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.
- package/docs/agent-workflow.md +17 -13
- package/docs/ai-agent-shortcuts.md +11 -6
- package/docs/cli.md +79 -35
- package/docs/configuration.md +40 -12
- package/docs/hooks.md +33 -0
- package/docs/install.md +8 -8
- package/docs/keybindings.md +15 -2
- package/docs/native-picker-parity.md +6 -3
- package/docs/notify-queue.md +45 -9
- package/docs/session-restore.md +8 -4
- package/docs/settings-ia.md +7 -2
- package/docs/statusbar.md +3 -0
- package/docs/testing.md +5 -2
- package/docs/upgrading.md +10 -4
- package/docs/usage-tracking.md +42 -13
- package/package.json +5 -5
package/docs/agent-workflow.md
CHANGED
|
@@ -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,
|
|
33
|
-
- `make test` also covers Settings > AI Settings > Enabled agents Phase 0 config behavior: missing config enables Claude and
|
|
34
|
-
- `make test` also covers
|
|
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:
|
|
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,
|
|
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
|
|
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:
|
|
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
|
-
|
|
71
|
-
focusing, non-critical `x` bulk clear that preserves critical rows,
|
|
72
|
-
state rendering after all visible non-critical rows are cleared, and
|
|
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
|
|
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,
|
|
53
|
-
or general shortcut registrations. Use it only in a private
|
|
54
|
-
when you deliberately want to launch a disabled agent without
|
|
55
|
-
Settings. If every AI agent is disabled, `--agent selective` still
|
|
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
|
|
133
|
-
|
|
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
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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.
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
|
355
|
-
a one-shot launch without changing that default.
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
|
364
|
-
also fail when disabled, including
|
|
365
|
-
deliberate one-shot direct CLI
|
|
366
|
-
default paths do not use this
|
|
367
|
-
|
|
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
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
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
|
|
679
|
-
|
|
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
|
-
|
|
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.
|
package/docs/configuration.md
CHANGED
|
@@ -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`
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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 >
|
|
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
|
|
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,
|
|
32
|
-
Press Enter to continue
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
package/docs/keybindings.md
CHANGED
|
@@ -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;
|
|
114
|
-
|
|
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
|
|
package/docs/notify-queue.md
CHANGED
|
@@ -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`.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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.
|
|
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
|
|
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.
|
package/docs/session-restore.md
CHANGED
|
@@ -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
|
-
|
|
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 >
|
|
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 >
|
|
105
|
+
and startup directory. Use `Settings > Session State > Sidebar startup picker` for
|
|
102
106
|
interactive Latest snapshot / Named snapshot / Empty session selection.
|
package/docs/settings-ia.md
CHANGED
|
@@ -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
|
-
-
|
|
111
|
-
|
|
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.
|
|
125
|
-
|
|
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
|
|
7
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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:
|
package/docs/usage-tracking.md
CHANGED
|
@@ -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
|
|
5
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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.
|
|
113
|
-
opportunistic refresh:
|
|
114
|
-
per-adapter throttle and active
|
|
115
|
-
|
|
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`.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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.
|
|
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.
|
|
32
|
-
"@projmux/linux-arm64": "0.6.
|
|
33
|
-
"@projmux/darwin-x64": "0.6.
|
|
34
|
-
"@projmux/darwin-arm64": "0.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
|
}
|