Native Windows
Ported, and exercised on real Windows hardware by the windows-latest CI job that landed on 2026-08-15 (this line first shipped saying the job was still a later phase, which was already wrong when it was published). Requires Claude Code 2.1.139 or newer, where hook args (exec form) was added: an older client silently drops args and runs bare uv, which exits non-zero. plugin.json has no field to express this, so it is stated here and in the README.
- Plugin hooks run on native Windows (no WSL). hooks.json moved from a
python3 <script>shell string to the documented exec form -uvspawned directly with an argument list - so the launcher works the same under Git Bash and PowerShell, cannot break on a plugin-cache path containing spaces (exec form passes arguments verbatim, no shell tokenization), and no longer depends on apython3name most Windows Python installs lack:uv run --no-project --python ">=3.11" pythonresolves a modern interpreter everywhere. Each hook makes the bundledmissioncache-db/importable itself - five insert it intosys.path,activity_trackerpasses it asPYTHONPATHto the subprocess it spawns - so the interpreter needs nothing pip-installed.missioncache-installpre-warms the interpreter resolution at plugin-install time so a first-use Python download never races the UserPromptSubmit hooks' 5-second timeout; a marketplace-only install skips that warm, and the new hooks.md troubleshooting entry covers the one-timeuv python installit may need. (plugin, missioncache-install, docs) - The slash commands' bash blocks no longer assume
python3or the slash-only cwd encoding. Each block probe-runspython3thenpython(executing, not just resolving - the Windows Store stub resolves on PATH but does not run) and capturessys.executable, a single quotable path that survives zsh (which does not word-split unquoted variables) and Windows paths with spaces alike, withuv python findas the last fallback.CWD_KEYcomes from the newmissioncache-db encode-cwd(the documented every-non-alphanumeric encoding), with a sed approximation as the CLI-less fallback - POSIX-correct only, since MSYSpwdprints/c/Users/.... (plugin) - The dashboard registers for autostart on Windows: a Task Scheduler ONLOGON task, falling back to an HKCU Run-key entry when schtasks refuses from a non-elevated prompt (stock Windows denies ONLOGON triggers without elevation; the Run key never needs it). Both mechanisms run
serve --hidden, plus--port Nwhen the port is not the default:--hiddenhides the console window (either mechanism otherwise parks a visible console on the desktop for the whole session) and redirects serve's own output to a Windows log file, and--portrides on the command line because neither mechanism can set per-task environment variables.statusanduninstall-service(which also stops the running server, matching every other platform) grew matching Windows branches. (missioncache-dashboard) - missioncache-auto runs Claude portably: the executable resolves via
shutil.which(npm installsclaudeas a.cmdshim, which a list-form spawn cannot start by bare name), the process-group spawn splits by platform (start_new_sessionhas no Windows meaning;CREATE_NEW_PROCESS_GROUPthere), and teardown reaps the claude subtree withtaskkill /T /Fwherekillpgdoes not exist.Workerround-trips through pickle, the spawn start method's requirement (Windows's only one). (missioncache-auto) - Bare-name executable resolution is centralized and hardened.
subprocess_utilsresolves a barecmd[0]throughshutil.whichon Windows so.cmdshims (claude, codex, and any future CLI) spawn from a list-form command in one place; a missing binary folds into the normalCommandFailedhandling instead of raisingFileNotFoundError. Every such resolution refuses a result whose directory is the current working directory:shutil.whichsearches the cwd before PATH on Windows, so an installer run from a directory holding a planted shim would otherwise bake that path into the dashboard's logon persistence, or hand the missioncache-auto Claude child the full environment. (missioncache-install, missioncache-dashboard, missioncache-auto) - The installer works with Windows tool shims and privileges:
--localmode falls back from symlinks to copies when Windows refuses without Developer Mode (WinError 1314, with a note pointing at the setting and a widened ignore list so secrets/local DBs never land under~/.claude/plugins/), and the statusline command is written as the absolute forward-slash path to the exe on Windows, quoted when it contains a space (Git Bash eats backslashes and word-splits on spaces; the scripts dir is not guaranteed on the statusline's PATH). The statusline itself now carries its crash guard inmain()- the installed entry point bypassed the old__main__-only guard, rendering blank on any unhandled exception - and recognizesUSERNAMEalongsideUSER. (missioncache-install, missioncache-dashboard) - Cross-machine sharing now supports native Windows as an import target: a bundle exported on macOS/Linux lands with Windows-shaped local paths (
config set-pathacceptsC:/...orC:\..., token expansion builds paths through pathlib,--rewrite-pathswrites the native form). Export FROM Windows stays out of scope - the embedded-path scanner recognizes only/-rooted absolutes - and the sharing plan doc states the asymmetry. (missioncache-db, docs)