projmux 0.6.7 → 0.7.1

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/README-ko.md CHANGED
@@ -4,8 +4,9 @@
4
4
  <img src="docs/assets/projmux-icon.png" alt="projmux icon" width="112">
5
5
  </p>
6
6
 
7
- 프로젝트별 tmux workspace를 빠르게 전환하고, preview/status context/AI pane
8
- attention까지 함께 다루는 터미널 workspace 도구입니다.
7
+ 프로젝트별 tmux workspace를 빠르게 전환하고, Claude Code, Codex,
8
+ Antigravity pane의 preview/status context/attention까지 함께 다루는 터미널
9
+ workspace 도구입니다.
9
10
 
10
11
  [![npm version](https://img.shields.io/npm/v/projmux?logo=npm)](https://www.npmjs.com/package/projmux)
11
12
  [![CI](https://github.com/crevissepartners/projmux/actions/workflows/ci.yml/badge.svg)](https://github.com/crevissepartners/projmux/actions/workflows/ci.yml)
@@ -15,7 +16,7 @@ attention까지 함께 다루는 터미널 workspace 도구입니다.
15
16
  <p align="center">
16
17
  <img src="docs/assets/projmux-ai-attention.gif" alt="projmux AI attention demo" width="820">
17
18
  <br>
18
- <em>다른 프로젝트에서 일하는 동안 agent 작업이 끝나면 notification에서 바로 해당 pane으로 돌아갑니다.</em>
19
+ <em>project를 오가며 AI permission 대기를 상태줄에서 확인하고, notification list에서 해당 pane으로 돌아갑니다.</em>
19
20
  </p>
20
21
 
21
22
  ## 무엇인가
@@ -23,6 +24,8 @@ attention까지 함께 다루는 터미널 workspace 도구입니다.
23
24
  `projmux`는 프로젝트 디렉터리를 오래 유지되는 tmux session으로 연결합니다.
24
25
  프로젝트 전환, session preview, AI split 실행, tmux 안의 상태 표시를 한
25
26
  키보드 중심 workspace 앱으로 묶습니다.
27
+ Claude Code와 Codex hook event를 직접 수집하고, 수동으로 연결한 Antigravity
28
+ hook/statusline event도 같은 notification 흐름으로 다룹니다.
26
29
 
27
30
  터미널 workspace를 한 명령으로 열고, 한 세트의 키로 project/window/pane,
28
31
  notification, settings 사이를 오가고 싶을 때 사용합니다.
@@ -59,7 +62,7 @@ projmux shell
59
62
 
60
63
  - `Alt-1`: project sidebar.
61
64
  - `Alt-2`: notification list.
62
- - `Alt-3`: existing-session picker.
65
+ - `Alt-3`: Recent Windows.
63
66
  - `Alt-4`: AI split picker.
64
67
  - `Alt-5`: settings.
65
68
  - `Alt-6`: project switcher popup.
@@ -82,17 +85,45 @@ projmux shell
82
85
  설정은 [Configuration](docs/configuration.md)을 참고하세요. installer별 update
83
86
  동작은 [Upgrading](docs/upgrading.md)에 있습니다.
84
87
 
88
+ ## 에이전트 스킬
89
+
90
+ projmux shortcut은 AI 도구의 user-level skill 또는 slash command로도 등록할
91
+ 수 있습니다. 스킬은 같은 CLI contract를 감싸는 얇은 wrapper입니다:
92
+
93
+ ```sh
94
+ projmux ai split --agent codex right
95
+ projmux ai split --agent claude down
96
+ projmux ai split --agent antigravity right
97
+ ```
98
+
99
+ `/projmux:codex-right` 같은 Claude slash command를 등록한 뒤 prompt와 함께
100
+ 실행시키면, Claude가 projmux command를 호출하고 현재 project에 붙은 managed
101
+ Codex pane이 새로 열립니다. prompt는 새 pane으로 바로 전달되고,
102
+ permission/completion hook event가 tmux 상태줄과 notification list에
103
+ 표시됩니다.
104
+ Antigravity도 같은 managed split 경로로 실행되며, 수동 hook ingest와 session
105
+ resume 지원 범위는 CLI reference에 정리되어 있습니다.
106
+
107
+ 설치 template과 naming convention은
108
+ [AI Agent Shortcuts](docs/ai-agent-shortcuts.md)에 정리되어 있습니다.
109
+
110
+ <p align="center">
111
+ <img src="docs/assets/projmux-skill-workflow.gif" alt="projmux skill workflow demo" width="820">
112
+ <br>
113
+ <em>Claude가 prompt와 함께 등록된 projmux skill을 호출해 managed Codex pane을 열고, Codex가 그 자리에서 응답합니다.</em>
114
+ </p>
115
+
85
116
  ## 추가 문서
86
117
 
87
118
  - [Install](docs/install.md)
88
119
  - [Configuration](docs/configuration.md)
89
120
  - [Terminal Keybindings](docs/keybindings.md)
121
+ - [AI Agent Shortcuts](docs/ai-agent-shortcuts.md)
90
122
  - [CLI Reference](docs/cli.md)
91
123
  - [Statusbar](docs/statusbar.md)
92
124
  - [Hooks](docs/hooks.md)
93
125
  - [Usage tracking](docs/usage-tracking.md)
94
126
  - [Agent Workflow](docs/agent-workflow.md)
95
- - [README Hero GIF Recording](docs/readme-hero-gif-recording.md)
96
127
 
97
128
  ## 개발
98
129
 
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  <p align="center">
8
8
  <strong>A tmux-native workspace for multi-agent AI development.</strong>
9
9
  <br>
10
- <em>First-class Claude Code and Codex integration with hook-driven attention and agent-aware session resume.</em>
10
+ <em>Managed Claude Code, Codex, and Antigravity panes with hook-driven attention and agent-aware session resume.</em>
11
11
  </p>
12
12
 
13
13
  <p align="center">
@@ -25,20 +25,20 @@ projmux shell
25
25
  <p align="center">
26
26
  <img src="docs/assets/projmux-ai-attention.gif" alt="projmux AI attention demo" width="820">
27
27
  <br>
28
- <em>An agent finishes in another project. Open notifications, select it, and jump straight back.</em>
28
+ <em>Switch between projects while an AI pane waits for permission, then jump back from the tmux notification list.</em>
29
29
  </p>
30
30
 
31
31
  ## Why
32
32
 
33
- Six tmux windows. Each one is running Claude Code or Codex on a different
34
- repo. Three are idle. One is waiting on a permission prompt. One crashed an
35
- hour ago and you have no idea which.
33
+ Six tmux windows. Each one is running Claude Code, Codex, or Antigravity on a
34
+ different repo. Three are idle. One is waiting on a permission prompt. One
35
+ crashed an hour ago and you have no idea which.
36
36
 
37
- projmux ingests Claude Code and Codex hook events directly, shows live
38
- per-pane state in the tmux status bar, and lets one keystroke take you to
39
- the pane that actually needs you. It also remembers each agent's resume id,
40
- so after a reboot every pane comes back as the *same* conversation not a
41
- fresh one.
37
+ projmux ingests Claude Code and Codex hook events directly, accepts manually
38
+ wired Antigravity hook/statusline events, shows live per-pane state in the tmux
39
+ status bar, and lets one keystroke take you to the pane that actually needs
40
+ you. It also remembers each agent's resume id, so after a reboot every pane
41
+ comes back as the *same* conversation — not a fresh one.
42
42
 
43
43
  ## Requirements
44
44
 
@@ -71,7 +71,7 @@ Inside the app:
71
71
 
72
72
  - `Alt-1` opens the project sidebar.
73
73
  - `Alt-2` opens the notification list.
74
- - `Alt-3` opens the existing-session picker.
74
+ - `Alt-3` opens Recent Windows.
75
75
  - `Alt-4` opens the AI split picker.
76
76
  - `Alt-5` opens settings.
77
77
 
@@ -94,6 +94,35 @@ For detailed configuration, including `PROJMUX_PROJDIR`, managed roots,
94
94
  notifications, and usage tracking, see [Configuration](docs/configuration.md).
95
95
  For update behavior by installer type, see [Upgrading](docs/upgrading.md).
96
96
 
97
+ ## Agent Skills
98
+
99
+ projmux shortcuts can also live in your AI tool as user-level skills or slash
100
+ commands. A skill is just a thin wrapper around the same CLI contract:
101
+
102
+ ```sh
103
+ projmux ai split --agent codex right
104
+ projmux ai split --agent claude down
105
+ projmux ai split --agent antigravity right
106
+ ```
107
+
108
+ After registering a Claude slash command such as `/projmux:codex-right`, ask
109
+ Claude to use it with a prompt. Claude runs the projmux command, Codex opens in
110
+ a managed pane attached to the current project, and the prompt is delivered
111
+ there immediately.
112
+ projmux tracks hook events from the opened pane and shows permission or
113
+ completion notifications in tmux.
114
+ Antigravity uses the same managed split path, with manual hook ingest and
115
+ session resume support documented in the CLI reference.
116
+
117
+ Install templates and naming conventions are in
118
+ [AI Agent Shortcuts](docs/ai-agent-shortcuts.md).
119
+
120
+ <p align="center">
121
+ <img src="docs/assets/projmux-skill-workflow.gif" alt="projmux skill workflow demo" width="820">
122
+ <br>
123
+ <em>Claude invokes a registered projmux skill with a prompt, opens a managed Codex pane, and Codex answers there.</em>
124
+ </p>
125
+
97
126
  ## More Docs
98
127
 
99
128
  - [Install](docs/install.md)
@@ -105,7 +134,6 @@ For update behavior by installer type, see [Upgrading](docs/upgrading.md).
105
134
  - [Hooks](docs/hooks.md)
106
135
  - [Usage tracking](docs/usage-tracking.md)
107
136
  - [Agent Workflow](docs/agent-workflow.md)
108
- - [README Hero GIF Recording](docs/readme-hero-gif-recording.md)
109
137
 
110
138
  ## Development
111
139
 
@@ -29,14 +29,15 @@
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, 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.
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, no-live-tmux save behavior, and stage-by-stage apply recovery copy, 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
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
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 Notify sidebar pane-grouped read-model rows and interactions: collapsed pane inbox group construction, fixed three-line group cards with stable project/provider, topic/context, aggregate metadata, and latest-preview slots including topic-with-project cases, child-count badges that match expandable child rows without rendering `+0`, childless group headers without strong fold affordance, selected/expanded marker-only row shape changes, duplicate label/preview reduction, worst-severity aggregation, inactive/gone group display and child-count rendering, pane-less fallback grouping, compact newest-first child event rows with warn/critical severity preservation, Right/Left fold mutation plus childless Right no-op refresh, folded and expanded live group Enter focus+ack with mixed-severity critical rows, inactive-but-routable group Enter focus+ack, gone group Enter cleanup without focus including critical rows, target-gone race cleanup, transient focus-failure no-ack refresh, child Enter focus/ack preservation, explicit group acknowledgement including mixed-severity critical rows, and grouped deferred refresh output with expanded-state pruning.
35
36
  - `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
37
  - `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
38
  - `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.
38
39
  - `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.
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 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, compact action-list state copy, flat Keys list/action detail rows, key detail remove/test rows, Add key default press-key flow with Advanced typed entry, collapsed Troubleshooting entry copy, Settings delivery diagnostics that split logical key/raw bytes/tmux received key while distinguishing missing, ambiguous, adapter-needed, and delivered states, safe direct key pool and risky/reserved diagnostic-only copy, Projmux-owned Ghostty/Windows Terminal advanced delivery copy, raw escape/CSI-u/xterm modified/UserKey/UserSequence rejection from primary keymap storage, Labs compatibility redirect to the Keybindings root, capture/add-key flows, unsafe raw capture, reset behavior, stale guide docs guards, and welcome/runtime footer copy that avoids hardcoded launch-key guides.
40
41
  - `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.
41
42
  - `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.
42
43
  - `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.
@@ -64,12 +65,15 @@
64
65
  - `make test` also covers `projmux ai ingest log` tail/path rendering and bounded JSONL log trimming for ingest diagnostics.
65
66
  - `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.
66
67
  - `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.
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.
68
+ - `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 `surface` / `chrome_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, global-only theme resolver behavior for `global`/`fallback` source labels (project `[theme]` is not a source), preset fill, explicit token override, unknown-preset/invalid-color warnings that ignore only the global layer, and truecolor-to-tmux mapping with generated `xterm*:RGB` terminal feature support, semantic role map (`RenderRoles`/`ANSIRoles`) fallback byte-identity for non-background historical palette literals plus explicit-theme repaint of Tier A/B chrome/state roles while Tier C renderer-only literals stay fixed, split foreground behavior where legacy `foreground` fills `text_primary` and `chrome_foreground` but `text_primary` does not repaint frame/title/search/border/status chrome, Phase 6 public token (`progress`/`success`/`action_required`/`pane_active_bg`/`focus`) repaint of the tmux and ANSI roles with `action_required` kept independent of `critical`, default `projmux` background tokens pinned to terminal default without separate terminal preset variants, Phase 6b pane-body-vs-popup/status background separation where an explicit `background` repaints the inactive pane body, an explicit `surface` repaints popups/native frames, and an explicit `status_background` repaints only the bottom status bar, native popup-toggle `display-popup -s` body style propagation from the effective theme without touching global popup/shell/status styles, and Settings global theme editing with the merged Global/Effective view, directly selectable prefixed theme token rows, no legacy `foreground` row, no project theme editor, and no font keys.
69
+ - `make test` also covers Recent Windows Phase 0 state/model behavior: server-scoped file paths, missing/corrupt state policy with corrupt-file backup, MRU newest-first recording, same-window dedupe and promotion, default queue limiting, current-window exclusion, cross-session candidate retention, gone-window pruning against live window inventory, and label fallback rules that keep win/pane ids as debug fallback instead of the primary row label.
70
+ - `make test` also covers Recent Windows Phase 1 native picker behavior: `projmux window recent` empty-state messaging, cross-session candidate picker rows with descriptive project/session/window/pane command age metadata, pane summaries mirroring visible pane labels with AI topic and known-shell command precedence, four visible pane cells before compact `+N` overflow, window-only switching without pane restoration, switch-failure refresh/prune handling, and gone-window pruning before picker selection.
71
+ - `make test` also covers Recent Windows Phase 2/3/4 keybinding, popup, and runtime recorder integration: `RecentWindows:Open` owns the guaranteed `M-3` launch default, generated tmux config uses client-scoped `tmux popup-toggle recent-windows`, the popup body runs `projmux window recent`, generated tmux config installs background `window record` hooks for window and client-session changes plus first-use population without `session-window-changed`, `window record` snapshots current tmux socket/session/window/active-pane metadata into the socket-scoped store with escaped field parsing, repeated same-window record fires dedupe instead of growing entries, the queue remains bounded by `recentwindows.DefaultLimit`, Settings > Keybindings shows Recent Windows with the `M-3` default, setup probe text names Recent Windows, `SessionPopupToggle` no longer owns the guaranteed `M-3` default, and escaped tmux field separators are parsed for current/list window metadata.
68
72
  - Current focused unit coverage also includes strict notify SOT behavior
69
73
  (TTL does not remove rows, focus success and target-gone clicks ack,
70
- reconcile reports stale rows), `notify list --live` queue/live explanations, notify sidebar
71
- two-line card rendering with age/project/window/pane metadata plus focus/ack/non-critical-clear/clear-all
72
- actions, notify/statusbar/sidebar attention-vs-AI palette assertions including muted stale/gone rows,
74
+ reconcile reports inactive `queue-stale` rows), `notify list --live` queue/live explanations, notify sidebar
75
+ three-line grouped card rendering with child-count/fold semantics plus focus/ack/non-critical-clear/clear-all
76
+ actions, notify/statusbar/sidebar attention-vs-AI palette assertions including muted inactive/gone rows,
73
77
  native picker-session-local `a` ack that refreshes the sidebar without
74
78
  focusing or restarting the picker, non-critical `x` bulk clear that preserves critical rows, empty
75
79
  state rendering after all visible non-critical rows are cleared, and notify queue-write refresh events
@@ -139,13 +139,14 @@ does not own the truth of every live badge.
139
139
  TTL is not a removal condition. `projmux notify list --live` adds a
140
140
  read-only comparison against live pane state, explaining manual reply
141
141
  badges without queue entries, live AI replies with/missing queue entries,
142
- and stale `ai:` entries.
142
+ and inactive (`queue-stale`) `ai:` entries.
143
143
  - **Ack** — `projmux notify ack <id>` removes one entry; `--all`
144
- flushes everything. Focus/click handlers do not ack rows.
144
+ flushes everything. Interactive focus/click handlers ack after successful
145
+ focus, and gone/unroutable targets clean up without focusing.
145
146
  - **Reconcile** — `projmux notify reconcile` walks
146
147
  `tmux list-panes -a` and back-fills entries for panes whose
147
148
  attention state is `reply` AND whose AI agent option is set,
148
- reporting stale `ai:` entries that no longer match a live pane without
149
+ reporting inactive `ai:` entries that no longer match a live reply+agent pane without
149
150
  acking them.
150
151
  `make install` and `projmux upgrade` invoke it so the queue
151
152
  recovers from any drift introduced by a lost daemon.
package/docs/cli.md CHANGED
@@ -218,11 +218,15 @@ projmux notify reconcile [--json]
218
218
  `--live` adds a non-mutating explanation table (or JSON report) that
219
219
  compares queued entries with live pane attention. It calls out manual
220
220
  reply badges that do not queue because no AI agent is attached, live AI
221
- reply panes missing a queue entry, matched AI reply entries, and stale
222
- queue entries whose live pane no longer matches. `--ui=sidebar` opens the
223
- compact interactive notify list where Enter focuses and acks a target, `a`
224
- acks the selected row, `x` clears non-critical rows, and `Ctrl-X` clears all;
225
- opening or navigating the sidebar does not ack. While open, the native
221
+ reply panes missing a queue entry, matched AI reply entries, inactive
222
+ (`queue-stale`) queue entries whose live pane EXISTS but no longer matches
223
+ reply+agent state, and gone (`queue-gone`) entries whose pane is absent from
224
+ the real tmux live pane inventory (or which have no routable target).
225
+ `--ui=sidebar` opens the compact interactive notify list where Enter
226
+ focuses and acks live or inactive-routable targets, cleans gone/unroutable
227
+ targets without focusing, `a` acks the selected row, `x` clears non-critical
228
+ rows, and `Ctrl-X` clears all; opening or navigating the sidebar does not ack.
229
+ While open, the native
226
230
  sidebar refreshes its row list on successful queue-write events without an
227
231
  Alt-2 close/reopen toggle, using the same deferred refresh path as `a` and
228
232
  `x`. The sidebar uses two-line cards with notification text first and
@@ -652,11 +656,15 @@ projmux tmux apply
652
656
  Helpers tmux's keybindings and the install pipeline call into. Modes
653
657
  accepted by `popup-toggle` mirror the historical sessionizer surface:
654
658
  `session-popup`, `sessionizer`, `sessionizer-sidebar`,
655
- `notify-sidebar`, `ai-split-picker-right`, `ai-split-picker-down`,
656
- `ai-split-settings`.
657
- `apply` reloads the live `-L projmux` server's config without restarting
658
- it; `make install` and `projmux upgrade` invoke it after replacing the
659
- binary.
659
+ `notify-sidebar`, `recent-windows`, `ai-split-picker-right`,
660
+ `ai-split-picker-down`, `ai-split-settings`.
661
+ `apply` regenerates the app tmux config and reloads the live `-L projmux`
662
+ server without restarting it. `make install` and `projmux upgrade` invoke it
663
+ after replacing the binary. Settings > Keybindings normally runs the same
664
+ save/config/reload flow automatically; use `projmux tmux apply` as the CLI
665
+ recovery or sync path after hand-editing `keymap.toml`, after saving Settings
666
+ outside tmux, or after resolving a reported config-generation or live-reload
667
+ failure.
660
668
 
661
669
  ## update
662
670
 
@@ -771,7 +779,10 @@ flags with the top-level `switch` UX:
771
779
  switcher's saved workdirs list, Labs (experimental), Settings > Keybindings,
772
780
  and About/Update status. The keybinding flow is a single
773
781
  `Settings > Keybindings` action list with simplified action details for
774
- aliases and reset. Terminal diagnostics and terminal mapping application stay
782
+ aliases and reset. Key save/reset automatically writes the key list,
783
+ regenerates the app config, and reloads the running tmux session when
784
+ possible; skipped or failed stages show `projmux tmux apply` as the recovery
785
+ or sync command. Terminal diagnostics and terminal mapping application stay
775
786
  in the `projmux shell` -> `projmux setup` -> `projmux init` remediation path.
776
787
  The About section includes the `Welcome` entry. In Project
777
788
  Picker, `Project Root` manages the saved
@@ -87,14 +87,15 @@ language.
87
87
  ## Keymap File
88
88
 
89
89
  Settings > Keybindings is the normal in-app editor for action keys. It lists
90
- actions with current keybinding summaries, opens a simple detail screen, and
91
- offers `Add alias` plus reset. Saving writes safe tmux plain chords to
92
- `~/.config/projmux/keymap.toml`, rewrites `~/.config/projmux/tmux.conf`, and,
93
- when Settings is running inside tmux, sources that app config so tmux-level
94
- chords take effect immediately.
95
-
96
- Raw sequences that cannot be safely represented as a tmux plain chord are not
97
- persisted. Use Settings to save a safe direct alias. When key delivery needs
90
+ actions with the current active keys and one state: Default, Custom, Available,
91
+ or Unbound. Open an action to see the action label, state, a flat Keys list,
92
+ Options, and a collapsed Troubleshooting row. Create flows start from
93
+ `+ Add key`, deletion lives under each key's detail, and action-level state
94
+ changes such as Unbind or Reset live under Options. Successful saves report the
95
+ keybinding as saved; failures identify the stage that failed.
96
+
97
+ Raw sequences that cannot be safely represented as a direct keybinding are not
98
+ persisted. Use Settings to save a custom key. When key delivery needs
98
99
  terminal-layer remediation, first try the key in `projmux shell`, then run
99
100
  `projmux setup` from the raw terminal, then use `projmux init` for supported
100
101
  terminal adapters.
@@ -133,7 +134,7 @@ the direct AI pane actions, `ai-split-right` and `ai-split-down`. The direct
133
134
  actions create a new managed AI pane each time they run, leaving existing AI
134
135
  panes in place. `right` and `down` choose where the new pane is created.
135
136
 
136
- Use an empty `keys` list to disable direct plain aliases for the action when
137
+ Use an empty `keys` list to disable direct plain keys for the action when
137
138
  editing the file by hand:
138
139
 
139
140
  ```toml
@@ -157,7 +158,7 @@ The file currently affects generated tmux config from `projmux tmux
157
158
  print-config`, `projmux tmux install`, `projmux tmux print-app-config`,
158
159
  `projmux tmux install-app`, and `projmux shell`. Terminal init adapters such as
159
160
  Ghostty and Windows Terminal install built-in plain-byte mappings where needed;
160
- they do not read `keymap.toml` or copy saved aliases into terminal configs.
161
+ they do not read `keymap.toml` or copy saved keys into terminal configs.
161
162
  Changing terminal-layer mappings still requires rerunning `projmux init` and
162
163
  restarting the terminal where that terminal requires it.
163
164
 
@@ -168,30 +169,66 @@ configured key opens and closes the popup.
168
169
 
169
170
  ## Theme Resolver Foundation
170
171
 
171
- Theme settings are resolved against the same project/global axes as
172
- declarative hooks and project recipe fields:
172
+ Theme is a global user preference. The effective theme resolves from the global
173
+ user theme plus a built-in fallback only:
173
174
 
174
175
  ```text
175
- <project>/.projmux/config.toml
176
176
  ~/.config/projmux/config.toml
177
+ built-in fallback preset
177
178
  ```
178
179
 
179
- Settings can edit the global `[theme]` in `~/.config/projmux/config.toml` and
180
- the current project override in `<project>/.projmux/config.toml`. The Effective
181
- theme view shows the final project > global > built-in fallback value for each
182
- field with source labels: `project`, `global`, or `fallback`.
180
+ Settings edits the global `[theme]` in `~/.config/projmux/config.toml`. The
181
+ Effective theme view shows the final global > built-in fallback value for each
182
+ field with source labels: `global` or `fallback`. Saving or resetting a theme
183
+ value live-applies it: projmux regenerates the generated tmux config and, when
184
+ Settings runs inside tmux, `tmux source-file`-reloads it so a running server
185
+ repaints immediately. Outside tmux the save still succeeds and the report
186
+ prints `Next: run \`projmux tmux apply\`` to sync a running server.
187
+
188
+ The `background`, `surface`, `status_background`, `surface_active`, and
189
+ `pane_active_bg` tokens additionally accept the value `default` ("Terminal
190
+ default" in Settings) to keep that role at the terminal background. Priority is
191
+ **explicit `default` > preset fill > unset (fallback)**, so picking a preset and
192
+ then setting (for example) `background = "default"` keeps every other token
193
+ preset-filled while the pane body stays at the terminal default (`window-style
194
+ "bg=default"`). Set `surface = "default"` separately when popup/native frame
195
+ backgrounds should inherit the terminal background, set
196
+ `status_background = "default"` when the bottom status line should do the same,
197
+ and set `pane_active_bg = "default"` when the active pane should not be tinted.
198
+ `default` is only valid on these background-like tokens. See
199
+ `docs/theme-palette.md` for the full sentinel contract.
200
+
201
+ Project `.projmux/config.toml` `[theme]` is **deprecated and ignored**: it is no
202
+ longer an effective theme source and does not influence the native picker,
203
+ statusbar, popup, or any tmux chrome. Settings has no Project theme tab, project
204
+ override editor, project theme reset action, or `project` source label — both
205
+ the global theme editor and the effective theme view live under the Global tab.
206
+ See `docs/upgrading.md` for the migration note for existing project `[theme]`
207
+ users.
183
208
 
184
209
  Renderer adapters can apply an already resolved `EffectiveTheme` to native
185
- picker frame background/foreground SGR and tmux status/window `colourN`
186
- background tokens. Settings and native project picker surfaces load global and
187
- project `[theme]` values through the shared effective-theme source. Native
188
- picker frames also apply the built-in fallback `background`/`foreground` tokens
189
- so picker-owned padding, empty rows, footer rows, and preview gaps do not
190
- inherit the terminal default background.
210
+ picker frame `surface` / `chrome_foreground` SGR, tmux window background tokens,
211
+ and the bottom status bar `status_background` token. Settings and native project
212
+ picker surfaces load global `[theme]` values through the shared effective-theme
213
+ source. Native picker frames also apply the built-in fallback `surface` /
214
+ `chrome_foreground` tokens so picker-owned padding, empty rows, footer rows, and
215
+ preview gaps do not inherit the terminal default background.
216
+
217
+ Active pane focus is part of the theme app chrome. The active pane is marked by
218
+ an active border (`pane-active-border-style`, fallback cyan `colour51`, the
219
+ public `focus` token) and a subtle dark background tint (`window-active-style`,
220
+ fallback `colour234`, the public `pane_active_bg` token); inactive panes follow
221
+ the public `background` token (tmux `window-style`, unset keeps `bg=default`).
222
+ tmux draws a single shared border between adjacent panes, so a full active-pane
223
+ rectangle is not guaranteed; focus is reinforced by the tint plus the
224
+ `pane-border-status top` topic line. This chrome preserves `pane-border-status
225
+ top`, pane topics, AI badges, and visible pane labels.
191
226
 
192
227
  Native picker popups launched through `projmux tmux popup-toggle` also pass a
193
228
  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
229
+ `surface` / `chrome_foreground` tmux tokens (popup/native backgrounds follow
230
+ `surface`, while the bottom status bar follows `status_background`). This styles
231
+ only the tmux popup body
195
232
  before the native renderer draws. It does not set global `popup-style` or
196
233
  `popup-border-style`, and it does not change shell pane backgrounds,
197
234
  `default-style`, `window-style`, OSC terminal backgrounds, or the general
@@ -201,33 +238,59 @@ Resolver schema shape:
201
238
 
202
239
  ```toml
203
240
  [theme]
204
- preset = "projmux-dark"
205
- background = "#182226"
206
- surface = "#182226"
241
+ preset = "projmux"
242
+ background = "default"
243
+ surface = "default"
244
+ status_background = "#182226"
207
245
  surface_active = "#2c383d"
208
- foreground = "#d8e0e4"
246
+ chrome_foreground = "#d8e0e4"
247
+ text_primary = "#d8e0e4"
209
248
  muted = "#75848c"
210
249
  accent = "#7ac7ad"
211
250
  critical = "#ff6b6b"
212
251
  warning = "#ffcc66"
213
- font_family = "Cascadia Mono"
214
- font_size = 12
252
+ progress = "#ffcc66"
253
+ success = "#5faf87"
254
+ action_required = "#ffaf00"
255
+ pane_active_bg = "default"
256
+ focus = "#00ffff"
215
257
  ```
216
258
 
217
- Supported presets are `projmux-dark`, `midnight`, `forest`, `rose`, and
218
- `high-contrast`. A preset fills missing color tokens in its own layer, and
219
- explicit color tokens override preset values. Missing or `inherit` values fall
220
- through to the next layer.
221
-
222
- Unknown presets and invalid color/font values invalidate only their own theme
223
- layer and produce resolver warnings; the next source still resolves normally.
259
+ `text_primary` controls primary content text in native terminal-rendered UI.
260
+ `chrome_foreground` controls frame, title, search, status, border-adjacent, and
261
+ other app chrome foreground roles. The older `foreground` key is still accepted
262
+ as a legacy alias/fill value: when present, it fills `text_primary` and
263
+ `chrome_foreground` unless either new key is explicitly set. New configs should
264
+ prefer the split keys, and Settings presents the split names rather than
265
+ encouraging writes to `foreground`.
266
+
267
+ `progress`, `success`, and `action_required` are the AI/status colors (progress
268
+ yellow, success green, action-required amber-orange). `action_required` is the
269
+ AI "needs input/approval" badge color and is intentionally independent of
270
+ `critical` — repainting `critical` never changes it. `pane_active_bg` is the
271
+ active-pane background tint, and `focus` is the active-pane border color. Each
272
+ of these is a public token: leave it unset to keep the historical built-in
273
+ color, or set it to repaint the matching chrome.
274
+
275
+ Supported presets are `projmux`, `high-contrast`, `blue-hour`, `carbon-violet`,
276
+ `ember`, `forest`, and `rose`. A preset fills
277
+ missing color tokens, and explicit color tokens override preset values. Tokens
278
+ the global theme leaves unset fall through to the built-in fallback preset.
279
+ Terminal-default backgrounds are configured per token with the `default`
280
+ sentinel rather than through separate terminal preset variants.
281
+
282
+ Unknown presets and invalid color values invalidate only the global theme
283
+ source and produce resolver warnings; the built-in fallback still resolves
284
+ normally.
224
285
  Colors are `#RRGGBB`. Settings edits colors through a preset selector, swatch
225
- rows, and a hex input page. Truecolor renderers use exact RGB SGR tokens, and
226
- tmux surfaces use the stored or nearest xterm 256-color `colourN` mapping. Font
227
- values are desired terminal profile hints, not universal tmux or ANSI renderer
228
- tokens. Without a supported terminal font adapter, Settings reports the
229
- effective desired font as `not applied`; projmux does not create or modify
230
- terminal profiles in this phase.
286
+ rows, and a hex input page. Native truecolor renderers and tmux style roles use
287
+ the exact hex value; 256-color mappings are retained only for renderer paths
288
+ that explicitly require xterm `colourN`/ANSI-256 colors. Generated tmux config
289
+ adds `xterm*:RGB` to `terminal-features` so capable terminals render exact
290
+ theme hex values instead of tmux downsampling them to the nearest 256-color
291
+ entry. The theme has no font keys: `font_family` and `font_size` were removed in
292
+ Phase 1b because tmux/ANSI rendering cannot force a terminal font. Leftover font
293
+ keys in an existing config are accepted but ignored. See `docs/upgrading.md`.
231
294
 
232
295
  ## UI Locale
233
296