Skip to content
gwmgwmgwmv1.10.0

v1.3.0

gwm now knows who is working in your worktrees. The headline feature is the agent session pane (#408): gwm detects AI-agent coding sessions (Claude Code, Codex, opencode, Mistral Vibe) per worktree and surfaces them everywhere - the worktree table, the sidebar, a dedicated overlay, gwm agents, the JSON/daemon rows, and the statusline. Detection reads each tool’s on-disk session artefacts with std::fs only: no process scanning, so it behaves identically on Linux, macOS and Windows, and a malformed or missing store degrades silently to “no sessions” instead of failing the render.

The second theme is finishing the daemon’s platform story (#439): gwm daemon and gwm statusline now run on Windows over an owner-only named pipe, with the same JSON-RPC surface and the same DoS guards as the unix socket. The port was not a transport swap: Windows named pipes have no non-blocking read mode worth using (PIPE_NOWAIT is documented against, and the crate layer maps an empty pipe to a false EOF), so the server’s slow-loris deadlines and poll ticks were rebuilt on PeekNamedPipe over blocking streams, and the client authenticates the server by checking the pipe’s owner SID before speaking - a named pipe name is predictable, and without that check any local process could squat it and impersonate the daemon.

  • Agent session pane (#408, PR #435). gwm now detects AI-agent coding sessions (Claude Code, Codex, opencode, Mistral Vibe) per worktree by reading each tool’s on-disk session artefacts - no process scanning, std::fs only, so detection behaves identically on Linux, macOS and Windows. Surfaced as: an AGENT column in the worktree table (most recently active agent, coloured by freshness), an Agent: summary line in the sidebar’s Worktree block, a generic detail overlay on a (rebindable; scroll/close keys under [tui.keys.modal.detail]) listing every matched session, an additive, experimental-tier agents field on the list --format=json / daemon row (SCHEMA_VERSION stays 1; omitted when no session matched), and an active-agent segment in gwm statusline. Detection runs off-thread with a 30 s re-check and a 30-day artefact scan window; missing or malformed artefact stores degrade silently to “no sessions”.
  • gwm agents + manual pinning (#408, PR #435). A dedicated CLI surface for the same detection: gwm agents lists sessions per worktree (human or --format=json), the plain gwm list table gains an AGENT column, and gwm agents attach <worktree> <session-id> / detach pin a session to a worktree when the recorded directory is not enough - auto-detection stays the default, the pin (git branch config gwm-agent-pin, one per worktree) only adds, and every surface honours it. GWM_AGENTS_HOME overrides the scanned home for deterministic tests/CI. Sessions carry a human-readable name when their artefacts have one (first prompt, or Vibe’s title) - shown in the overlay and gwm agents, and exposed as an optional name on the wire. The TUI overlay is interactive: j/k select a session (highlight + scrollbar, stable frame), a pins it, d unpins. Daemon detection is cached for 30 s per poll loop; a live session always beats a freshly-ended one for the compact indicator.
  • Windows named pipe transport for the daemon (#439, PR #444). gwm daemon and gwm statusline now work on Windows: the daemon binds an owner-only named pipe under \\.\pipe\ (default name gwm-<user>.sock, --socket takes the pipe name) with the same JSON-RPC surface, DoS guards and graceful degradation as the unix socket, and the statusline client rides it - every segment lights up, including the agent indicator from #408. Unix behaviour is untouched; the docs’ Unix-only caveats are lifted.
  • Agent session detection no longer reports an outright-killed Claude Code session as active for the rest of the 5-minute activity window: on Unix, when the live registry (~/.claude/sessions/<pid>.json) records the session’s PID and that process is gone, the session drops to idle immediately. Backends without a process signal (Codex, opencode, Vibe) and non-Unix platforms keep the artefact-only classification. (#441, PR #443)
  • The release workflow’s read-only checkouts no longer persist the auto-injected token in .git/config. Only the two checkouts that push (the Homebrew tap and the Scoop bucket) keep a credential, and both sides of that split are pinned by a test. (#429, PR #432)
  • The aur-publish job. gwm-cli-bin is maintained on the AUR by a third party, so the job never had push rights: being advisory, it failed silently on every stable tag while the release reported success. The AUR is now fed by hand, like Nixpkgs and aqua. The PKGBUILD template and its render script stay in-repo, reworked for the manual recipe, and the tests now pin the job’s absence, so the handover stays a one-liner. (#430, PR #431 / PR #434)
  • The “Attach a session” prompt of the agent detail overlay keeps a fixed frame while typing: the candidate window is sized by the terminal alone (short lists blank-pad), so the modal no longer resizes on every keystroke, and an overflowing list now shows the same scrollbar as the detail mode. (#445, PR #446)
  • gwm clean --yes no longer fails wholesale when a concurrent writer (a watcher such as rust-analyzer regenerating files inside target/) races the removal: a transient ENOTEMPTY is retried with a bounded budget, and a directory already reclaimed by someone else counts as success instead of aborting the command. (#440, PR #442)