projmux 0.8.3 → 0.9.0

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/cli.md CHANGED
@@ -23,7 +23,8 @@ projmux <command> [args...]
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. |
26
- | `doctor` | Diagnose runtime dependencies. |
26
+ | `doctor` | Run read-only runtime and integration diagnostics. |
27
+ | `diagnostics` | Read the private bounded operational event log. |
27
28
  | `focus` | Switch the active client to a session/window/pane target. |
28
29
  | `init` | Preview or apply supported terminal key delivery mappings. |
29
30
  | `kill` | Terminate tagged tmux sessions. |
@@ -32,6 +33,7 @@ projmux <command> [args...]
32
33
  | `preview` | Manage persisted tmux preview selection. |
33
34
  | `prune` | Trim stale tmux lifecycle state and inspect preserved session snapshots. |
34
35
  | `quit` | Quit the app-owned projmux tmux runtime. |
36
+ | `resources` | Inspect live Linux/tmux Project → Window → Pane CPU/RSS attribution. |
35
37
  | `sessions` | Pick and open an existing tmux session. |
36
38
  | `session-popup` | Read tmux popup preview state. |
37
39
  | `settings` | Configure projmux. |
@@ -45,7 +47,7 @@ projmux <command> [args...]
45
47
  | `update` | Check installer-aware GitHub release update status. |
46
48
  | `upgrade` | Self-update via `go install`. |
47
49
  | `welcome` | Print the shell onboarding guide again. |
48
- | `usage` | Report AI token usage across 5h and weekly windows. |
50
+ | `usage` | Report AI usage across fixed windows, context, and named quota buckets. |
49
51
  | `version` | Print the current version. |
50
52
 
51
53
  ## switch
@@ -63,7 +65,9 @@ sub-verbs are entry hooks invoked by tmux keybindings (e.g.
63
65
  the active session in sync).
64
66
 
65
67
  Settings > Labs remains available for experimental settings, but picker backend
66
- selection has been retired. The native picker is always used.
68
+ selection/source rows have been retired. The native picker is always used;
69
+ legacy `PROJMUX_PICKER_BACKEND` and `picker-backend` values remain read-compatible
70
+ and normalize to native.
67
71
 
68
72
  ## setup
69
73
 
@@ -81,31 +85,35 @@ key map. Default `--timeout` is `5s`. Run it outside tmux after trying
81
85
  Settings > Keybindings edits in-app action aliases; terminal delivery
82
86
  diagnostics stay in this CLI flow.
83
87
 
84
- ## init
88
+ ## setup terminal
85
89
 
86
90
  ```
87
- projmux init [terminal] [--apply | --dry-run] [--config <path>]
88
- [--allow-symlink]
91
+ projmux setup terminal [terminal] [--apply] [--config <path>]
92
+ [--allow-symlink]
89
93
  ```
90
94
 
91
95
  Previews or applies terminal-specific key delivery mappings for supported
92
96
  terminals when `projmux setup` reports swallowed shortcuts. When `terminal` is
93
97
  omitted, autodetects from `$TERM_PROGRAM`/`$TERMINAL_EMULATOR`.
94
- Known terminals: `ghostty`, `windows-terminal`. Default is dry-run; pass
95
- `--apply` to write (timestamped `.bak.<timestamp>` is created). Refuses to
98
+ Known terminals: `ghostty`, `windows-terminal`. Default is a read-only
99
+ preview; pass `--apply` to write (timestamped `.bak.<timestamp>` is created). Refuses to
96
100
  write through a symlink unless `--allow-symlink` is passed (dotfiles repos).
97
101
  `--config <path>` overrides the candidate list when the adapter has more
98
102
  than one default location (Ghostty `config` vs `config.ghostty`). If setup
99
- shows every key arriving, skip init.
103
+ shows every key arriving, skip terminal remediation.
104
+
105
+ The top-level `projmux init` command remains a deprecated compatibility alias
106
+ during the migration period. It prints the exact `projmux setup terminal`
107
+ replacement to stderr and still accepts the legacy `--dry-run` flag.
100
108
 
101
109
  ## doctor
102
110
 
103
111
  ```
104
112
  projmux doctor [--json]
105
- projmux doctor --install-missing [--dry-run] [--include-optional]
106
113
  ```
107
114
 
108
- Runs a dependency check: `tmux ≥ 3.4`, `git`, `stty` (POSIX only), and
115
+ Runs read-only diagnostics, including a dependency check for `tmux ≥ 3.4`,
116
+ `git`, `stty` (POSIX only), and
109
117
  `kubectl` (optional), then reports read-only AI notify integration diagnostics
110
118
  for Codex hooks, Claude Code hooks, and the tmux bell
111
119
  fallback. AI notify integration statuses are `installed`, `missing`, or
@@ -115,23 +123,63 @@ diagnostics for saved agent panes, including `available`, `stale`, or
115
123
  `unavailable` status plus confidence, source, updated-at, and the affected
116
124
  snapshot/window/pane.
117
125
 
118
- Exit code `0` even when optional deps or AI notify integrations are missing;
119
- non-zero only when a required dep is missing or stale. `--json` emits a
120
- machine-readable object with `dependencies`, `ai_notify_integrations`, and
121
- `session_state_resume`; the default is the human report with suggested install
122
- commands per platform, AI integration install/remove/dry-run commands, and
123
- Session State resume metadata health. `--install-missing` is explicit opt-in
124
- and runs generated install commands only for missing or stale required
125
- dependencies. `--dry-run` prints those commands without executing them.
126
- `--include-optional` also includes optional missing dependencies such as
127
- `kubectl` when an install command is available. Install flags cannot be combined
128
- with `--json`. Doctor does not diagnose terminal key delivery; use `projmux
129
- setup` for that.
130
-
131
- `Settings > Notifications > Delivery sources` shows active Codex hooks, Claude,
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.
126
+ Session State preview and doctor report the resume source captured on the pane.
127
+ Live `hook`/`session-id` metadata is high confidence; DB-validated Antigravity
128
+ `antigravity-last-conversation` and `antigravity-conversation-metadata` picker
129
+ sources are medium confidence; legacy `antigravity-history` is low confidence.
130
+ Disk discovery never lowers or overwrites an already captured live source.
131
+
132
+ The default plain report exits non-zero when a required dependency is missing
133
+ or stale, and exits `0` when only optional dependencies or AI notify
134
+ integrations are missing. `--json` preserves its current successful exit after
135
+ emitting the report even when a required dependency is missing or stale. It
136
+ emits a machine-readable object with `dependencies`,
137
+ `ai_notify_integrations`, and `session_state_resume`; the default is the human
138
+ report with suggested install commands per platform, AI integration
139
+ install/remove/dry-run commands, and Session State resume metadata health.
140
+ Users explicitly run any displayed install guidance or command outside doctor.
141
+ Doctor does not diagnose terminal key delivery; use `projmux setup` for that.
142
+
143
+ Compatibility notice: `--install-missing`, `--dry-run`, and
144
+ `--include-optional` are deprecated install flags. During the compatibility
145
+ period their install, preview, optional-dependency, output, and exit behavior
146
+ remain unchanged, and each invocation using one or more of them emits one
147
+ stderr warning. They cannot be combined with `--json`; `--dry-run` and
148
+ `--include-optional` still require `--install-missing`. These mutation paths
149
+ will be removed when doctor becomes read-only diagnostics only.
150
+
151
+ `Settings > Notifications > Delivery sources` shows active Codex, Claude, and
152
+ Antigravity hooks plus tmux statuses, conflicts, config paths, and
153
+ copyable AI integration commands where available. Its summary/detail also shows
154
+ whether `PROJMUX_NOTIFY_HOOK` overrides the built-in desktop sender. Settings
155
+ does not install or remove external Codex, Claude, Antigravity, or tmux notify
156
+ wiring. Pending in-app queue rows remain owned by the statusbar/sidebar rather
157
+ than a standalone Settings row.
158
+
159
+ ## diagnostics
160
+
161
+ ```
162
+ projmux diagnostics log [--tail N] [--json]
163
+ [--level info|error] [--component NAME] [--path]
164
+ ```
165
+
166
+ Reads the local operational event journal through the same tolerant JSONL
167
+ reader used by every output mode. The default text view shows the newest 50
168
+ valid records. `--tail N` changes that bound, `--json` emits the selected
169
+ records as JSONL, and `--level` / `--component` filter before tailing. `--path`
170
+ prints the resolved path without creating or reading the log.
171
+
172
+ Successful state-changing top-level commands produce one `info` outcome, and
173
+ every top-level command error produces one `error` outcome. Successful
174
+ high-frequency/read-only commands such as `status`, `ai ingest`, `attention
175
+ arm`/`clear`/`window`, `tmux autosave-session-state`, `window record`, and
176
+ successful `diagnostics log` views do not produce an event. Errors from those
177
+ automatic hook/poll paths still produce one safe `error` outcome. Successful
178
+ direct command help and explicit `--dry-run` preview modes also remain
179
+ read-only and do not produce an event. Journal failures are a best-effort side
180
+ channel and never change command output or exit status. See
181
+ [operational-diagnostics.md](operational-diagnostics.md) for the file,
182
+ retention, concurrency, and privacy contracts.
135
183
 
136
184
  ## focus
137
185
 
@@ -249,23 +297,51 @@ Authoritative AI token usage. See [usage-tracking.md](usage-tracking.md)
249
297
  for adapter detail.
250
298
 
251
299
  ```
252
- projmux usage [--model codex|claude|antigravity|all] [--window 5h|weekly|all]
300
+ projmux usage [--model codex|claude|antigravity|all] [--window 5h|weekly|context|quota|all]
253
301
  [--json] [--force|-f]
254
302
  ```
255
303
 
256
- Renders a tab-aligned `MODEL WINDOW PCT RESETS_AT STALE` table; appends a
304
+ Renders a tab-aligned `MODEL WINDOW PCT RESETS_AT RESET_IN STALE` table; appends a
257
305
  backoff note when an adapter is in 429 cooldown. `--force` clears any
258
306
  active backoff and bypasses the per-adapter throttle floor (Claude `5m`,
259
307
  Codex shares the global `30s`). `--json` emits the snapshot array; when
260
308
  backoff is active the wrapper `{snapshots, backoff}` object is emitted
261
309
  instead.
262
310
 
263
- Antigravity has no 5-hour/weekly quota contract, so it is surfaced
264
- `context-window-only`: the adapter emits a single `context` window row
265
- (context-window fullness, no `RESETS_AT`) sourced from the latest
266
- statusline `context_window` seen via hook ingest. `--model antigravity`
267
- renders that row; in the HUD it shows as `Antigravity ctx [bar] N%`
268
- alongside the Claude/Codex quota bars.
311
+ Antigravity emits a conversation-local `context` row and separate official
312
+ account rows labelled `quota/<upstream bucket ID>`. `--window quota` selects
313
+ the latter; opaque IDs such as `weekly` are not aliases for the fixed
314
+ `weekly` window. Used percent is `100 * (1 - remaining_fraction)`.
315
+ `reset_time` and optional `reset_in_seconds` are preserved independently,
316
+ including the distinction between absent and explicit zero. Invalid,
317
+ disabled, missing, or empty quota data degrades without reinterpreting the
318
+ conversation context row.
319
+
320
+ ## resources
321
+
322
+ ```
323
+ projmux resources
324
+ ```
325
+
326
+ Opens the native, read-only Resource Inspector. It samples only while this
327
+ interactive process is alive, paints `warming` immediately, then refreshes at
328
+ a non-overlapping two-second cadence. Enter drills Project → Window → Pane →
329
+ Pane detail; Esc or Alt-Left returns, and root Esc closes. Search matches the
330
+ current scope's display name and stable tmux id. Tab cycles CPU, Memory, and
331
+ Name sorting; Ctrl-R requests an immediate refresh. A plain `r` remains search
332
+ input.
333
+
334
+ CPU list values are host-capacity share; pane detail also shows
335
+ core-equivalent CPU. Memory is explicitly an RSS sum (shared pages can be
336
+ counted more than once) plus its host ratio. `Unassigned`,
337
+ `Shared / ambiguous`, and non-drillable `Other / unattributed` remain explicit,
338
+ as do warming, partial, unavailable, unknown, and overage states. No process
339
+ command list, mutation, history, graph, daemon, persistence, or Session State
340
+ telemetry is created. Linux/tmux provides attribution; unsupported platforms
341
+ show an unavailable reason rather than zero metrics.
342
+
343
+ This is distinct from `projmux status resources`, which remains the short
344
+ host-only statusbar renderer.
269
345
 
270
346
  ## status
271
347
 
@@ -289,18 +365,23 @@ projmux status resources
289
365
  `~/.cache/tmux/kube-segment-<session>.txt` first (TTL governed by
290
366
  `TMUX_KUBE_CACHE_TTL`, default `5s`). Picks up a per-session
291
367
  `KUBECONFIG` from `${XDG_RUNTIME_DIR:-~/.cache}/kube-sessions/<session>.yaml`.
292
- - `usage` — HUD-style `Claude (Nm) 5h [bar] N% · weekly [bar] N% Codex 5h
293
- [bar] N% · weekly [bar] N%`. Degrades through six tiers as `--max-width`
368
+ - `usage` — HUD-style `Claude (Nm) 5h [bar] N% · weekly [bar] N% Antigravity
369
+ ctx [bar] N% · quota/<bucket> [bar] N%`. Degrades through six tiers as `--max-width`
294
370
  shrinks. Triggers an opportunistic, throttled refresh (per-adapter
295
371
  throttle, `30s` floor) so a stale cache self-heals.
296
372
  - `notify` — newest-first HUD block with project, state, optional agent, text,
297
373
  age, and `+<extras>`. Window/pane ids remain routable metadata but are not
298
374
  displayed in the compact HUD. Degrades through width tiers; default
299
375
  `--max-width` is `200` runes.
300
- - `resources` — Linux/WSL aggregate `CPU N% MEM N%` from `/proc/stat` and
301
- `/proc/meminfo`. CPU needs two invocations to establish a delta and renders
302
- `--` for the first sample. WSL reports the Linux guest/VM view. Unsupported
303
- platforms and unreadable procfs data produce no error output.
376
+ - `resources` — macOS/Linux/WSL aggregate `CPU N% MEM N%`. Linux uses
377
+ `/proc/stat` and `/proc/meminfo`; macOS uses native Mach host statistics.
378
+ CPU needs two invocations to establish a delta and renders `--` for the first
379
+ sample. CPU independently warns at 70–89% and becomes bold critical at 90% or
380
+ above; memory independently warns at 75–89% and becomes bold critical at 90%
381
+ or above. Normal and unavailable values use the secondary status-text role.
382
+ These values are host-scoped rather than pane/window/project/session
383
+ attribution. WSL reports the Linux guest/VM view. Unsupported platforms and
384
+ unreadable system metrics produce no error output.
304
385
 
305
386
  ## statusbar
306
387
 
@@ -351,7 +432,7 @@ supplied window.
351
432
  ## ai
352
433
 
353
434
  ```
354
- projmux ai split [--agent <claude|codex|antigravity|shell|selective|resume>] [--force-agent] [right|down] [-- <extra-arg>...]
435
+ projmux ai split [--agent <claude|codex|antigravity|shell|selective|resume>] [--force-agent] [--print-pane-id] [right|down] [-- <extra-arg>...]
355
436
  projmux ai picker [--inside] [--shell] [--resume] <right|down>
356
437
  projmux ai settings
357
438
  projmux ai status set <thinking|waiting|idle> [--pane <id>]
@@ -359,11 +440,12 @@ projmux ai notify <reset|notify> [--pane <id>]
359
440
  projmux ai watch-title [--pane <id>]
360
441
  projmux ai ingest codex-hook < payload.json
361
442
  projmux ai ingest claude-hook < payload.json
362
- projmux ai ingest antigravity-hook < payload.json
443
+ projmux ai ingest antigravity-hook [--event <PreInvocation|PostInvocation|PostToolUse|Stop|Statusline>] < payload.json
363
444
  projmux ai ingest bell --pane <pane_id>
364
445
  projmux ai ingest log [--tail N] [--json] [--path]
365
446
  projmux ai integrate codex [--dry-run] [--remove]
366
447
  projmux ai integrate claude [--dry-run] [--remove]
448
+ projmux ai integrate antigravity [--dry-run] [--remove]
367
449
  projmux ai integrate tmux-bell [--dry-run] [--remove]
368
450
  projmux ai topic ...
369
451
  ```
@@ -393,11 +475,41 @@ existing plain shell split. Arguments after `--` are extra arguments appended to
393
475
  the resolved `claude`, `codex`, or `agy` executable inside the managed wrapper;
394
476
  projmux still sets the context directory, tmux title, AI pane metadata, title
395
477
  watcher, and split layout.
396
- The resume picker lists the newest deduplicated Claude/Codex resume sessions
397
- for the current project, with `[+ New Session]` pinned first. If there are no
398
- resume sessions it goes straight to the existing selective picker. Phase 1
399
- captures the selected `(agent, resume id)` contract but still launches a fresh
400
- split; actual `claude --resume` / `codex resume` wiring is reserved for Phase 2.
478
+
479
+ Automation callers can add `--print-pane-id` to an explicit direct
480
+ `--agent claude|codex|antigravity|shell` launch. On success, stdout contains
481
+ exactly the new `%N` pane id followed by one newline. The value comes directly
482
+ from tmux's existing
483
+ `split-window -P -F '#{pane_id}'` result. If tmux returns no valid pane id, the
484
+ command fails non-zero with tmux-specific guidance and writes no
485
+ success value. Without `--print-pane-id`, successful split invocations keep the
486
+ existing empty-stdout behavior.
487
+
488
+ `--print-pane-id` is not available for the saved default mode or for
489
+ `--agent selective|resume`, because those paths may open a picker and launch
490
+ only after a later user selection. Those combinations fail before opening a
491
+ picker or creating a pane. Arguments after `--` keep their existing argv-tail
492
+ meaning when the flag is used with a concrete AI agent.
493
+ The resume picker lists the newest deduplicated Claude, Codex, and Antigravity
494
+ resume sessions for the current project, with `[+ New Session]` pinned first.
495
+ If there are no resume sessions it goes straight to the existing selective
496
+ picker. Selecting a row directly starts `claude --resume <id>`,
497
+ `codex resume <id>`, or `agy --conversation <uuid>`.
498
+
499
+ Live Antigravity hook/session-state resume metadata remains a separate,
500
+ high-confidence lane; it is not enumerated from disk by the picker. Within the
501
+ picker's disk discovery, source order is the workspace-to-latest-UUID mapping
502
+ in `cache/last_conversations.json`, workspace-bearing summarized rows in
503
+ `cache/conversation_metadata.json`, then legacy `history.jsonl`. The two cache
504
+ sources require a normalized UUID and an exact regular
505
+ `conversations/<uuid>.db`; only DB existence and mtime are read. SQLite content,
506
+ prompt/transcript text, sidecars, symlinks, and arbitrary paths are never used.
507
+ The cache is only the history floor exposed by upstream v1.1.12, not a complete
508
+ conversation history. Cache rows have medium confidence and blank turns;
509
+ `last_conversations` uses a short UUID title, while metadata uses only a safe
510
+ summary. Legacy history is low confidence. Missing/malformed cache, stale
511
+ missing-DB mappings, workspace-less metadata, and unknown fields degrade
512
+ without failing Claude/Codex or legacy discovery.
401
513
  Settings > AI Settings > Enabled agents controls Claude/Codex/Antigravity launch
402
514
  visibility. Disabled agents are hidden from the selective picker and from the
403
515
  default-mode picker. A saved default that later becomes disabled fails clearly
@@ -466,27 +578,75 @@ precedence over catalog `action` for known Claude events too; for example a
466
578
  noisy notify event can be made state-only or quiet without changing installed
467
579
  Claude hook commands.
468
580
 
469
- `ingest antigravity-hook` is the manual hook/statusline entrypoint for
470
- Antigravity CLI `agy` payloads observed in the Phase 0b smoke. Projmux does not
471
- provide `projmux ai integrate antigravity`, does not install Antigravity hooks,
472
- and does not mutate Antigravity user config. If users wire Antigravity manually,
473
- the hook/statusline command should call an absolute `projmux` path or run from a
474
- known cwd because relative command paths failed smoke.
475
-
476
- The default known Antigravity catalog is intentionally narrow:
477
- `PostInvocation` is quiet/log-only, `Stop` is notify, and `Statusline` is notify
478
- only when manually wired and `tool_confirmation_pending=true`. `Stop` with
479
- `error` or a non-normal `terminationReason` pushes a critical error row; `Stop`
480
- without those error signals pushes an info completion row. Accepted identity
481
- fields include `conversationId`/`conversation_id`, `cwd` or `workspace.path`,
482
- `transcriptPath`, `fullyIdle`, `agent_state`, and `context_window`.
581
+ `ingest antigravity-hook` is the hook/statusline entrypoint for
582
+ Antigravity CLI `agy` payloads. Official v1.1.12 hook commands must pass their
583
+ event identity explicitly, for example
584
+ `projmux ai ingest antigravity-hook --event Stop`; the official stdin payload
585
+ does not carry an event field. The explicit selector is authoritative, while
586
+ payload `eventName` and its legacy aliases remain fallback inputs for existing
587
+ manual wiring. `projmux ai integrate antigravity` manages exactly the named
588
+ `projmux` entry in `~/.gemini/config/hooks.json` and, separately, exactly the
589
+ `statusLine` member in `~/.gemini/antigravity-cli/settings.json`. The managed
590
+ statusline uses the official v1.1.12 `{type:"command", enabled:true,
591
+ stack_with_default:true}` shape and an absolute direct ingest command whose
592
+ stdout is empty, so the built-in statusline remains visible. It preserves every
593
+ other named entry and unknown JSON value, resolves the running projmux
594
+ executable to a stable absolute path, and supports `--dry-run` and `--remove`.
595
+ An existing unmanaged custom `statusLine` is an actionable conflict and is
596
+ never chained, wrapped, or rewritten. An existing
597
+ unmanaged `projmux` entry, another Antigravity projmux ingest command, malformed
598
+ JSON, symlinks, and read/write permission failures are reported without
599
+ rewriting the file. Doctor and Settings also report a managed entry as `stale`
600
+ when its absolute executable, event/schema wiring, or stdout fallback differs
601
+ from the current plan; the displayed install command refreshes it.
602
+
603
+ The embedded v1.1.12 catalog contains the five official events `PreToolUse`,
604
+ `PostToolUse`, `PreInvocation`, `PostInvocation`, and `Stop`. The managed entry
605
+ installs `PreInvocation`, `PostInvocation`, `PostToolUse`, and `Stop`, each with
606
+ an explicit `--event`; `PreToolUse` remains disabled because its response can
607
+ change permission policy. `Statusline` remains an explicit statusline selector
608
+ outside that official hook catalog.
609
+
610
+ `PreInvocation` moves the matched pane to thinking/busy without notifying.
611
+ `PostInvocation` and `PostToolUse` remain quiet bookkeeping paths, with tool
612
+ errors retained in ingest diagnostics. `Stop` keeps the completion/error notify
613
+ classification. Hook stdout is `{}` for the three non-Stop managed events and
614
+ `{"decision":"stop"}` for Stop, including a shell fallback if ingest fails, so
615
+ the hook cannot force continuation or synthesize a permission decision.
616
+ Official statusline `agent_state` values `thinking`, `working`, and `tool_use`
617
+ map to thinking/busy unless the pane already holds a terminal completion or
618
+ approval state; this prevents a late statusline refresh from regressing `Stop`.
619
+ A new `PreInvocation` resets the pane to thinking for the next generation.
620
+ `idle` is quiet and does not clear an existing completion or approval state.
621
+ `tool_confirmation_pending=true` produces a stable-ID,
622
+ deduped approval-required row; false never produces a notification.
623
+
624
+ The managed JSON is the install source of truth. The command
625
+ `agy -p '/hooks' --output-format json` is a read-only runtime diagnostic for
626
+ confirming loaded event names and sources; projmux never uses `/hooks` output
627
+ to rewrite `hooks.json`.
628
+
629
+ `workspacePaths` uses the first non-empty path as a cwd matching candidate;
630
+ an absent or empty array does not invent a cwd. Inherited `$TMUX_PANE` remains
631
+ the first pane attribution source. A Stop with non-empty `error`, explicit
632
+ `ERROR`, or a `MAX_STEPS_EXCEEDED` family reason pushes a critical error row.
633
+ `NO_TOOL_CALL`, `MODEL_STOP`, and known normal reasons push an info completion;
634
+ unknown reasons remain info completions with diagnostic metadata rather than
635
+ being promoted to critical. Official camelCase fields retained by the parser
636
+ also include `artifactDirectoryPath`, `modelName`, `invocationNum`,
637
+ `initialNumSteps`, `toolCall`, `stepIdx`, `executionNum`, and `fullyIdle`.
483
638
  Antigravity notify metadata uses `agent=antigravity`. Phase 3 session-state
484
639
  restore is included: Antigravity ingest stores `conversationId` as pane thread
485
640
  metadata for matching and as session-state resume metadata. Restore uses
486
641
  `agy --conversation <uuid>` when that id is present and UUID-shaped; otherwise
487
- session-state preview/doctor render `resume unavailable`. The statusline
488
- `context_window` value is persisted on ingest and surfaced by the usage HUD
489
- as a `context-window-only` row (Antigravity has no 5h/weekly quota contract).
642
+ session-state preview/doctor render `resume unavailable`. Structured statusline
643
+ `context_window.used_percentage` is persisted with its conversation id and
644
+ surfaced by the usage HUD as the separate `context` row. The official `quota`
645
+ map is persisted independently and surfaces each valid entry as
646
+ `quota/<exact bucket ID>` with independently retained absolute and relative
647
+ reset values. Bucket IDs are never mapped to `5h`/`weekly`, and account quota
648
+ is never inferred from the conversation-local gauge.
649
+ The earlier string percentage form remains a compatibility fallback.
490
650
  Transcript contents are not read.
491
651
 
492
652
  `ingest bell --pane <pane_id>` is the narrow tmux-bell fallback ingest path.
@@ -663,7 +823,7 @@ projmux tmux popup-switch
663
823
  projmux tmux popup-sessions
664
824
  projmux tmux popup-preview <session>
665
825
  projmux tmux rebalance-panes
666
- projmux tmux rename-pane <pane> <title>
826
+ projmux tmux rename-pane <pane> <label>
667
827
  projmux tmux print-config [--bin <path>]
668
828
  projmux tmux print-app-config [--bin <path>]
669
829
  projmux tmux install [--bin <path>] [--config <path>] [--include <path>]
@@ -674,9 +834,14 @@ projmux tmux apply
674
834
  Helpers tmux's keybindings and the install pipeline call into. Modes
675
835
  accepted by `popup-toggle` mirror the historical sessionizer surface:
676
836
  `session-popup`, `sessionizer`, `sessionizer-sidebar`,
677
- `notify-sidebar`, `recent-windows`, `ai-split-picker-right`,
837
+ `notify-sidebar`, `recent-windows`, `resource-inspector`, `ai-split-picker-right`,
678
838
  `ai-split-picker-down`, `ai-split-resume-right`, `ai-split-resume-down`,
679
839
  `ai-split-settings`.
840
+ `rename-pane` sets only the pane-scoped user label
841
+ `@projmux_pane_label`; an empty label clears the option. It does not change the
842
+ raw tmux pane title, AI topic, or AI topic manual-ownership flag. The canonical
843
+ keybinding action id is `rename-pane-label`; `rename-pane-topic` remains a
844
+ deprecated label-only keymap alias for one compatibility period.
680
845
  `apply` regenerates the app tmux config and reloads the live `-L projmux`
681
846
  server without restarting it. `make install` and `projmux upgrade` invoke it
682
847
  after replacing the binary. Settings > Keybindings normally runs the same
@@ -817,8 +982,13 @@ flags with the top-level `switch` UX:
817
982
  regenerates the app config, and reloads the running tmux session when
818
983
  possible; skipped or failed stages show `projmux tmux apply` as the recovery
819
984
  or sync command. Terminal diagnostics and terminal mapping application stay
820
- in the `projmux shell` -> `projmux setup` -> `projmux init` remediation path.
821
- The About section includes the `Welcome` entry. In Project
985
+ in the `projmux shell` -> `projmux setup` -> `projmux setup terminal`
986
+ remediation path.
987
+ The compact About section contains Version, Source, real update
988
+ status/actions, Welcome, and Quit. It does not duplicate static setup or
989
+ diagnostics guides: use `projmux setup` for key-delivery diagnosis,
990
+ `projmux setup terminal` for supported terminal remediation, and the
991
+ read-only `projmux doctor` report for dependency/runtime diagnostics. In Project
822
992
  Picker, `Project Root` manages the saved
823
993
  primary root (`~/.config/projmux/projdir`) and displays whether the effective
824
994
  value comes from `PROJMUX_PROJDIR`, tmux `@projmux_projdir`, saved config, or
@@ -833,10 +1003,9 @@ flags with the top-level `switch` UX:
833
1003
  selecting Check Updates runs `projmux update check`, Update Now runs
834
1004
  `projmux update apply`, and Welcome opens a Settings-native viewer
835
1005
  independent of shell skip state. `Settings > About > Quit projmux` routes
836
- through the same `projmux quit` action picker. The same About section also
837
- lists the keybinding diagnostic path: try `projmux shell` first, use `setup`
838
- for swallowed keys, use `init` for supported terminal mappings, and use
839
- `doctor` for dependencies.
1006
+ through the same `projmux quit` action picker. Settings mutations surface
1007
+ their handled success/failure as a transient passive row inside the native
1008
+ popup; selecting the next action clears or replaces that row.
840
1009
 
841
1010
  ## See also
842
1011
 
@@ -4,6 +4,24 @@ Most users can configure projmux from `projmux settings`. Environment variables
4
4
  are available for repeatable shell setup, managed machines, or advanced
5
5
  overrides.
6
6
 
7
+ ## Operational diagnostics state
8
+
9
+ Projmux keeps a private bounded operational journal at:
10
+
11
+ ```text
12
+ ${XDG_STATE_HOME:-$HOME/.local/state}/projmux/logs/operations.jsonl
13
+ ```
14
+
15
+ There is no configuration switch for arbitrary fields or remote delivery. The
16
+ `projmux` state and `logs` directories are created/repaired to mode `0700`, and
17
+ the JSONL file is created/repaired to `0600` on POSIX systems. At more than
18
+ 5 MiB, the writer atomically retains about the newest 2 MiB of complete valid
19
+ records. Lock ownership is maintained by the OS and acquisition waits no more
20
+ than 200 ms before the best-effort write is abandoned. See
21
+ [operational-diagnostics.md](operational-diagnostics.md) for safe field and
22
+ best-effort behavior. Existing `ai-ingest.log` and
23
+ `PROJMUX_*_DEBUG` settings remain separate and unchanged.
24
+
7
25
  ## Project Discovery
8
26
 
9
27
  `projmux switch` combines pinned directories, live tmux sessions, and
@@ -97,8 +115,8 @@ keybinding as saved; failures identify the stage that failed.
97
115
  Raw sequences that cannot be safely represented as a direct keybinding are not
98
116
  persisted. Use Settings to save a custom key. When key delivery needs
99
117
  terminal-layer remediation, first try the key in `projmux shell`, then run
100
- `projmux setup` from the raw terminal, then use `projmux init` for supported
101
- terminal adapters.
118
+ `projmux setup` from the raw terminal, then use `projmux setup terminal` for
119
+ supported terminal adapters.
102
120
 
103
121
  `~/.config/projmux/keymap.toml` can also be edited by hand. When the file is
104
122
  absent, generated tmux config stays on the built-in defaults.
@@ -114,6 +132,9 @@ keys = ["C-t"]
114
132
 
115
133
  [bindings."Sidebar:PinProject"]
116
134
  keys = ["M-p", "p"]
135
+
136
+ [bindings."Resources:Open"]
137
+ keys = ["M-u"]
117
138
  ```
118
139
 
119
140
  Each table is `[bindings.<action-id>]`. Supported keys are:
@@ -150,6 +171,12 @@ such as `ProjectSidebarToggle`, `NotifySidebarToggle`, `SessionPopupToggle`,
150
171
  popup commands use `Surface:Action` IDs and have surface-local conflict
151
172
  domains and remain visible in Settings when catalogued.
152
173
 
174
+ `Resources:Open` is a user-configurable direct popup action with no built-in
175
+ shortcut. Every configured alias renders the canonical client-scoped body
176
+ `projmux tmux popup-toggle --client #{client_tty} resource-inspector`; pressing
177
+ the same alias again closes only that client's popup. It remains available on
178
+ Linux/tmux even when the Labs live-resource status segment is off.
179
+
153
180
  The Settings writer is deterministic and rewrites the supported saved subset
154
181
  only. If the existing file has parse errors or unknown action IDs, Settings
155
182
  shows the keymap error row and refuses to overwrite it until the file is fixed.
@@ -159,8 +186,8 @@ print-config`, `projmux tmux install`, `projmux tmux print-app-config`,
159
186
  `projmux tmux install-app`, and `projmux shell`. Terminal init adapters such as
160
187
  Ghostty and Windows Terminal install built-in plain-byte mappings where needed;
161
188
  they do not read `keymap.toml` or copy saved keys into terminal configs.
162
- Changing terminal-layer mappings still requires rerunning `projmux init` and
163
- restarting the terminal where that terminal requires it.
189
+ Changing terminal-layer mappings still requires rerunning `projmux setup
190
+ terminal` and restarting the terminal where that terminal requires it.
164
191
 
165
192
  When a chord is overridden, projmux emits unbinds for both the stale default
166
193
  chord and the replacement before binding the merged action. Popup and floating
@@ -334,9 +361,9 @@ user/global preference in this release.
334
361
  ## AI Resume Picker
335
362
 
336
363
  The AI resume picker (`projmux ai split --agent resume`) lists the most recent
337
- deduplicated Claude/Codex resume sessions. The number of rows it shows and how
338
- far below the current directory it scans are both configurable; the defaults are
339
- 30 rows and depth 0 (the current directory only).
364
+ deduplicated Claude/Codex/Antigravity resume sessions. The number of rows it
365
+ shows and how far below the current directory it scans are both configurable;
366
+ the defaults are 30 rows and depth 0 (the current directory only).
340
367
 
341
368
  Preferred interactive path:
342
369
 
@@ -375,6 +402,21 @@ column (`./`, `./web`, `./api`) so child-directory sessions are easy to tell
375
402
  apart. A missing or zero depth is identical to the historical behavior. Settings
376
403
  edits write the global config.
377
404
 
405
+ Antigravity uses the upstream v1.1.12 current-storage boundary before its
406
+ legacy history fallback. `cache/last_conversations.json` contributes the latest
407
+ UUID mapped to a matching workspace; `cache/conversation_metadata.json`
408
+ contributes only rows that carry a valid UUID, workspace URI/path, and summary.
409
+ Both require an exact regular `conversations/<uuid>.db` and use only its
410
+ existence/mtime. They do not open SQLite content and do not treat `.db-wal`,
411
+ `.db-shm`, symlinks, or arbitrary paths as conversations. The cache provides a
412
+ latest-session floor rather than complete history. Missing/malformed cache,
413
+ workspace-less metadata, and stale mappings degrade to legacy `history.jsonl`
414
+ without changing the shared exact/depth/sort/cap behavior.
415
+ Live hook/session-state resume metadata is a separate high-confidence lane and
416
+ is not a disk-picker candidate. When a disk picker selection creates a pane,
417
+ its source is persisted so Session State preview and doctor can report medium
418
+ confidence for DB-validated cache sources or low confidence for legacy history.
419
+
378
420
  ## Environment Variables
379
421
 
380
422
  | Variable | Purpose |
@@ -780,10 +822,28 @@ CPU/memory segment on the lower status row. The saved global value is:
780
822
  ```
781
823
 
782
824
  Accepted values are `off` (default) and `on`. The feature is available on
783
- native Linux and WSL. It reads Linux procfs directly without launching `top`,
784
- `free`, PowerShell, or another metrics process. In WSL the values describe the
785
- Linux guest/VM view, not total Windows host utilization. The CPU delta cache is
786
- internal state at
825
+ macOS, native Linux, and WSL. Linux reads procfs directly; macOS reads Mach host
826
+ statistics and `hw.memsize`. Neither path launches `top`, `vm_stat`, `free`,
827
+ PowerShell, or another metrics process. On macOS, available memory is free plus
828
+ inactive pages, matching the reclaimable-memory intent of Linux
829
+ `MemAvailable`. In WSL the values describe the Linux guest/VM view, not total
830
+ Windows host utilization. These are host-scoped values and do not attribute
831
+ usage to a pane, window, project, or session.
832
+
833
+ When enabled, the compact segment is also the clickable `resources` statusbar
834
+ range and opens the Resource Inspector. Turning the Lab off hides only this
835
+ segment; it does not disable `projmux resources` or a custom-bound
836
+ `Resources:Open` action. Inspector samples are memory-only for the popup
837
+ lifetime and are unrelated to the status segment's host CPU reference cache.
838
+
839
+ The display policy is fixed rather than configurable: CPU is normal below 70%,
840
+ warning at 70–89%, and critical at 90% or above; memory is normal below 75%,
841
+ warning at 75–89%, and critical at 90% or above. The two values are classified
842
+ and styled independently. Normal and unavailable (`--`) values use the
843
+ secondary status-text theme role, warnings use the warning role, and critical
844
+ values use the bold critical role. No threshold values are stored in config.
845
+
846
+ The CPU delta cache is internal state at
787
847
  `${XDG_STATE_HOME:-~/.local/state}/projmux/live-resources-sample.json`.
788
848
  CPU reference samples older than 30 seconds are ignored and replaced on the
789
849
  next refresh.
@@ -124,7 +124,7 @@ Classification:
124
124
 
125
125
  Do not translate these families:
126
126
 
127
- - Product and agent names: `Codex`, `Claude`, `projmux`, `tmux`, `psmux`,
127
+ - Product and agent names: `Codex`, `Claude`, `projmux`, `tmux`,
128
128
  `GitHub`, `npm`.
129
129
  - Terminal and app names: `Windows Terminal`, `Ghostty`, `WezTerm`, `Kitty`,
130
130
  `iTerm2`, `Alacritty`, `Foot`.