Windows specifics

How checks run on Windows (no shell, six-variable environment, PATH and PATHEXT lookup), job objects, retained context, the installer, and that smith does not handle line endings.

Every Windows statement on this page is marked "from code only" (read from the source) or "verified on Windows" (seen on a Windows host). Nothing is verified on a Windows host except what one reporter saw.

01shell#

From code only. Checks run with no shell. The executable is resolved with exec.LookPath and started directly under a job object (internal/host/windowsjob/process_windows.go). Builtins that exist only in cmd, pipes and && do not work in a check.

Workarounds: wrap the command in a .cmd or .ps1, or name powershell as the executable with -NoProfile, -File, x.ps1 each as its own entry in args.

02path#

From code only. Known limitation, not a promise. The check environment has six keys (internal/service/patch_checks.go): PATH (the core process's own, as it was when the core started), HOME (a temp dir), GOCACHE, GOLANGCI_LINT_CACHE, GOMODCACHE, and a dummy SMITH_ANTHROPIC_API_KEY. There is no SystemRoot, USERPROFILE or TEMP; windowsjob AuthEnvironment returns the env unchanged.

A user PATH edit made after the app started is not in the core's environment, so restart the app.

This is separate from the claude-code install finder, which re-reads PATH on each call. AdoptLoginPath (internal/runtime/login_path.go) is darwin-only and does not apply on Windows.

03executables#

From code only. exec.LookPath tries each PATHEXT extension and returns the first match on PATH. The WindowsApps python.exe store alias may be found first and may not be a real interpreter; name the real interpreter's full path in executable. See checks.

04line-endings#

From code only. Smith does not handle line endings. A case-insensitive grep of internal/gitx (gitx.go) and internal/workspace (manager.go, model.go, target.go, volatile*.go) for autocrlf, CRLF, \r\n and eol found no matches. Diffs are git's own, under the machine's git config, so a clone made with autocrlf=true shows CRLF-sensitive diffs exactly as git would.

05containment#

From code only. Check and run processes are put in a Windows job object (internal/host/windowsjob/job_windows.go, process_windows.go), which is how smith contains them. Whether the limits behave as intended on a real Windows host: not checked.

06retained context#

From code only. On Windows privateMode always returns true and syncsContextDirectories = false (internal/service/harness_context_windows.go), so there is no mode-bit test: every directory reports 0777, and only the directory and symlink checks apply. See retained context.

Permission-bit tests: the only Windows permission skips found are internal/config/config_test.go (two, "permission test not applicable on Windows"). A retained-context permission-bit test for Windows (asked about in an earlier ticket): not checked, not found.

07install#

From code only. The installer is NSIS, per user: desktop/package.json has "oneClick": false and "perMachine": false. The uninstaller asks "also remove smith's data?" (desktop/installer.nsh:6-8). The default is no, and the answer when the uninstall is silent. Yes removes $LOCALAPPDATA\smith and $APPDATA\smith. An update never touches them.

Unsigned build and SmartScreen: not checked. First-launch setup: firstLaunchSetup (desktop/update-logic.js) opens the setup page until a folder is opened, on Windows and Linux alike (from code only).