Repository navigation
Full platform parity
Every script PhanesLight installs into a project now has both a Windows and a POSIX variant. The ten that were Windows-only join the day-to-day checks that were already on both:
preflight, install-templates, update-preflight, manifest-write, batch-apply, census-diff, scaffold, ledger, repo-manifest, and the hook-ledger-status hook.
Seven of the ten use Node to parse JSON, which costs nothing extra: Claude Code is itself a Node program, the plugin's hooks already dispatch through Node, and cli.js installs on every platform. The nine existing pure-shell scripts stay pure shell.
Defects fixed, none of them caused by the port
scaffold, both platforms. The existence pre-checks were untyped, so a file sitting where a directory belongs reportedEXISTS, and a directory where a file belongs reportedEXISTS. Both platforms behaved identically, which is why no differential test had ever caught it.scaffold, Windows.New-Item -ItemType Directory -Forcereturns without error and creates nothing when an ancestor is a file, so the script announcedCREATEDand exited 0 for directories that did not exist.update-preflight, both platforms. The spec sensor was gated differently from the other five gating sensors, so a sensor reporting a delta could still let the verdict reachquiet: true.new-file, both platforms. The DOC DISCIPLINE header written into every generated documentation file now matches the canonical template.
Notes for maintainers
batch-apply and repo-manifest claimed a byte-identical stdout against their POSIX siblings. PowerShell appends CRLF on redirect, so that was never true and could not have been noticed while the siblings did not exist. The stated invariant is now: identical exit code, stdout identical after stripping CR, and every written file byte-identical.
MANIFEST.json declares all six hardcoded list caps. publish.sh gains three guards: manifest and tree agreement, every template stamp at the published version, and a shell parse plus bashism check that refuses outright when dash is absent.
Upgrading: no migration boundary. A POSIX project picks up the ten new scripts through an ordinary /phaneslight:run update.