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/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 `--project`, the Project comes from the active managed runtime**:
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 # active Project, new Window "hi"
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. Creates run against the
252
- inherited exact socket inside tmux; outside tmux an explicit `--project` is
253
- required before anything live is touched.
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. On Windows, POSIX mode bits cannot establish ACL privacy, so otherwise
891
- valid paths report the closed `privacy-unverified` warning rather than a false
892
- private/insecure classification, followed by a separate metadata-only `ready`
893
- or `not-writable` finding; Doctor never changes ACLs.
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 it
1726
- after replacing the binary. Settings > Keybindings normally runs the same
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, it runs `npm install -g projmux@latest` (which reliably
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`. With `--no-apply`, that convergence step uses
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. For Go installs, it uses the existing atomic
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 `Quit projmux` and `Cancel`. Selecting
1871
- `Quit projmux` terminates only a `tmux -L projmux` runtime whose global
1872
- `@projmux_app` option is set by the generated app config. Missing servers,
1873
- default tmux servers, embedded tmux servers, and other tmux runtimes without
1874
- that marker are no-ops. Non-interactive callers must pass `--yes` or
1875
- `--force`; the default command always goes through the action picker.
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