projmux 0.9.0 → 0.10.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.
@@ -53,8 +53,8 @@ Responsibilities:
53
53
  - selection handoff into core actions
54
54
  - picker-agnostic close/dismiss actions
55
55
 
56
- Picker-specific display and search rules are tracked in
57
- [picker-ui-plan.md](picker-ui-plan.md).
56
+ Picker-specific display, search, input, and popup rules are tracked in
57
+ [native-picker.md](native-picker.md).
58
58
 
59
59
  This keeps parity with the existing shell workflow while moving state and behavior into Go.
60
60
 
package/docs/cli.md CHANGED
@@ -26,7 +26,6 @@ projmux <command> [args...]
26
26
  | `doctor` | Run read-only runtime and integration diagnostics. |
27
27
  | `diagnostics` | Read the private bounded operational event log. |
28
28
  | `focus` | Switch the active client to a session/window/pane target. |
29
- | `init` | Preview or apply supported terminal key delivery mappings. |
30
29
  | `kill` | Terminate tagged tmux sessions. |
31
30
  | `notify` | Manage the pending AI notify queue (push/list/ack/reconcile). |
32
31
  | `pin` | Manage pinned project directories. |
@@ -47,27 +46,27 @@ projmux <command> [args...]
47
46
  | `update` | Check installer-aware GitHub release update status. |
48
47
  | `upgrade` | Self-update via `go install`. |
49
48
  | `welcome` | Print the shell onboarding guide again. |
50
- | `usage` | Report AI usage across fixed windows, context, and named quota buckets. |
49
+ | `usage` | Report AI usage across fixed windows and named account quota buckets. |
51
50
  | `version` | Print the current version. |
52
51
 
53
52
  ## switch
54
53
 
55
54
  ```
56
- projmux switch [path]
55
+ projmux switch [--ui=popup|sidebar]
56
+ projmux switch open <path>
57
57
  projmux switch toggle-tag | toggle-pin | kill | settings | preview
58
58
  projmux switch cycle-pane | cycle-window | sidebar-focus
59
59
  ```
60
60
 
61
61
  Project picker. With no positional argument, opens the configured picker popup
62
- or sidebar (depending on entry helper). With a path, jumps directly. The
62
+ or sidebar (depending on entry helper). `switch open <path>` jumps directly. The
63
63
  sub-verbs are entry hooks invoked by tmux keybindings (e.g.
64
64
  `sidebar-focus` is wired to the sidebar's focus binding so navigation keeps
65
65
  the active session in sync).
66
66
 
67
- Settings > Labs remains available for experimental settings, but picker backend
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
+ Settings > Labs remains available for experimental settings, but picker
68
+ selection/source rows have been retired. The native picker is always used, and
69
+ there is no picker selection configuration or migration behavior.
71
70
 
72
71
  ## setup
73
72
 
@@ -102,20 +101,16 @@ write through a symlink unless `--allow-symlink` is passed (dotfiles repos).
102
101
  than one default location (Ghostty `config` vs `config.ghostty`). If setup
103
102
  shows every key arriving, skip terminal remediation.
104
103
 
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.
108
-
109
104
  ## doctor
110
105
 
111
106
  ```
112
- projmux doctor [--json]
107
+ projmux doctor [--json] [--section deps|runtime|integrations|session-state|logs] [--verbose]
113
108
  ```
114
109
 
115
110
  Runs read-only diagnostics, including a dependency check for `tmux ≥ 3.4`,
116
111
  `git`, `stty` (POSIX only), and
117
112
  `kubectl` (optional), then reports read-only AI notify integration diagnostics
118
- for Codex hooks, Claude Code hooks, and the tmux bell
113
+ for Codex hooks, Claude Code hooks, Antigravity hooks/statusline, and the tmux bell
119
114
  fallback. AI notify integration statuses are `installed`, `missing`, or
120
115
  `conflict`; missing or conflicting integrations are informational and do not
121
116
  make doctor fail. It also reports read-only Session State resume metadata
@@ -129,24 +124,57 @@ Live `hook`/`session-id` metadata is high confidence; DB-validated Antigravity
129
124
  sources are medium confidence; legacy `antigravity-history` is low confidence.
130
125
  Disk discovery never lowers or overwrites an already captured live source.
131
126
 
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.
127
+ The default text report shows per-section summaries plus failing or warning
128
+ items. `--verbose` adds successful checks and complete typed detail, including
129
+ versions, paths, confidence/source metadata, and displayed remediation.
130
+ `--section` projects the same inventory used by text and JSON: `deps` selects
131
+ dependencies, `integrations` selects AI notify integrations, and
132
+ `session-state` selects resume metadata plus retention guidance. `runtime`
133
+ selects the fixed `tmux` backend, an actual one-second read-only probe of the
134
+ app socket, and generated-versus-live config digest state. `logs` selects the
135
+ state/log/journal presence, private permissions and metadata-only writability
136
+ checks plus a bounded aggregate of recent safe operational error codes. These
137
+ sections expose only closed status codes and counts: no path, socket name,
138
+ routing identity, message, config content, or argv is rendered.
139
+ The recent-error count is the size of the newest 20-record window, not a
140
+ lifetime total; `logs.recent-errors.bounded` means older errors were omitted.
141
+ The probe captures at most 4 KiB, generated config inspection reads at most
142
+ 1 MiB, and the journal seam reads at most 5 MiB.
143
+ Symlinks and non-regular inputs are rejected without following or blocking on
144
+ them. On Windows, POSIX mode bits cannot establish ACL privacy, so otherwise
145
+ valid paths report the closed `privacy-unverified` warning rather than a false
146
+ private/insecure classification, followed by a separate metadata-only `ready`
147
+ or `not-writable` finding; Doctor never changes ACLs.
148
+
149
+ JSON reports have integer `schema_version: 2`. An unfiltered report retains the
150
+ existing typed `dependencies`, `ai_notify_integrations`,
151
+ `session_state_resume`, and `session_state_prune` detail and adds ordered
152
+ `runtime` and `logs` finding arrays. Every finding has closed `severity`,
153
+ stable `code`, and closed `remediation`; bounded aggregates may add `count`
154
+ and `safe_codes`. A filtered report contains only the selected typed field(s).
155
+ `--verbose` is accepted with `--json` but does not change JSON fields or values.
156
+
157
+ Default and verbose text exit non-zero only when their projected dependency
158
+ inventory contains a required missing or stale dependency. A non-`deps`
159
+ section exits `0`. JSON preserves its successful exit after emitting a report,
160
+ even when required dependencies are missing or stale.
161
+
162
+ Doctor is read-only for every flag combination. It never creates or repairs
163
+ state/log paths, installs packages, runs displayed remediation, changes
164
+ terminal or tmux state, generates/applies config, migrates files, or writes
165
+ operational-log outcomes. Missing, malformed, or permission-denied journals
166
+ degrade to typed log findings without failing the command. The removed `--install-missing`,
167
+ `--include-optional`, and Doctor `--dry-run` mutation flags fail as unknown
168
+ usage with an exact instruction to remove the flag and run displayed
169
+ remediation explicitly outside Doctor; they are never ignored. Doctor does not
170
+ diagnose terminal key delivery; use `projmux setup` for that.
171
+
172
+ JSON migration: consumers must switch on `schema_version` before decoding.
173
+ Version 2 changes the previously empty/reserved `runtime` and `logs` arrays to
174
+ the typed finding shape above; field meanings inside the version 1 dependency,
175
+ integration, and Session State inventories are unchanged. Consumers that only
176
+ understand version 1 must reject version 2 rather than decoding the new arrays
177
+ as the old empty placeholder shape.
150
178
 
151
179
  `Settings > Notifications > Delivery sources` shows active Codex, Claude, and
152
180
  Antigravity hooks plus tmux statuses, conflicts, config paths, and
@@ -161,6 +189,7 @@ than a standalone Settings row.
161
189
  ```
162
190
  projmux diagnostics log [--tail N] [--json]
163
191
  [--level info|error] [--component NAME] [--path]
192
+ projmux diagnostics report [--output <path>]
164
193
  ```
165
194
 
166
195
  Reads the local operational event journal through the same tolerant JSONL
@@ -181,6 +210,52 @@ channel and never change command output or exit status. See
181
210
  [operational-diagnostics.md](operational-diagnostics.md) for the file,
182
211
  retention, concurrency, and privacy contracts.
183
212
 
213
+ `ai watch-title` emits a bounded common lifecycle: one start, one terminal
214
+ pane-gone/hook-active stop, and at most one copy of each closed watcher failure
215
+ tuple per process. Normal polling iterations emit nothing. AI hook ingest emits
216
+ common events only for malformed/read/oversized payloads, unmatched or invalid
217
+ targets, unsupported event classification, and route failures. Provider event
218
+ names, payloads, prompt/tool/transcript values, notification text, pane
219
+ metadata, paths, UUIDs, and conversation/session IDs are never stored. Normal
220
+ state/notify/quiet/dedupe hook results stay zero-volume in the common AI family;
221
+ the existing notify transition remains the owner when notification behavior
222
+ occurs.
223
+
224
+ Session create/attach/switch/kill and `tmux apply` use correlated
225
+ `lifecycle.start`/`lifecycle.outcome` records instead of a duplicate generic
226
+ top-level outcome. The text and JSONL views expose only the closed safe
227
+ `operation` and optional `code` enums; session names, socket paths, tmux
228
+ targets, subprocess argv, and generated configuration are never recorded.
229
+
230
+ `diagnostics report` is the explicit consent boundary for creating one local
231
+ private `tar.gz` support archive. The invocation first prints a redacted
232
+ destination label, the complete included/omitted entry list, stable omission reasons, report
233
+ schema, and redaction mode; the first parent/temp/archive write happens only
234
+ after that preview is successfully written. `--output` selects the local
235
+ destination. Without it, the command uses a timestamped archive in the current
236
+ directory. Existing destinations are never replaced.
237
+
238
+ The archive contains `manifest.json`, safe projmux version/platform/backend
239
+ metadata, a redacted projection of Doctor JSON schema version 2,
240
+ config presence states (never values), up to 50 recent errors from the existing
241
+ bounded operations reader, and count-only AI ingest diagnostics. Paths,
242
+ session/window/pane/thread/routing identifiers, run IDs, tool/version output,
243
+ commands, guidance, reasons, and other free text are field-scoped hashes unless they
244
+ match a closed diagnostic enum/static-name allowlist. Raw config/environment
245
+ values, argv/stdin, prompts, notification text, pane output, transcripts, and
246
+ hook payloads are never collected. Missing, corrupt, or unreadable sources are
247
+ recorded as stable manifest omissions. Report collection does not repair source
248
+ permissions, migrate hooks, append an operational outcome, contact a network,
249
+ upload, create an issue, or run in the background; only the explicitly selected
250
+ output parent/temp/archive can be written.
251
+
252
+ The redacted Doctor projection keeps `schema_version`, closed runtime/log
253
+ finding enums, and structural/count
254
+ numbers as numbers. Numeric routing fields such as `window_index` and
255
+ `pane_index` become field-scoped hash strings under `default-hash-v1`; consumers
256
+ must treat this support projection as redacted evidence rather than decoding it
257
+ back into the unredacted Doctor Go types.
258
+
184
259
  ## focus
185
260
 
186
261
  ```
@@ -278,10 +353,12 @@ projmux notify reconcile [--json]
278
353
  While open, the native
279
354
  sidebar refreshes its row list on successful queue-write events without an
280
355
  Alt-2 close/reopen toggle, using the same deferred refresh path as `a` and
281
- `x`. The sidebar uses two-line cards with notification text first and
282
- compact age/project/window/pane metadata below. Hidden queue ids remain
283
- action values, but the sidebar has no search input. `--client` is used by
284
- tmux popup launchers to keep row-select focus on the clicked client.
356
+ `x`. The sidebar is a pane/session-grouped inbox whose collapsed rows are
357
+ fixed three-line cards: project/session, agent/provider, and newest age on
358
+ line 1; topic/pane-title/task context plus severity/live-state metadata on
359
+ line 2; and the latest notification preview on line 3. Hidden queue ids
360
+ remain action values, but the sidebar has no search input. `--client` is used
361
+ by tmux popup launchers to keep row-select focus on the clicked client.
285
362
  - `ack <id>` removes one entry; `--all` flushes the queue.
286
363
  - `reconcile` — walks `tmux list-panes -a` and back-fills entries for
287
364
  panes whose attention state is `reply` AND whose AI agent option is
@@ -293,7 +370,7 @@ projmux notify reconcile [--json]
293
370
 
294
371
  ## usage
295
372
 
296
- Authoritative AI token usage. See [usage-tracking.md](usage-tracking.md)
373
+ Authoritative AI account usage. See [usage-tracking.md](usage-tracking.md)
297
374
  for adapter detail.
298
375
 
299
376
  ```
@@ -308,14 +385,27 @@ Codex shares the global `30s`). `--json` emits the snapshot array; when
308
385
  backoff is active the wrapper `{snapshots, backoff}` object is emitted
309
386
  instead.
310
387
 
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)`.
388
+ Claude keeps the canonical aggregate `5h` and `weekly` rows and projects each
389
+ valid typed upstream `limits[]` entry as a named `quota/<exact group>` row.
390
+ Model-scoped rows append the exact upstream model display identity in text
391
+ output; terminal controls are escaped and the visible label is bounded without
392
+ normalizing the stored identity. JSON preserves the typed named-quota metadata,
393
+ including nullable scope/model ID/surface, reset, `updated_at`, and `stale`.
394
+ These percent-only rows never synthesize token counts. A malformed limits block
395
+ fails that adapter refresh so the prior complete Claude slice remains visible;
396
+ a valid aggregate-only response replaces and removes obsolete named rows.
397
+
398
+ Antigravity emits official account rows labelled
399
+ `quota/<upstream bucket ID>`. Conversation-local context remains private
400
+ hook/notify diagnostic metadata and legacy cached context rows are suppressed
401
+ from text and JSON output. `--window quota` selects named account rows; opaque
402
+ IDs such as `weekly` are not aliases for the fixed `weekly` window. Used
403
+ percent is `100 * (1 - remaining_fraction)`. `--window context` remains
404
+ accepted for compatibility and returns no Usage rows.
315
405
  `reset_time` and optional `reset_in_seconds` are preserved independently,
316
406
  including the distinction between absent and explicit zero. Invalid,
317
407
  disabled, missing, or empty quota data degrades without reinterpreting the
318
- conversation context row.
408
+ private conversation context diagnostic.
319
409
 
320
410
  ## resources
321
411
 
@@ -325,21 +415,33 @@ projmux resources
325
415
 
326
416
  Opens the native, read-only Resource Inspector. It samples only while this
327
417
  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.
418
+ a non-overlapping two-second cadence. Right or Enter drills Project → Window →
419
+ Pane → Pane detail; Left returns (and is a no-op at the root), while Esc closes
420
+ the popup at every depth. Search matches the current scope's display name and
421
+ stable tmux id. Tab cycles CPU, Memory, and Name sorting; Ctrl-R requests an
422
+ immediate refresh. A plain `r` remains search input.
333
423
 
334
424
  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
425
+ core-equivalent CPU. Project and window rows count panes, while pane rows count
426
+ the attributed processes. Pane rows and detail share the resolved pane identity
427
+ and label the tmux current command, PID/SID, pane id, and TTY separately. Memory
428
+ is explicitly an RSS sum (shared pages can be counted more than once) plus its
429
+ host ratio. `No project match`, `Multiple project matches`, and non-drillable
430
+ `Other / unattributed` remain explicit. The first two are display labels over
431
+ stable internal attribution keys. Warming, partial, unavailable, unknown, and
432
+ overage states also remain explicit. No process
339
433
  command list, mutation, history, graph, daemon, persistence, or Session State
340
434
  telemetry is created. Linux/tmux provides attribution; unsupported platforms
341
435
  show an unavailable reason rather than zero metrics.
342
436
 
437
+ Only Resource Inspector anomalies (`unavailable`, `partial`, `stale`, closed
438
+ collection-stage errors, and scan-budget exhaustion) enter the private bounded
439
+ operations journal. Identical persistent anomalies are transition-coalesced;
440
+ healthy periodic samples and refreshes emit zero records. These records contain
441
+ no CPU/RSS values, PID/process detail, project/tmux identity, path/title/command,
442
+ or arbitrary error/status text. `diagnostics report` includes only error-level
443
+ closed resource outcomes; local-only partial/stale info rows are omitted.
444
+
343
445
  This is distinct from `projmux status resources`, which remains the short
344
446
  host-only statusbar renderer.
345
447
 
@@ -365,9 +467,14 @@ projmux status resources
365
467
  `~/.cache/tmux/kube-segment-<session>.txt` first (TTL governed by
366
468
  `TMUX_KUBE_CACHE_TTL`, default `5s`). Picks up a per-session
367
469
  `KUBECONFIG` from `${XDG_RUNTIME_DIR:-~/.cache}/kube-sessions/<session>.yaml`.
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`
370
- shrinks. Triggers an opportunistic, throttled refresh (per-adapter
470
+ - `usage` — HUD-style provider blocks containing only official `5h` and
471
+ `weekly` windows. Antigravity's exact `quota/gemini-weekly` snapshot is
472
+ projected as `weekly` without changing its cached identity; other named
473
+ quotas and context never consume status width. Claude typed `limits[]`
474
+ named/model rows are likewise excluded, so only its aggregate `5h` and
475
+ `weekly` rows reach the status line. Narrow tiers keep one primary window per
476
+ provider (`5h`, otherwise `weekly`) before hard truncation.
477
+ Triggers an opportunistic, throttled refresh (per-adapter
371
478
  throttle, `30s` floor) so a stale cache self-heals.
372
479
  - `notify` — newest-first HUD block with project, state, optional agent, text,
373
480
  age, and `+<extras>`. Window/pane ids remain routable metadata but are not
@@ -392,16 +499,22 @@ projmux statusbar usage-refresh
392
499
  ```
393
500
 
394
501
  Click/keyboard dispatcher for the two-line status bar. Implemented range ids:
395
- `session pwd kube git usage notify settings`. The bare `window` /
502
+ `session pwd kube git resources usage notify settings`. The bare `window` /
396
503
  `window|<idx>` token (tmux's built-in window-list range) and the empty
397
504
  range fall through to `select-window -t @<mouse_window>` so the native
398
- click-to-switch tab affordance is preserved on row 0. Unknown range ids are
505
+ click-to-switch tab affordance is preserved on row 1. Unknown range ids are
399
506
  non-specialized placeholders and no-op. `session` opens the existing-session
400
507
  popup; `pwd` shows the current pane path in a native-framed display-only
401
508
  popup; `kube` and `git` open the project switcher popup;
402
509
  `settings` toggles the settings popup for the tmux client; `usage` opens the
403
- detailed `projmux usage` table popup; `notify` focuses and acks the newest
404
- actionable queue target. The internal `usage-refresh` shortcut entry point
510
+ detailed cached account-usage popup. Legacy context rows are suppressed and
511
+ named quotas retain exact identity/reset/freshness values. Claude model-scoped
512
+ rows distinguish the exact group and model display identity with bounded,
513
+ terminal-safe labels; JSON retains their full typed metadata. `USED`, `LIMIT`,
514
+ and `LEFT` appear together only when at least one displayed row has real
515
+ absolute counts; percent-only datasets omit those columns rather than
516
+ synthesizing counts.
517
+ `notify` focuses and acks the newest actionable queue target. The internal `usage-refresh` shortcut entry point
405
518
  runs the same throttled, per-adapter collection policy as `status usage` and
406
519
  then reopens the display-only usage popup from cache.
407
520
  `MouseDown1Status` errors are
@@ -433,11 +546,11 @@ supplied window.
433
546
 
434
547
  ```
435
548
  projmux ai split [--agent <claude|codex|antigravity|shell|selective|resume>] [--force-agent] [--print-pane-id] [right|down] [-- <extra-arg>...]
436
- projmux ai picker [--inside] [--shell] [--resume] <right|down>
437
- projmux ai settings
438
- projmux ai status set <thinking|waiting|idle> [--pane <id>]
439
- projmux ai notify <reset|notify> [--pane <id>]
440
- projmux ai watch-title [--pane <id>]
549
+ projmux ai picker [--inside] [--shell] [--resume] [right|down]
550
+ projmux ai settings [--get|--set <mode>]
551
+ projmux ai status set <thinking|waiting|idle> [pane]
552
+ projmux ai notify [notify|reset] [pane]
553
+ projmux ai watch-title [pane]
441
554
  projmux ai ingest codex-hook < payload.json
442
555
  projmux ai ingest claude-hook < payload.json
443
556
  projmux ai ingest antigravity-hook [--event <PreInvocation|PostInvocation|PostToolUse|Stop|Statusline>] < payload.json
@@ -640,9 +753,9 @@ restore is included: Antigravity ingest stores `conversationId` as pane thread
640
753
  metadata for matching and as session-state resume metadata. Restore uses
641
754
  `agy --conversation <uuid>` when that id is present and UUID-shaped; otherwise
642
755
  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
756
+ `context_window.used_percentage` is persisted with its conversation id as
757
+ private hook/notify diagnostic metadata and is not surfaced as account usage.
758
+ The official `quota` map is persisted independently and surfaces each valid entry as
646
759
  `quota/<exact bucket ID>` with independently retained absolute and relative
647
760
  reset values. Bucket IDs are never mapped to `5h`/`weekly`, and account quota
648
761
  is never inferred from the conversation-local gauge.
@@ -664,6 +777,15 @@ payloads are not stored. The log is capped at 1 MiB and trimmed to the most
664
777
  recent roughly 512 KiB when it grows past the cap. Use `--json` for raw JSONL
665
778
  and `--path` to print the resolved file path.
666
779
 
780
+ This legacy log is retained for compatibility. Its producer, `ingest log`
781
+ consumer, 1 MiB/roughly 512 KiB retention, and support-report count summary are
782
+ unchanged. The common operations journal now carries only the safe anomalous
783
+ classification and watcher lifecycle described above. Both surfaces run in
784
+ parallel during the migration. It is now documented as a deprecation candidate,
785
+ but this release does not deprecate, remove, rename, or change it; a separate
786
+ breaking roadmap must first migrate its detailed local consumer. See
787
+ [legacy-diagnostics-inventory.md](legacy-diagnostics-inventory.md).
788
+
667
789
  For `Stop`, projmux reads `transcript_path` when present and extracts the last
668
790
  assistant text from the transcript tail; if that is unavailable, it falls back
669
791
  to a generic Claude completion row. `PermissionRequest` rows expose the tool
@@ -840,15 +962,21 @@ accepted by `popup-toggle` mirror the historical sessionizer surface:
840
962
  `rename-pane` sets only the pane-scoped user label
841
963
  `@projmux_pane_label`; an empty label clears the option. It does not change the
842
964
  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.
965
+ keybinding action id is `rename-pane-label`. The retired `rename-pane-topic`
966
+ keymap action is no longer accepted: replace a stale
967
+ `[bindings.rename-pane-topic]` table with `[bindings.rename-pane-label]`.
968
+ The advanced `projmux ai topic set/clear` commands remain available and keep
969
+ AI topic ownership separate from the user pane label and raw pane title.
845
970
  `apply` regenerates the app tmux config and reloads the live `-L projmux`
846
971
  server without restarting it. `make install` and `projmux upgrade` invoke it
847
972
  after replacing the binary. Settings > Keybindings normally runs the same
848
973
  save/config/reload flow automatically; use `projmux tmux apply` as the CLI
849
974
  recovery or sync path after hand-editing `keymap.toml`, after saving Settings
850
975
  outside tmux, or after resolving a reported config-generation or live-reload
851
- failure.
976
+ failure. Reload also removes the known retired no-prefix `C-t` pane-label
977
+ binding from older live servers before installing current bindings. If the
978
+ current keymap assigns `C-t` to another action, that current action is bound
979
+ after cleanup and remains the owner.
852
980
 
853
981
  ## update
854
982
 
@@ -183,7 +183,7 @@ shows the keymap error row and refuses to overwrite it until the file is fixed.
183
183
 
184
184
  The file currently affects generated tmux config from `projmux tmux
185
185
  print-config`, `projmux tmux install`, `projmux tmux print-app-config`,
186
- `projmux tmux install-app`, and `projmux shell`. Terminal init adapters such as
186
+ `projmux tmux install-app`, and `projmux shell`. Terminal remediation adapters such as
187
187
  Ghostty and Windows Terminal install built-in plain-byte mappings where needed;
188
188
  they do not read `keymap.toml` or copy saved keys into terminal configs.
189
189
  Changing terminal-layer mappings still requires rerunning `projmux setup
@@ -439,7 +439,6 @@ confidence for DB-validated cache sources or low confidence for legacy history.
439
439
  | `PROJMUX_SESSIONSTATE_AUTOSAVE` | Session snapshot autosave override for the global fallback. Values such as `off`, `false`, or `0` disable autosave for projects that inherit the global setting; explicit project auto-save `on`/`off` still takes precedence. |
440
440
  | `PROJMUX_SESSIONSTATE_DEBUG` | When non-empty, quiet autosave surfaces suppressed session-state errors to stderr. |
441
441
  | `PROJMUX_FOCUS_DEBUG` | When non-empty, `projmux focus` prints one telemetry line to stderr. |
442
- | `PROJMUX_PICKER_BACKEND` | Legacy picker backend override. Any value, including old `fzf` settings, now resolves to the native picker. |
443
442
  | `PROJMUX_INSTALLER` | Installer source hint used by update flows. npm installs set this automatically; advanced release installs can set `github-release`. |
444
443
  | `PROJMUX_SHELL_UPDATE_CHECK_TIMEOUT_MS` | Timeout in milliseconds for the best-effort release check attempted by `projmux shell` when the update cache is missing or stale. Invalid, zero, or negative values use the default. |
445
444
 
@@ -841,7 +840,9 @@ warning at 70–89%, and critical at 90% or above; memory is normal below 75%,
841
840
  warning at 75–89%, and critical at 90% or above. The two values are classified
842
841
  and styled independently. Normal and unavailable (`--`) values use the
843
842
  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.
843
+ values use the bold critical role. Visible severity words are omitted and each
844
+ percent uses a fixed four-column slot, including `%`, so metric transitions do
845
+ not resize the segment. No threshold values are stored in config.
845
846
 
846
847
  The CPU delta cache is internal state at
847
848
  `${XDG_STATE_HOME:-~/.local/state}/projmux/live-resources-sample.json`.
@@ -34,7 +34,7 @@ Classification:
34
34
 
35
35
  | Family | Examples | Class | Phase 0 policy |
36
36
  | --- | --- | --- | --- |
37
- | Agent names | `Codex`, `Claude`, `AI` | `literal` | Preserve exactly. |
37
+ | Agent names | `Codex`, `Claude`, `Antigravity`, `AI` | `literal` | Preserve exactly. |
38
38
  | Category labels | `Response complete`, `Approval required`, `Input required`, `Error`, `Subagent stopped`, `Teammate waiting` | `translate` | English baseline now; catalog keys later. |
39
39
  | Review body prefix | `Review pending:` | `translate` | English baseline now; catalog key later. |
40
40
  | Tool names | `Bash`, `Read`, `WebFetch`, `Shell` | `literal` | Preserve provider/source spelling. |
@@ -78,7 +78,7 @@ Classification:
78
78
  | Row labels and previews | enabled/disabled state, current source, saved values | `translate` | Inventory only; catalog later. |
79
79
  | Disabled reasons and warnings | missing project, env override, conflict text | `translate` | Inventory only; catalog later. |
80
80
  | Config keys and env vars | `PROJMUX_PROJDIR`, `config.toml`, `ui.locale` | `literal` | Preserve exactly. |
81
- | Commands shown for copying | `projmux ai integrate codex --dry-run` | `literal` | Preserve exactly. |
81
+ | Commands shown for copying | `projmux ai integrate codex --dry-run`, `projmux ai integrate antigravity --dry-run` | `literal` | Preserve exactly. |
82
82
  | Persisted values | `none`, `notify`, `raise`, `auto` | `literal` | Preserve enum values. |
83
83
 
84
84
  ### Native Picker And Render Surfaces
@@ -87,7 +87,7 @@ Files:
87
87
 
88
88
  - `internal/ui/projmuxpicker/*`
89
89
  - `internal/ui/render/*`
90
- - `docs/native-picker-no-fzf-poc.md`
90
+ - `docs/native-picker.md`
91
91
 
92
92
  Classification:
93
93
 
@@ -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`,
127
+ - Product and agent names: `Codex`, `Claude`, `Antigravity`, `projmux`, `tmux`,
128
128
  `GitHub`, `npm`.
129
129
  - Terminal and app names: `Windows Terminal`, `Ghostty`, `WezTerm`, `Kitty`,
130
130
  `iTerm2`, `Alacritty`, `Foot`.
@@ -239,7 +239,8 @@ Contribution convention:
239
239
  - Add the `en-US` entry in the same change as the key.
240
240
  - Add `ko-KR` when the translation is known; otherwise rely on fallback while
241
241
  keeping the missing key intentional in review notes.
242
- - Do not translate product names (`projmux`, `tmux`, `Codex`, `Claude`),
242
+ - Do not translate product names (`projmux`, `tmux`, `Codex`, `Claude`,
243
+ `Antigravity`),
243
244
  commands, paths, config keys, environment variables, provider payloads, or
244
245
  source enum values.
245
246
  - Runtime migrations should be narrow by surface. Move a string family behind
@@ -296,7 +297,8 @@ Width-safe rendering:
296
297
 
297
298
  Runtime surfaces migrated:
298
299
 
299
- - AI desktop notification summaries for Codex and Claude hook payloads.
300
+ - AI desktop notification summaries for Codex, Claude, and Antigravity hook
301
+ payloads.
300
302
  - In-app notify queue table/sidebar/statusbar display text for AI entries.
301
303
  - Notify live explanation text for `projmux notify list --live`.
302
304
  - Sidebar/table/statusbar age formatting and sidebar stale/gone/target labels.
@@ -317,9 +319,9 @@ Literal preservation and parity rules:
317
319
  - Translate only catalog-owned category labels such as `Response complete`,
318
320
  `Approval required`, `Input required`, `Error`, `Subagent stopped`, and
319
321
  `Teammate waiting`.
320
- - Preserve provider-owned payloads verbatim: `Codex`, `Claude`, tool names,
321
- commands, paths, URLs, query strings, transcript excerpts, teammate IDs, and
322
- subagent IDs.
322
+ - Preserve provider-owned payloads verbatim: `Codex`, `Claude`, `Antigravity`,
323
+ tool names, commands, paths, URLs, query strings, transcript excerpts,
324
+ teammate IDs, and subagent IDs.
323
325
  - Desktop notification summaries and in-app queue display text must use the
324
326
  same rendered category labels for the same locale while preserving the same
325
327
  literal payload body.
package/docs/hooks.md CHANGED
@@ -205,11 +205,11 @@ If a `send-noti` hook itself calls `projmux notify push`, projmux sees
205
205
  `PROJMUX_NOTIFY_HOOK_DEPTH=1` in the child environment and skips another
206
206
  `send-noti` hook fire. The queue write itself still succeeds.
207
207
 
208
- `Settings > Notifications > Delivery sources` surfaces the active Codex hooks,
209
- Claude, and tmux AI notify diagnostics: status, conflicts, config paths, and
210
- copyable CLI install/remove/dry-run commands. It also shows whether
208
+ `Settings > Notifications > Delivery sources` surfaces the active Codex,
209
+ Claude, Antigravity, and tmux AI notify diagnostics: status, conflicts, config
210
+ paths, and copyable CLI install/remove/dry-run commands. It also shows whether
211
211
  `PROJMUX_NOTIFY_HOOK` overrides the built-in desktop sender. It does not install
212
- or remove external Codex, Claude, or tmux settings.
212
+ or remove external Codex, Claude, Antigravity, or tmux settings.
213
213
 
214
214
  `PROJMUX_NOTIFY_HOOK` is separate from `[hooks.send-noti]`: it replaces the
215
215
  desktop sender and receives positional arguments
@@ -731,16 +731,28 @@ projmux does not run `post-attach` for outside-tmux attach paths in this phase.
731
731
 
732
732
  ## Environment
733
733
 
734
- Hooks inherit projmux's environment, plus:
735
-
736
- | Variable | Always set | Description |
737
- | --- | --- | --- |
738
- | `PROJMUX_SESSION` | yes | tmux session name |
739
- | `PROJMUX_CWD` | yes | lifecycle working directory; for creation events this is the new session directory |
740
- | `PROJMUX_SESSION_KIND` | yes | `persistent` or `ephemeral` for creation events; empty for `post-attach` |
741
- | `PROJMUX_VERSION` | yes | projmux version string |
742
- | `PROJMUX_SOCKET` | only if projmux used `tmux -L <socket>` | tmux socket name |
743
- | `PROJMUX_PANE` | only for pane events | tmux pane id such as `%7` |
734
+ Hooks inherit projmux's environment. The lifecycle variables below are added by
735
+ event; “omitted” means the variable is not added when its context value is
736
+ empty.
737
+
738
+ | Variable | `pre-create` | `post-create` | `post-attach` | `send-noti` |
739
+ | --- | --- | --- | --- | --- |
740
+ | `PROJMUX_SESSION` | new session name | new session name | target session name | target session when known; otherwise empty |
741
+ | `PROJMUX_CWD` | requested session directory | created session directory | resolved target directory; may be empty if lookup fails | dispatcher working directory |
742
+ | `PROJMUX_SESSION_KIND` | `persistent` or `ephemeral` | `persistent` or `ephemeral` | empty | empty |
743
+ | `PROJMUX_VERSION` | projmux version | projmux version | projmux version | projmux version |
744
+ | `PROJMUX_SOCKET` | app socket metadata (`projmux`) | app socket metadata (`projmux`) | app socket metadata (`projmux`) | queue-entry socket when known; otherwise omitted |
745
+ | `PROJMUX_PANE` | omitted: no pane exists yet | exact id returned by standard persistent/ephemeral `tmux new-session`, such as `%7`; omitted for snapshot replay | omitted | target pane when known; otherwise omitted |
746
+
747
+ `pre-create` intentionally has no `PROJMUX_PANE`: it runs before
748
+ `tmux new-session` creates the first pane. Standard persistent and ephemeral
749
+ `post-create` paths run after creation and therefore receive that exact pane
750
+ id. Snapshot replay can restore multiple panes and does not expose a single
751
+ returned pane at its lifecycle boundary, so it omits `PROJMUX_PANE`.
752
+ `PROJMUX_SOCKET` is routing metadata for hook commands; it does not imply that
753
+ the tmux client itself adds `-L` to its commands. The `post-attach` and
754
+ `send-noti` cells describe their existing contexts; this contract adds no pane
755
+ context to either event.
744
756
 
745
757
  ## Examples
746
758
 
@@ -749,6 +761,7 @@ Hooks inherit projmux's environment, plus:
749
761
  ```bash
750
762
  #!/usr/bin/env bash
751
763
  echo "session=$PROJMUX_SESSION cwd=$PROJMUX_CWD kind=$PROJMUX_SESSION_KIND"
764
+ tmux -L "$PROJMUX_SOCKET" set-option -p -t "$PROJMUX_PANE" @projmux_initialized 1
752
765
  ```
753
766
 
754
767
  ### Project Startup Command
@@ -770,7 +783,7 @@ case "$PROJMUX_CWD" in
770
783
  *) exit 0 ;;
771
784
  esac
772
785
 
773
- tmux set-environment -t "$PROJMUX_SESSION" GH_TOKEN "$token"
786
+ tmux -L "$PROJMUX_SOCKET" set-environment -t "$PROJMUX_SESSION" GH_TOKEN "$token"
774
787
  ```
775
788
 
776
789
  `set-environment` only seeds the session env that newly-spawned panes inherit;
@@ -194,7 +194,7 @@ Settings > Keybindings stays a discovery surface. It must continue to expose
194
194
  launch toggles, sidebar keymap actions, picker-local actions, pane switching,
195
195
  window switching, and rename actions. The basic Settings flow is not the
196
196
  terminal remediation surface: key-role replacement, disable-default, typed
197
- fallback, terminal mapping preview/apply, and init execution rows stay out of
197
+ fallback and terminal mapping preview/apply rows stay out of
198
198
  the action detail.
199
199
 
200
200
  The product model does not support `UserN` or `CSI-u` as fallback guidance.
@@ -242,7 +242,10 @@ Settings is the default apply path for key edits: it writes the key list,
242
242
  refreshes the generated config, and reloads the running tmux session when
243
243
  possible. Use `projmux tmux apply` as a CLI recovery/sync command after editing
244
244
  the keymap file by hand, after an outside-tmux Settings save, or after resolving
245
- a reported generated-config or live-reload failure.
245
+ a reported generated-config or live-reload failure. Generated config first
246
+ unbinds the known retired `C-t` pane-label chord, then installs the current
247
+ keymap; an explicit current `C-t` assignment therefore wins without retaining
248
+ the retired command body. Apply does not rewrite `keymap.toml`.
246
249
 
247
250
  ## Keymap File
248
251