projmux 0.6.6 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,18 +29,21 @@
29
29
  - `make fmt`: repository formatting for Go, shell snippets, and generated docs where applicable.
30
30
  - `make fix`: safe automatic fixes such as `go fix` and repository-approved cleanup steps.
31
31
  - `make npm-pack`: local npm binary package staging and `npm pack --dry-run` for the root package plus platform packages.
32
- - `make test`: fast unit coverage for app-layer AI split native agent launch/selective popup-toggle/settings/status/notification parity including AI pane option metadata, watcher metadata bootstrap for existing panes, capture-backed reply detection, missing-pane watcher shutdown, armed focus-only reply badge clearing, busy attention preservation on focus clear, manual AI topic preservation while watcher status still updates, agent-labeled desktop notification message context with pane-title-first body text, global/project-local lifecycle hook dispatch for post-create/pre-create/post-attach/send-noti with project hook and `.projmux/config.toml` trust-store hashing plus env/settings kill-switch gating, declarative startup command and hook run coverage, `send-noti` stdin JSON delivery plus `PROJMUX_NOTIFY_*` env payload, notify queue write success/failure/depth-guard dispatch rules, notify/statusbar/sidebar origin-client focus routing, project config env/kube session environment application, Settings project config env/kube/startup form writes with trust-store refresh and preserved hook commands, startup command send-keys orchestration plus startup pane replay markers, pre-create abort behavior, and shared projmux notification icon paths, and scoped even row/column resizing after shell and agent splits, status-bar git/kube segment parity including muted git branch block styling and compact dirty/staged/ahead/behind state colors, statusbar pwd display-only native-framed path popup with shared popup-wait-key/no-extra-payload-line command coverage, no clipboard or tmux buffer copy, and popup-wait-key cursor/raw-mode restore coverage, statusbar usage native HUD popup alignment/height-budget/threshold palette/muted sync-staleness/fallback coverage without raw CLI popup or popup-toggle stacking, statusbar settings click popup fallback and settings chip right-edge rendering without default trailing space, popup-toggle stale marker recovery, isolated `projmux shell` tmux app launch/config generation including home fallback plus project-context default session targeting from `PROJMUX_CWD` or nearest project marker, app-owned project-name statusbar layout, distinct project badge color, and quiet debounced session-state autosave command/app-config trigger, first-run/version-bump shell welcome state and inline update handling, shell startup update prompt actions for fresh installer-aware cached updates, pane/window keybindings, keymap.toml tmux override rendering/stale unbinds including retired direct/UserKey cleanup, Settings Keybindings root/list/detail capture flows including parse-error rows, unsafe raw capture and timeout guards, disable/reset writes, app config regeneration, live tmux source-file reload, and no-live-tmux save behavior, window rename bindings, pane rename helper/binding, pane-exit rebalance command/hooks, hook-pane and after-select-pane based attention focus hooks, attention badge toggle/clear/list/window rendering, attach/current/kill/pin/preview/prune/sessions/session-popup/settings commands, switch, tag, tmux helper commands, update status/check/apply cache and installer detection including GitHub Release binary asset selection/extraction/replacement, doctor install-missing command selection, AI notify integration diagnostics, and Session State resume metadata diagnostics, Settings AI notify integration diagnostics read-only status/conflict/CLI guidance, and Settings About update status/check action wiring, untitled standalone popup-toggle marker close/config install, direct popup minimum sizing, AI picker minimum width and height, sidebar minimum width and compact badge spacing, preview select writes, popup render output after cycling, switch picker pin action behavior without inline settings rows, nested settings hub sections for AI defaults, project picker filesystem scan/pin actions, Project Root settings source/shadowing/set/current/clear flows, app/keybinding info including Ctrl-M rename forwarding, and About version/source rendering, switch picker focused-session kill, switch picker launcher-key abort bindings, switch explicit project-root, unconfigured-root, and weak managed-root heuristic parity, switch popup hiding new-session candidates while sidebar keeps create-capable rows, switch row project-name display with `~` pinned to the top and live-session-first sorting, pretty-path, preview-context including kube context/namespace, switch settings subcommand flows including add-current-pin, interactive add-pin picker, and settings label/preview polish including Phase 2 Settings/hookmaker/project-startup/trust/quit destructive row color regression strings, native preview wiring, baseline picker surface parity including prompt/footer/header fallback without app-name filler and search-key scoped card matching, sidebar compact action-only key footer, sidebar preview-window/start-position behavior without focus-time session switching, sidebar row/window ANSI styling with pane-aggregated attention badge state and AI topic labels, Alt+2/Alt+3 legacy popup row, preview-window, pane metadata, and pane-snapshot parity, switch read0 card rows with active/inactive title styling, right-side status badges, combined directory/git metadata with muted inactive branch styling, statusbar-matched block window tabs with window attention badges, read0 expect-key action parsing, restored pin/tag card badges, and restrained selected-row marker styling, switch preview metadata without duplicated directory/git rows, preview metadata rendering, popup pane display names for AI agents, AI topics, and shell commands, switch preview cycle bindings, sessions picker preview/cycle/open/kill wiring including attached-session fallback behavior, sessions picker launcher-key abort bindings, popup/switch preview summary formatting, popup sessions tmux entry helpers, switch/popup/session rendering, session identity, session-state Claude/Codex resume and declarative startup replay, session snapshot capture/autosave recipe classification including save/autosave pre-capture resume metadata refresh from live AI session ids, Claude transcript paths, and Codex rollout log cwd matching/ambiguity skips, candidate discovery, config path derivation, popup preview read-models, and pure state rules including preview, tag, and lifecycle stores.
33
- - `make test` also covers Settings > AI Settings > Enabled agents Phase 0 config behavior: missing config enables Claude and Codex, unknown saved provider names are ignored without disabling known providers, Settings toggles persist Claude/Codex only, shell/selective are absent from enabled-agent rows, and a saved default split mode warns when its provider is disabled.
34
- - `make test` also covers AI semantic badge renderer aggregation for window-list, sidebar rows, switch window tabs, popup pane summaries, and pane-border topic badges using prompt-required > response-complete > in-progress priority while preserving blank no-state lanes, plus Settings > Appearance AI badge style selection for dot/emoji/off pane-border compatibility with dot as the persisted/config fallback.
32
+ - `make test`: fast unit coverage for app-layer AI split native agent launch/selective popup-toggle/settings/status/notification parity including AI pane option metadata, watcher metadata bootstrap for existing panes, capture-backed reply detection, missing-pane watcher shutdown, armed focus-only reply badge clearing, busy attention preservation on focus clear, manual AI topic preservation while watcher status still updates, agent-labeled desktop notification message context with pane-title-first body text, global/project-local lifecycle hook dispatch for post-create/pre-create/post-attach/send-noti with project hook and `.projmux/config.toml` trust-store hashing plus env/settings kill-switch gating, declarative startup command and hook run coverage, `send-noti` stdin JSON delivery plus `PROJMUX_NOTIFY_*` env payload, notify queue write success/failure/depth-guard dispatch rules, notify/statusbar/sidebar origin-client focus routing, project config env/kube session environment application, Settings project config env/kube/startup form writes with trust-store refresh and preserved hook commands, startup command send-keys orchestration plus startup pane replay markers, pre-create abort behavior, and shared projmux notification icon paths, and scoped even row/column resizing after shell and agent splits, status-bar git/kube segment parity including muted git branch block styling and compact dirty/staged/ahead/behind state colors, statusbar pwd display-only native-framed path popup with shared popup-wait-key/no-extra-payload-line command coverage, no clipboard or tmux buffer copy, and popup-wait-key cursor/raw-mode restore coverage, statusbar usage native HUD popup alignment/height-budget/threshold palette/muted sync-staleness/fallback coverage without raw CLI popup or popup-toggle stacking, statusbar settings click popup fallback and settings chip right-edge rendering without default trailing space, popup-toggle stale marker recovery, isolated `projmux shell` tmux app launch/config generation including home fallback plus project-context default session targeting from `PROJMUX_CWD` or nearest project marker, app-owned project-name statusbar layout, distinct project badge color, and quiet debounced session-state autosave command/app-config trigger, shell-entry welcome release prompt and inline update handling, shell update skip-by-latest-tag behavior plus best-effort stale-cache refresh, pane/window keybindings, keymap.toml tmux override rendering/stale unbinds including retired direct/UserKey cleanup, Settings Keybindings root/list/detail capture flows including parse-error rows, unsafe raw capture and timeout guards, disable/reset writes, app config regeneration, live tmux source-file reload, and no-live-tmux save behavior, window rename bindings, pane rename helper/binding, pane-exit rebalance command/hooks, hook-pane and after-select-pane based attention focus hooks, attention badge toggle/clear/list/window rendering, attach/current/kill/pin/preview/prune/sessions/session-popup/settings commands, switch, tag, tmux helper commands, update status/check/apply cache and installer detection including GitHub Release binary asset selection/extraction/replacement, doctor install-missing command selection, AI notify integration diagnostics, and Session State resume metadata diagnostics, Settings AI notify integration diagnostics read-only status/conflict/CLI guidance, and Settings About update status/check action wiring, untitled standalone popup-toggle marker close/config install, direct popup minimum sizing, AI picker minimum width and height, sidebar minimum width and compact badge spacing, preview select writes, popup render output after cycling, switch picker pin action behavior without inline settings rows, nested settings hub sections for AI defaults, project picker filesystem scan/pin actions, Project Root settings source/shadowing/set/current/clear flows, app/keybinding info including Ctrl-M rename forwarding, and About version/source rendering, switch picker focused-session kill, switch picker launcher-key abort bindings, switch explicit project-root, unconfigured-root, and weak managed-root heuristic parity, switch popup hiding new-session candidates while sidebar keeps create-capable rows, switch row project-name display with `~` pinned to the top and live-session-first sorting, pretty-path, preview-context including kube context/namespace, switch settings subcommand flows including add-current-pin, interactive add-pin picker, and settings label/preview polish including Phase 2 Settings/hookmaker/project-startup/trust/quit destructive row color regression strings, native preview wiring, baseline picker surface parity including prompt/footer/header fallback without app-name filler and search-key scoped card matching, sidebar compact action-only key footer, sidebar preview-window/start-position behavior without focus-time session switching, sidebar row/window ANSI styling with pane-aggregated attention badge state and AI topic labels, Alt+2/Alt+3 legacy popup row, preview-window, pane metadata, and pane-snapshot parity, switch read0 card rows with active/inactive title styling, right-side status badges, combined directory/git metadata with muted inactive branch styling, statusbar-matched block window tabs with window attention badges, read0 expect-key action parsing, restored pin/tag card badges, and restrained selected-row marker styling, switch preview metadata without duplicated directory/git rows, preview metadata rendering, popup pane display names for AI agents, AI topics, and shell commands, switch preview cycle bindings, sessions picker preview/cycle/open/kill wiring including attached-session fallback behavior, sessions picker launcher-key abort bindings, popup/switch preview summary formatting, popup sessions tmux entry helpers, switch/popup/session rendering, session identity, session-state Claude/Codex/Antigravity resume and declarative startup replay, session snapshot capture/autosave recipe classification including save/autosave pre-capture resume metadata refresh from live AI session ids including Antigravity conversation ids, Claude transcript paths, and Codex rollout log cwd matching/ambiguity skips, candidate discovery, config path derivation, popup preview read-models, and pure state rules including preview, tag, and lifecycle stores.
33
+ - `make test` also covers Settings > AI Settings > Enabled agents Phase 0 config behavior: missing config enables Claude, Codex, and Antigravity, unknown saved provider names are ignored without disabling known providers, Settings toggles persist Claude/Codex/Antigravity only, shell/selective are absent from enabled-agent rows, and a saved default split mode warns when its provider is disabled.
34
+ - `make test` also covers native Alt-1 sidebar `Sidebar:KillSession` mutable refresh: the action kills through the focused-session safety path, keeps the native picker session open, refreshes rows and preview with `picker.Action.Mutate`/`DeferredUpdate`, and preserves the previous-live-session guard.
35
+ - `make test` also covers the AI provider metadata registry for Claude/Codex/Antigravity launch providers: registry-derived enabled-agent defaults and ordering, Settings enabled-agent rows, AI picker visibility for disabled providers, ambient usage model scope derivation for quota-supported providers, hook diagnostic provider metadata, Antigravity session-state support metadata, and explicit diagnostics for disabled providers without adding unsupported quota adapters.
36
+ - `make test` also covers usage HUD/all-model filtering from Settings > AI Settings > Enabled agents: ambient `status usage` and `usage --model all` scope collection/rendering to enabled Claude/Codex providers, all-disabled all-model output shows a Settings fallback without refreshing adapters, disabled cached rows/backoff do not leak into ambient output, and explicit `usage --model claude|codex` still collects/renders the requested provider even when disabled.
37
+ - `make test` also covers AI semantic badge renderer aggregation for window-list, sidebar rows, switch window tabs, popup pane summaries, and pane-border topic badges using prompt-required > response-complete > in-progress priority while preserving blank no-state lanes, response-complete live badge consume on attention clear without idling action-required/progress badges, plus Settings > Appearance AI badge style selection for dot/emoji/off pane-border, Alt-1 sidebar window/preview tabs, and tmux window-status compatibility with dot as the persisted/config fallback.
35
38
  - `make test` also covers AI semantic badge Phase 3 theme-role hardening: `@projmux_ai_badge_kind` storage values and aggregate priority stay unchanged, `minimal` remains a read-time alias for the `off` badge style, progress/success/action-required badge roles stay distinct, permission/input status badges do not use critical red, and critical notify queue severity does not drive live AI status badge colors or desktop notification urgency.
36
- - `make test` also covers keybinding surface tier catalog rules, action-centered `keymap.toml` `keys = [...]` multi-alias parsing/writing, quoted internal `Surface:Action` tables, legacy popup action ID aliases, canonical popup toggle names, generated tmux config multi-alias rendering, global/direct conflict detection, surface-scoped native picker command conflict detection, Settings Keybindings list/search/detail surface-aware picker-local labels, simplified action detail rows, Labs compatibility redirect to the Keybindings root, capture/add-alias flows, unsafe raw capture, reset behavior, stale guide docs guards, and welcome/runtime footer copy that avoids hardcoded launch-key guides.
37
- - `make test` also covers welcome revisit policy: shell welcome is suppressed only by `skip_version` matching the current version, legacy `last_welcomed_version` state does not count as skipped, `s` stores current-version welcome skip, Enter continues without storing skip, Settings > About > Welcome opens a Settings-native viewer without pending state, and shell prompt display does not schedule a redundant attach popup.
39
+ - `make test` also covers keybinding surface tier catalog rules, action-centered `keymap.toml` `keys = [...]` multi-alias parsing/writing, quoted internal `Surface:Action` tables, legacy popup action ID aliases, canonical popup toggle names, AI split popup-vs-direct action labels, generated tmux config multi-alias rendering, global/direct conflict detection, surface-scoped native picker command conflict detection, Settings Keybindings list/search/detail surface-aware picker-local labels, simplified action detail rows, Labs compatibility redirect to the Keybindings root, capture/add-alias flows, unsafe raw capture, reset behavior, stale guide docs guards, and welcome/runtime footer copy that avoids hardcoded launch-key guides.
40
+ - `make test` also covers welcome revisit policy: legacy welcome state remains readable without suppressing shell entry, Enter continues without storing release skip, `s` stores an update skip for the current latest tag when an update is available, source installs show disabled Upgrade guidance, stale update cache refresh is best-effort, Settings > About > Welcome opens a Settings-native viewer without pending state, and shell prompt display does not schedule a redundant attach popup.
38
41
  - `make test` also covers transport-dependent app tmux defaults for pane/window navigation (`M-Left`/`M-Right`/`M-Up`/`M-Down` and `M-S-Left`/`M-S-Right`) while keeping visible default chords, allowing additive safe plain aliases that do not store or remove the transport defaults, and no UserKey/CSI-u generated fallback.
39
- - `make test` also covers direct `projmux ai split --agent <claude|codex|shell|selective>` launches, enabled-agent gating for disabled direct launches and disabled saved defaults, `--force-agent` as an explicit direct CLI-only override, selective picker filtering with all-disabled shell fallback guidance, config-default preservation, extra args appended to resolved agent executables, managed pane metadata, title watcher startup, layout application, plain shell split behavior, selective picker delegation, and invalid direct-agent usage errors.
42
+ - `make test` also covers direct `projmux ai split --agent <claude|codex|antigravity|shell|selective>` launches, enabled-agent gating for disabled direct launches and disabled saved defaults, `--force-agent` as an explicit direct CLI-only override, selective picker filtering with all-disabled shell fallback guidance, config-default preservation, extra args appended to resolved agent executables, managed pane metadata, title watcher startup, layout application, plain shell split behavior, selective picker delegation, invalid direct-agent usage errors, and regressions that direct concrete-agent and saved-default splits create a new pane without probing existing AI pane metadata or selecting an existing pane, including when launched from the current AI pane.
40
43
  - `make test` also covers Settings IA regression guards for `send-noti` visibility in Hooks, no nested Project recipe inside Hooks, Project recipe/AI/Labs view-first detail rows, Appearance Path/Git/Notify icon direct off/symbol/emoji preview selection with no Change page, Notifications root/Desktop notifications/Delivery sources relocation, localized Korean Desktop notifications root/detail chrome without visible English residue, Delivery sources command-row clipboard copy, and Labs Project Hooks overview-first rows.
41
44
  - `make test` also covers AI desktop notification dedupe precedence (env override > Settings saved value > default), Desktop notifications mode persistence through `desktop-notify-mode`, saved-config precedence over live tmux options, `projmux tmux apply` regeneration of `@projmux_desktop_notify_mode`, configured dedupe-window collapse/send behavior, Settings > Notifications AI dedupe preset/custom rows, explicit notify focus consume rules for selected critical rows and older same-pane non-critical AI cleanup, preservation of critical/permission/stop-failure/external/git/k8s rows during bulk cleanup, OS Toast click-to-focus queue consume, WSL Toast protocol handler hidden-launcher registration with `wsl.exe --exec` URI forwarding, and attention clear paths that do not ack the queue.
42
45
  - `make test` also covers AI hook runtime action precedence over catalog defaults, runtime quiet for known Codex notify events, runtime notify for known Claude quiet events, generic in-app-only notify rows for known Codex hook events without specialized handlers, suppression of desktop notification and `send-noti` dispatch on that generic path, separation of runtime hook action from catalog install events, Settings > Notifications hook quiet policy display/write behavior without external install/remove execution, hook desktop notification payload parity with the in-app queue text across the shared OS notification payload, normal/transient OS urgency and expiration for critical AI queue rows, and dormant title/capture fallback gating once a pane is hook-active.
43
- - `make test` also covers Settings > Session State as global settings-only UI with default-off auto-save and no window/pane tree, Settings > Project > Session State project-derived identity plus project auto-save override/effective source rows and distinct Save latest snapshot / Save named snapshot labels, closed-project save disabled reasons, named snapshot portable path conversion, project/global auto-save precedence, Projects > Sessions > State read-only latest/named snapshot overview with window/pane cwd/recipe/agent-resume health, user-facing `projmux session-state` status/save/delete/restore dry-run actions including explicit manual save bypass of disabled autosave and agent resume status/confidence preview, and Project open sidebar startup coverage for Labs opt-in `Start project`, default-off empty creation, Latest snapshot, Named snapshot, Empty session, Back, saved-at row metadata, existing-session skip, startup-before-trust ordering, detached sidebar open continuation before client-scoped separate trust popup handoff without sidebar inline trust UI, trust approve continuation, and trust deny/cancel no-session sidebar refresh behavior.
46
+ - `make test` also covers Settings > Session State as global settings-only UI with default-off auto-save, Sidebar startup picker relocation/compatibility, and no window/pane tree, Settings > Project > Session State project-derived identity plus project auto-save override/effective source rows and distinct Save latest snapshot / Save named snapshot labels, closed-project save disabled reasons, named snapshot portable path conversion, project/global auto-save precedence, Projects > Sessions > State read-only latest/named snapshot overview with window/pane cwd/recipe/agent-resume health, user-facing `projmux session-state` status/save/delete/restore dry-run actions including explicit manual save bypass of disabled autosave and agent resume status/confidence preview, and Project open sidebar startup coverage for Session State opt-in `Start project`, default-off empty creation, Latest snapshot, Named snapshot, Empty session, Back, saved-at row metadata, existing-session skip, startup-before-trust ordering, detached sidebar open continuation before client-scoped separate trust popup handoff without sidebar inline trust UI, trust approve continuation, and trust deny/cancel no-session sidebar refresh behavior.
44
47
  - `make test` also covers `projmux shell` usage without startup selector flags, project-context default target lookup from `PROJMUX_CWD` or nearest project marker, explicit `--session` separation from project-derived defaults, and direct empty attach behavior without shell startup picker/replay.
45
48
  - `make test` also covers app tmux naming metadata policy: pane border and automatic window rename share the visible pane label expression, AI topic panes feed window tab labels through `@projmux_ai_topic`, shell panes prefer the visible shell command label such as `zsh`, and `projmux shell` disables program-driven window renames while keeping automatic rename enabled.
46
49
  - `make test` also covers manual Session State Save snapshot and restore dry-run preview actions, title-first pane preview labels with legacy snapshot fallback, missing-snapshot messaging, and the absence of the removed statusbar State shortcut.
@@ -59,20 +62,21 @@
59
62
  - `make test` also covers the Globalization Phase 6 governance guard: Go string-literal audit classification for hardcoded Korean candidates, English user-facing candidates, and ignored literal/data/debug examples; no unapproved runtime Korean literals outside catalog/formatter/test fixtures; `en-US` coverage for every embedded default catalog key; and required `ko-KR` coverage for migrated notify, Settings, picker, welcome, update, and help surfaces.
60
63
  - `make test` also covers `projmux ai integrate tmux-bell` dry-run/install/remove tmux command planning, managed `alert-bell` hook append/idempotence/removal, preservation of unmanaged bell hooks, and `projmux ai ingest bell --pane` queue push/metadata/dedupe behavior for non-AI-managed panes.
61
64
  - `make test` also covers `projmux ai ingest log` tail/path rendering and bounded JSONL log trimming for ingest diagnostics.
62
- - `make test` also covers welcome revisit policy: shell `skip_version` gating, `s` skip vs Enter one-run continue, Settings > About > Welcome native viewer, and attach-popup no-duplicate/no-op behavior.
65
+ - `make test` also covers welcome revisit policy: legacy `skip_version` readability without shell suppression, `s` Skip until next vs Enter continue, Settings > About > Welcome native viewer, best-effort shell update cache refresh, and attach-popup no-duplicate/no-op behavior.
63
66
  - `make test` also covers `projmux quit` action-picker rows, cancel/close no-op behavior, explicit quit of only app-owned mux runtimes marked by `@projmux_app=1` on the selected `tmux`/`psmux -L projmux` backend, missing/default runtime no-ops, dispatcher wiring, and `Settings > About > Quit projmux` routing through the same picker before any shutdown side effect.
64
- - `make test` also covers the built-in semantic palette foundation: non-empty fallback truecolor/tmux tokens, distinct action/attention/AI/progress/danger roles, native picker chip/current/titlebar render strings including titlebar frame background/foreground inheritance without separate overlay ANSI, statusbar git/notify/usage/settings palette regressions, attention/pane-border/popup/switch progress color guards, renderer-only lead-mode topic prefix styling, settings/trust/destructive row color guards, Theme settings Phase 0/1 resolver behavior for project/global/fallback source labels, preset fill, explicit token override, invalid-layer warnings, and truecolor-to-tmux mapping, Phase 2 fallback render parity and project/global color isolation for native picker and tmux status/window background adapters, Phase 3 desired font config save/resolve plus unsupported `not applied` status without breaking no-adapter fallback rendering, and Phase 4 Settings theme editing boundaries for project/global resets, project inherit-vs-override labels, effective source labels, and project config theme values feeding the native project popup render path.
67
+ - `make test` also covers the built-in semantic palette foundation: non-empty fallback truecolor/tmux tokens, distinct action/attention/AI/progress/danger roles, native picker chip/current/titlebar render strings including titlebar frame background/foreground inheritance without separate overlay ANSI, statusbar git/notify/usage/settings palette regressions, attention/pane-border/popup/switch progress color guards, renderer-only lead-mode topic prefix styling, settings/trust/destructive row color guards, Theme settings Phase 0/1 resolver behavior for project/global/fallback source labels, preset fill, explicit token override, invalid-layer warnings, and truecolor-to-tmux mapping, Phase 2 fallback render parity and project/global color isolation for native picker and tmux status/window background adapters, native popup-toggle `display-popup -s` body style propagation from the effective theme without touching global popup/shell/status styles, Phase 3 desired font config save/resolve plus unsupported `not applied` status without breaking no-adapter fallback rendering, and Phase 4 Settings theme editing boundaries for project/global resets, project inherit-vs-override labels, effective source labels, and project config theme values feeding the native project popup render path.
65
68
  - Current focused unit coverage also includes strict notify SOT behavior
66
69
  (TTL does not remove rows, focus success and target-gone clicks ack,
67
70
  reconcile reports stale rows), `notify list --live` queue/live explanations, notify sidebar
68
71
  two-line card rendering with age/project/window/pane metadata plus focus/ack/non-critical-clear/clear-all
69
72
  actions, notify/statusbar/sidebar attention-vs-AI palette assertions including muted stale/gone rows,
70
- in-place `a` ack that refreshes the sidebar without
71
- focusing, non-critical `x` bulk clear that preserves critical rows, and empty
72
- state rendering after all visible non-critical rows are cleared, and `focus` dispatch diagnostics for session fallback, unresolved
73
+ native picker-session-local `a` ack that refreshes the sidebar without
74
+ focusing or restarting the picker, non-critical `x` bulk clear that preserves critical rows, empty
75
+ state rendering after all visible non-critical rows are cleared, and notify queue-write refresh events
76
+ that update an open native sidebar best-effort without failing queue pushes, and `focus` dispatch diagnostics for session fallback, unresolved
73
77
  targets, window fallback, pane fallback, explicit id failures as unresolved exits, and
74
78
  notify-only fallback.
75
- - Picker focused unit coverage includes backend-neutral picker item/action mapping, native title-focused filtering, numeric selection, shared close actions including raw native custom actions, deprecated picker backend value normalization, AI picker title chrome and stable search-key ordering, Settings title chrome and root section order, Settings Labs shell without backend choices plus keybindings compatibility redirect, environment override normalization, compact multi-line metadata gutters with one-column-indented metadata, proportional native scrollbar thumb rendering, native row width clamps that preserve ANSI resets and Korean/wide-cell frame geometry with matched scrollbar/no-scrollbar row budgets including Settings > Appearance AI badge preview rows and parent long emoji preview rows, native app-background coverage for fallback/effective themes across content padding, empty no-footer rows, footer rows, scrollbars, split-preview gaps, reset-to-padding continuation, and Korean Settings > Appearance AI badge style chips/prompt/emoji rows, multiline partial next/previous item row rendering with rendered-row scrollbar units, fixed split-preview and sidebar list viewports with scrollbar tracks, native up/down-family navigation wrap with empty-list safety and PageUp/PageDown/Home/End clamp regression coverage, native mouse down/follow-drag/release behavior, deferred native row updates that preserve filter/selection state, preview tab/control normalization before width clipping, optional native frame titlebars without same-line rule fill and with title/chip gap inheritance guards, titled native Alt-1 sidebar chrome, statusbar-preserving sidebar popup height, native-only compact project sidebar popup sizing, cheap Alt-1 first-paint rows with deferred git/window/attention/preview enrichment, fixed three-line Alt-1 sidebar row geometry across cheap/enriched paints, bulk switch existing-session classification with per-candidate fallback, and notify sidebar title/popup sizing.
79
+ - Picker focused unit coverage includes backend-neutral picker item/action mapping, native title-focused filtering, numeric selection, shared close actions including raw native custom actions, deprecated picker backend value normalization, AI picker title chrome and stable search-key ordering, Settings title chrome and root section order, Settings Labs shell without backend choices plus keybindings compatibility redirect, environment override normalization, compact multi-line metadata gutters with one-column-indented metadata, proportional native scrollbar thumb rendering, native row width clamps that preserve ANSI resets and Korean/wide-cell frame geometry with matched scrollbar/no-scrollbar row budgets including Settings > Appearance AI badge preview rows and parent long emoji preview rows, native app-background and semantic selected/muted/accent/warning/critical role coverage for fallback/effective themes across content padding, empty no-footer rows, footer rows, scrollbars, split-preview gaps, reset-to-padding continuation, and Korean Settings > Appearance AI badge style chips/prompt/emoji rows, multiline partial next/previous item row rendering with rendered-row scrollbar units, fixed split-preview and sidebar list viewports with scrollbar tracks, native up/down-family navigation wrap with empty-list safety and PageUp/PageDown/Home/End clamp regression coverage, native mouse down/follow-drag/release behavior, deferred native row updates that preserve filter/selection state and can repeat from event triggers, preview tab/control normalization before width clipping, optional native frame titlebars without same-line rule fill and with title/chip gap inheritance guards, titled native Alt-1 sidebar chrome, statusbar-preserving sidebar popup height, native-only compact project sidebar popup sizing, cheap Alt-1 first-paint rows with deferred git/window/attention/preview enrichment, fixed three-line Alt-1 sidebar row geometry across cheap/enriched paints, bulk switch existing-session classification with per-candidate fallback, and notify sidebar title/popup sizing.
76
80
  - Doctor focused unit coverage includes native Windows psmux dependency policy, Windows `stty` skip behavior, Linux tmux required/stale behavior, and native Windows tmux bell fallback skip diagnostics.
77
81
  - psmux focused unit coverage includes Windows native command rendering policy: PowerShell-generated config callbacks quote `projmux.exe` and argv without POSIX shell quoting, direct CreateProcess/C-runtime command-line rendering remains separate from PowerShell and `cmd.exe /c`, and paths/args containing spaces, quotes, backtick, dollar, ampersand, pipe, redirect characters, semicolon, parentheses, braces, caret, percent, and exclamation are pinned as data.
78
82
  - psmux app/session foundation focused unit coverage includes `PROJMUX_MUX_BACKEND` and platform-default backend selection, psmux `-L projmux` session create/attach/switch/ephemeral marker command args, list-sessions/list-windows/list-panes minimal inventory parsing, selected-backend app command wiring, and the explicit absence of pane-scoped metadata in psmux inventory rows.
@@ -22,6 +22,11 @@ projmux ai split --agent codex right
22
22
  projmux ai split --agent claude down
23
23
  ```
24
24
 
25
+ Every direct AI split invocation creates a new managed AI pane for the selected
26
+ agent. Existing Codex, Claude, or Antigravity panes in the same project/session
27
+ are left in place and are not selected by the shortcut. `right` and `down`
28
+ choose where the new pane is created.
29
+
25
30
  Add the separator only when you have extra arguments for the selected agent:
26
31
 
27
32
  ```sh
@@ -42,18 +47,18 @@ project defaults or current recommendations. If there are no private extra
42
47
  arguments, omit the separator entirely; do not leave a trailing bare `--`.
43
48
 
44
49
  Settings > AI Settings > Enabled agents is the source of truth for whether
45
- Claude and Codex may be launched. Disabled agents do not appear in the
50
+ Claude, Codex, and Antigravity may be launched. Disabled agents do not appear in the
46
51
  selective picker, and direct shortcut commands such as
47
52
  `projmux ai split --agent codex right` fail clearly instead of launching. This
48
53
  is intentional: shortcuts are thin direct CLI wrappers and must respect the
49
54
  same disabled state as hand-written commands.
50
55
 
51
56
  `--force-agent` is the only override, and it is explicit CLI policy for direct
52
- `--agent claude|codex` launches. Do not put it in shared picker, default-mode,
53
- or general shortcut registrations. Use it only in a private one-shot command
54
- when you deliberately want to launch a disabled agent without changing
55
- Settings. If every AI agent is disabled, `--agent selective` still offers a
56
- plain `shell` split and guidance to re-enable Claude/Codex.
57
+ `--agent claude|codex|antigravity` launches. Do not put it in shared picker,
58
+ default-mode, or general shortcut registrations. Use it only in a private
59
+ one-shot command when you deliberately want to launch a disabled agent without
60
+ changing Settings. If every AI agent is disabled, `--agent selective` still
61
+ offers a plain `shell` split and guidance to re-enable Claude/Codex/Antigravity.
57
62
 
58
63
  `shell` and `selective` are not targets for extra agent arguments. Use them
59
64
  without a tail:
package/docs/cli.md CHANGED
@@ -19,7 +19,7 @@ projmux <command> [args...]
19
19
 
20
20
  | Command | Purpose |
21
21
  | --- | --- |
22
- | `ai` | Manage tmux AI splits (Codex/Claude) and per-pane status. |
22
+ | `ai` | Manage tmux AI splits (Codex/Claude/Antigravity) and per-pane status. |
23
23
  | `attention` | View and manage live tmux pane attention state. |
24
24
  | `attach` | Open tmux lifecycle entry helpers. |
25
25
  | `current` | Resolve the active tmux pane path. |
@@ -129,9 +129,9 @@ with `--json`. Doctor does not diagnose terminal key delivery; use `projmux
129
129
  setup` for that.
130
130
 
131
131
  `Settings > Notifications > Delivery sources` shows active Codex hooks, Claude,
132
- and tmux statuses, conflicts, config paths, and copyable AI integration
133
- install/remove/dry-run commands. Settings does not install or remove external
134
- Codex, Claude, or tmux notify wiring.
132
+ Antigravity manual hook ingest, and tmux statuses, conflicts, config paths, and
133
+ copyable AI integration commands where available. Settings does not install or
134
+ remove external Codex, Claude, Antigravity, or tmux notify wiring.
135
135
 
136
136
  ## focus
137
137
 
@@ -152,6 +152,10 @@ client is attached on that socket, it emits the configured desktop
152
152
  notification instead. `--socket` is explicit; when omitted, the socket is
153
153
  derived from `$TMUX`.
154
154
 
155
+ After a successful tmux focus, `projmux focus` dispatches host-terminal
156
+ osfocus only when Desktop notification mode is `raise`. Modes `off` /
157
+ `none` and `notify` keep focus in tmux without a host-window raise.
158
+
155
159
  `--client` is a preferred origin tmux client. In-app consumers such as the
156
160
  status bar and notify sidebar pass the clicked client so focus redirects that
157
161
  display first. If that client is gone, focus falls back to an attached client
@@ -202,10 +206,13 @@ projmux notify reconcile [--json]
202
206
  - `push` — append (or refresh, with `--id`) one entry. `--ttl` defaults to
203
207
  `600` seconds as freshness metadata; it does not remove rows from
204
208
  `notify list`. `--text` is hard-capped to 80 runes (longer text is
205
- truncated server-side). After a successful queue write, projmux fires
206
- declarative `[hooks.send-noti]` asynchronously if configured. That hook gets
207
- a JSON payload on stdin plus `PROJMUX_NOTIFY_*` env vars, and it does not
208
- replace the normal desktop notification path.
209
+ truncated server-side). After a successful queue write, projmux sends a
210
+ best-effort refresh event to open native notify sidebars and fires
211
+ declarative `[hooks.send-noti]` asynchronously if configured. Event delivery
212
+ failure does not fail the queue write; reopening the sidebar still shows the
213
+ latest queue. The hook gets a JSON payload on stdin plus
214
+ `PROJMUX_NOTIFY_*` env vars, and it does not replace the normal desktop
215
+ notification path.
209
216
  - `list` — newest-first pending queue table `ID AGE SEV SRC TARGET TEXT`
210
217
  (or JSON). `--severity` and `--source` are repeatable filters.
211
218
  `--live` adds a non-mutating explanation table (or JSON report) that
@@ -215,10 +222,13 @@ projmux notify reconcile [--json]
215
222
  queue entries whose live pane no longer matches. `--ui=sidebar` opens the
216
223
  compact interactive notify list where Enter focuses and acks a target, `a`
217
224
  acks the selected row, `x` clears non-critical rows, and `Ctrl-X` clears all;
218
- opening or navigating the sidebar does not ack. The sidebar uses two-line cards with notification text
219
- first and compact age/project/window/pane metadata below. Hidden queue ids
220
- remain action values, but the sidebar has no search input. `--client` is
221
- used by tmux popup launchers to keep row-select focus on the clicked client.
225
+ opening or navigating the sidebar does not ack. While open, the native
226
+ sidebar refreshes its row list on successful queue-write events without an
227
+ Alt-2 close/reopen toggle, using the same deferred refresh path as `a` and
228
+ `x`. The sidebar uses two-line cards with notification text first and
229
+ compact age/project/window/pane metadata below. Hidden queue ids remain
230
+ action values, but the sidebar has no search input. `--client` is used by
231
+ tmux popup launchers to keep row-select focus on the clicked client.
222
232
  - `ack <id>` removes one entry; `--all` flushes the queue.
223
233
  - `reconcile` — walks `tmux list-panes -a` and back-fills entries for
224
234
  panes whose attention state is `reply` AND whose AI agent option is
@@ -234,7 +244,7 @@ Authoritative AI token usage. See [usage-tracking.md](usage-tracking.md)
234
244
  for adapter detail.
235
245
 
236
246
  ```
237
- projmux usage [--model codex|claude|all] [--window 5h|weekly|all]
247
+ projmux usage [--model codex|claude|antigravity|all] [--window 5h|weekly|all]
238
248
  [--json] [--force|-f]
239
249
  ```
240
250
 
@@ -245,6 +255,11 @@ Codex shares the global `30s`). `--json` emits the snapshot array; when
245
255
  backoff is active the wrapper `{snapshots, backoff}` object is emitted
246
256
  instead.
247
257
 
258
+ Antigravity has no supported 5-hour/weekly quota adapter. `--model
259
+ antigravity` renders an explicit unsupported note: the stable Antigravity
260
+ signal is `context-window-only` statusline data, which is not mixed into the
261
+ Claude/Codex quota HUD.
262
+
248
263
  ## status
249
264
 
250
265
  Per-segment status-bar renderers. All four are silent on failure — the
@@ -321,7 +336,7 @@ supplied window.
321
336
  ## ai
322
337
 
323
338
  ```
324
- projmux ai split [--agent <claude|codex|shell|selective>] [--force-agent] [right|down] [-- <extra-arg>...]
339
+ projmux ai split [--agent <claude|codex|antigravity|shell|selective>] [--force-agent] [right|down] [-- <extra-arg>...]
325
340
  projmux ai picker --inside <right|down>
326
341
  projmux ai settings
327
342
  projmux ai status set <thinking|waiting|idle> [--pane <id>]
@@ -329,6 +344,7 @@ projmux ai notify <reset|notify> [--pane <id>]
329
344
  projmux ai watch-title [--pane <id>]
330
345
  projmux ai ingest codex-hook < payload.json
331
346
  projmux ai ingest claude-hook < payload.json
347
+ projmux ai ingest antigravity-hook < payload.json
332
348
  projmux ai ingest bell --pane <pane_id>
333
349
  projmux ai ingest log [--tail N] [--json] [--path]
334
350
  projmux ai integrate codex [--dry-run] [--remove]
@@ -351,21 +367,25 @@ yellow respectively. That palette is independent from notify queue
351
367
  can still render a non-red action-required status badge.
352
368
 
353
369
  `ai split right|down` uses the configured default split mode. Add
354
- `--agent claude`, `--agent codex`, `--agent shell`, or `--agent selective` for
355
- a one-shot launch without changing that default. `--agent selective` opens the
356
- existing picker flow; `--agent shell` opens the existing plain shell split.
357
- Arguments after `--` are extra arguments appended to the resolved `claude` or
358
- `codex` executable inside the managed wrapper; projmux still sets the context
359
- directory, tmux title, AI pane metadata, title watcher, and split layout.
360
- Settings > AI Settings > Enabled agents controls Claude/Codex launch
370
+ `--agent claude`, `--agent codex`, `--agent antigravity`, `--agent shell`, or
371
+ `--agent selective` for a one-shot launch without changing that default.
372
+ Concrete `--agent claude|codex|antigravity` invocations create a new managed
373
+ agent pane every time; existing managed AI panes in the same project/session are
374
+ not selected or reused.
375
+ `--agent selective` opens the existing picker flow; `--agent shell` opens the
376
+ existing plain shell split. Arguments after `--` are extra arguments appended to
377
+ the resolved `claude`, `codex`, or `agy` executable inside the managed wrapper;
378
+ projmux still sets the context directory, tmux title, AI pane metadata, title
379
+ watcher, and split layout.
380
+ Settings > AI Settings > Enabled agents controls Claude/Codex/Antigravity launch
361
381
  visibility. Disabled agents are hidden from the selective picker and from the
362
382
  default-mode picker. A saved default that later becomes disabled fails clearly
363
- instead of falling back to another agent. Direct `--agent claude|codex` launches
364
- also fail when disabled, including shortcuts that call the same command. For a
365
- deliberate one-shot direct CLI launch, pass `--force-agent`; picker and saved
366
- default paths do not use this override. If all AI agents are disabled, the
367
- selective picker still offers the plain `shell` split and shows guidance to
368
- re-enable Claude/Codex.
383
+ instead of falling back to another agent. Direct
384
+ `--agent claude|codex|antigravity` launches also fail when disabled, including
385
+ shortcuts that call the same command. For a deliberate one-shot direct CLI
386
+ launch, pass `--force-agent`; picker and saved default paths do not use this
387
+ override. If all AI agents are disabled, the selective picker still offers the
388
+ plain `shell` split and shows guidance to re-enable Claude/Codex/Antigravity.
369
389
  For user-level skill, slash-command, editor, or launcher registrations that
370
390
  call this contract, see [AI Agent Shortcuts](ai-agent-shortcuts.md).
371
391
 
@@ -425,6 +445,28 @@ precedence over catalog `action` for known Claude events too; for example a
425
445
  noisy notify event can be made state-only or quiet without changing installed
426
446
  Claude hook commands.
427
447
 
448
+ `ingest antigravity-hook` is the manual hook/statusline entrypoint for
449
+ Antigravity CLI `agy` payloads observed in the Phase 0b smoke. Projmux does not
450
+ provide `projmux ai integrate antigravity`, does not install Antigravity hooks,
451
+ and does not mutate Antigravity user config. If users wire Antigravity manually,
452
+ the hook/statusline command should call an absolute `projmux` path or run from a
453
+ known cwd because relative command paths failed smoke.
454
+
455
+ The default known Antigravity catalog is intentionally narrow:
456
+ `PostInvocation` is quiet/log-only, `Stop` is notify, and `Statusline` is notify
457
+ only when manually wired and `tool_confirmation_pending=true`. `Stop` with
458
+ `error` or a non-normal `terminationReason` pushes a critical error row; `Stop`
459
+ without those error signals pushes an info completion row. Accepted identity
460
+ fields include `conversationId`/`conversation_id`, `cwd` or `workspace.path`,
461
+ `transcriptPath`, `fullyIdle`, `agent_state`, and `context_window`.
462
+ Antigravity notify metadata uses `agent=antigravity`. Phase 3 session-state
463
+ restore is included: Antigravity ingest stores `conversationId` as pane thread
464
+ metadata for matching and as session-state resume metadata. Restore uses
465
+ `agy --conversation <uuid>` when that id is present and UUID-shaped; otherwise
466
+ session-state preview/doctor render `resume unavailable`. Usage quota HUD
467
+ support remains unsupported because the only stable usage signal is
468
+ `context-window-only` statusline data. Transcript contents are not read.
469
+
428
470
  `ingest bell --pane <pane_id>` is the narrow tmux-bell fallback ingest path.
429
471
  It does not require the pane to be AI-managed. Projmux resolves session,
430
472
  window, pane, title, command, and socket metadata from tmux, pushes an info
@@ -637,10 +679,13 @@ latest/update/cache result. `--json` emits the same machine-readable
637
679
  status shape for both subcommands.
638
680
 
639
681
  `projmux shell` reads the same cache before opening the isolated tmux app.
640
- When the cache is fresh, an update is available, and the installer supports
641
- `update apply`, shell startup shows a small picker with Update Now, Later,
642
- and Skip This Version actions. This startup prompt never reaches the network;
643
- run `projmux update check` first when you want it to see the newest release.
682
+ When the cache is missing or stale, shell startup attempts a bounded
683
+ best-effort refresh, then continues even if the network check fails. When a
684
+ fresh cached update is available, the shell welcome uses Enter=Continue,
685
+ `u`=Upgrade, and `s`=Skip until next. Upgrade invokes only
686
+ `projmux update apply`; Skip until next writes the latest release tag to
687
+ `${XDG_CACHE_HOME:-~/.cache}/projmux/update-skip.json` and suppresses that tag
688
+ until a newer latest release appears.
644
689
 
645
690
  Installer detection honors
646
691
  `PROJMUX_INSTALLER=npm|go|github-release|source`. When unset or invalid,
@@ -675,9 +720,8 @@ installs.
675
720
  projmux welcome [--popup [--force]]
676
721
  ```
677
722
 
678
- Prints the onboarding shell guide (`projmux shell` welcome view) without
679
- starting tmux. This is useful when you want to revisit the key/shortcut/update
680
- walkthrough at any time.
723
+ Prints the shell-entry release prompt and bootstrap reminder without starting
724
+ tmux. This is useful when you want to revisit the welcome view at any time.
681
725
 
682
726
  `--popup` is the tmux attach-helper form. It shows the popup only when a
683
727
  pending attach welcome marker exists. `--popup --force` opens the popup without
@@ -710,7 +754,7 @@ flags with the top-level `switch` UX:
710
754
  tmux default shell when set, otherwise `/bin/sh`. `shell` starts or attaches
711
755
  the app session directly after resolving the target app session name and
712
756
  startup directory. Alt-1 sidebar project open defaults to `Empty session`; the
713
- Labs `Sidebar startup picker` opt-in shows `Latest snapshot`, `Named
757
+ Session State `Sidebar startup picker` opt-in shows `Latest snapshot`, `Named
714
758
  snapshot`, and `Empty session` before creating a closed project session.
715
759
  `Latest snapshot` is auto-saved; named snapshots are fixed until the user
716
760
  saves or replaces them.
@@ -127,6 +127,12 @@ do not break. Settings preserves existing prefix entries when rewriting the
127
127
  file, but does not create new prefix keys, and generated tmux config no longer
128
128
  binds the old action prefix chords.
129
129
 
130
+ Settings > Keybindings names `AISplitPickerToggle` as the AI split popup
131
+ picker toggle. That action opens or closes the picker UI and is separate from
132
+ the direct AI pane actions, `ai-split-right` and `ai-split-down`. The direct
133
+ actions create a new managed AI pane each time they run, leaving existing AI
134
+ panes in place. `right` and `down` choose where the new pane is created.
135
+
130
136
  Use an empty `keys` list to disable direct plain aliases for the action when
131
137
  editing the file by hand:
132
138
 
@@ -183,6 +189,14 @@ picker frames also apply the built-in fallback `background`/`foreground` tokens
183
189
  so picker-owned padding, empty rows, footer rows, and preview gaps do not
184
190
  inherit the terminal default background.
185
191
 
192
+ Native picker popups launched through `projmux tmux popup-toggle` also pass a
193
+ per-popup tmux 3.4 `display-popup -s` body style using the effective theme
194
+ `background`/`foreground` tmux tokens. This styles only the tmux popup body
195
+ before the native renderer draws. It does not set global `popup-style` or
196
+ `popup-border-style`, and it does not change shell pane backgrounds,
197
+ `default-style`, `window-style`, OSC terminal backgrounds, or the general
198
+ status/window palette.
199
+
186
200
  Resolver schema shape:
187
201
 
188
202
  ```toml
@@ -273,11 +287,12 @@ user/global preference in this release.
273
287
  | `PROJMUX_FOCUS_DEBUG` | When non-empty, `projmux focus` prints one telemetry line to stderr. |
274
288
  | `PROJMUX_PICKER_BACKEND` | Legacy picker backend override. Any value, including old `fzf` settings, now resolves to the native picker. |
275
289
  | `PROJMUX_INSTALLER` | Installer source hint used by update flows. npm installs set this automatically; advanced release installs can set `github-release`. |
290
+ | `PROJMUX_SHELL_UPDATE_CHECK_TIMEOUT_MS` | Timeout in milliseconds for the best-effort release check attempted by `projmux shell` when the update cache is missing or stale. Invalid, zero, or negative values use the default. |
276
291
 
277
292
  ## Welcome State
278
293
 
279
- `projmux shell` stores per-version welcome state under the projmux state
280
- directory, normally:
294
+ `projmux shell` still reads and rewrites legacy per-version welcome state under
295
+ the projmux state directory for attach-popup compatibility, normally:
281
296
 
282
297
  ```text
283
298
  ${XDG_STATE_HOME:-$HOME/.local/state}/projmux/welcomed-v<version>.json
@@ -295,11 +310,21 @@ The current schema is:
295
310
  }
296
311
  ```
297
312
 
298
- `skip_version` is the only field that suppresses the shell welcome. When it
299
- matches the current projmux version, `projmux shell` skips the welcome. When it
300
- is absent or names a different version, the welcome is shown again. Older state
301
- files that contain only `last_welcomed_version` remain readable, but that field
302
- does not count as a skip.
313
+ This file no longer suppresses the shell-entry welcome. `skip_version` and
314
+ `last_welcomed_version` remain readable for legacy state and pending attach
315
+ popup compatibility, but the automatic shell prompt now uses release skip state
316
+ instead.
317
+
318
+ Update prompt skips are stored by latest release tag under the update cache
319
+ directory:
320
+
321
+ ```text
322
+ ${XDG_CACHE_HOME:-$HOME/.cache}/projmux/update-skip.json
323
+ ```
324
+
325
+ When `tag_name` matches the fresh cached latest release tag, `projmux shell`
326
+ continues without offering the update actions. A newer latest tag makes the
327
+ prompt eligible again.
303
328
 
304
329
  Example:
305
330
 
@@ -401,7 +426,9 @@ only a generic in-app queue/sidebar/statusbar row; it does not fire OS toast,
401
426
  The OS-level dispatch carries three modes. The in-app notify queue, the
402
427
  statusbar segment, and the attention badge stay live regardless of which
403
428
  mode is active — only the toast / notify-send / auto-raise fan-out is
404
- gated here.
429
+ gated here. The same mode also gates `projmux focus` post-switch osfocus
430
+ dispatch: only `raise` asks the host terminal to come forward after a
431
+ successful tmux focus.
405
432
 
406
433
  | Mode | On push | On click |
407
434
  | --- | --- | --- |
@@ -413,7 +440,8 @@ Click activation is wired only for `raise`. The `projmux://` URI handler is
413
440
  registered on the first `raise` Notify of each tmux server (gated by the
414
441
  `@projmux_uri_protocol_registered_v6` marker). The
415
442
  mode only controls whether a toast fires at all and whether to follow it
416
- up with an on-push auto-raise.
443
+ up with an on-push auto-raise. `off` / `none` and `notify` also suppress
444
+ the focus-triggered osfocus raise after `projmux focus`.
417
445
 
418
446
  Resolution order (highest priority first):
419
447
 
@@ -551,8 +579,8 @@ while `on` and `off` take precedence. Auto-save only updates the latest
551
579
  snapshot. Named snapshots are manual and are never updated by auto-save.
552
580
 
553
581
  Project open from the Alt-1 sidebar defaults to opening a closed project as an
554
- `Empty session`. The optional `Settings > Labs > Sidebar startup picker` toggle
555
- enables the native sidebar `Start project` step. Rows appear as `Latest
582
+ `Empty session`. The optional `Settings > Session State > Sidebar startup
583
+ picker` toggle enables the native sidebar `Start project` step. Rows appear as `Latest
556
584
  snapshot`, named snapshot rows, `Empty session`, and `Back`. `Latest snapshot`
557
585
  is the snapshot auto-save that changes as auto-save runs; named snapshots are
558
586
  fixed snapshots. Rows include saved-at date/time metadata when projmux can
@@ -571,7 +599,7 @@ Default `projmux shell` no longer opens a startup picker or replays session-stat
571
599
  snapshots before attach. It still derives the default app session identity and
572
600
  startup directory from the current project context when available; otherwise it
573
601
  uses the `home` target and home directory. Session-state restore selection is
574
- limited to the Labs sidebar startup picker.
602
+ limited to the Session State sidebar startup picker.
575
603
 
576
604
  Settings > Session State is global settings only: global auto-save, auto-save
577
605
  interval, and storage/retention policy. Settings > Project > Session State
package/docs/hooks.md CHANGED
@@ -606,6 +606,39 @@ Codex and are managed from `Settings > Notifications > Hook quiet policy`.
606
606
  They only affect ingest delivery; `projmux ai integrate claude` still uses the
607
607
  catalog `install` field for installed hook events.
608
608
 
609
+ ## Antigravity Hook Ingest
610
+
611
+ `projmux ai ingest antigravity-hook < payload.json` is available for manual
612
+ Antigravity CLI `agy` hook/statusline payloads. Projmux does not provide
613
+ `projmux ai integrate antigravity`, does not install Antigravity hooks, and
614
+ does not mutate Antigravity user config. The Delivery sources diagnostic
615
+ therefore reports Antigravity as a read-only unsupported/manual row. If users
616
+ wire it by hand, use an absolute `projmux` command path or a known cwd because
617
+ relative command paths failed the Phase 0b smoke.
618
+
619
+ The default known Antigravity catalog records only observed Phase 0b signals
620
+ and marks them `install: false`:
621
+
622
+ | Event/signal | Behavior |
623
+ | --- | --- |
624
+ | `PostInvocation` | marks the matched pane hook-active and writes a quiet ingest diagnostic; no notify queue entry is pushed |
625
+ | `Stop` | pushes a completion row, or a critical error row when `error` is present or `terminationReason` is non-normal |
626
+ | `Statusline` with `tool_confirmation_pending=true` | pushes a critical approval row; this is only active when a statusline/manual status payload is wired to ingest |
627
+ | `Statusline` without `tool_confirmation_pending=true` | marks the matched pane hook-active and writes a quiet ingest diagnostic |
628
+ | unknown events | mark the matched pane hook-active and write quiet ingest diagnostics only |
629
+
630
+ Antigravity notify rows use `agent=antigravity` metadata. Accepted fields
631
+ include `conversationId`/`conversation_id`, `cwd`, `workspace.path`,
632
+ `transcriptPath`, `terminationReason`, `error`, `fullyIdle`, `agent_state`,
633
+ `context_window`, and nested `statusline.tool_confirmation_pending`.
634
+ Antigravity ingest uses `conversationId` as pane thread metadata for matching
635
+ and as session-state resume metadata. Session restore uses
636
+ `agy --conversation <uuid>` only when that id is present and UUID-shaped;
637
+ otherwise preview and doctor render `resume unavailable`. Antigravity usage
638
+ quota HUD support remains unsupported because the stable usage signal is
639
+ `context-window-only` statusline data, not 5-hour/weekly quota data. Raw
640
+ payloads or transcript contents are not stored.
641
+
609
642
  ## Ingest Debug Log
610
643
 
611
644
  Every `projmux ai ingest ...` path appends compact JSONL diagnostics to
package/docs/install.md CHANGED
@@ -28,14 +28,14 @@ projmux shell
28
28
  ```
29
29
 
30
30
  Each `projmux shell` launch prints a short welcome with the current version,
31
- detach/exit keys, core app shortcuts, and cached update status when available.
32
- Press Enter to continue for this run, or press `s` to skip the welcome for the
33
- current projmux version. The next projmux version shows the welcome again.
34
-
35
- If an installer-supported update is available, the same prompt keeps update
36
- actions separate from welcome skip: press `u` to run `projmux update apply`,
37
- `n` to print the manual update command, or `d` to skip daily update prompts for
38
- that release.
31
+ detach/exit keys, a bootstrap reminder, and cached release status when
32
+ available. Press Enter to continue into the shell.
33
+
34
+ If an update is available, the same shell-entry prompt uses one action
35
+ vocabulary: Enter continues, `u` upgrades by invoking `projmux update apply`,
36
+ and `s` skips that latest release tag until a newer tag appears. For `source`
37
+ or unknown installer sources, `u` prints installer guidance and then continues
38
+ shell entry.
39
39
 
40
40
  To revisit the guide later, run `projmux welcome`, or use Settings > About >
41
41
  Welcome inside the app to open it in a visible viewer. Set `PROJMUX_WELCOME=off` before
@@ -33,7 +33,7 @@ These shortcuts are the guaranteed launch defaults. They need no tmux prefix.
33
33
  | `Alt-1` | Project sidebar |
34
34
  | `Alt-2` | Notify sidebar |
35
35
  | `Alt-3` | Existing session popup |
36
- | `Alt-4` | AI split picker |
36
+ | `Alt-4` | AI split popup picker |
37
37
  | `Alt-5` | Settings |
38
38
 
39
39
  The tmux prefix remains the upstream default `Ctrl-b`. Inside a running
@@ -57,9 +57,20 @@ Optional direct aliases can be added for actions such as:
57
57
  | Canonical action | Meaning |
58
58
  | --- | --- |
59
59
  | `ProjectSwitcherToggle` | Project switcher popup |
60
+ | `AISplitPickerToggle` | AI split popup picker; pressing again closes the picker popup |
61
+ | `ai-split-right` | Open a new direct AI split to the right |
62
+ | `ai-split-down` | Open a new direct AI split below |
60
63
  | `new-window` | New tmux window in the current pane directory |
61
64
  | `rename-window` | Rename the current tmux window |
62
65
 
66
+ `AISplitPickerToggle` is the `Alt-4` popup picker toggle. It opens or closes
67
+ the picker UI where the user chooses the AI split mode. It is separate from
68
+ the direct `ai-split-right` and `ai-split-down` actions.
69
+
70
+ The direct AI split actions create a new managed AI pane each time they run.
71
+ Existing AI panes are left in place; the requested direction controls where the
72
+ new pane is created.
73
+
63
74
  Pane switching is catalogued as transport-dependent and the generated app tmux
64
75
  config binds `M-Left`, `M-Right`, `M-Up`, and `M-Down` to `select-pane`
65
76
  movement. Previous/next window remain transport-dependent and the generated app
@@ -132,7 +143,9 @@ Legacy popup IDs such as `sessionizer-sidebar`, `notify-sidebar`,
132
143
  `session-popup`, `ai-split-picker-right`, `ai-split-settings`, and
133
144
  `sessionizer` still read. Settings and new docs show the canonical toggle
134
145
  names: `ProjectSidebarToggle`, `NotifySidebarToggle`, `SessionPopupToggle`,
135
- `AISplitPickerToggle`, `SettingsToggle`, and `ProjectSwitcherToggle`.
146
+ `AISplitPickerToggle`, `SettingsToggle`, and `ProjectSwitcherToggle`. Direct
147
+ AI split actions keep their command IDs, `ai-split-right` and `ai-split-down`,
148
+ so Settings can distinguish them from the `Alt-4` popup picker toggle.
136
149
 
137
150
  ## Diagnose: `projmux setup`
138
151
 
@@ -32,6 +32,7 @@ native picker engine and is not a public dependency-policy change.
32
32
  | close `--bind key:abort` | Esc, Ctrl-C, Alt-N, Ctrl-Alt-S variants | Covered | `CloseActions`; `TestNativeRunnerUsesSharedCloseActions` |
33
33
  | terminal modified-key encoding | legacy parser fixtures, Ghostty/kitty-style modified keys | Covered | native handles app-specific parser fixtures, generic modified letters/digits, and non-text keys such as Enter/Esc/Backspace/Tab; this is backend parity, not product fallback guidance; `TestNativeInteractiveSupportsCSIuAppKeyBindings` |
34
34
  | `execute-silent(...)+refresh-preview` | switch/session preview cycling | Covered for command execution and rerender loop | `pickercompat.PickerOptions`/`pickercompat.OptionsFromPicker`; `TestNativeInteractiveRunsCustomActionCommandAndRefreshes`; `TestPickerOptionsMapsCompatBindingsToContractActions`; Docker no-fzf e2e sends `Right` and `Alt-Down` before selection |
35
+ | action-local/event-backed mutable refresh | notify sidebar `a` ack and `x` non-critical clear; notify sidebar queue-write event refresh; switch sidebar `Ctrl-X` kill | Covered for in-session row/live-state refresh without picker restart | `picker.Action.Mutate` returns a `DeferredUpdate`, notify queue-write events trigger the same `DeferredUpdate` path after an event arrives, and both reuse the native frame diff renderer plus value-then-clamp selection preservation; `TestNativeInteractiveCustomActionMutatesItemsAndRefreshes`; `TestNativeInteractiveCustomActionRefreshPreservesSelectedValue`; `TestNativeInteractiveDeferredUpdateTriggerRefreshesRepeatedly`; notify sidebar app tests assert one picker invocation with refreshed rows/live state and event subscription; switch sidebar kill app tests assert one native picker invocation with refreshed rows/preview and previous-live-session guard preservation |
35
36
  | `focus:execute-silent(...)` | switch sidebar focus | Covered | native renders the selection frame diff before running sidebar focus commands so movement stays visible before tmux focus side effects; `runNativeFocusAction`; `TestNativeInteractiveRunsFocusActionOnSelectionChange` |
36
37
  | `start:pos(N)` | switch sidebar initial row | Covered | `pickercompat.PickerOptions`/`pickercompat.OptionsFromPicker`; `TestPickerOptionsFromCompatPickerMapsStartPosToInitialIndex`; `TestPickerOptionsMapsCompatBindingsToContractActions` |
37
38
  | `--preview` | switch, sessions | Covered by command output | `nativePreviewLines`; `TestNativeInteractiveRendersSelectedPreview` |
@@ -47,7 +48,7 @@ native picker engine and is not a public dependency-policy change.
47
48
  | alternate-screen lifecycle | fzf fullscreen picker screen restore | Covered | native frame updates and screen exit return to column 0 before terminal control sequences, screen exit resets styles plus clears the alternate buffer from the home cursor before restore, and real TTY restores get a short settle window before caller handoff; `nativeScreenEnter`; `TestNativeInteractiveUsesAlternateScreen`; `TestRenderFullFrameUpdateAlwaysHomesAndWritesFrame` |
48
49
  | frame content width | fzf border inner width | Covered | `ContentLayout` uses the frame inner width so separators and rows reach the right border; `TestRendererContentLayoutUsesFrameInnerWidth` |
49
50
  | picker-owned app background | native picker frame interior | Covered for renderer-owned cells | `ThemeFromEffective` applies built-in fallback and explicit effective background/foreground SGR to the native frame, and frame rows resume the app style after embedded resets so content padding, empty no-footer rows, footer rows, scrollbars, and preview gaps do not leak terminal default background; `TestThemeFromEffectiveFallbackPaintsFrameBackground`; `TestRendererFrameBackgroundResumesAfterContentResetBeforePadding`; `TestNativeInteractiveNoFooterBlankRowsUseThemeBackground`; `TestNativeInteractiveSplitPreviewGapsUseThemeBackground`; `TestNativeInteractiveSettingsAIBadgeStyleLongPreviewClampsFrameRows` |
50
- | tmux popup frame interaction | native picker popups launched through `popup-toggle` | Covered for native backend popups | `popup-toggle` passes tmux `display-popup -B` when `PROJMUX_PICKER_BACKEND=native`, so the native picker owns the visible frame instead of double-drawing with the tmux popup border; native Alt-1 uses a compact native-only minimum while fzf keeps the previous project sidebar minimum; Alt-1/Alt-2 sidebar heights reserve two bottom statusbar rows; Alt-2 notify sidebar keeps the fzf-like `24%` / min `64` baseline; `TestAppRunTmuxPopupToggleUsesBorderlessPopupForNativeBackend`; `TestSessionizerSidebarWidthKeepsFZFMinimum`; `TestSidebarPopupHeightLeavesStatusbarRows`; `TestNotifySidebarWidthMatchesFZFBaseline`; `TestAppRunTmuxPopupToggleKeepsNotifySidebarFZFSizingForNative` |
51
+ | tmux popup frame interaction | native picker popups launched through `popup-toggle` | Covered for native backend popups | `popup-toggle` passes tmux `display-popup -B` when `PROJMUX_PICKER_BACKEND=native`, so the native picker owns the visible frame instead of double-drawing with the tmux popup border; tmux 3.4 per-command `display-popup -s` is used for the popup body style, setting `bg`/`fg` from the same effective theme tmux background/foreground tokens so tmux's blank/pre-draw popup body matches the native picker surface before the app renderer paints; no global `popup-style`, `popup-border-style`, shell pane background, `default-style`, `window-style`, OSC background, or status/window palette options are changed; native Alt-1 uses a compact native-only minimum while fzf keeps the previous project sidebar minimum; Alt-1/Alt-2 sidebar heights reserve two bottom statusbar rows; Alt-2 notify sidebar keeps the fzf-like `24%` / min `64` baseline; `TestAppRunTmuxPopupToggleUsesBorderlessPopupForNativeBackend`; `TestAppRunTmuxPopupToggleUsesNativePopupBodyStyleFromEffectiveTheme`; `TestBuildPopupToggleWithPickerBackendStylesNativeOnly`; `TestBuildDisplayPopupArgsAddsBodyStyle`; `TestSessionizerSidebarWidthKeepsFZFMinimum`; `TestSidebarPopupHeightLeavesStatusbarRows`; `TestNotifySidebarWidthMatchesFZFBaseline`; `TestAppRunTmuxPopupToggleKeepsNotifySidebarFZFSizingForNative` |
51
52
  | optional native titlebar | native picker popup frame | Covered for empty-title compatibility and opt-in titles | `picker.Options.Title`; `RenderFrameWithTitle`; `ContentLayoutWithTitle`; empty titles keep the prior frame unchanged, non-empty titles render in a picker-owned section below the top border, titlebar text/divider/chip gaps inherit the frame background/foreground instead of a separate titlebar overlay ANSI layer, and the native Alt-1 project sidebar opts into `Projects`; `TestRendererRenderFrameWithTitleKeepsDefaultWhenTitleEmpty`; `TestRendererRenderFrameWithTitleUsesTitlebarRow`; `TestRendererContentLayoutWithTitleReservesTitlebarRow`; `TestNativeInteractiveRendersOptionalTitlebar`; `TestSwitchCommandNativeSidebarSetsTitle` |
52
53
  | redraw flicker/top clipping | keyboard navigation in exact-height tmux popup | Partially covered | native redraws use synchronized updates plus coalesced row diffs after the first frame, skip unchanged frames, render frame diffs before sidebar focus commands, frame rendering avoids trailing bottom-border CRLF, and screen exit clears the alternate buffer before restore; `TestNativeInteractiveWrapsRedrawsInSynchronizedUpdates`; `TestFrameUpdateRendererSkipsUnchangedFrame`; `TestFrameUpdateRendererCoalescesEachFrameUpdate`; `TestRendererRenderFrameUsesCRLFRowsForRawTTY`; `TestNativeInteractiveUsesAlternateScreen` |
53
54
 
@@ -110,8 +111,10 @@ contract; native popups still rely on the existing borderless tmux popup path.
110
111
  the right-side preview layout instead of inline preview, asserts the stored
111
112
  preview cursor, selects `bravo-web`, and asserts tmux reports the selected
112
113
  session's active target on the expected window with the expected pane path.
113
- - `notify sidebar`: native routing is unit-covered; Docker no-fzf e2e pushes a
114
- notification, presses printable expect key `a`, and verifies the row is acked.
114
+ - `notify sidebar`: native routing is unit-covered; app tests cover
115
+ queue-write event subscription and picker tests cover repeated
116
+ event-triggered deferred refresh. Docker no-fzf e2e pushes a notification,
117
+ presses printable expect key `a`, and verifies the row is acked.
115
118
 
116
119
  ## Experimental Boundaries
117
120
 
@@ -13,6 +13,7 @@ via `projmux focus`, and feeds the HUD pill rendered by
13
13
  ```
14
14
  ${XDG_STATE_HOME:-$HOME/.local/state}/projmux/notify.json
15
15
  ${XDG_STATE_HOME:-$HOME/.local/state}/projmux/notify.json.lock
16
+ ${XDG_STATE_HOME:-$HOME/.local/state}/projmux/notify-queue-events/refresh-*.sock
16
17
  ```
17
18
 
18
19
  The lock file is acquired via `O_CREATE|O_EXCL` with bounded retry
@@ -24,6 +25,13 @@ The queue file is a pretty-printed JSON array of `Notification`
24
25
  objects, sorted newest-first on read. `expires_at` is freshness metadata;
25
26
  expired entries are not filtered or deleted by `list`.
26
27
 
28
+ Open native notify sidebars also create per-process Unix datagram sockets for
29
+ queue-write refresh events. If the state-dir socket path would exceed Unix
30
+ socket path limits, projmux uses a short per-state-dir temp runtime path for
31
+ the socket directory. These sockets are transient UI delivery endpoints only:
32
+ they are not queue state, do not change the JSON schema, and are removed when
33
+ the sidebar exits.
34
+
27
35
  ## Data model
28
36
 
29
37
  `internal/core/notify`:
@@ -58,11 +66,17 @@ exit code 2.
58
66
  routing/debug context such as `agent`, `thread_id`, `turn_id`, `cwd`,
59
67
  `model`, and `client`; Claude hook rows also carry event-specific keys such as
60
68
  `tool_name`, `tool_input.command`, `error_type`, `subagent_type`, and
61
- `teammate_name`. Tmux bell fallback rows carry `agent=bell`, `event=bell`,
62
- and tmux target context such as pane title, command, session, window, pane, and
63
- socket. `notify list --json` includes this metadata as the structured data
64
- channel while human table/sidebar output keeps the compact text body. Existing
65
- entries without metadata remain valid.
69
+ `teammate_name`. Antigravity manual hook rows carry `agent=antigravity`,
70
+ `conversation_id`, `termination_reason`, `fully_idle`,
71
+ `tool_confirmation_pending`, `agent_state`, and `context_window` when present.
72
+ The same `conversation_id` can seed session-state restore via
73
+ `agy --conversation <uuid>` when it is UUID-shaped; Antigravity quota usage
74
+ remains unsupported because `context_window` is not 5-hour/weekly quota data.
75
+ Tmux bell fallback rows carry `agent=bell`, `event=bell`, and tmux target
76
+ context such as pane title, command, session, window, pane, and socket.
77
+ `notify list --json` includes this metadata as the structured data channel
78
+ while human table/sidebar output keeps the compact text body. Existing entries
79
+ without metadata remain valid.
66
80
 
67
81
  ## CLI surface
68
82
 
@@ -100,11 +114,22 @@ pane and acks the row after focus succeeds. The surface actions
100
114
  are edited in Settings, while internal picker aliases are adjusted in
101
115
  `keymap.toml` when needed. Runtime footer key guides read the merged keymap
102
116
  and show the default alias when present, otherwise the first configured alias,
103
- so custom aliases do not make the UI stale. Rows are intentionally compact: the visible label keeps
117
+ so custom aliases do not make the UI stale. `NotifySidebar:Ack` and
118
+ `NotifySidebar:ClearNonCritical` refresh rows, live state, and selection inside
119
+ the same native picker session; `NotifySidebar:ClearAll` still closes the
120
+ popup and prints a summary. Rows are intentionally compact: the visible label keeps
104
121
  notification text first, then age, project, window, and pane metadata; hidden
105
122
  queue ids remain action values but the sidebar has no search input and
106
123
  intentionally does not expose a separate metadata detail view.
107
124
 
125
+ When a new pending notification is successfully pushed by any app producer
126
+ (`notify push`, reply-ready, reconcile backfill, or bell fallback), open native
127
+ notify sidebars receive a best-effort queue-write event and rerun the same
128
+ `DeferredUpdate` row/live-state refresh path used by `a` ack and `x`
129
+ non-critical clear. Event delivery errors are ignored after the queue write:
130
+ the push still succeeds, and reopening the sidebar remains the recovery path
131
+ for seeing the latest queue.
132
+
108
133
  `--live` adds a non-mutating explanation view that reads
109
134
  `tmux list-panes -a` and compares the queue with live reply-state panes. It
110
135
  does not push, ack, or otherwise repair anything. Human output keeps the
@@ -153,6 +178,9 @@ path), then:
153
178
  - reports every existing queue entry whose id starts with `ai:` and whose
154
179
  pane no longer matches that condition as stale, without acking it.
155
180
 
181
+ Successful backfill pushes publish the same best-effort open-sidebar refresh
182
+ event as other pending queue additions.
183
+
156
184
  Soft-fails when tmux is not running (returns a populated `errors`
157
185
  field rather than a non-zero exit) so the post-install hook does not
158
186
  break. Run this as the recovery path when the on-disk queue has drifted
@@ -180,7 +208,10 @@ an entry with:
180
208
  When the pane leaves the reply state (manual `attention clear`,
181
209
  `status set idle`, or a window close), `AckReplyReady` intentionally does not
182
210
  remove the entry. The user consumes it through explicit ack. Store errors are
183
- swallowed so the live tmux UI never blocks on disk IO.
211
+ swallowed so the live tmux UI never blocks on disk IO. After a successful
212
+ queue write and same-pane non-critical compaction, the producer publishes the
213
+ same best-effort notify-sidebar queue-write refresh event used by
214
+ `projmux notify push`.
184
215
 
185
216
  Manual `projmux attention toggle` on a pane without an agent option
186
217
  does NOT push — the queue is intentionally AI-driven; reconcile honours
@@ -200,7 +231,9 @@ tmux and writes an info/source-ai row with:
200
231
  Unlike reply-ready reconcile, bell ingest does not require AI pane metadata.
201
232
  It is intentionally available for arbitrary CLIs that only signal attention
202
233
  through BEL or OSC 9. Repeated bells from the same pane are suppressed for 5
203
- seconds before a later bell refreshes the stable queue id.
234
+ seconds before a later bell refreshes the stable queue id. Successful
235
+ non-deduped bell queue writes publish the same best-effort open-sidebar
236
+ refresh event as other pending queue additions.
204
237
 
205
238
  ## Consumer (status-bar click)
206
239
 
@@ -230,8 +263,11 @@ Outcomes:
230
263
 
231
264
  The same consume policy is shared by notify-sidebar Enter and OS
232
265
  click-to-focus Toast callbacks after a real tmux focus dispatch succeeds.
266
+ OS Toast click-to-focus is only registered when Desktop notification mode is
267
+ `raise`; the in-app sidebar/statusbar consume path works in every mode.
233
268
  Pane focus hooks and attention clear paths remain live-attention-only and do
234
- not ack the notify queue. Non-critical AI completion producers also compact
269
+ not ack the notify queue; their response-complete badge consume is limited to
270
+ live tmux pane badge/state options. Non-critical AI completion producers also compact
235
271
  older same-pane non-critical AI rows after replacing/pushing their latest row,
236
272
  so reply-ready/stop/bell-style completion rows stay latest-state centered
237
273
  without changing the queue schema or TTL contract.
@@ -51,8 +51,12 @@ CLI for inspection/actions.
51
51
  Agent restore direct-starts supported resume commands when creating fresh tmux
52
52
  panes, matching the `projmux ai split` wrapper shape: the wrapper prepends the
53
53
  agent binary directory to `PATH`, changes to the saved cwd, sets the terminal
54
- and tmux pane title from the saved agent topic, then execs `codex resume <id>`
55
- or `claude --resume <id>`. This avoids typing agent resumes with
54
+ and tmux pane title from the saved agent topic, then execs `codex resume <id>`,
55
+ `claude --resume <id>`, or `agy --conversation <uuid>`. Antigravity restore
56
+ uses only the stable statusline `conversation_id` or hook `conversationId`
57
+ metadata captured as the pane resume id; missing or non-UUID Antigravity ids
58
+ render as `resume unavailable` rather than falling back silently to a shell
59
+ recipe. This avoids typing agent resumes with
56
60
  `tmux send-keys`. The restore wrapper is still a non-interactive shell command
57
61
  tail, so it does not replay the original pane's interactive shell startup,
58
62
  environment, shell functions, aliases, or live process state. Startup recipes
@@ -74,7 +78,7 @@ when building `Named snapshot` candidates; new primary surfaces should describe
74
78
  the restore unit as a snapshot, not as a separate layout or preset feature.
75
79
 
76
80
  Project open from the Alt-1 sidebar defaults to opening a closed project as an
77
- `Empty session`. `Settings > Labs > Sidebar startup picker` is an opt-in toggle;
81
+ `Empty session`. `Settings > Session State > Sidebar startup picker` is an opt-in toggle;
78
82
  when it is on, closed project open advances inside the sidebar to the native
79
83
  `Start project` step. Rows are ordered `Latest snapshot`, named snapshot rows,
80
84
  `Empty session`, then `Back`. `Latest snapshot` is the auto-saved snapshot that
@@ -98,5 +102,5 @@ directly without a startup picker or trust gate.
98
102
  Default `projmux shell` no longer opens a compatibility startup picker and no
99
103
  longer accepts startup selector flags for session-state restore. It always
100
104
  follows the normal empty attach path after resolving the target app session name
101
- and startup directory. Use `Settings > Labs > Sidebar startup picker` for
105
+ and startup directory. Use `Settings > Session State > Sidebar startup picker` for
102
106
  interactive Latest snapshot / Named snapshot / Empty session selection.
@@ -62,6 +62,10 @@ view-first layout:
62
62
  runtime action values and writes only
63
63
  `${XDG_CONFIG_HOME:-$HOME/.config}/projmux/ai-hook-actions.json`. It does not
64
64
  edit catalog `install` values or run agent install/remove commands.
65
+ - `Settings > Session State > Sidebar startup picker` controls the Alt-1
66
+ project-open startup selector. The saved file remains
67
+ `${XDG_CONFIG_HOME:-$HOME/.config}/projmux/sidebar-startup-picker`, and the
68
+ stale `labs:sidebar-startup-picker` action opens this Session State detail.
65
69
  - `Settings > Labs` keeps experimental toggles, but keybindings no longer have a
66
70
  visible Labs row. The hidden compatibility action redirects to the
67
71
  `Settings > Keybindings` action list, not to a diagnostic default.
@@ -107,5 +111,6 @@ Shell bootstrap UX is phase-split:
107
111
  - `projmux welcome` remains the stdout revisit command.
108
112
  - `Settings > About > Welcome` opens a visible native viewer independent of
109
113
  shell skip state.
110
- - Shell `skip_version` state applies only to the automatic `projmux shell`
111
- prompt; it does not hide manual revisit surfaces.
114
+ - Legacy shell `skip_version` state remains readable for compatibility but no
115
+ longer suppresses the automatic `projmux shell` prompt; release skips live in
116
+ `update-skip.json` and do not hide manual revisit surfaces.
package/docs/statusbar.md CHANGED
@@ -46,6 +46,9 @@ row 1 [#S] #{pane_current_path} ⎈ <ctx>/<ns> <git>  %H:%M
46
46
  notify queue segment and from notify queue severity or desktop notification
47
47
  urgency. For example, an approval request may remain a critical queued
48
48
  notification while its live status badge renders action-required amber-orange.
49
+ Pane focus hooks and `projmux attention clear` consume only the
50
+ response-complete live badge, including stale `@projmux_ai_state=waiting`
51
+ fallback state; action-required and in-progress live badges remain visible.
49
52
  Window-list badges and app pane-border badges use the same semantic priority,
50
53
  with display style controlled by Settings > Appearance > AI badge style and persisted in
51
54
  `~/.config/projmux/ai-badge-style`. The default is `dot`; `emoji` renders
package/docs/testing.md CHANGED
@@ -117,12 +117,15 @@ Observe:
117
117
  `"reason":"no-attached-client"`.
118
118
  - Windows shows a short projmux toast with `session ready:
119
119
  projmux-host-smoke`.
120
+ - In `notify` mode, the toast has no click-to-focus action and should not
121
+ auto-raise the host terminal.
120
122
  - No visible PowerShell or console window remains open after the toast.
121
123
 
122
124
  If the PR changes click-to-focus behavior, repeat with
123
125
  `PROJMUX_DESKTOP_NOTIFY_MODE=raise`, click the toast, and record whether the
124
- host terminal returns to the target. Otherwise leave click callbacks marked as
125
- manual/not run.
126
+ host terminal returns to the target. `raise` should also be the only mode where
127
+ `projmux focus` performs post-switch osfocus. Otherwise leave click callbacks
128
+ marked as manual/not run.
126
129
 
127
130
  ### macOS GUI Notification
128
131
 
package/docs/upgrading.md CHANGED
@@ -3,13 +3,14 @@
3
3
  projmux has two update surfaces:
4
4
 
5
5
  - `projmux shell` reads the cached release status before opening the app. When
6
- the cache is fresh and a newer release is available, startup shows a picker
7
- with Update Now, Later, and Skip This Version actions.
6
+ the cache is missing or stale, startup attempts a short best-effort refresh
7
+ and continues if it fails. When a newer release is available, the shell
8
+ welcome offers Continue, Upgrade, and Skip until next actions.
8
9
  - Settings > About > Update shows the current version, detected installer,
9
10
  cached latest version, Check Updates, and Update Now actions.
10
11
 
11
- Startup never reaches the network. Refresh the cache explicitly when you want
12
- projmux to check GitHub Releases:
12
+ Refresh the cache explicitly when you want a full foreground GitHub Releases
13
+ check:
13
14
 
14
15
  ```sh
15
16
  projmux update check
@@ -24,6 +25,11 @@ projmux update apply
24
25
  Use `--dry-run` to see the planned action and `--no-apply` to skip reloading
25
26
  the live tmux config after the binary changes.
26
27
 
28
+ Shell Upgrade invokes only `projmux update apply`. Shell Skip until next stores
29
+ the current latest release tag in `update-skip.json`; the prompt appears again
30
+ when the cached latest tag changes. For `source` and unknown installer sources,
31
+ Upgrade prints guidance and continues shell entry without applying anything.
32
+
27
33
  ## npm Installs
28
34
 
29
35
  The recommended install path is:
@@ -1,10 +1,26 @@
1
1
  # Usage tracking
2
2
 
3
3
  `projmux usage` and `projmux status usage` report authoritative 5-hour
4
- and weekly utilisation for both Claude Code and the Codex CLI. Both
5
- adapters read from the upstream's own view of the account so the
4
+ and weekly utilisation for enabled AI agents. `--model all`, the tmux
5
+ HUD, and the statusbar usage popup use Settings > AI Settings > Enabled
6
+ agents as the source of truth, so disabled Claude/Codex providers are
7
+ not refreshed or rendered on ambient/all surfaces. Explicit read-only
8
+ requests such as `projmux usage --model claude` or `--model codex`
9
+ still collect and render that provider even when it is disabled.
10
+
11
+ Both adapters read from the upstream's own view of the account so the
6
12
  percentages match what `claude /usage` and `codex` show natively.
7
13
 
14
+ Antigravity is intentionally not registered as a 5-hour/weekly quota adapter.
15
+ The only stable Phase 0b usage signal is statusline `context_window`, which is
16
+ conversation context-window usage, not account quota usage. `projmux usage
17
+ --model antigravity` and ambient all-model table output therefore render an
18
+ explicit unsupported note when Antigravity is enabled. The statusbar usage
19
+ popup shows an `Antigravity ctx ... unsupported` row, while the compact tmux
20
+ status segment stays silent unless Claude/Codex quota rows exist. Projmux does
21
+ not infer quota, reset timestamps, or account limits from screen scraping,
22
+ tokens, history, OAuth/cache files, or binary strings.
23
+
8
24
  ## Adapters
9
25
 
10
26
  ### Claude (`internal/core/usage/adapters/claude`)
@@ -79,12 +95,13 @@ across machines (Dropbox, iCloud Drive).
79
95
  ### `projmux usage`
80
96
 
81
97
  ```
82
- projmux usage [--model codex|claude|all] [--window 5h|weekly|all]
98
+ projmux usage [--model codex|claude|antigravity|all] [--window 5h|weekly|all]
83
99
  [--json] [--force|-f]
84
100
  ```
85
101
 
86
- Calls `Manager.Collect` (or `ForceCollect` with `--force`), filters by
87
- model/window, and renders the tab-aligned table:
102
+ For `--model all`, calls `Manager.Collect` (or `ForceCollect` with
103
+ `--force`) only for providers enabled in Settings > AI Settings >
104
+ Enabled agents, filters by window, and renders the tab-aligned table:
88
105
 
89
106
  ```
90
107
  MODEL WINDOW PCT RESETS_AT STALE
@@ -103,16 +120,27 @@ instead. A backoff note is appended to the human table:
103
120
  claude is in backoff, try again in 30m (use --force to bypass)
104
121
  ```
105
122
 
123
+ When no AI agents are enabled, all-model table output contains no
124
+ provider rows and prints a short Settings hint. `--json` returns an
125
+ empty array. Explicit `--model claude` and `--model codex` bypass the
126
+ enabled-agent filter for read-only inspection and collect/render only
127
+ the requested adapter. Explicit `--model antigravity` renders the same
128
+ unsupported/context-window-only note even when Antigravity is disabled, because
129
+ there is no supported Antigravity quota adapter to collect.
130
+
106
131
  ### `projmux status usage`
107
132
 
108
133
  ```
109
134
  projmux status usage [--max-width N] [--force|-f]
110
135
  ```
111
136
 
112
- The HUD bar wired to the tmux status interval. Triggers an
113
- opportunistic refresh: `MaybeCollect(throttle=30s)` (subject to
114
- per-adapter throttle and active backoff). Errors are swallowed unless
115
- `PROJMUX_USAGE_DEBUG` is set. Then loads the cache and renders.
137
+ The HUD bar wired to the tmux status interval. It scopes the registry to
138
+ enabled AI agents, then triggers an opportunistic refresh:
139
+ `MaybeCollect(throttle=30s)` (subject to per-adapter throttle and active
140
+ backoff). Disabled providers are not refreshed just to be hidden. Errors
141
+ are swallowed unless `PROJMUX_USAGE_DEBUG` is set. Then it loads the
142
+ cache, filters to the same enabled-agent scope, and renders. If no AI
143
+ agents are enabled, the status segment emits nothing.
116
144
 
117
145
  Output degrades through six tiers as `--max-width` shrinks:
118
146
 
@@ -132,10 +160,11 @@ because the rollout file is always near-current (no throttle gap to report).
132
160
  ### Statusbar usage popup
133
161
 
134
162
  `projmux statusbar click usage` renders a native-framed popup from the same
135
- cache instead of shelling out to `projmux usage`. This keeps `projmux usage
136
- --json` backwards-compatible for CLI consumers while giving the tmux click path
137
- a structured table with aligned rows, right-aligned numeric values, dim
138
- unavailable cells, amber usage at 80%, and red usage at 95%.
163
+ cache instead of shelling out to `projmux usage`. The popup filters rows and
164
+ sync metadata to the same enabled-agent scope as the ambient HUD. This keeps
165
+ `projmux usage --json` backwards-compatible for CLI consumers while giving the
166
+ tmux click path a structured table with aligned rows, right-aligned numeric
167
+ values, dim unavailable cells, amber usage at 80%, and red usage at 95%.
139
168
 
140
169
  The popup sync line uses the maximum authoritative `LastCollect` timestamp from
141
170
  the cache. If that field is unavailable, it falls back to the snapshots file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.6.6",
3
+ "version": "0.6.7",
4
4
  "description": "tmux project session manager",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/crevissepartners/projmux#readme",
@@ -28,9 +28,9 @@
28
28
  "package:npm:pack": "scripts/package-npm.sh --pack"
29
29
  },
30
30
  "optionalDependencies": {
31
- "@projmux/linux-x64": "0.6.6",
32
- "@projmux/linux-arm64": "0.6.6",
33
- "@projmux/darwin-x64": "0.6.6",
34
- "@projmux/darwin-arm64": "0.6.6"
31
+ "@projmux/linux-x64": "0.6.7",
32
+ "@projmux/linux-arm64": "0.6.7",
33
+ "@projmux/darwin-x64": "0.6.7",
34
+ "@projmux/darwin-arm64": "0.6.7"
35
35
  }
36
36
  }