projmux 0.15.3 → 0.16.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/statusbar.md CHANGED
@@ -29,17 +29,16 @@ row 1 [#S] #{pane_current_path} <git> CPU 12% MEM 41%  %H:%M
29
29
  state surface.
30
30
  Settings > Appearance > Status Bar controls `Notifications HUD` and `Agent
31
31
  Usage HUD` independently. Agent Usage HUD is a View whose `Visible` parent
32
- contains Claude/Codex/Antigravity provider Views; each provider has its own
33
- `Visible` plus explicit supported windows (Claude/Codex: `5h`, `Weekly`;
34
- Antigravity: `Weekly`). Every leaf defaults on except Codex `5h`, which
32
+ contains Claude/Codex provider Views; each provider has its own
33
+ `Visible` plus explicit supported windows (`5h`, `Weekly`). Antigravity has
34
+ no usage source and no row. Every leaf defaults on except Codex `5h`, which
35
35
  defaults off; saving it as on explicitly restores that window. Parent off
36
36
  preserves saved children, and returning it on restores them. When only one HUD is visible, its
37
37
  sole range receives the full `#{client_width}` budget and the absent range and
38
38
  alignment are not emitted. When both are hidden, tmux collapses to one line
39
39
  with `status on`,
40
- moves the native Window row to `status-format[0]`, unsets stale higher rows,
41
- and keeps the app's quiet Session State autosave job on that surviving row;
42
- there is no empty HUD row. These toggles hide presentation only and do not
40
+ moves the native Window row to `status-format[0]`, and unsets stale higher
41
+ rows; there is no empty HUD row. These toggles hide presentation only and do not
43
42
  mutate the Notification queue or usage collection/cache/API state.
44
43
  Provider/window visibility also changes only the ambient status projection;
45
44
  the cached popup and explicit `agent usage` table/JSON stay lossless. If every
@@ -304,11 +303,11 @@ as a secondary bar and cannot be shed by rule 3.
304
303
  Only hard rune-truncation, below every listed step, can reach either.
305
304
 
306
305
  Within a per-provider rule the steps run **tail-first** over the canonical
307
- provider order (Claude, Codex, Antigravity), so the provider a user reads first
308
- is the last to lose detail. This is why a 120-cell budget renders
309
- `Claude 5h [bar] · weekly [bar] Codex 5h [bar] Antigravity~~ weekly [bar]`
310
- — Codex's second window paid for Claude's — where whole-segment tier selection
311
- dropped both second windows at once and rendered 92 cells into a 120-cell row.
306
+ provider order (Claude, Codex), so the provider a user reads first
307
+ is the last to lose detail. This is why a 100-cell budget renders
308
+ `Claude 5h [bar] · weekly [bar] Codex 5h [bar]` — Codex's second window paid
309
+ for Claude's — where whole-segment tier selection would drop both second
310
+ windows at once.
312
311
 
313
312
  The order lives in **exactly one place in code**: `usageShedOrder` in
314
313
  `internal/app/usagecmd/usage.go`. The entry names above are that variable's
@@ -351,18 +350,16 @@ the queued notify segment, not to the separate window-list live attention badge.
351
350
  the cached usage state in-process and aligns model/window rows with
352
351
  right-aligned numeric values, dims unavailable values, keeps stale sync/age
353
352
  metadata muted, and colors only threshold values: amber at 80% and red at 95%.
354
- Antigravity rows keep conversation-local `context` separate from account
355
- `quota/<exact upstream bucket ID>` rows; the popup displays an absolute reset
356
- when provided and otherwise the exact optional relative reset seconds. Opaque
357
- bucket IDs are escaped for terminal/tmux safety and are never assigned a
353
+ Named `quota/<exact upstream bucket ID>` rows display an absolute reset when
354
+ provided and otherwise the exact optional relative reset seconds; cached
355
+ Antigravity rows from the removed adapter are not shown, and an enabled
356
+ Antigravity appears only as an `usage unsupported` row. Opaque bucket IDs are escaped for terminal/tmux safety and are never assigned a
358
357
  `5h`/`weekly` cadence. Claude retains aggregate `5h`/`weekly` rows alongside
359
358
  typed named/model `limits[]` rows in this popup: model-scoped rows display the
360
359
  exact upstream group plus model display identity with a bounded terminal-safe
361
360
  label, reset, and per-row age. The compact status line excludes every Claude
362
361
  named/model row and continues to use only the aggregate official windows.
363
- Session State inspection lives under `Projects > Sessions > State`; global
364
- Settings > Session State is settings-only and the statusbar no longer exposes a
365
- duplicate State button.
362
+ The statusbar has no State button.
366
363
 
367
364
  The path popup uses the native picker frame chrome, a one-line title,
368
365
  the full wrapped current path, cheap project/git metadata when available, and
package/docs/testing.md CHANGED
@@ -7,6 +7,8 @@ and humans run the same entrypoints.
7
7
 
8
8
  - `make test` runs the fast Go unit suite. These tests avoid tmux, TTY, GUI,
9
9
  and host shell dependencies.
10
+ - `make vet` runs `go vet ./...`. CI runs it in the Unit Tests job after
11
+ `make test`.
10
12
  - Picker unit coverage includes the backend-neutral item/action contract,
11
13
  native title-focused filtering, numeric selection, and shared close actions.
12
14
  - `make test-integration` builds `test/docker/Dockerfile` and runs
@@ -40,6 +42,19 @@ and humans run the same entrypoints.
40
42
  runner is slow or loaded; a wait that expires still fails with the description
41
43
  of what it was waiting for, so a slow machine reports a timeout rather than
42
44
  the regression message of the assertion that would have run next.
45
+ - `make test-e2e-update` runs `test/e2e/update-flow.sh` in the Node image
46
+ (`test/docker/Dockerfile.node`) on a bridged network. It installs an older
47
+ published `projmux` from the public npm registry, runs the source build's
48
+ `update apply`, and asserts the global install reaches the latest published
49
+ version while the exact legacy tmux server, socket, and sessions survive,
50
+ then checks npm installer autodetection from an npm-shaped path. Because it
51
+ depends on the public registry and the published package, it is not a
52
+ required check and stays out of the aggregate `Test`: the separate
53
+ `Update Flow E2E` workflow runs it on pull requests that change the update
54
+ path, daily on a schedule, and on manual dispatch. A local run skips when the
55
+ registry is unreachable; under CI (`CI=true`) or
56
+ `PROJMUX_UPDATE_FLOW_STRICT=1` the script runs with `--strict`, where a skip
57
+ fails the run instead.
43
58
  - `make test-e2e-contract`, `make test-e2e-reliability`, and
44
59
  `make test-e2e-shards` validate typed attempt evidence, bounded semantic
45
60
  waits/owned cleanup, and exhaustive four-shard isolation without rerunning
@@ -10,7 +10,6 @@ Primary production sources:
10
10
 
11
11
  - `internal/integrations/mux/`
12
12
  - `internal/integrations/tmux/`
13
- - `internal/integrations/sessionstate/`
14
13
  - `internal/app/`
15
14
  - generated config from `projmux config render standalone`,
16
15
  `projmux config render app`, and `projmux shell`
@@ -79,7 +78,7 @@ focus resolution, preview, and recent-window inventory.
79
78
 
80
79
  The typed `internal/integrations/tmux.Client` owns higher-level operations
81
80
  such as ensure/open/kill sessions, recent session summaries, preview inventory,
82
- resource inventory, and session-state capture/replay.
81
+ and resource inventory.
83
82
 
84
83
  ## Generated Configuration Surface
85
84
 
@@ -87,7 +86,7 @@ The standalone and app configs own:
87
86
 
88
87
  - app/runtime marker options such as `@projmux_app`;
89
88
  - status rows, ranges, palette options, mouse dispatch, and popup bindings;
90
- - AI, attention, notify, recent-window, session-state, and resource hooks;
89
+ - AI, attention, notify, recent-window, and resource hooks;
91
90
  - project-root and live-resource options;
92
91
  - reload/apply behavior for default and named sockets.
93
92
 
@@ -102,11 +101,11 @@ integration or e2e coverage when live tmux behavior changes.
102
101
  | Identity | `display-message -p`, `list-clients -F` | focus, switch, hooks |
103
102
  | Pane/window inventory | `list-panes -a -F`, `list-windows -F` | preview, notify, attention, recent windows |
104
103
  | Session lifecycle | `has-session`, `new-session`, `attach-session`, `switch-client`, `kill-session` | attach, switch, sessions |
105
- | Split/window creation | `split-window`, `new-window` | AI split, shell, session restore |
104
+ | Split/window creation | `split-window`, `new-window` | AI split, shell, Project materialization |
106
105
  | Metadata | `set-option -p`, `show-options`, `display-message` | AI state, labels, app ownership |
107
- | Hooks | `set-hook`, `show-hooks`, `run-shell -b` | notify, attention, autosave, recent windows |
106
+ | Hooks | `set-hook`, `show-hooks`, `run-shell -b` | notify, attention, recent windows |
108
107
  | Interactive UI | `display-popup`, `capture-pane`, `resize-pane` | popup surfaces, title watch, layout |
109
- | State replay | `rename-window`, `select-layout`, `select-pane`, `send-keys` | session state |
108
+ | Topology materialization | `rename-window`, `select-layout`, `select-pane`, `send-keys` | Project Continue and Registry reconcile |
110
109
  | Config | `source-file`, global/session options | install, apply, shell |
111
110
  | Resource inventory | `list-panes -a -F` with PID/TTY/project fields | Linux resource attribution |
112
111
 
@@ -121,7 +120,6 @@ Changes to this surface should preserve the repository validation order:
121
120
  5. `make test-integration`;
122
121
  6. `make test-e2e`.
123
122
 
124
- The maintained test list in [agent-workflow.md](agent-workflow.md) must change
125
- with behavior. Live tests must use isolated tmux sockets and must validate
126
- returned ids or queried server state rather than pane ordering, screen content,
127
- or `send-keys` as a completion signal.
123
+ Live tests must use isolated tmux sockets and must validate returned ids or
124
+ queried server state rather than pane ordering, screen content, or `send-keys`
125
+ as a completion signal.
@@ -126,10 +126,8 @@ history without a current activation is excluded. A complete comparison with no
126
126
  mismatches emits no comparison block. An unreadable Registry or missing,
127
127
  inconsistent, orphaned, or unobservable activation produces an `unavailable` or
128
128
  `incomplete` enumeration signal; confirmed mismatches remain visible alongside
129
- those gaps. A foreign Codex state domain, opaque generation, or a present or
130
- unreadable generation pool is unobservable from the default daemon probe.
131
- Private pool generations can also have version-shaped IDs, so Doctor does not
132
- infer their running endpoint from that spelling or from admission-current.
129
+ those gaps. A foreign Codex state domain or an opaque generation is
130
+ unobservable from the default daemon probe.
133
131
 
134
132
  The additive `codex_endpoint_mismatch` JSON field carries the same mismatch set,
135
133
  enumeration gaps, and evidence strength without changing the schema version.
package/docs/upgrading.md CHANGED
@@ -52,6 +52,141 @@ still requires an explicit `PROJMUX_INSTALLER=github-release`.
52
52
 
53
53
  ## Behavior Changes
54
54
 
55
+ ### Closed Project startup setting removed
56
+
57
+ The closed-Project startup screen is now shown for every registered Project
58
+ that has no running session, and it is never shown for a folder that is not a
59
+ registered Project -- Enter registers and opens that folder in one step.
60
+ With nothing left to choose, the setting that turned the screen off is gone.
61
+
62
+ - Settings > Projects > Project Sidebar > Closed Project startup is removed.
63
+ Project Sidebar keeps its Runtime diagnostics choice.
64
+ - `~/.config/projmux/sidebar-startup-picker` is no longer read. The first
65
+ `projmux config apply` after upgrading (which `make install` and
66
+ `projmux update apply` also run) removes it and prints one
67
+ `reclaimed retired closed-Project startup setting: removed 1 file` line.
68
+ Only a regular file with that name is removed; a failure is reported and
69
+ never fails the apply, and later applies print nothing.
70
+ - **A saved `off` is not migrated.** If you had turned the screen off, a
71
+ registered closed Project shows it again. Its default row is Continue
72
+ project, so Enter opens the Project the way `off` did.
73
+ - The second row is renamed from **Recreate Project** to
74
+ **Clear layout and open** (ko-KR: **구성 비우고 새로 열기**). It clears only
75
+ the Project's saved Window and Agent layout; the folder, its files,
76
+ `.projmux/config.toml`, and trust stay. Its confirmation screen uses the same
77
+ name, and its cancel row is **Keep the saved layout**. What the row does is
78
+ unchanged.
79
+ - `switch sidebar-open --mode fresh` keeps its token, so a sidebar started by
80
+ an older client still reaches the renamed row's action.
81
+
82
+ ### Antigravity statusLine support removed
83
+
84
+ projmux no longer installs, reads, or judges the Antigravity `statusLine` in
85
+ `~/.gemini/antigravity-cli/settings.json`. Only the official hooks entry
86
+ (`projmux` in `~/.gemini/config/hooks.json`) remains.
87
+
88
+ - The first `projmux config apply` after upgrading (which `make install` and
89
+ `projmux update apply` also run) removes only a `statusLine` whose `command`
90
+ carries the `projmux-managed:antigravity-statusline:v1` marker, whatever its
91
+ `enabled`, `stack_with_default`, extra keys, or executable path. The rest of
92
+ the file keeps its bytes and mode. It is never re-installed, and
93
+ `projmux agent integrate antigravity` never creates or writes the file.
94
+ `agent integrate antigravity --remove` also removes the marker entry.
95
+ - A user-owned `statusLine`, or any value without the marker, is left
96
+ untouched and can no longer block install, cause a conflict, or change the
97
+ doctor status. A malformed or unreadable settings file is skipped.
98
+ - Until that removal runs, a leftover bridge calling
99
+ `internal agent-hook ingest antigravity-hook --event Statusline` exits 0 with
100
+ empty stdout and changes nothing.
101
+ - Antigravity usage display (`agent usage`, the statusbar HUD and popup, and
102
+ the Settings usage rows), the Antigravity approval-required notification,
103
+ and the mid-turn busy detail are gone until Antigravity offers official
104
+ events for them. `agent usage --model antigravity` is still accepted and
105
+ prints the `usage unsupported` note; `agent capabilities` reports Antigravity
106
+ usage as unsupported. Working state still follows the official
107
+ `PreInvocation`/`Stop` hooks.
108
+ - Leftover `~/.config/projmux/statusbar-visibility-*antigravity*` files,
109
+ `<state>/usage/antigravity-*.json` sidecars, and cached Antigravity rows in
110
+ `snapshots.json` are ignored, not deleted. Doctor JSON no longer has
111
+ `statusline_config_path`, and the diagnostic is named `Antigravity hooks`.
112
+
113
+ ### Project snapshots removed
114
+
115
+ `registry.json` is now the only saved Project state. projmux no longer saves or
116
+ restores Project snapshots anywhere else, so these surfaces are gone:
117
+
118
+ - the `create snapshot`, `get snapshots`, `delete snapshot`,
119
+ `restore snapshot`, and `prune snapshot` commands. `create`, `get`,
120
+ `delete`, and `prune` now refuse the `snapshot` kind with a usage error. The
121
+ `restore` command group had no other child and is removed with them, so
122
+ `restore snapshot` fails as an unknown command. `prune` now prunes only stale
123
+ Projects and Agents;
124
+ - the hidden `session-state` route;
125
+ - the Global and Project **Snapshots** pages in Settings: the auto-save toggle
126
+ and interval, the per-Project auto-save override, and the save latest, save
127
+ named, preview, and delete actions;
128
+ - the snapshot view in the session popup and its `SessionPopup:OpenState`
129
+ keybinding;
130
+ - the session-state section of `projmux doctor`, including
131
+ `doctor --section session-state` and the `session_state_resume` and
132
+ `session_state_prune` JSON fields.
133
+
134
+ projmux no longer emits `session-state.outcome` diagnostics records. Records
135
+ with that event in existing logs are still read and accepted.
136
+
137
+ The existing `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/sessions` directory
138
+ is no longer read. `projmux config apply` (which `make install` runs) removes
139
+ the `*.json` snapshot files in it once, along with the `sessionstate-autosave`
140
+ and `sessionstate-autosave-interval` files and the
141
+ `sessionstate-projects/<session>/autosave` files under the config directory,
142
+ and then removes the `sessions/` and `sessionstate-projects/` directories if
143
+ they end up empty. It only removes regular files with those names and never
144
+ follows symlinks. Any other entry there is kept, and the apply that removes
145
+ the files lists it on its one `reclaimed retired Project snapshot files: ...`
146
+ line; later applies with nothing left to remove print nothing. To keep the old files,
147
+ copy those directories before you upgrade. `PROJMUX_SESSIONSTATE_AUTOSAVE` is
148
+ ignored. Tmux configs rendered by older installs may
149
+ still call `projmux internal tmux autosave-session-state`; that route stays and
150
+ exits 0 without writing anything.
151
+
152
+ Closed Projects start from the Registry: **Continue project** materializes the
153
+ Project's stored Windows and Panes, and **Recreate Project** (since renamed
154
+ **Clear layout and open**) replaces them with a fresh graph.
155
+ Settings > Projects > Project Sidebar > Closed Project startup and its
156
+ `sidebar-startup-picker` file were unchanged by that release; a later release
157
+ removed them
158
+ ([Closed Project startup setting removed](#closed-project-startup-setting-removed)).
159
+ Settings no longer saves a
160
+ named layout from a live session into `<project>/.projmux/layouts`, and no
161
+ current surface opens those files.
162
+ Leftover `.projmux/layouts` files on disk and layout entries in
163
+ `trusted-projects.json` are kept and ignored.
164
+
165
+ ### Private Codex generation files reclaimed
166
+
167
+ The private Codex generation pool is gone; app-server lifetime belongs to
168
+ `codex app-server daemon`. Nothing reads the files that pool left on disk, and
169
+ `projmux config apply` (which `make install` and `projmux update apply` also
170
+ run) removes them once:
171
+
172
+ - under `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/codex-generations/`:
173
+ `rolling-upgrade.json` and its `.flock`, the stored `qualification/*.json`
174
+ records, and the leased release bundles in `bundles/sha256-<digest>/`, which
175
+ are the bulk of that directory;
176
+ - under `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/g/<key>/`: each private
177
+ host's `.projmux-launch-<generation>.json` intent, its `.guard`, and the
178
+ app-server socket nothing listens on anymore.
179
+
180
+ Each directory is removed once it ends up empty. Only entries whose names have
181
+ exactly those shapes are removed, and symlinks are never followed. A private
182
+ host whose socket still accepts a connection keeps its whole directory and is
183
+ named on the report line instead, so an app-server that outlived projmux does
184
+ not lose the socket under it. Any other entry is kept and listed on the single
185
+ `reclaimed retired Codex generation files: ...` line that apply prints; later
186
+ applies with nothing left to remove print nothing. A failure is reported on
187
+ that line and never fails the apply, and a rerun converges. To keep the old
188
+ files, copy those directories before you upgrade.
189
+
55
190
  ### Claude dialogue endpoint revalidation
56
191
 
57
192
  The heterogeneous dialogue release moves the public message envelope and
@@ -124,8 +259,7 @@ That is evidence of incompatibility, not permission to proceed. Operators must
124
259
  refuse a binary-only downgrade before installation and must not permit the old
125
260
  binary to write final-v2 bytes. To roll back during the prerelease window, stop
126
261
  the final writer, restore the exact pre-normalization Registry backup, and
127
- restore the matching intermediate binary as a pair. Snapshots are not migration
128
- or rollback inputs and are never rewritten by this normalization.
262
+ restore the matching intermediate binary as a pair.
129
263
 
130
264
  Rollback rehearsal is byte-oriented: record the backup path, mode, SHA-256,
131
265
  and matching pre-release binary revision; stop every final-v2 writer; atomically
@@ -346,7 +480,7 @@ commands and exit 1. Use `internal ...` for generated plumbing and `config
346
480
  render|apply` for public configuration work.
347
481
 
348
482
  The mixed roots retain only `attach project`, `focus project|window|pane`, `pin
349
- project`, and `prune project|snapshot`. Shortcuts and singular/plural resource
483
+ project`, and `prune agent|project`. Shortcuts and singular/plural resource
350
484
  kind aliases are unchanged. The ledger contains the complete removed
351
485
  argv/replacement/error matrix.
352
486
 
@@ -359,8 +493,8 @@ queue maintenance.
359
493
 
360
494
  ### Managed Agent hook producer migration
361
495
 
362
- The installer now writes Codex, Claude, Antigravity named hooks, Antigravity
363
- Statusline, and the tmux bell fallback with the canonical
496
+ The installer now writes Codex, Claude, Antigravity named hooks, and the tmux
497
+ bell fallback with the canonical
364
498
  `projmux internal agent-hook ingest ...` entrypoint. Copyable integration
365
499
  commands use `projmux agent integrate <provider>`.
366
500
 
@@ -374,8 +508,9 @@ through v0.11.1 before the next release when you need the migration-window
374
508
  event guarantee.
375
509
 
376
510
  Migration is ownership- and transaction-aware. Codex managed blocks and the
377
- Claude, Antigravity, Statusline, and tmux-bell markers are the only ownership
378
- evidence. Missing integrations and markerless commands are not installed or
511
+ Claude, Antigravity, and tmux-bell markers are the only ownership
512
+ evidence (the legacy Antigravity statusLine marker is only ever removed; see
513
+ [Antigravity statusLine support removed](#antigravity-statusline-support-removed)). Missing integrations and markerless commands are not installed or
379
514
  rewritten. Provider file plans and conflicts are collected before the first
380
515
  file write. Live bell state is then inventoried on the exact target socket
381
516
  before its first command; a later bell failure rolls back both that live state
@@ -1,22 +1,26 @@
1
1
  # Usage tracking
2
2
 
3
3
  `projmux agent usage` and `projmux internal status usage` report authoritative fixed-window
4
- utilisation for Claude/Codex and official named quota buckets for Antigravity.
4
+ utilisation for Claude/Codex.
5
5
  `--model all`, the tmux
6
6
  HUD, and the statusbar usage popup use Settings > AI Settings > Enabled
7
- agents as the source of truth, so disabled Claude/Codex/Antigravity providers are
7
+ agents as the source of truth, so disabled Claude/Codex providers are
8
8
  not refreshed or rendered on ambient/all surfaces. Explicit read-only
9
- requests such as `projmux agent usage --model claude`, `--model codex`, or
10
- `--model antigravity`
9
+ requests such as `projmux agent usage --model claude` or `--model codex`
11
10
  still collect and render that provider even when it is disabled.
12
11
 
13
- Claude and Codex adapters read the upstream's own account view. Antigravity
14
- reads only the official managed statusline payload: `context_window` remains
15
- private conversation-local diagnostic metadata, while each valid `quota` map
16
- entry is a separate account row. Projmux preserves the upstream bucket ID and
17
- never guesses that an undocumented ID means `5h` or `weekly`. It does not infer
18
- quota, cadence, reset timestamps, or account limits from screen scraping,
19
- tokens, history, OAuth/cache files, or binary strings.
12
+ Claude and Codex adapters read the upstream's own account view. projmux does
13
+ not infer quota, cadence, reset timestamps, or account limits from screen
14
+ scraping, tokens, history, OAuth/cache files, or binary strings.
15
+
16
+ Antigravity has no usage adapter: Antigravity offers no official usage event,
17
+ and projmux no longer reads its statusLine. `--model antigravity` is still
18
+ accepted; it prints no rows and the `Antigravity usage unsupported` note (exit
19
+ status 0), and an enabled Antigravity shows the same note on `--model all` and
20
+ in the statusbar popup. Rows an older Antigravity adapter left in
21
+ `snapshots.json` are never printed or projected, and leftover
22
+ `usage/antigravity-*.json` sidecars and Antigravity statusbar visibility files
23
+ are neither read nor deleted.
20
24
 
21
25
  Claude keeps the canonical aggregate `five_hour` and `seven_day` rows and also
22
26
  preserves structurally valid typed `limits[]` rows as named account quotas for
@@ -128,30 +132,6 @@ rollout fallback row records `source=rollout` plus the closed fallback reason.
128
132
  If neither lane produces rows, Manager preserves the previous source/value and
129
133
  adds a closed `stale_reason` to the last-known-good row.
130
134
 
131
- ### Antigravity (`internal/core/usage/adapters/antigravity`)
132
-
133
- Local managed-statusline sidecars. No network or credential reads.
134
-
135
- - `context_window.used_percentage` and its conversation ID remain in the
136
- private context sidecar for hook/notify diagnostics. They do not become
137
- Usage snapshots. The legacy string percentage remains a writer fallback.
138
- - The official `quota` map is sorted by its exact bucket ID. Each valid bucket
139
- becomes `window=quota`, `bucket=<upstream ID>` and renders as
140
- `quota/<upstream ID>` on account-inspection surfaces.
141
- - Used percent is `100 * (1 - remaining_fraction)`. Non-finite or values
142
- outside `[0,1]`, empty IDs, null/disabled entries, and negative relative
143
- resets are ignored safely. Rejected and duplicate buckets are skipped
144
- individually — the healthy buckets in the same map still become rows — and the
145
- skip is reported by sorted row index only, never by bucket ID.
146
- - `reset_time` and optional `reset_in_seconds` are stored independently. An
147
- absent relative reset differs from explicit zero; no value is derived from
148
- the other.
149
- - Context and quota use independent private sidecars. A context-only payload
150
- does not erase the last quota observation. An explicit empty/null quota map
151
- records no buckets; the manager's existing rule still preserves prior model
152
- rows when an adapter returns zero total rows. Context never participates in
153
- that account-row replacement decision.
154
-
155
135
  ## Snapshot store
156
136
 
157
137
  ```
@@ -180,7 +160,7 @@ across machines (Dropbox, iCloud Drive).
180
160
  ### `projmux agent usage`
181
161
 
182
162
  ```
183
- projmux agent usage [--model codex|claude|antigravity|all] [--window 5h|weekly|context|quota|all]
163
+ projmux agent usage [--model codex|claude|all] [--window 5h|weekly|context|quota|all]
184
164
  [--json] [--force|-f]
185
165
  ```
186
166
 
@@ -192,7 +172,6 @@ Enabled agents, filters by window, and renders the tab-aligned table:
192
172
  MODEL WINDOW PCT RESETS_AT RESET_IN STALE SOURCE REASON
193
173
  codex 5h/codex · General 12% 2026-05-07T14:00:00+09:00 - app-server
194
174
  claude 5h 80% 2026-05-07T14:00:00+09:00 -
195
- antigravity quota/gemini-weekly 6% 2026-07-06T16:50:32+09:00 560580s
196
175
  claude quota/group-redacted · Model Redacted Alpha 38% 2031-02-03T15:05:06+09:00 - *
197
176
  ```
198
177
 
@@ -210,11 +189,9 @@ claude is in backoff, try again in 30m (use --force to bypass)
210
189
 
211
190
  When no AI agents are enabled, all-model table output contains no
212
191
  provider rows and prints a short Settings hint. `--json` returns an
213
- empty array. Explicit `--model claude`, `--model codex` and
214
- `--model antigravity` bypass the enabled-agent filter for read-only
215
- inspection and collect/render only the requested adapter. Antigravity reports
216
- zero or more account `quota/<bucket-id>` rows. Legacy cached `window=context`
217
- rows are suppressed in text and JSON output. `--window quota` selects only
192
+ empty array. Explicit `--model claude` and `--model codex` bypass the
193
+ enabled-agent filter for read-only inspection and collect/render only the
194
+ requested adapter. Legacy cached `window=context` rows are suppressed in text and JSON output. `--window quota` selects only
218
195
  account buckets; `--window weekly` never matches an opaque quota bucket named
219
196
  `weekly`. `--window context` remains an accepted compatibility filter and
220
197
  returns no Usage rows.
@@ -236,11 +213,10 @@ after collection, throttle/backoff, and cache load. If no AI
236
213
  agents are enabled, the status segment emits nothing.
237
214
 
238
215
  The HUD first derives an ambient projection separate from lossless account
239
- snapshots. The explicit HUD capability map admits Claude/Codex `5h` and
240
- `weekly`, while Antigravity's exact `quota/gemini-weekly` identity alone is
241
- projected as `weekly`
242
- without rewriting the cache. Context, `3p-weekly`, and unknown quota buckets
243
- do not participate in status width. Claude `limits[]` named/model rows are also
216
+ snapshots. The explicit HUD capability map admits only Claude/Codex `5h` and
217
+ `weekly`. Context, named quota buckets, and cached rows from providers without
218
+ a capability (such as the removed Antigravity adapter) do not participate in
219
+ status width. Claude `limits[]` named/model rows are also
244
220
  excluded; only its aggregate official `5h` and `weekly` rows reach the HUD.
245
221
  The Settings provider list consumes `aiprovider.UsageSupported()` order, but a
246
222
  window toggle exists only when this same projection seam declares it. A future
@@ -355,7 +331,7 @@ When a collection fails, the failure is visible in three places:
355
331
  not be read), or `response-invalid` (a 200 body that did not parse). The
356
332
  class comes from the adapter's typed error, never from its message text. A
357
333
  failure without a class stays `collect-failed`, and so does every whole
358
- Codex or Antigravity failure. Status codes, paths, upstream bodies, and
334
+ Codex failure. Status codes, paths, upstream bodies, and
359
335
  credentials never reach the row. Codex rollout fallback records
360
336
  `source=rollout` plus its closed fallback reason; retained data records
361
337
  `source=last-known-good` plus its closed stale reason. A healthy native
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.15.3",
3
+ "version": "0.16.0",
4
4
  "description": "tmux project session manager",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/crevissepartners/projmux#readme",
@@ -28,9 +28,9 @@
28
28
  "package:npm:pack": "scripts/package-npm.sh --pack"
29
29
  },
30
30
  "optionalDependencies": {
31
- "@projmux/linux-x64": "0.15.3",
32
- "@projmux/linux-arm64": "0.15.3",
33
- "@projmux/darwin-x64": "0.15.3",
34
- "@projmux/darwin-arm64": "0.15.3"
31
+ "@projmux/linux-x64": "0.16.0",
32
+ "@projmux/linux-arm64": "0.16.0",
33
+ "@projmux/darwin-x64": "0.16.0",
34
+ "@projmux/darwin-arm64": "0.16.0"
35
35
  }
36
36
  }