projmux 0.15.2 → 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/README-ko.md +3 -4
- package/README.md +3 -3
- package/docs/agent-message-replies.md +82 -2
- package/docs/ai-agent-shortcuts.md +6 -5
- package/docs/architecture.md +149 -63
- package/docs/claude-coordination-endpoints.md +192 -21
- package/docs/cli-guide.md +322 -124
- package/docs/cli.md +605 -500
- package/docs/codex-installed-compatibility.md +6 -11
- package/docs/codex-native-required-migration.md +1 -59
- package/docs/configuration.md +164 -176
- package/docs/globalization.md +11 -1
- package/docs/heterogeneous-dialogue-canary.md +8 -3
- package/docs/hooks.md +83 -32
- package/docs/keybindings.md +108 -3
- package/docs/legacy-cli-retirement.md +3 -3
- package/docs/legacy-diagnostics-inventory.md +4 -4
- package/docs/native-picker.md +3 -5
- package/docs/notify-queue.md +1 -1
- package/docs/operational-diagnostics.md +53 -31
- package/docs/pr-guideline.md +66 -22
- package/docs/release.md +97 -0
- package/docs/replacement-contract.md +66 -58
- package/docs/resource-attribution.md +2 -2
- package/docs/session-restore.md +46 -80
- package/docs/settings-ia.md +43 -20
- package/docs/statusbar.md +25 -22
- package/docs/testing.md +15 -0
- package/docs/theme-palette.md +14 -0
- package/docs/tmux-surface-inventory.md +8 -10
- package/docs/troubleshooting.md +2 -4
- package/docs/upgrading.md +142 -7
- package/docs/usage-tracking.md +56 -53
- package/package.json +5 -5
- package/docs/agent-workflow.md +0 -2123
- package/docs/codex-generation-pool.md +0 -623
- package/docs/codex-stored-qualification.md +0 -45
package/docs/settings-ia.md
CHANGED
|
@@ -58,7 +58,7 @@ step, never a silent no-op.
|
|
|
58
58
|
Project`, which forwards to the canonical `create project --root` route for
|
|
59
59
|
that one exact path, and `Unpin candidate`, which removes the preference and
|
|
60
60
|
leaves the directory alone. Nothing here adopts a path automatically.
|
|
61
|
-
- `Project Sidebar [View]` — holds the
|
|
61
|
+
- `Project Sidebar [View]` — holds the Projects sidebar policy:
|
|
62
62
|
`Runtime diagnostics [Choice]` chooses `When needed` (the read-time default
|
|
63
63
|
with nothing saved) or `Always` for the sidebar's Runtime row. `When needed`
|
|
64
64
|
keeps the row for a refused runtime class or for an observation that could
|
|
@@ -68,26 +68,27 @@ step, never a silent no-op.
|
|
|
68
68
|
Recent Windows links are unchanged, and `projmux runtime diagnostics` and
|
|
69
69
|
`get runtime` never read it. An unrecognized saved value applies the default
|
|
70
70
|
without writing and shows an invalid source.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
`Continue project - off - saved`, skips the picker, and retains the
|
|
76
|
-
registered-Continue/unregistered-Fresh automatic
|
|
77
|
-
adjudication. Reading the row or opening/cancelling the picker never writes
|
|
78
|
-
the default or changes saved preference bytes/mtime.
|
|
71
|
+
The closed-Project startup screen has no setting: a registered closed
|
|
72
|
+
Project always gets it, and a root that is not a registered Project never
|
|
73
|
+
does. Its two rows are `Continue project` and `Clear layout and open`
|
|
74
|
+
(`이어서 열기` / `구성 비우고 새로 열기` in ko-KR).
|
|
79
75
|
`Continue project` materializes the Project's current Registry desired state
|
|
80
|
-
and then moves the client. `
|
|
76
|
+
and then moves the client. `Clear layout and open` confirms the exact old Project
|
|
81
77
|
UID and per-kind counts before writing anything,
|
|
82
78
|
atomically replaces the old Project graph with a new Project UID and a new
|
|
83
79
|
canonical Window/shell UID pair, and leaves exactly one same-root claimant
|
|
84
80
|
before ordinary materialization. Esc returns to Projects. Neither action
|
|
85
|
-
deletes or rewrites
|
|
86
|
-
keeps its `sidebar-startup-picker` spelling.
|
|
81
|
+
deletes or rewrites the folder, its files, Git, worktree data, or trust.
|
|
87
82
|
- **AI** — `AI` is a product category, never an addressable resource.
|
|
88
83
|
- `Default launch target [Choice]` — an Agent Provider, a Shell Pane, or
|
|
89
84
|
choose-at-launch. It is a keybinding/picker preference and does not weaken
|
|
90
85
|
the canonical `create agent` explicit-provider requirement.
|
|
86
|
+
- `New splits start in [Choice]` — `Project root` (default) or
|
|
87
|
+
`Current Pane directory`, shown with the tier that decided it (`project`,
|
|
88
|
+
`global`, `default`). It writes only the global `[ai] split_cwd_from` and
|
|
89
|
+
decides UI splits only; the Pane directory is used only inside the Project
|
|
90
|
+
root, and the CLI does not follow this setting (`create pane|agent` obey
|
|
91
|
+
`--cwd-from` alone).
|
|
91
92
|
- `Enabled providers [View]` — Claude, Codex, and Antigravity are Providers;
|
|
92
93
|
`Shell`, `Selective` and `Resume` are not Providers and never appear here.
|
|
93
94
|
- `Agent Resume Picker [View]` — states that resume targets an existing Agent
|
|
@@ -141,10 +142,10 @@ step, never a silent no-op.
|
|
|
141
142
|
HUD`, `Working directory` and `Git` are component Views because each owns a
|
|
142
143
|
`Visible` Toggle plus an icon `Choice`; cwd/Git icon `off` removes only the
|
|
143
144
|
icon and leaves the text segment visible. `Agent Usage HUD` is a component
|
|
144
|
-
View with `Visible`, then Claude/Codex
|
|
145
|
+
View with `Visible`, then Claude/Codex provider Views in the
|
|
145
146
|
usage-supported catalog order. Each provider owns `Visible` plus only its
|
|
146
|
-
explicit HUD windows
|
|
147
|
-
|
|
147
|
+
explicit HUD windows, `5h` and `Weekly`; Antigravity has no usage source and
|
|
148
|
+
no provider View. Parent off states gate effective visibility without rewriting
|
|
148
149
|
saved child values. Provider/window rows show saved, effective, and source.
|
|
149
150
|
`Project`, `Clock` and `Settings launcher` are direct visibility Toggles. These global
|
|
150
151
|
presentation values default on except Codex `5h`, which defaults off to
|
|
@@ -157,8 +158,6 @@ step, never a silent no-op.
|
|
|
157
158
|
presentation-only and do not disable their underlying producers, cache,
|
|
158
159
|
backoff, explicit table/JSON command, or cached popup.
|
|
159
160
|
- `Language / Locale [Choice]` and `Agent attention badge style [Choice]`.
|
|
160
|
-
- **Snapshots** — the visible noun is the Snapshot resource. `session-state`
|
|
161
|
-
remains the config/route spelling and appears only as source detail.
|
|
162
161
|
- **Keybindings** — `Launch & popups`, `Agent & Pane launch`,
|
|
163
162
|
`Pane & Window navigation`, `Sidebar & picker actions` (nested by surface:
|
|
164
163
|
Project Sidebar, Session Picker, Notification Sidebar, Settings), and
|
|
@@ -215,15 +214,39 @@ step, never a silent no-op.
|
|
|
215
214
|
the approve/revoke actions) and `Project hooks [View]` (`Session lifecycle`
|
|
216
215
|
plus `After notification queued`, with the same per-event Views the global
|
|
217
216
|
scope uses, extended by a trust state row).
|
|
218
|
-
- **Snapshots** — the auto-save override and the saved snapshots.
|
|
219
217
|
|
|
220
218
|
Without an actionable project context the Project surface renders a single
|
|
221
219
|
passive guidance row rather than repeating a disabled reason per row.
|
|
222
220
|
|
|
221
|
+
## Search
|
|
222
|
+
|
|
223
|
+
Search reaches every setting from the Settings root. A non-empty query at the
|
|
224
|
+
root lists the current scope's settings as one `path > label` list (rendered
|
|
225
|
+
with `›`) built by walking the navigation catalog, and choosing a result opens
|
|
226
|
+
the owning View with the cursor on that row without running its control --
|
|
227
|
+
Confirm and Action rows included, so `Quit Projmux` and `Reset theme` are
|
|
228
|
+
focused and never fired. The list is scope-pure: a Global query never returns
|
|
229
|
+
Project nodes and a Project query never returns Global ones, and with no project
|
|
230
|
+
context the Project tab returns nothing. User-data collection items -- an
|
|
231
|
+
individual discovery root, pinned Project or candidate -- are data
|
|
232
|
+
rather than settings, so results stop at their parent View and at the
|
|
233
|
+
collection-level controls. Inside a View the query still filters that View's
|
|
234
|
+
rows, and category rows carry their members' search text so search crosses
|
|
235
|
+
categories.
|
|
236
|
+
|
|
237
|
+
The result rows are built from the catalog alone: no Registry, tmux,
|
|
238
|
+
or filesystem read participates, because a result is a destination
|
|
239
|
+
rather than a rendered value. Where that leaves a row unnameable -- a saved
|
|
240
|
+
user path, a command whose row spelling depends on whether a command is
|
|
241
|
+
already stored, a read-only state row that stands for several rendered lines --
|
|
242
|
+
the result still appears and opens the owning View on its first row instead of
|
|
243
|
+
guessing a row. The same happens when the target row is simply not rendered any
|
|
244
|
+
more: the View opens, unfocused, and nothing errors.
|
|
245
|
+
|
|
223
246
|
## Vocabulary and compatibility
|
|
224
247
|
|
|
225
248
|
Visible nouns follow the shared resource vocabulary: `Project`, `Window`,
|
|
226
|
-
`Pane`, `Agent`, `Provider`, `Notification`,
|
|
249
|
+
`Pane`, `Agent`, `Provider`, `Notification`, with `AI` as a category
|
|
227
250
|
and `Session` as the runtime projection. The Agent Usage HUD is a presentation
|
|
228
251
|
of what the canonical `agent usage` command provides; there is no addressable
|
|
229
252
|
`Usage` resource, and Settings never spells usage as a readable resource kind.
|
|
@@ -271,7 +294,7 @@ result replaces it. Typed validation and staged apply failures stay in the popup
|
|
|
271
294
|
instead of being visible only on stdout/stderr.
|
|
272
295
|
|
|
273
296
|
The generic feedback inventory deliberately excludes Welcome, Quit, read-only
|
|
274
|
-
hook/effective/notification diagnostics,
|
|
297
|
+
hook/effective/notification diagnostics, and key
|
|
275
298
|
capture/probe/diagnostic bodies. Those flows own a viewer, confirmation, or
|
|
276
299
|
multi-step output surface; only an actual Settings write at their boundary is
|
|
277
300
|
eligible for transient mutation feedback.
|
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
|
|
33
|
-
`Visible` plus explicit supported windows (
|
|
34
|
-
|
|
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
|
|
41
|
-
|
|
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
|
|
@@ -254,10 +253,16 @@ bind-key -n MouseDown1Status if-shell -F "#{==:#{mouse_status_range},window}" \
|
|
|
254
253
|
## Usage element drop order
|
|
255
254
|
|
|
256
255
|
The compact Codex provider identity is native-first. An authoritative healthy
|
|
257
|
-
app-server snapshot renders as `Codex`;
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
256
|
+
app-server snapshot renders as `Codex`; a retained last-known-good snapshot is
|
|
257
|
+
qualified as `Codex [stale]`. A fallback lane carries no text qualifier: it
|
|
258
|
+
keeps the bare `Codex` label, painted in the `provenance` theme color (user
|
|
259
|
+
decision: *"codex[fallback] 하단 status 바대신 주황색의 Codex가나오는게어때"* →
|
|
260
|
+
*"B로 가자"*, a role color of its own rather than a reused threshold color, with
|
|
261
|
+
`[stale]` kept). The text tiers below the bars emit no color, so the same row
|
|
262
|
+
spells `Codex^ 5h:17%` / `X^ 5h:17%` — one ASCII cell instead of the former
|
|
263
|
+
11-cell ` [fallback]` tag. Unknown non-stale provenance uses that same
|
|
264
|
+
conservative fallback presentation. These labels are locale-invariant,
|
|
265
|
+
including on en-US and ko-KR narrow rows. The full Usage table, JSON, and diagnostics retain
|
|
261
266
|
the raw source and closed reason; the statusbar label is presentation only.
|
|
262
267
|
|
|
263
268
|
The usage segment does not pick a whole-segment tier. It starts from its
|
|
@@ -298,11 +303,11 @@ as a secondary bar and cannot be shed by rule 3.
|
|
|
298
303
|
Only hard rune-truncation, below every listed step, can reach either.
|
|
299
304
|
|
|
300
305
|
Within a per-provider rule the steps run **tail-first** over the canonical
|
|
301
|
-
provider order (Claude, Codex
|
|
302
|
-
is the last to lose detail. This is why a
|
|
303
|
-
`Claude 5h [bar] · weekly [bar] Codex 5h [bar]
|
|
304
|
-
|
|
305
|
-
|
|
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.
|
|
306
311
|
|
|
307
312
|
The order lives in **exactly one place in code**: `usageShedOrder` in
|
|
308
313
|
`internal/app/usagecmd/usage.go`. The entry names above are that variable's
|
|
@@ -345,18 +350,16 @@ the queued notify segment, not to the separate window-list live attention badge.
|
|
|
345
350
|
the cached usage state in-process and aligns model/window rows with
|
|
346
351
|
right-aligned numeric values, dims unavailable values, keeps stale sync/age
|
|
347
352
|
metadata muted, and colors only threshold values: amber at 80% and red at 95%.
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
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
|
|
352
357
|
`5h`/`weekly` cadence. Claude retains aggregate `5h`/`weekly` rows alongside
|
|
353
358
|
typed named/model `limits[]` rows in this popup: model-scoped rows display the
|
|
354
359
|
exact upstream group plus model display identity with a bounded terminal-safe
|
|
355
360
|
label, reset, and per-row age. The compact status line excludes every Claude
|
|
356
361
|
named/model row and continues to use only the aggregate official windows.
|
|
357
|
-
|
|
358
|
-
Settings > Session State is settings-only and the statusbar no longer exposes a
|
|
359
|
-
duplicate State button.
|
|
362
|
+
The statusbar has no State button.
|
|
360
363
|
|
|
361
364
|
The path popup uses the native picker frame chrome, a one-line title,
|
|
362
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
|
package/docs/theme-palette.md
CHANGED
|
@@ -54,6 +54,7 @@ onto these stable names:
|
|
|
54
54
|
| `action_required` | AI needs-input/approval badge color | AI action-required badge (independent of `critical`) |
|
|
55
55
|
| `pane_active_bg` | active-pane background tint | active-pane window-active-style tint (tmux pane chrome) |
|
|
56
56
|
| `focus` | active-pane border color | active-pane border (tmux pane chrome) |
|
|
57
|
+
| `provenance` | fallback-data-source label color | compact usage label for a row served by a fallback source (never a usage threshold color) |
|
|
57
58
|
|
|
58
59
|
`text_primary` and `chrome_foreground` split the old broad foreground behavior:
|
|
59
60
|
changing primary content text no longer repaints frame/title/search/border/status
|
|
@@ -71,6 +72,17 @@ failure, destructive, over-limit, or risk states. `pane_active_bg` and `focus`
|
|
|
71
72
|
are also public keys driving the active-pane tint and border (tmux-only pane
|
|
72
73
|
chrome, with no ANSI/native role).
|
|
73
74
|
|
|
75
|
+
`provenance` colors a compact usage label whose numbers came from a fallback
|
|
76
|
+
data source instead of the provider's authoritative one (today: a Codex row
|
|
77
|
+
outside a healthy app-server). It is deliberately neither `warning` nor
|
|
78
|
+
`critical` — those mean usage thresholds — nor the `accent.ai` label color a
|
|
79
|
+
healthy row uses, because it is the only signal that row carries. Every built-in
|
|
80
|
+
preset defines it as an orange (hue 15-45°) whose nearest tmux color differs
|
|
81
|
+
from that preset's five state colors and from `colour121`; the fallback theme
|
|
82
|
+
uses `colour208`, and an explicit light `status_background` darkens that literal
|
|
83
|
+
the same way it darkens the other statusbar text roles. It is a tmux-only role
|
|
84
|
+
(`usage.provenance_fg`) with no ANSI/native counterpart.
|
|
85
|
+
|
|
74
86
|
Renderer-only role names such as `accent.ai`, `state.progress`, `git.branch`,
|
|
75
87
|
and trust colors remain in `internal/theme/palette.go` until Phase 2+ maps each
|
|
76
88
|
surface to the resolver tokens. The key product contract for this phase is that
|
|
@@ -200,6 +212,7 @@ light experience with `daylight` also requires a light terminal theme.
|
|
|
200
212
|
| `action_required` | `#d97706` | `colour172` |
|
|
201
213
|
| `pane_active_bg` | `#e8e4dc` | `colour254` |
|
|
202
214
|
| `focus` | `#2563eb` | `colour26` |
|
|
215
|
+
| `provenance` | `#944400` | `colour94` |
|
|
203
216
|
|
|
204
217
|
## Fallback Inventory
|
|
205
218
|
|
|
@@ -221,6 +234,7 @@ Accents and state:
|
|
|
221
234
|
| `accent.action` | `141;205;142`, strong `122;199;173` | `colour29` bg / `colour230` fg |
|
|
222
235
|
| `accent.attention` | notify HUD background/project family | `colour53`, project `colour90` |
|
|
223
236
|
| `accent.ai` | notify agent `colour37` family | `colour37` bg / `colour121` fg |
|
|
237
|
+
| `usage.provenance_fg` | not emitted on native surfaces | `colour208` (public `provenance` token) |
|
|
224
238
|
| `state.progress` | `255;204;102`; switch attention/busy dot, pane-border in-progress badge, and pending notify title/bell/badge `colour220` | `colour220` |
|
|
225
239
|
| `state.action_required` | AI approval/input-required status badge amber-orange; currently aliases the established warning token | `colour214` |
|
|
226
240
|
| `state.warning` | usage/status popup warning ANSI 256 wrapper; non-AI warning chrome | `colour214` |
|
|
@@ -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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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.
|
package/docs/troubleshooting.md
CHANGED
|
@@ -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
|
|
130
|
-
|
|
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.
|
|
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
|
|
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,
|
|
363
|
-
|
|
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,
|
|
378
|
-
evidence
|
|
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
|