Three independent Windows correctness fixes bundled with their tests: * daemon.ts: killExistingDaemon now uses killProcessTree (taskkill /T /F) instead of raw process.kill so detached grandchildren of the daemon (pty-host, dashboard subprocess) are reached on Windows. POSIX behavior is preserved via killProcessTree's process-group fallback. * startup-preflight.ts: on Windows, when the project config selects runtime: tmux, offer to rewrite the line to runtime: process in the project YAML instead of prompting "install tmux?". The rewrite is a targeted line-replace (not yaml round-trip) so comments and quoting are preserved. Decline -> hard exit with manual-fix guidance. * path-equality: new pathsEqual / canonicalCompareKey helpers used by start.ts and resolve-project.ts for "same filesystem entry" checks. realpathSync on Windows can return canonical paths whose drive-letter case or 8.3-vs-long-name expansion differs from the input even when both resolve to the same on-disk entry, which made naive === comparisons miss and surface as phantom "register this project?" prompts on re-runs of `ao start <path>`. Lowercases on Windows; POSIX is unchanged. Also fixes resolve-project.ts's isLocalPath to recognize Windows path patterns (drive-letter, UNC, .\, ..\) so `ao start C:\path\to\repo` takes the path branch instead of being mis-classified as a project id. Test changes: makeConfig now defaults to runtime: process so tests run on every platform without tripping the Windows-tmux exit; the one tmux preflight test pins process.platform = 'linux'. The "kills existing process" test asserts on killProcessTree instead of process.kill. On-disk yaml fixtures in start.test.ts switch from runtime: tmux to runtime: process for the same reason. New tests: 7 in startup-preflight.test.ts (Windows rewrite, decline exit, missing configPath exit, comment+quoting preservation, Linux pass-through), 8 in path-equality.test.ts (drive-letter case, segment case, POSIX case-sensitivity, realpathSync fallback, ~ expansion), killProcessTree assertions added to daemon.test.ts. Verified non-issues during the audit (no code change): ao stop graceful shutdown gap (the work was already moved into ao stop itself in a prior refactor; running.json/last-stop/sessions are persisted before the parent kill, and stale state is self-healing on next read); better-sqlite3 cross-platform binary (optionalDependencies + files: ['dist'], no prebuilt .node bundled in any release artifact); ao-doctor / ao-update PowerShell rewrite (script-runner already rewrites .sh -> .ps1 on Windows, .ps1 siblings ship in assets/scripts/, covered by an existing Windows-only test); bun-tmp-janitor leak (janitor is a no-op on Windows because opencode ships no win32 binary and Windows refuses to unlink mapped files). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| ao | ||
| cli | ||
| core | ||
| integration-tests | ||
| plugins | ||
| web | ||