Skip to content

Windows: Full-mode manifest still gates open/open-link/last to macos+linux after #31 revert #43

Closed

Description

@kursku

Context

On Windows the manifest (bfe0de8, and current main) gates the Full-review entrypoints — the [[build]], the doc pane, and the open / open-link / last actions plus the markdown link_handler — to ["macos","linux"]. So Windows users get only capture / copy-* / manage; the whole plannotator-tui review flow is unreachable, even though scripts/fetch-plannotator-tui.ps1 exists and the tui ships an x86_64-pc-windows-msvc.exe asset.

I ran the ps1 locally: it fetches + sha256-verifies + stages bin/plannotator-tui.exe (0.7.0) cleanly, and plannotator-tui.exe --version runs. Flipping the three actions to include windows makes them work as-is, since Herdr's relative-program resolver applies to actions (they use ./bin/plannotator-tui.exe).

The real blocker (why #30 was reverted in #31)

The doc pane command can't use ./bin/… — the resolver doesn't apply to panes; they spawn with the review folder as --cwd. The Unix manifest sidesteps this with a wrapper resolving via $HERDR_PLUGIN_ROOT:

["sh","-c","exec bash \"$HERDR_PLUGIN_ROOT/scripts/plannotator-tui.sh\" herdr pane"]

That wrapper needs sh+bash, which native Windows (no Git Bash) lacks. That's the piece still missing for a clean Windows re-enable.

Question

Would a pwsh-based pane wrapper resolving the binary via $HERDR_PLUGIN_ROOT (mirroring the pattern herdr-file-viewer / herdr-sidebar already use for their -windows action variants) be the accepted path to re-land Windows Full-mode? Happy to open a PR along those lines if so.

Activity

  1. backnotprop commented on Sep 8, 2026

    @backnotprop
    Contributor

    Thanks, and yes, we want this. Two corrections and the shape we'll merge.

    1. Flipping the three actions alone doesn't work: open and last launch the doc pane, which would still be gated off, so every review fails to open.
    2. A second doc pane can't exist. Herdr rejects duplicate pane ids even with disjoint platforms, and a PowerShell wrapper in the middle is out: it puts a process between Herdr and the TUI, and on 0.8.2 the plugin root arrives as an extended-length \\?\ path that PowerShell mishandles.

    Accepted design: a separate Windows install variant, windows-full/herdr-plugin.toml, requiring Herdr 0.9.0, where panes resolve relative programs against the plugin root. Its doc pane is direct argv: ["./bin/plannotator-tui.exe", "herdr", "pane"], no wrapper. Actions use the same direct argv. The root manifest stays as is; Windows on 0.8.2 keeps Lite.

    The acceptance checklist (manifest parity, the fetch contract, and what the Windows CI runner must prove) is going into the repo shortly and I'll link it here. If you want to take the PR against it, say so. You have Windows hardware and we don't, so your live results would also count as the native qualification.

  2. backnotprop commented on Sep 9, 2026

    @backnotprop
    Contributor

    The acceptance checklist is in the repo now: https://github.com/plannotator/herdr-annotate/blob/main/docs/windows-full-acceptance.md. That's the target for the windows-full/ variant if you take it.

  3. timo-tigges commented on Sep 17, 2026

    @timo-tigges
    Contributor

    Native Windows results, since they're the blocker on hardware you don't have. Measured against herdr 0.9.0 stable (protocol 22), Windows 11 Pro 10.0.22621, PROCESSOR_ARCHITECTURE=AMD64, plugin at 7c8f5a1. Method: throwaway plugin link plugins, one pane per case, opened with herdr plugin pane open --entrypoint <id> --cwd <dir>; outcome read from pane.exit in herdr-server.log.

    TL;DR: the accepted design works. ./bin/plannotator-tui.exe as a direct-argv doc pane resolves correctly from a review-folder cwd on 0.9.0.

    Reading the exit codes

    Outcome Meaning
    plugin_pane_open_failed CreateProcessW failed synchronously, no pid — and the error names the exact path herdr passed, which is what makes resolution observable
    exit 0 / 1 image started and ran (1 = herdr-annotate editor refusing without a pending annotation)
    exit 4294901760 (0xFFFF0000) image started and then exited abnormally — the log shows pane.spawned outcome="ok" pid=… first. Not a spawn failure.

    1. Panes resolve relative programs against the plugin root

    ["./bin/herdr-annotate.exe", "editor"], plugin root C:\Users\<user>\hp, opened with --cwd C:/projects/terminal-setup → exit 1. Found and ran, from a cwd containing no bin/.

    A deliberately missing relative program makes the resolution explicit:

    CreateProcessW `"\\?\C:\Users\<user>\hp\bin\nope.exe editor"`
      in cwd `Some("C:/projects/terminal-setup")` failed: os error 2
    

    Resolved against the plugin root; cwd passed separately. Not source-dependent — this was a linked plugin, not a GitHub install.

    2. Resolved paths arrive extended-length, and that is what kills a PowerShell wrapper

    Only relative spellings get rewritten. An absolute missing program reports CreateProcessW "C:\Users\<user>\hp\bin\nope2.exe" — no prefix.

    Isolating it on one binary (a copy of powershell.exe staged at <root>/bin/probe.exe), every run with --cwd outside the root:

    Program as written in the manifest Exit
    C:\Users\<user>\hp\bin\probe.exe 0
    \\?\C:\Users\<user>\hp\bin\probe.exe 4294901760
    ./bin/probe.exe 4294901760
    .\bin\probe.exe 4294901760
    bin/probe.exe 4294901760
    bin\probe.exe 4294901760
    ./bin/probe.exe, cwd = plugin root 4294901760

    Rows 1 and 2 differ only by a prefix typed in by hand. So the failure is the extended-length image path — not relative resolution as such, and not the pane cwd, since row 7 fails where a cwd-relative lookup would have succeeded. Not path length: identical at a 36-character binary path and a 140-character one. Native binaries are unaffected.

    So the checklist's "no launcher process between Herdr and the TUI" is stronger than a design preference on Windows — a PowerShell-wrapped pane cannot stay up. Good news for windows-full, since plannotator-tui is native.

    3. A correction to the \\?\ note in this thread

    On 0.9.0 the extended-length form reaches the program argument, but HERDR_PLUGIN_ROOT read inside a pane arrives in normal form (C:\Users\<user>\probe). So code rebuilding a path from the env var and code reading the image path see different things. Worth pinning, given the checklist's "do not blindly remove \\?\" row.

    What this does not show

    • Both come from the CLI's plugin.pane.open. A pane opened by the plugin itself over the socket is not exercised.
    • plannotator-tui was never run — this is "the pane can start", not rendering, q, or teardown.
    • ARM64 untested; this machine is AMD64.

    Taking the PR

    I'd like to, against docs/windows-full-acceptance.md. Two questions before I start:

    1. Onboarding sections 7/8/9 are referenced by §1, §3 and §6 but I can't find that document in the repo. Is it published somewhere, or could it be added?
    2. §2's subdirectory staging. fetch-plannotator-tui.ps1 does Set-Location (Join-Path $PSScriptRoot "..") and writes ./bin, so called from windows-full/ it stages to root bin/ — which §2 explicitly refuses. Do you want a destination parameter on the shared fetcher, or a windows-full/scripts/ wrapper that supplies it? Happy either way; it changes which regression tests I add.

    I can cover §1, §2 and the AMD64 half of §4 on this hardware. §3's GitHub Windows runner I can attempt, but flagging early that §4's native ARM64 row is not closeable here.

  4. backnotprop commented on Oct 15, 2026

    @backnotprop
    Contributor

    Fixed by #49 and #58: Windows now has its own full-mode manifest with open, open-link and last. Thanks for the report.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions