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.
- package/README-ko.md +89 -72
- package/README.md +21 -14
- package/docs/agent-workflow.md +26 -14
- package/docs/architecture.md +2 -2
- package/docs/cli.md +197 -69
- package/docs/configuration.md +4 -3
- package/docs/globalization.md +11 -9
- package/docs/hooks.md +28 -15
- package/docs/keybindings.md +5 -2
- package/docs/legacy-diagnostics-inventory.md +23 -0
- package/docs/native-picker.md +103 -0
- package/docs/operational-diagnostics.md +215 -8
- package/docs/pr-guideline.md +1 -1
- package/docs/resource-attribution.md +77 -4
- package/docs/session-restore.md +18 -0
- package/docs/settings-ia.md +10 -9
- package/docs/statusbar.md +28 -18
- package/docs/tmux-surface-inventory.md +0 -1
- package/docs/upgrading.md +29 -7
- package/docs/usage-tracking.md +63 -19
- package/package.json +5 -5
- package/docs/native-picker-no-fzf-poc.md +0 -227
- package/docs/native-picker-parity.md +0 -155
- package/docs/picker-ui-plan.md +0 -91
package/docs/architecture.md
CHANGED
|
@@ -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
|
|
57
|
-
[picker
|
|
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
|
|
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 [
|
|
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).
|
|
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
|
|
68
|
-
selection/source rows have been retired. The native picker is always used
|
|
69
|
-
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
`
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
|
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 →
|
|
329
|
-
Pane detail;
|
|
330
|
-
|
|
331
|
-
Name sorting; Ctrl-R requests an
|
|
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.
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
|
369
|
-
|
|
370
|
-
|
|
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
|
|
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
|
|
404
|
-
|
|
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]
|
|
437
|
-
projmux ai settings
|
|
438
|
-
projmux ai status set <thinking|waiting|idle> [
|
|
439
|
-
projmux ai notify
|
|
440
|
-
projmux ai watch-title [
|
|
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
|
|
644
|
-
|
|
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
|
|
844
|
-
|
|
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
|
|
package/docs/configuration.md
CHANGED
|
@@ -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
|
|
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.
|
|
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`.
|
package/docs/globalization.md
CHANGED
|
@@ -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
|
|
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
|
|
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`,
|
|
321
|
-
commands, paths, URLs, query strings, transcript excerpts,
|
|
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
|
|
209
|
-
Claude, and tmux AI notify diagnostics: status, conflicts, config
|
|
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
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
| `
|
|
739
|
-
|
|
|
740
|
-
| `
|
|
741
|
-
| `
|
|
742
|
-
| `
|
|
743
|
-
| `
|
|
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;
|
package/docs/keybindings.md
CHANGED
|
@@ -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
|
|
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
|
|