projmux 0.13.0 → 0.14.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.md +3 -0
- package/docs/agent-workflow.md +182 -4
- package/docs/cli-guide.md +94 -21
- package/docs/cli.md +267 -7
- package/docs/codex-native-required-migration.md +175 -0
- package/docs/configuration.md +36 -13
- package/docs/hooks.md +30 -5
- package/docs/install.md +23 -7
- package/docs/keybindings.md +3 -1
- package/docs/npm-distribution.md +6 -0
- package/docs/operational-diagnostics.md +7 -8
- package/docs/testing.md +33 -7
- package/docs/troubleshooting.md +164 -0
- package/docs/upgrading.md +38 -6
- package/package.json +5 -5
package/docs/cli-guide.md
CHANGED
|
@@ -63,6 +63,28 @@ rendered from the same command manifest the binary renders `projmux help`
|
|
|
63
63
|
from and is verified against it on every `make test`, so it cannot drift.
|
|
64
64
|
Nothing in this guide restates it.
|
|
65
65
|
|
|
66
|
+
Every executable route and root-level parser bridge in that same graph has one
|
|
67
|
+
**selectorless authority** class. The label describes what omission means; it
|
|
68
|
+
does not prevent a route from accepting an explicit selector:
|
|
69
|
+
|
|
70
|
+
- `natural-omitted` — omission resolves one predictable current resource or a
|
|
71
|
+
documented contextual read/scope, such as an active-root inventory or picker;
|
|
72
|
+
supplying any selector replaces that natural target or scope instead of
|
|
73
|
+
blending with it. Current Pane/Window mutations still require one exact
|
|
74
|
+
resource.
|
|
75
|
+
- `explicit-target` — the route or its generated caller must name the exact
|
|
76
|
+
target; ambient tmux context cannot supply or narrow it.
|
|
77
|
+
- `refusal` — the node has no safe selectorless action, so omission refuses
|
|
78
|
+
before output or mutation. Namespace nodes use this class when only a child
|
|
79
|
+
route is executable.
|
|
80
|
+
- `explicit-fan-out` — the route spelling is an intentional global or
|
|
81
|
+
whole-set operation. Resource mutations never enter this class merely
|
|
82
|
+
because a selector happened to match several rows.
|
|
83
|
+
|
|
84
|
+
The generated reference and `projmux <route> --help` print the class projected
|
|
85
|
+
from the graph. Completeness tests census every graph node plus bare/help/version
|
|
86
|
+
root bridges and reject missing, duplicate, conflicting, or unknown rows.
|
|
87
|
+
|
|
66
88
|
## Resource selectors and the active target
|
|
67
89
|
|
|
68
90
|
The resource routes (`get`, `describe`, `create`, `rename`, `rebind`, `delete`,
|
|
@@ -215,7 +237,7 @@ The scope resolves in two branches:
|
|
|
215
237
|
|
|
216
238
|
- **Explicit `--project`/`-p` wins**, inside tmux and outside it. The active
|
|
217
239
|
tmux target is not consulted at all.
|
|
218
|
-
- **With no
|
|
240
|
+
- **With no explicit scope occurrence, the Project comes from the active managed runtime**:
|
|
219
241
|
the `@projmux_window_uid` mirrored on the pane you are in, and that Window's
|
|
220
242
|
registry `ownerRef`. This is the same seam the empty-selector reads use.
|
|
221
243
|
|
|
@@ -224,7 +246,7 @@ flag alone:
|
|
|
224
246
|
|
|
225
247
|
```
|
|
226
248
|
projmux create codex # active Project, active Window, split from the active Pane
|
|
227
|
-
projmux create codex -w hi --create-window #
|
|
249
|
+
projmux create codex -p alpha -w hi --create-window # exact Project, new Window "hi"
|
|
228
250
|
projmux create codex -p beta -w main # everything explicit
|
|
229
251
|
projmux create pane -p alpha # every Window of alpha; a deliberate fan-out
|
|
230
252
|
```
|
|
@@ -237,6 +259,11 @@ shell-required offline operation may plan a lazy direct
|
|
|
237
259
|
`spec.defaultShellPaneRef` without replacing an Agent anchor. A missing or stale
|
|
238
260
|
anchor is exit `2` rather than a silent alternate-Pane repair.
|
|
239
261
|
|
|
262
|
+
An exact existing Window or Pane can reveal its owner Project through Registry
|
|
263
|
+
`ownerRef`. A Window named with `--create-window` does not exist yet and cannot;
|
|
264
|
+
without `--project` that spelling refuses and names `--project <ref>` as the
|
|
265
|
+
remedy, even when the invocation happens inside a managed Pane.
|
|
266
|
+
|
|
240
267
|
Refusals are exit `2` with zero Registry writes and zero tmux mutations, and
|
|
241
268
|
they name `--project` as the fix:
|
|
242
269
|
|
|
@@ -248,9 +275,19 @@ they name `--project` as the fix:
|
|
|
248
275
|
gone — a `recoverable` runtime is reported, never adopted.
|
|
249
276
|
|
|
250
277
|
Every create is **detached**: no create moves the client. Use `focus pane` or
|
|
251
|
-
`-o pane-id` when you want to end up in the new pane.
|
|
252
|
-
inherited exact
|
|
253
|
-
|
|
278
|
+
`-o pane-id` when you want to end up in the new pane. A natural create validates
|
|
279
|
+
the inherited exact route and Pane containment. An explicit resource scope
|
|
280
|
+
binds the selected app resource route without letting unrelated inherited
|
|
281
|
+
`TMUX`/`TMUX_PANE` choose or change the resource target; exact Project plus
|
|
282
|
+
`--create-window` therefore uses the validated app logical `-L` route on its
|
|
283
|
+
first attempt, with no `env -u` workaround. Runtime safety remains independent
|
|
284
|
+
and may refuse before mutation. An inherited app-owned `TMUX` socket/PID stays
|
|
285
|
+
route evidence: projmux validates its exact `-S` path, ownership/logical
|
|
286
|
+
markers, logical `-L` alias, and PID while ignoring unrelated `TMUX_PANE`
|
|
287
|
+
containment. Outside tmux it validates the default app `-L` route. Marker,
|
|
288
|
+
physical-socket, server-PID, generation, and owner reobservation remain
|
|
289
|
+
mandatory. Commands that explicitly select an existing live `--socket-path`
|
|
290
|
+
keep that exact `-S` route unchanged.
|
|
254
291
|
|
|
255
292
|
#### Splits started from a popup
|
|
256
293
|
|
|
@@ -887,10 +924,11 @@ lifetime total; `logs.recent-errors.bounded` means older errors were omitted.
|
|
|
887
924
|
The probe captures at most 4 KiB, generated config inspection reads at most
|
|
888
925
|
1 MiB, and the journal seam reads at most 5 MiB.
|
|
889
926
|
Symlinks and non-regular inputs are rejected without following or blocking on
|
|
890
|
-
them.
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
927
|
+
them. The closed `privacy-unverified` warning stays in the finding schema for
|
|
928
|
+
a path whose privacy cannot be established from its mode bits, but no supported
|
|
929
|
+
platform reports it: Linux and macOS are the only build targets and POSIX mode
|
|
930
|
+
bits are authoritative on both, so a readable path always resolves to a
|
|
931
|
+
private or insecure classification. Doctor never changes permissions.
|
|
894
932
|
|
|
895
933
|
JSON reports have integer `schema_version: 2`. An unfiltered report retains the
|
|
896
934
|
existing typed `dependencies`, `ai_notify_integrations`,
|
|
@@ -1269,6 +1307,13 @@ projmux attention window [window]
|
|
|
1269
1307
|
Toggles the `✳` pane title prefix and the `@projmux_attention_state` pane
|
|
1270
1308
|
option. `toggle` flips between cleared and `reply`; `clear` always
|
|
1271
1309
|
clears; `arm` sets a pre-reply armed state used by the AI flow. The
|
|
1310
|
+
optional pane is the exact pane invoking the command: when it is omitted,
|
|
1311
|
+
Projmux requires inherited `$TMUX` plus an exact `$TMUX_PANE=%N` and verifies
|
|
1312
|
+
that same pane with a targeted tmux read before changing attention state. From
|
|
1313
|
+
outside tmux, or when that evidence is missing, malformed, or stale, pass an
|
|
1314
|
+
explicit pane target instead; the command fails without writing attention
|
|
1315
|
+
state. Explicit targets used by generated focus hooks keep their existing
|
|
1316
|
+
meaning.
|
|
1272
1317
|
producer side pushes the matching entry into the notify queue when the pane
|
|
1273
1318
|
has an associated AI agent option; clearing attention does not ack the queue
|
|
1274
1319
|
row (manual toggles on shell panes do not push). `list` reads `tmux list-panes -a` and shows live pane
|
|
@@ -1322,6 +1367,17 @@ the resolved `claude`, `codex`, or `agy` executable inside the managed wrapper;
|
|
|
1322
1367
|
projmux still sets the context directory, tmux title, AI pane metadata, and
|
|
1323
1368
|
split layout.
|
|
1324
1369
|
|
|
1370
|
+
A prompted Codex create — provider `codex` with exactly one non-empty payload
|
|
1371
|
+
operand — requires native authority. If the app-server endpoint is not ready or
|
|
1372
|
+
attachable, if `--add-dir` roots cannot be negotiated, or if the selector
|
|
1373
|
+
resolves several Windows, the create refuses with zero Registry and zero tmux
|
|
1374
|
+
mutations instead of silently producing a plain-CLI Agent with no native turn
|
|
1375
|
+
control. `--interactive-only` is the one public spelling that asks for that
|
|
1376
|
+
plain Agent on purpose; it is Codex-only and equivalent on `create agent
|
|
1377
|
+
--provider codex` and the `create codex` shortcut. Empty-prompt creates,
|
|
1378
|
+
multi-operand payloads, `agent resume`, Claude, and Antigravity are unaffected.
|
|
1379
|
+
See [Codex Native-Required Create Migration](codex-native-required-migration.md).
|
|
1380
|
+
|
|
1325
1381
|
Automation callers get the new pane's handle from `-o pane-id` on the canonical
|
|
1326
1382
|
create routes: `projmux create agent --provider <p> --placement right -o pane-id`
|
|
1327
1383
|
and `projmux create pane --placement right -o pane-id` each print exactly the
|
|
@@ -1722,8 +1778,8 @@ keymap action is no longer accepted: replace a stale
|
|
|
1722
1778
|
The `projmux agent topic set/clear` commands keep
|
|
1723
1779
|
AI topic ownership separate from the user pane label and raw pane title.
|
|
1724
1780
|
`apply` regenerates the app tmux config and reloads the live `-L projmux`
|
|
1725
|
-
server without restarting it. `make install` and `projmux update apply` invoke
|
|
1726
|
-
|
|
1781
|
+
server without restarting it. `make install` and `projmux update apply` invoke
|
|
1782
|
+
it before binary publication and again afterward for verification. Settings > Keybindings normally runs the same
|
|
1727
1783
|
save/config/reload flow automatically; use `projmux config apply` (or its
|
|
1728
1784
|
hidden equivalent `projmux internal tmux apply`) as the CLI recovery or sync path after
|
|
1729
1785
|
hand-editing `keymap.toml`, after saving Settings outside tmux, or after
|
|
@@ -1812,15 +1868,21 @@ binary in `$GOBIN`/`$GOPATH/bin`/`~/go/bin` as `go`, and a local `go build`
|
|
|
1812
1868
|
still require an explicit `PROJMUX_INSTALLER=github-release`. Anything else is
|
|
1813
1869
|
reported as `unknown` with guidance.
|
|
1814
1870
|
`apply` is installer-aware and only runs after explicit user selection.
|
|
1815
|
-
For npm installs,
|
|
1871
|
+
For npm installs, the current binary first runs `config apply --bin` with the
|
|
1872
|
+
exact published target. Only after that succeeds does it run
|
|
1873
|
+
`npm install -g projmux@latest` (which reliably
|
|
1816
1874
|
crosses minor/major versions where `npm update -g` does not, and re-resolves
|
|
1817
1875
|
the per-platform optional dependency) and then runs the new binary's
|
|
1818
|
-
`projmux config apply
|
|
1876
|
+
`projmux config apply` as post-publication verification. A failed preparation
|
|
1877
|
+
does not invoke the installer; later failures are non-zero and print the exact
|
|
1878
|
+
`projmux config apply --socket projmux` recovery. With `--no-apply`, the
|
|
1879
|
+
pre-publication live convergence is omitted and the post-update step uses
|
|
1819
1880
|
`--no-reload`: it still migrates marker-owned files and writes generated
|
|
1820
|
-
configuration without accessing live tmux
|
|
1881
|
+
configuration without accessing live tmux, then explicitly reports that live
|
|
1882
|
+
apply remains required. For Go installs, it uses the same ordering around the existing atomic
|
|
1821
1883
|
replacement implementation. For `github-release` installs, it downloads the latest
|
|
1822
1884
|
matching `projmux_<version>_<goos>_<goarch>.tar.gz` release asset, extracts the
|
|
1823
|
-
binary, atomically replaces the current executable, then performs the same
|
|
1885
|
+
binary, pre-converges, atomically replaces the current executable, then performs the same
|
|
1824
1886
|
apply/`--no-reload` convergence. `source` installs report an
|
|
1825
1887
|
actionable error to update the checkout with `git pull --ff-only && make install`.
|
|
1826
1888
|
|
|
@@ -1867,12 +1929,23 @@ human configuration work should prefer `config render` and `config apply`.
|
|
|
1867
1929
|
a new Project/Window/shell UID chain and one same-root claimant. Repeating it
|
|
1868
1930
|
allocates another new identity. Neither action modifies snapshot
|
|
1869
1931
|
bytes, the project directory, git/worktrees, unrelated roots, or trust state.
|
|
1870
|
-
- `quit` — open an action picker with `
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1932
|
+
- `quit` — open an action picker with `Save Project snapshots and quit`, `Quit
|
|
1933
|
+
without saving`, and `Cancel`. The safe first action takes one complete,
|
|
1934
|
+
exact-socket Registry/resource-graph observation, freezes every live managed
|
|
1935
|
+
Project session in Project UID/session order, and captures each latest
|
|
1936
|
+
snapshot even when auto-save is off. Home/control, ephemeral, unattributed,
|
|
1937
|
+
recoverable, foreign, and offline sessions are excluded and reported as
|
|
1938
|
+
bounded class counts. Every target is attempted. A failed capture leaves the
|
|
1939
|
+
successful per-session atomic files in place, reports the exact failed
|
|
1940
|
+
session, and does not stop the app; retry captures every target again. Only an
|
|
1941
|
+
all-success ledger reaches the existing physical-socket, app-marker, and
|
|
1942
|
+
logical-route guarded shutdown. Named snapshots and Registry bytes are never
|
|
1943
|
+
written, and the batch is not a multi-file transaction or topology freeze.
|
|
1944
|
+
`Quit without saving` preserves the earlier guarded shutdown behavior:
|
|
1945
|
+
missing servers and runtimes without the app marker are no-ops. Existing
|
|
1946
|
+
non-interactive `--yes` and `--force` callers retain that same snapshot-free
|
|
1947
|
+
behavior and exact shutdown route; the default command always uses the
|
|
1948
|
+
action picker.
|
|
1876
1949
|
- `attach project <ref>` — enter a Project runtime from outside tmux.
|
|
1877
1950
|
Automatic live-runtime attachment is `runtime attach`.
|
|
1878
1951
|
- `settings` — interactive configuration UI for the project picker, AI
|