v1.5.0
Minor Changes
- #25
be1705a- Servers in a linked git worktree keep the project's declared host instead of getting an ephemeralworktree-<label>.<preferred>.localhostorigin. Every*.localhostname resolves to loopback, so the label never disambiguated a bind, while the third-level subdomain broke any auth config an app pins to one origin (an OAuth callback, a cookie domain, a CORS allow list, a trusted-origins check). Sibling worktrees of one repo are still told apart: the shared committed port auto-rebinds as before, and the worktree name surfaces as a display value (worktreeandmainProjecton status JSON, aworktree: <label>line indevctl statushuman output and inconfig check, and a banner line in session context). The menu bar app and Spotlight show a worktree server under its project family (myproj · review), so searching for the project name still finds it.
Patch Changes
-
#25
557bc3c- Antigravity sessions now rediscover running servers the way Claude Code and Cursor already do.devctl hook install --harness antigravity(also offered at first run and in Settings when~/.geminiis present) wires a PreInvocation hook so a new session sees livedevctlstatus instead of spawning duplicates.devctl hook uninstall --harness antigravityremoves it. -
ef2adc7-devctl doctornow catches a second devctl copy shadowing your Homebrew install, the failure wherebrew upgradechanges one copy while a baredevctl(or the background daemon) keeps running an older one. It reports when a manual~/.local/bininstall coexists with the Homebrew cask (whichever~/.local/binor brew's bin comes first on your PATH is what actually runs), and when an/Applications/devctl.appthat Homebrew did not place is still present. Each finding names the exact cleanup command. Like doctor's other environment findings, it only reports, and only fires when a Homebrew install is present, so a plainmake installis never flagged. -
#25
69232b8- Grok Build is a supported agent harness.devctl hook install --harness grok(also offered at first run and in Settings when~/.grokis present) wires a session hook and a short home rule that tells Grok to rundevctl contextbefore touching a server, so a new session does not spawn duplicates.devctl hook uninstall --harness grokremoves both. -
#25
b170109- A server whose start command waits on an interactive credential prompt (a secrets CLI unlock, a biometric approval) can no longer crash-loop invisibly. When runs repeatedly exit on their own, nonzero, after tens of seconds, without ever passing a healthcheck, status surfacesblockedOn: "interactive-auth"with the remedy in human status,devctl why, and the session-context block: start the server once in a terminal to surface the prompt, thendevctl ensure. The classification is a heuristic in devctl's own words and clears the first time a run dies differently or a healthcheck passes. -
#25
3f8a7c2- Servers under a discarded checkout now stop on their own within about a minute of the checkout disappearing, instead of waiting for a reboot or a machine-widedevctl status --all. The daemon stats every registered project every 30 seconds and prunes a path only after it is missing on two consecutive sweeps, so one flaky stat (a network mount blip, a slow Finder move) never tears down a live project. -
#25
8409259- OpenCode is a supported agent harness.devctl hook install --harness opencode(also offered at first run and in Settings when~/.config/opencodeis present) writes a managed~/.config/opencode/devctl.mdthat tells OpenCode to rundevctl contextbefore touching a server, wired through theinstructionsarray of the winning global config file, so a new session discovers the servers without spawning duplicates. OpenCode has no session-start hook to inject live context into, so the standing instruction is the integration; instruction files already referenced by a losingopencode.jsonstay active after the entry lands inopencode.jsonc.devctl hook uninstall --harness opencoderemoves both halves. -
#25
3f8a7c2---projectnow refuses anything that is not an existing directory (exit 2,usage). Passing a project's NAME instead of its path used to resolve to a nonexistent relative directory and answer an empty scoped view:devctl down --project myprojreported success against a phantom project while the real server kept running.