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::fsonly, 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), anAgent:summary line in the sidebar’s Worktree block, a generic detail overlay ona(rebindable; scroll/close keys under[tui.keys.modal.detail]) listing every matched session, an additive, experimental-tieragentsfield on thelist --format=json/ daemon row (SCHEMA_VERSIONstays 1; omitted when no session matched), and an active-agent segment ingwm 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 agentslists sessions per worktree (human or--format=json), the plaingwm listtable gains an AGENT column, andgwm agents attach <worktree> <session-id>/detachpin a session to a worktree when the recorded directory is not enough - auto-detection stays the default, the pin (git branch configgwm-agent-pin, one per worktree) only adds, and every surface honours it.GWM_AGENTS_HOMEoverrides 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 andgwm agents, and exposed as an optionalnameon the wire. The TUI overlay is interactive:j/kselect a session (highlight + scrollbar, stable frame),apins it,dunpins. 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 daemonandgwm statuslinenow work on Windows: the daemon binds an owner-only named pipe under\\.\pipe\(default namegwm-<user>.sock,--sockettakes 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.
Changed
Section titled “Changed”- 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)
Removed
Section titled “Removed”- The
aur-publishjob.gwm-cli-binis 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. ThePKGBUILDtemplate 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 --yesno longer fails wholesale when a concurrent writer (a watcher such as rust-analyzer regenerating files insidetarget/) 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)