projmux 0.7.1 → 0.7.2

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
@@ -66,6 +66,7 @@ projmux shell
66
66
  - `Alt-4`: AI split picker.
67
67
  - `Alt-5`: settings.
68
68
  - `Alt-6`: project switcher popup.
69
+ - `Alt-7`: AI resume session picker.
69
70
 
70
71
  전체 key map은 [Terminal Keybindings](docs/keybindings.md)를 참고하세요. 키가
71
72
  동작하지 않으면 tmux 밖에서 `projmux setup`을 실행한 뒤,
package/README.md CHANGED
@@ -74,8 +74,10 @@ Inside the app:
74
74
  - `Alt-3` opens Recent Windows.
75
75
  - `Alt-4` opens the AI split picker.
76
76
  - `Alt-5` opens settings.
77
+ - `Alt-7` opens the AI resume session picker.
77
78
 
78
- Those five launch keys are the guaranteed zero-config defaults. Add more
79
+ The `Alt-1` through `Alt-5` launch keys are the guaranteed zero-config
80
+ defaults. Add more
79
81
  aliases in Settings > Keybindings or `~/.config/projmux/keymap.toml`. If a key
80
82
  does not fire, run `projmux setup` outside tmux, then use
81
83
  `projmux init [terminal] --apply` for supported terminal delivery fallbacks.
@@ -40,7 +40,7 @@
40
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.
41
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.
42
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.
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.
43
+ - `make test` also covers direct `projmux ai split --agent <claude|codex|antigravity|shell|selective|resume>` 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, resume picker routing/New delegation/zero-session fallback/Phase 1 fresh fallback contract, 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.
44
44
  - `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.
45
45
  - `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.
46
46
  - `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.
@@ -66,10 +66,13 @@ without a tail:
66
66
  ```sh
67
67
  projmux ai split --agent shell right
68
68
  projmux ai split --agent selective down
69
+ projmux ai split --agent resume right
69
70
  ```
70
71
 
71
72
  `shell` opens a plain shell split. `selective` opens the existing picker, where
72
- the user chooses the launch mode interactively.
73
+ the user chooses the launch mode interactively. `resume` opens the current
74
+ project's resume-session picker; when no sessions exist it delegates to the
75
+ same selective picker.
73
76
 
74
77
  ## Naming Pattern
75
78
 
@@ -88,6 +91,8 @@ Concrete examples:
88
91
  ```text
89
92
  $projmux-codex-right
90
93
  $projmux-claude-down
94
+ $projmux-resume-right
95
+ $projmux-resume-down
91
96
  ```
92
97
 
93
98
  For Claude-style slash-command surfaces, names can follow:
@@ -102,6 +107,8 @@ Concrete examples:
102
107
  ```text
103
108
  /projmux:codex-right
104
109
  /projmux:claude-down
110
+ /projmux:resume-right
111
+ /projmux:resume-down
105
112
  ```
106
113
 
107
114
  The same pattern also works for editor commands, launcher actions, shell
@@ -120,6 +127,7 @@ For Codex-style skill surfaces:
120
127
  ```text
121
128
  $projmux-codex → projmux ai split --agent codex right
122
129
  $projmux-claude → projmux ai split --agent claude right
130
+ $projmux-resume → projmux ai split --agent resume right
123
131
  ```
124
132
 
125
133
  For Claude-style slash-command surfaces:
@@ -127,6 +135,7 @@ For Claude-style slash-command surfaces:
127
135
  ```text
128
136
  /projmux:codex → projmux ai split --agent codex right
129
137
  /projmux:claude → projmux ai split --agent claude right
138
+ /projmux:resume → projmux ai split --agent resume right
130
139
  ```
131
140
 
132
141
  Register the bare name as a thin alias of the `*-right` shortcut so that the
@@ -189,6 +198,26 @@ projmux ai split --agent claude down -- <agent flags>
189
198
  ```
190
199
  ````
191
200
 
201
+ Resume picker examples:
202
+
203
+ ```text
204
+ ~/.codex/skills/projmux-resume-right/SKILL.md
205
+ ~/.codex/skills/projmux-resume-down/SKILL.md
206
+ ```
207
+
208
+ ````markdown
209
+ ---
210
+ name: projmux-resume-right
211
+ description: Open a projmux-managed AI resume-session picker to the right.
212
+ ---
213
+
214
+ Run this command:
215
+
216
+ ```sh
217
+ projmux ai split --agent resume right
218
+ ```
219
+ ````
220
+
192
221
  If your tool stores skills as JSON, TOML, or another format, keep the same
193
222
  fields conceptually:
194
223
 
package/docs/cli.md CHANGED
@@ -259,10 +259,12 @@ Codex shares the global `30s`). `--json` emits the snapshot array; when
259
259
  backoff is active the wrapper `{snapshots, backoff}` object is emitted
260
260
  instead.
261
261
 
262
- Antigravity has no supported 5-hour/weekly quota adapter. `--model
263
- antigravity` renders an explicit unsupported note: the stable Antigravity
264
- signal is `context-window-only` statusline data, which is not mixed into the
265
- Claude/Codex quota HUD.
262
+ Antigravity has no 5-hour/weekly quota contract, so it is surfaced
263
+ `context-window-only`: the adapter emits a single `context` window row
264
+ (context-window fullness, no `RESETS_AT`) sourced from the latest
265
+ statusline `context_window` seen via hook ingest. `--model antigravity`
266
+ renders that row; in the HUD it shows as `Antigravity ctx [bar] N%`
267
+ alongside the Claude/Codex quota bars.
266
268
 
267
269
  ## status
268
270
 
@@ -340,8 +342,8 @@ supplied window.
340
342
  ## ai
341
343
 
342
344
  ```
343
- projmux ai split [--agent <claude|codex|antigravity|shell|selective>] [--force-agent] [right|down] [-- <extra-arg>...]
344
- projmux ai picker --inside <right|down>
345
+ projmux ai split [--agent <claude|codex|antigravity|shell|selective|resume>] [--force-agent] [right|down] [-- <extra-arg>...]
346
+ projmux ai picker [--inside] [--shell] [--resume] <right|down>
345
347
  projmux ai settings
346
348
  projmux ai status set <thinking|waiting|idle> [--pane <id>]
347
349
  projmux ai notify <reset|notify> [--pane <id>]
@@ -372,7 +374,8 @@ can still render a non-red action-required status badge.
372
374
 
373
375
  `ai split right|down` uses the configured default split mode. Add
374
376
  `--agent claude`, `--agent codex`, `--agent antigravity`, `--agent shell`, or
375
- `--agent selective` for a one-shot launch without changing that default.
377
+ `--agent selective` for a one-shot launch without changing that default. Add
378
+ `--agent resume` to open the current project's AI resume-session picker.
376
379
  Concrete `--agent claude|codex|antigravity` invocations create a new managed
377
380
  agent pane every time; existing managed AI panes in the same project/session are
378
381
  not selected or reused.
@@ -381,6 +384,11 @@ existing plain shell split. Arguments after `--` are extra arguments appended to
381
384
  the resolved `claude`, `codex`, or `agy` executable inside the managed wrapper;
382
385
  projmux still sets the context directory, tmux title, AI pane metadata, title
383
386
  watcher, and split layout.
387
+ The resume picker lists the newest deduplicated Claude/Codex resume sessions
388
+ for the current project, with `[+ New Session]` pinned first. If there are no
389
+ resume sessions it goes straight to the existing selective picker. Phase 1
390
+ captures the selected `(agent, resume id)` contract but still launches a fresh
391
+ split; actual `claude --resume` / `codex resume` wiring is reserved for Phase 2.
384
392
  Settings > AI Settings > Enabled agents controls Claude/Codex/Antigravity launch
385
393
  visibility. Disabled agents are hidden from the selective picker and from the
386
394
  default-mode picker. A saved default that later becomes disabled fails clearly
@@ -467,9 +475,10 @@ Antigravity notify metadata uses `agent=antigravity`. Phase 3 session-state
467
475
  restore is included: Antigravity ingest stores `conversationId` as pane thread
468
476
  metadata for matching and as session-state resume metadata. Restore uses
469
477
  `agy --conversation <uuid>` when that id is present and UUID-shaped; otherwise
470
- session-state preview/doctor render `resume unavailable`. Usage quota HUD
471
- support remains unsupported because the only stable usage signal is
472
- `context-window-only` statusline data. Transcript contents are not read.
478
+ session-state preview/doctor render `resume unavailable`. The statusline
479
+ `context_window` value is persisted on ingest and surfaced by the usage HUD
480
+ as a `context-window-only` row (Antigravity has no 5h/weekly quota contract).
481
+ Transcript contents are not read.
473
482
 
474
483
  `ingest bell --pane <pane_id>` is the narrow tmux-bell fallback ingest path.
475
484
  It does not require the pane to be AI-managed. Projmux resolves session,
@@ -657,7 +666,8 @@ Helpers tmux's keybindings and the install pipeline call into. Modes
657
666
  accepted by `popup-toggle` mirror the historical sessionizer surface:
658
667
  `session-popup`, `sessionizer`, `sessionizer-sidebar`,
659
668
  `notify-sidebar`, `recent-windows`, `ai-split-picker-right`,
660
- `ai-split-picker-down`, `ai-split-settings`.
669
+ `ai-split-picker-down`, `ai-split-resume-right`, `ai-split-resume-down`,
670
+ `ai-split-settings`.
661
671
  `apply` regenerates the app tmux config and reloads the live `-L projmux`
662
672
  server without restarting it. `make install` and `projmux upgrade` invoke it
663
673
  after replacing the binary. Settings > Keybindings normally runs the same
@@ -328,6 +328,50 @@ warning with the unsupported value and source.
328
328
  Project-local locale override is not part of the runtime policy. Locale is a
329
329
  user/global preference in this release.
330
330
 
331
+ ## AI Resume Picker
332
+
333
+ The AI resume picker (`projmux ai split --agent resume`) lists the most recent
334
+ deduplicated Claude/Codex resume sessions. The number of rows it shows and how
335
+ far below the current directory it scans are both configurable; the defaults are
336
+ 30 rows and depth 0 (the current directory only).
337
+
338
+ Preferred interactive path:
339
+
340
+ - `Settings > AI Settings > Resume picker`
341
+
342
+ Config paths (global and project both honored):
343
+
344
+ ```text
345
+ ~/.config/projmux/config.toml # global
346
+ <project>/.projmux/config.toml # project
347
+ ```
348
+
349
+ Schema:
350
+
351
+ ```toml
352
+ [ai]
353
+ resume_picker_limit = 30 # 1-100; how many recent sessions the picker lists
354
+ resume_scan_depth = 0 # 0-8; include sessions started in cwd child dirs
355
+ ```
356
+
357
+ Resolution priority (each key resolves independently) is:
358
+
359
+ 1. `PROJMUX_AI_RESUME_PICKER_LIMIT` / `PROJMUX_AI_RESUME_SCAN_DEPTH`
360
+ 2. project `[ai]` key
361
+ 3. global/user `[ai]` key
362
+ 4. built-in default (`30` rows, depth `0`)
363
+
364
+ `resume_picker_limit` is clamped to `1`-`100`; a missing or non-positive value
365
+ falls back to the default. `resume_scan_depth` is clamped to `0`-`8`: depth `0`
366
+ lists only sessions whose recorded working directory matches the current one
367
+ (the historical behavior), while depth `N` also lists sessions started up to `N`
368
+ levels below it — useful from a monorepo or parent directory. The match is a
369
+ path-tree filter on each session's recorded cwd, so parent and sibling
370
+ directories are never included. At depth `>0` the picker adds a relative-cwd
371
+ column (`./`, `./web`, `./api`) so child-directory sessions are easy to tell
372
+ apart. A missing or zero depth is identical to the historical behavior. Settings
373
+ edits write the global config.
374
+
331
375
  ## Environment Variables
332
376
 
333
377
  | Variable | Purpose |
@@ -337,6 +381,8 @@ user/global preference in this release.
337
381
  | `TMUX_SESSIONIZER_ROOTS` | Legacy alias still honored at runtime for managed roots. |
338
382
  | `PROJMUX_LOCALE` | UI locale override. `auto` resumes detection; `en-US` and `ko-KR` pin supported locales. Unsupported tags fall back to `en-US` and surface a Settings warning. |
339
383
  | `PROJMUX_NOTIFY_HOOK` | External executable that receives AI desktop notifications instead of the built-in Linux/WSL sender. Separate from declarative `[hooks.send-noti]`. |
384
+ | `PROJMUX_AI_RESUME_PICKER_LIMIT` | Overrides the AI resume picker row count (`[ai] resume_picker_limit`). Clamped to 1-100; takes priority over project and global config. |
385
+ | `PROJMUX_AI_RESUME_SCAN_DEPTH` | Overrides the AI resume picker cwd-tree scan depth (`[ai] resume_scan_depth`). Clamped to 0-8; takes priority over project and global config. Depth 0 keeps the exact-cwd behavior. |
340
386
  | `PROJMUX_NOTIFY_HOOK_DEPTH` | Internal recursion guard for `send-noti` hooks. Depth `>= 1` suppresses nested hook dispatch while still allowing the queue write itself. |
341
387
  | `PROJMUX_NOTIFY_EXPIRE_MS` | AI desktop notification expiration in milliseconds. Defaults to `5000`; unset, zero, negative, and non-numeric values fall back to the default. |
342
388
  | `PROJMUX_DESKTOP_NOTIFY_MODE` | OS desktop notification mode override. `none` / `notify` / `raise` (case insensitive). When set, this takes priority over every other resolution rung. The in-app notify queue is not affected. |
package/docs/hooks.md CHANGED
@@ -634,10 +634,11 @@ include `conversationId`/`conversation_id`, `cwd`, `workspace.path`,
634
634
  Antigravity ingest uses `conversationId` as pane thread metadata for matching
635
635
  and as session-state resume metadata. Session restore uses
636
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.
637
+ otherwise preview and doctor render `resume unavailable`. The statusline
638
+ `context_window` percentage is persisted to the usage state dir on ingest so
639
+ the usage HUD can surface it as a `context-window-only` row Antigravity has
640
+ no 5-hour/weekly quota contract, so no quota bars are emitted. Raw payloads or
641
+ transcript contents are not stored.
641
642
 
642
643
  ## Ingest Debug Log
643
644
 
@@ -2,7 +2,8 @@
2
2
 
3
3
  projmux is keyboard-driven, but the guaranteed launch contract is small:
4
4
  fresh installs bind `Alt-1` through `Alt-5` as plain Meta sequences
5
- (`M-1`..`M-5`, bytes `\x1b1`..`\x1b5`). Other actions remain discoverable in
5
+ (`M-1`..`M-5`, bytes `\x1b1`..`\x1b5`). The AI resume picker ships with an
6
+ editable `Alt-7` default. Other actions remain discoverable in
6
7
  Settings > Keybindings. Transport-dependent actions keep their built-in
7
8
  transport default key, and Settings can add separate safe tmux plain keys to
8
9
  the same action. They are not installed as terminal-specific User-key
@@ -84,6 +85,7 @@ Optional direct keys can be added for actions such as:
84
85
  | `RecentWindows:Open` | Recent windows queue across projects |
85
86
  | `ProjectSwitcherToggle` | Project switcher popup |
86
87
  | `AISplitPickerToggle` | AI split popup picker; pressing again closes the picker popup |
88
+ | `AIResumePickerToggle` | AI resume session picker; default `Alt-7`; pressing again closes the picker popup |
87
89
  | `ai-split-right` | Open a new direct AI split to the right |
88
90
  | `ai-split-down` | Open a new direct AI split below |
89
91
  | `new-window` | New tmux window in the current pane directory |
package/docs/testing.md CHANGED
@@ -97,6 +97,7 @@ Observe:
97
97
  - `Alt-3` opens Recent Windows.
98
98
  - `Alt-4` opens the AI split picker.
99
99
  - `Alt-5` opens Settings.
100
+ - `Alt-7` opens the AI resume session picker.
100
101
  - Pressing the same launch key again closes the popup instead of typing escape
101
102
  bytes into the shell or picker input.
102
103
 
@@ -122,11 +122,12 @@ claude is in backoff, try again in 30m (use --force to bypass)
122
122
 
123
123
  When no AI agents are enabled, all-model table output contains no
124
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.
125
+ empty array. Explicit `--model claude`, `--model codex` and
126
+ `--model antigravity` bypass the enabled-agent filter for read-only
127
+ inspection and collect/render only the requested adapter. Antigravity
128
+ exposes no 5h/weekly quota, so its adapter reports a single `context`
129
+ window row (context-window fullness, no `RESETS_AT`) sourced from the
130
+ latest statusline `context_window` observed via hook ingest.
130
131
 
131
132
  ### `projmux status usage`
132
133
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
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.7.1",
32
- "@projmux/linux-arm64": "0.7.1",
33
- "@projmux/darwin-x64": "0.7.1",
34
- "@projmux/darwin-arm64": "0.7.1"
31
+ "@projmux/linux-x64": "0.7.2",
32
+ "@projmux/linux-arm64": "0.7.2",
33
+ "@projmux/darwin-x64": "0.7.2",
34
+ "@projmux/darwin-arm64": "0.7.2"
35
35
  }
36
36
  }