projmux 0.14.2 → 0.15.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
@@ -87,13 +87,23 @@ root bridges and reject missing, duplicate, conflicting, or unknown rows.
87
87
 
88
88
  ## Resource selectors and the active target
89
89
 
90
+ Plural Registry reads (`get projects|windows|panes|agents`) default to
91
+ `NAME STATUS ACTIONS`: the route already selects the kind. Removing the previous
92
+ KIND column changes these tables from four columns to three and moves NAME,
93
+ STATUS and ACTIONS one position left, so existing positional parsers can break.
94
+ Use `-o wide` to retain KIND, context, source/observation, owner chain, session,
95
+ termination and age; `-o json` retains each resource's `kind`, full resource and
96
+ invocation context. Mixed Registry/Runtime pickers keep KIND in both profiles.
97
+ Wide stdout preserves full values at every terminal width. See [Column profiles](column-profiles.md)
98
+ for the exact per-kind matrix and migration from the previous default output.
99
+
90
100
  The resource routes (`get`, `describe`, `create`, `rename`, `rebind`, `delete`,
91
101
  `agent resume`) address stored resources through one shared selector grammar.
92
102
 
93
103
  The grammar in one paragraph: a value is either `uid:<uid>` or a bare
94
104
  `metadata.name`. There is no bare-uid form, values are never split on commas,
95
- and a `displayName`, a `spec.root` path, or a raw tmux `%N`/`@N`/`$N` handle
96
- never resolves anything. `--project`/`-p` occurs at most once and fixes the
105
+ and an ephemeral context value, a `spec.root` path, or a raw tmux
106
+ `%N`/`@N`/`$N` handle never resolves anything. `--project`/`-p` occurs at most once and fixes the
97
107
  Project scope; `--window`/`-w` and `--pane` repeat and union in argv order;
98
108
  `--selector key=value`
99
109
  repeats and ANDs. A singular route also accepts the target as a positional
@@ -182,13 +192,25 @@ their existing meaning and include ControlSession descendants. Outside tmux, an
182
192
  omitted root keeps the historical whole-Registry inventory without probing a
183
193
  default server.
184
194
 
195
+ For the four Registry-backed plural reads, `get
196
+ projects|windows|panes|agents -o json` adds a top-level `context` object to
197
+ every resource item. Its `value`, `source`, and `observed` keys are always
198
+ present, including as empty strings and `false` when no context is available.
199
+ The values come from the same invocation snapshot used to resolve and render
200
+ the item: only an exact UID-bound live Window name or Pane title sets
201
+ `observed: true`; Project and Agent context, Registry fallbacks, and unmatched
202
+ runtime objects remain unobserved. This is a read projection, not stored
203
+ resource state or selector authority. It does not change `-o metadata`, the
204
+ Registry or snapshot schema, singular `describe ... -o json`, or `get pane -o
205
+ json`; an empty plural result remains one List document with `"items": []`.
206
+
185
207
  ### Reference scope: the active Project namespace
186
208
 
187
- A `metadata.name` is unique inside its owner scope, never across the registry: a
188
- Window name is unique inside its Project, a Pane name inside its Window or
189
- Agent, an Agent name inside its Window. So inside a managed Project a reference
190
- is resolved inside the Project that owns the active Window, which is the same
191
- universe the plural reads use in that context:
209
+ A descendant `metadata.name` is unique across its Project or ControlSession root
210
+ for the same kind, never across the whole registry. Direct ownership remains
211
+ Window-owned for Agents and Window/Agent-owned for Panes. Inside a managed root,
212
+ a bare descendant name is therefore resolved in the root that owns the active
213
+ Window, which is the same universe the plural reads use in that context:
192
214
 
193
215
  ```
194
216
  projmux describe window zsh # the Window named zsh in *this* Project
@@ -248,17 +270,59 @@ flag alone:
248
270
  projmux create codex # active Project, active Window, split from the active Pane
249
271
  projmux create codex -p alpha -w hi --create-window # exact Project, new Window "hi"
250
272
  projmux create codex -p beta -w main # everything explicit
251
- projmux create pane -p alpha # every Window of alpha; a deliberate fan-out
273
+ projmux create pane -p alpha # exactly alpha's primary Window
274
+ projmux create pane -p alpha --all-windows # every Window of alpha; a deliberate fan-out
252
275
  ```
253
276
 
254
- One explicit scope occurrence (`--project`, `--window`, `--pane`, or
255
- `--selector`) makes the whole scope explicit, so naming a Window never picks up
256
- an anchor from somewhere you did not address. With a scope but no `--pane`, the
277
+ One explicit scope occurrence (`--project`, `--window`, `--pane`, `--selector`,
278
+ `--all-windows`, or `--primary-window`) makes the whole scope explicit, so
279
+ naming a Window never picks up an anchor from somewhere you did not address.
280
+ With a scope but no `--pane`, the
257
281
  split anchor is the target Window's role-agnostic `spec.anchorPaneRef`. A
258
282
  shell-required offline operation may plan a lazy direct
259
283
  `spec.defaultShellPaneRef` without replacing an Agent anchor. A missing or stale
260
284
  anchor is exit `2` rather than a silent alternate-Pane repair.
261
285
 
286
+ #### Target cardinality
287
+
288
+ `create pane|agent|<provider>` targets a *set* of Windows, and the argv says
289
+ which set:
290
+
291
+ | spelling | target set |
292
+ | --- | --- |
293
+ | whole scope omitted, inside a managed Pane | the active Window, anchored on the active Pane |
294
+ | `--project P` alone | exactly `P`'s `spec.primaryWindowRef` Window |
295
+ | `--project P --primary-window` | the same Window, spelled out |
296
+ | `--project P --all-windows` | **every Window of P**; the opt-in fan-out |
297
+ | `--project P --window W...` | the named Windows, deduplicated in argv order |
298
+ | `--project P --selector k=v...` | the Windows whose labels match; zero matches refuses |
299
+ | `--project P --pane X...` | the owning Window of each named Pane |
300
+ | `--create-window --window <name>` | the ensured Window |
301
+
302
+ `--project P` with no Window selector means exactly one Window: the Project's
303
+ `spec.primaryWindowRef`. An earlier release spelled the same thing as "every
304
+ Window of P" and spent a release printing a deprecation notice naming this
305
+ default and both flags; the notice is gone now that the default is what it
306
+ named. The whole-Project fan-out is not gone with it -- it is `--all-windows`,
307
+ which resolves the identical set that spelling used to resolve.
308
+
309
+ Omitting the scope entirely is a different thing and did not change. Inside a
310
+ managed Pane, `projmux create pane` with no `--project` at all still splits the
311
+ Window you are looking at, anchored on the Pane you are in.
312
+
313
+ `--all-windows` and `--primary-window` each fix the target set outright, so
314
+ neither can be combined with `--window`, `--pane`, `--selector`,
315
+ `--create-window`, or with the other one. Every such pair is exit `2` before any
316
+ Registry write, tmux object, or provider launch. An empty `--all-windows` set
317
+ refuses the same way, and so does a missing, dangling, or cross-Project
318
+ `spec.primaryWindowRef` -- for `--primary-window` and for the bare `--project`
319
+ default alike, since they share one preflight. The refusal names the spelling
320
+ you actually typed.
321
+
322
+ The `-o receipt` projection reports the target planner's decision in
323
+ `selectedWindowUIDs`, so `create pane`, `create agent`, and the three provider
324
+ shortcuts report the identical selected set for identical argv.
325
+
262
326
  An exact existing Window or Pane can reveal its owner Project through Registry
263
327
  `ownerRef`. A Window named with `--create-window` does not exist yet and cannot;
264
328
  without `--project` that spelling refuses and names `--project <ref>` as the
@@ -331,13 +395,15 @@ managed-menu contract.
331
395
  then updates only its exact UID-bound live transport field:
332
396
 
333
397
  - Project: `@projmux_project_name` (never the tmux session name)
334
- - Window: `@projmux_window_name` (never `metadata.displayName` or tmux
335
- `window_name`)
398
+ - Window: `@projmux_window_name` (never tmux `window_name`)
336
399
  - Pane: `@projmux_pane_label` (never raw `pane_title`)
337
400
 
338
- `rename agent` changes only the Agent's stable Window-scoped `metadata.name`.
401
+ `rename agent` changes only the Agent's stable root-scoped `metadata.name`.
339
402
  It does not change the Agent topic, provider, lifecycle state, or managed Pane
340
- name/title. `rebind project` preserves uid and session name, moves no files,
403
+ name/title. `create agent` derives the managed Pane's name from the Agent's
404
+ once, at create; nothing keeps the two in sync afterwards, so `rename pane`
405
+ stays free to move the Pane name anywhere and `rename agent` still touches
406
+ exactly one resource. `rebind project` preserves uid and session name, moves no files,
341
407
  and updates only `spec.root` plus the exact session's
342
408
  `@projmux_project_path` anchor.
343
409
 
@@ -355,13 +421,77 @@ duplicate UID claims remain fail-closed.
355
421
 
356
422
  ### Agent topic, interaction, activation, and workspace
357
423
 
424
+ `projmux agent capabilities --provider <codex|claude|antigravity>` prints the
425
+ static action matrix without opening the Registry or consulting tmux, provider
426
+ transport, or an app-server process. Passing an Agent reference (or omitting it
427
+ inside an Agent-owned Pane) adds current Registry-backed eligibility and the
428
+ exact Pane activation generation; Codex rows also expose the stored connection
429
+ and binding epochs. The runtime object reports `evidence=registry`,
430
+ `registryReady`, and `liveVerified=false`; capability reads do not claim a
431
+ live check that mutating routes must perform for themselves. Static `mode`,
432
+ current Registry-backed `available`, and
433
+ `completionPrecision` are separate fields. Use `-o json` for the stable machine
434
+ projection.
435
+
436
+ The closed static modes are `generic-registry`, `provider-resume`,
437
+ `native-exact-control`, `provider-hook`, `read-only-adapter`, and
438
+ `unsupported`. `message.send`, `message.status`, and `wait.idle` are provider-neutral commands whose availability is decided from
439
+ the exact Agent's provider and current activation capability. There is no
440
+ provider-specific `agent codex`, `agent claude`, or `agent antigravity`
441
+ namespace.
442
+
443
+ ```sh
444
+ projmux agent message send [--message-ref <ref>] [--ttl 10m] uid:<target-agent> -- "coordination text"
445
+ projmux agent message status <message-ref> [-o json]
446
+ projmux agent message qualify uid:<claude-agent> --evidence /absolute/owned/private-init.json --confirm-isolated-provider-push -o json
447
+ projmux agent wait uid:<agent> [--timeout 30s] [-o json]
448
+ ```
449
+
450
+ Message send requires an exact current managed source and target and never
451
+ creates an Agent. The envelope is untrusted coordination data, not a user turn,
452
+ tool request, approval, interrupt, or model-history write. A Claude target must
453
+ first have a current exact registration and helper-memory qualification for the
454
+ frozen frame on Claude Code 2.1.263. Qualification is a dedicated opt-in push
455
+ using same-process sanitized public-init evidence and an exact Stop marker; a
456
+ version string alone is never proof. Claude delivery ends at one full-frame
457
+ auth+user-frame provider handoff plus helper receipt, not model processing. A
458
+ correlated model reply is a separate envelope with the original
459
+ `conversationRef` and `replyTo`. Codex delivery ends when the exact target Agent
460
+ self-claims that envelope. Message lifecycle updates neither Agent interaction
461
+ state nor tmux badges.
462
+
463
+ Claude messaging is opt-in through `projmux agent integrate claude`. The
464
+ integration installs no receiver waiter or `asyncRewake`; ingress is immediate
465
+ through the exact registered provider socket. Capability JSON keeps Claude
466
+ source send/status availability tied to its registration lease and reports
467
+ target ingress qualification separately under
468
+ `runtimeEligibility.coordination`. If an existing pre-install session has no
469
+ lease, preview and enable integration, let that process exit normally, then run
470
+ `projmux agent resume uid:<same-agent-uid>`; the UID is preserved and no Agent
471
+ is recreated. Delivery remains zero until registration and a fresh qualification
472
+ are ready. Use `projmux agent integrate claude --remove` to remove only managed
473
+ hooks.
474
+
358
475
  `agent turn start`, `agent turn steer`, `agent turn interrupt`, and
359
476
  `agent approval review` use the live Codex app-server connection only when the
360
477
  selected Agent, its owned Pane, activation generation, thread, current turn,
361
478
  and connection epoch still match exactly. `start` sends only the exact thread
362
- id and one text input; `steer` supplies the current expected turn id; and
363
- `interrupt` supplies that exact turn id. These commands never install sticky
364
- model, effort, cwd, sandbox, permission, or collaboration overrides.
479
+ id and one text input. Immediately before that write it reads one bounded,
480
+ content-free lifecycle snapshot: fresh active/in-progress returns
481
+ `turn-in-progress`, fresh idle/terminal repairs stale cached state and starts
482
+ once, and an unavailable or inconsistent snapshot returns
483
+ `turn-state-unavailable` with no turn mutation. `steer` also reads that
484
+ content-free snapshot before any write and submits exactly once only when it
485
+ still proves the same exact active turn. Fresh idle, terminal, or different-turn
486
+ state returns `no-active-turn`; an unavailable or inconsistent read, including
487
+ a fence mismatch after the read, returns `turn-state-unavailable`. Both are
488
+ nonzero exits with zero `turn/steer` writes. A successful steer prints the exact
489
+ machine-readable receipt `acceptance=provider delivery=unconfirmed`. Exit zero
490
+ means the provider accepted the body-free `turn/steer` request; it does not
491
+ confirm TUI display, model consumption, or goal continuation. `interrupt`
492
+ supplies the cached exact turn id without adopting the steer preflight in this
493
+ phase. These commands never install sticky model, effort, cwd, sandbox,
494
+ permission, or collaboration overrides.
365
495
 
366
496
  Approval review shows only the safe one-shot intersection supplied by the
367
497
  exact pending request. Command, file, and network requests are limited to
@@ -581,9 +711,13 @@ A retained graph keeps descendant UIDs; a
581
711
  zero-Window Project atomically receives a new canonical Window/shell UID chain.
582
712
  A deleted Project may use only the exact usable snapshot compatibility path;
583
713
  an unavailable Continue is an explicit zero-write refusal with no Fresh
584
- fallback. `Open fresh` is one step with no danger styling, confirmation, or
585
- delete counts: it atomically replaces the same-root graph with a new Project
586
- UID and new canonical Window/shell UIDs, then hands off only after ordinary
714
+ fallback. `Recreate Project` is the one startup row that replaces identity, and it asks
715
+ before it does. Choosing it opens a confirmation naming the exact old Project
716
+ UID and its Window/Pane/Agent counts; declining returns to the startup rows
717
+ with zero Registry writes, and an unreadable confirmation declines rather than
718
+ proceeds. An unregistered root has no identity to replace and is not asked.
719
+ Confirmed, it atomically replaces the same-root graph with a new Project UID
720
+ and new canonical Window/shell UIDs, then hands off only after ordinary
587
721
  materialization. A repeat replaces identity again. The root, git/worktrees,
588
722
  trust decision, unrelated roots, and snapshot bytes remain unchanged.
589
723
 
@@ -642,7 +776,7 @@ it, rather than because it crashed.
642
776
  ## get runtime
643
777
 
644
778
  ```text
645
- projmux get runtime sessions|windows|panes [--socket <name> | --socket-path <absolute>] [-o json|none]
779
+ projmux get runtime sessions|windows|panes [--socket <name> | --socket-path <absolute>] [-o wide|json|none]
646
780
  ```
647
781
 
648
782
  `get runtime` is the read-only escape hatch onto one exact tmux server. The
@@ -672,7 +806,10 @@ one difference at the end:
672
806
  reason, and zero tmux calls. There is no default-socket guess, and a sibling
673
807
  socket is never read.
674
808
 
675
- The default projection is a table preceded by a header line naming the host mode
809
+ The default table contains identity, containment and classification columns;
810
+ `-o wide` adds UID, RESOURCE and REASON with full, unbounded values. The
811
+ [exact profiles](column-profiles.md) do not change with terminal width. Each
812
+ human projection is preceded by a header line naming the host mode
676
813
  and the exact transport, plus one line per scope that could not be observed. The
677
814
  header is always printed, even when the table is empty: "no sessions" is only
678
815
  trustworthy next to which server was asked and whether the answer could be taken
@@ -746,10 +883,12 @@ An explicit path gets exactly the same verification as a bounded copy.
746
883
  Verification is fail closed. Malformed JSON, an empty file, an envelope newer
747
884
  than this build, and a graph with a duplicate uid, a dangling `ownerRef`, or a
748
885
  broken name reservation are all refused with the current Registry byte-identical.
749
- The verified bytes are then published **verbatim**, so uids, owner relations, and
750
- name reservations are preserved exactly rather than re-encoded, and a
751
- known-older-but-valid envelope stays readable through the normal safe read and
752
- migrates on the next semantic write.
886
+ A verified current-v4 source is published **verbatim**. A verified v3 source is
887
+ instead imported as one atomic compatibility migration: the exact source bytes
888
+ are written to a versioned backup, a checksum-bearing content-free migration
889
+ report is published beside it, and the deterministic canonical v4 bytes are
890
+ staged and committed as the live Registry. A repeat restore compares against
891
+ the canonical publish checksum and writes no new Registry, backup, or report.
753
892
 
754
893
  The bytes being replaced are kept first, at
755
894
  `recovery/replaced-<stamp>-<seq>.json`. Unlike the write-side copies this keeps
@@ -852,6 +991,12 @@ sub-verbs are entry hooks invoked by tmux keybindings (e.g.
852
991
  `sidebar-focus` is wired to the sidebar's focus binding so navigation keeps
853
992
  the active session in sync).
854
993
 
994
+ `switch` composes the canonical Project routes rather than aliasing one of
995
+ them: a live row focuses, an offline row is `open project`, and an unregistered
996
+ candidate row is `create project` followed by `open project`. That is why its
997
+ canonical spelling is those two routes and not `focus project`, which never
998
+ materializes anything.
999
+
855
1000
  Settings > Labs remains available for experimental settings, but picker
856
1001
  selection/source rows have been retired. The native picker is always used, and
857
1002
  there is no picker selection configuration or migration behavior.
@@ -918,7 +1063,12 @@ versions, paths, confidence/source metadata, and displayed remediation.
918
1063
  dependencies, `integrations` selects AI notify integrations, and
919
1064
  `session-state` selects resume metadata plus retention guidance. `runtime`
920
1065
  selects the fixed `tmux` backend, an actual one-second read-only probe of the
921
- app socket, and generated-versus-live config digest state. `logs` selects the
1066
+ app socket, generated-versus-live config digest state, and a
1067
+ `projmux_process_vintage` census of this executable's live children by role and
1068
+ image age. That census is provider-neutral and counts every child, naming
1069
+ per-pane supervisors and keeping an `other` remainder so a route it has no name
1070
+ for cannot shrink the total; on a platform with no process table it reports
1071
+ `unknown` rather than claiming currency. `logs` selects the
922
1072
  state/log/journal presence, private permissions and metadata-only writability
923
1073
  checks plus a bounded aggregate of recent safe operational error codes. These
924
1074
  sections expose only closed status codes and counts: no path, socket name,
@@ -1045,6 +1195,79 @@ numbers as numbers. Numeric routing fields such as `window_index` and
1045
1195
  must treat this support projection as redacted evidence rather than decoding it
1046
1196
  back into the unredacted Doctor Go types.
1047
1197
 
1198
+ ## Project runtime lifecycle
1199
+
1200
+ ```
1201
+ projmux start project <ref> [-o receipt|none]
1202
+ projmux open project <ref> [-o receipt|none]
1203
+ projmux attach project <ref>
1204
+ projmux focus project <ref>
1205
+ projmux stop project <ref> [-o receipt|none]
1206
+ projmux unregister project [<ref>...] [--all] [--dry-run] [--yes]
1207
+ ```
1208
+
1209
+ Five verbs that address one Project and change one thing each. They are
1210
+ separate spellings because a Project has two independent states -- it is
1211
+ registered in the Registry, and its persistent tmux session is or is not
1212
+ running -- and one verb that moved both was the reason it was never obvious
1213
+ which of them a command had touched.
1214
+
1215
+ | Verb | Registry | Runtime | Client |
1216
+ | --- | --- | --- | --- |
1217
+ | `create project` | creates or reuses the Project, its canonical Window, and its shell | not started | not moved |
1218
+ | `start project` | unchanged | materialized when offline | not moved |
1219
+ | `open project` | unchanged | materialized when offline | moved to the Project |
1220
+ | `attach project` | unchanged | materialized when offline | the outside caller attaches |
1221
+ | `focus project` | unchanged | never materialized | moved to the Project |
1222
+ | `stop project` | unchanged | the exact session ends | existing safe fallback |
1223
+ | `unregister project` | the Project subtree is removed | **preserved** | not moved |
1224
+
1225
+ `open project` and `attach project` are the same operation seen from the two
1226
+ sides of a tmux client. Inside tmux, `open` moves the client you are in and
1227
+ `attach` refuses with a pointer at `open`; outside tmux, `attach` attaches the
1228
+ caller and `open` refuses with a pointer at `attach`. Both refusals happen
1229
+ before anything is materialized.
1230
+
1231
+ `stop project` refuses an offline target rather than succeeding silently: it
1232
+ declares exactly one runtime outcome, and reporting `runtime=stopped` for a
1233
+ session that was never running would be false. `unregister project` is the
1234
+ inverse -- it removes the Registry graph and deliberately leaves the running
1235
+ session, the root, Git/worktrees, and snapshots exactly as they were.
1236
+
1237
+ `delete project` is a deprecated alias of `unregister project`. It keeps its
1238
+ exact behavior and its exact stdout; it adds one deprecation line on stderr and
1239
+ one `compatibilityWarnings` entry in the receipt. It is not scheduled for
1240
+ removal in this release.
1241
+
1242
+ The reference for a Project can be `uid:<uid>`, a bare `metadata.name`, or the
1243
+ absolute root path the Project claims.
1244
+
1245
+ ### Operation receipts
1246
+
1247
+ Every create, rename, delete, and Project lifecycle route reports what it did
1248
+ as one `OperationReceipt/v1` record. The default human result prints it as a
1249
+ trailing line; `-o receipt` prints the same record as JSON.
1250
+
1251
+ ```
1252
+ receipt operation=open.project identity=unchanged address=unchanged topology=unchanged \
1253
+ desired-state=unchanged runtime=materialized focus=moved-current-client \
1254
+ projects=1 windows=0 panes=0 agents=0
1255
+ ```
1256
+
1257
+ The six effect axes use the same enum values `projmux <route> --help` and the
1258
+ generated reference advertise as *allowed*, so a result can be compared against
1259
+ the contract without translating between two vocabularies. A receipt whose
1260
+ actual tuple is not one the route declares is refused before it is printed.
1261
+
1262
+ The JSON projection adds `target`, `selectedWindowUIDs`, `affectedUIDs` (every
1263
+ resource the operation touched and what happened to it), `compatibilityWarnings`,
1264
+ and a `domainEffect` slot that is `null` for every route today. The existing
1265
+ `-o uid|name|ref|metadata|json|pane-id|none` projections are unchanged.
1266
+
1267
+ One consequence is visible immediately: registering a root that is already a
1268
+ Project now says `reused`, not `created`, and its receipt says
1269
+ `identity=reused` with address, topology, and desired state unchanged.
1270
+
1048
1271
  ## focus
1049
1272
 
1050
1273
  ```
@@ -1332,12 +1555,14 @@ supplied window.
1332
1555
  projmux create agent --provider <claude|codex|antigravity> [--project <ref>] [--window <ref>]... [--create-window] [--placement right|down] ...
1333
1556
  projmux create pane [--project <ref>] [--window <ref>]... [--create-window] [--placement right|down] ...
1334
1557
  projmux config edit [--get|--set <mode>]
1335
- projmux agent status set <thinking|waiting|idle> [pane]
1336
- projmux agent topic ...
1558
+ projmux agent status [get [<agent-ref>] | set <unknown|idle|in_progress|approval_required|input_required|response_complete> [<agent-ref>]] [--agent <ref>]
1559
+ projmux agent topic get|clear [<agent-ref>] [--agent <ref>]
1560
+ projmux agent topic set <text> [<agent-ref>] [--agent <ref>]
1561
+ projmux agent capabilities [<agent-ref> | --provider <codex|claude|antigravity>] [-o json]
1337
1562
  projmux internal agent-hook watch-title [pane]
1338
- projmux internal agent-hook ingest codex-hook < payload.json
1339
- projmux internal agent-hook ingest claude-hook < payload.json
1340
- projmux internal agent-hook ingest antigravity-hook [--event <PreInvocation|PostInvocation|PostToolUse|Stop|Statusline>] < payload.json
1563
+ projmux internal agent-hook ingest codex-hook [--pane <pane_uid|pane_id>] < payload.json
1564
+ projmux internal agent-hook ingest claude-hook [--pane <pane_uid|pane_id>] < payload.json
1565
+ projmux internal agent-hook ingest antigravity-hook [--event <PreInvocation|PostInvocation|PostToolUse|Stop|Statusline>] [--pane <pane_uid|pane_id>] < payload.json
1341
1566
  projmux internal agent-hook ingest bell --pane <pane_id>
1342
1567
  projmux diagnostics agent-hook [--tail N] [--json] [--path]
1343
1568
  projmux agent integrate codex [--dry-run] [--remove]
@@ -1365,7 +1590,25 @@ default. Concrete provider invocations create a new Agent and a new managed
1365
1590
  Pane every time; existing managed AI panes in the same project/session are
1366
1591
  not selected or reused, and rebinding an existing conversation is `agent
1367
1592
  resume`, a different verb. The scope of the new resources follows
1368
- [Create scope](#create-scope). The provider picker remains available through
1593
+ [Create scope](#create-scope).
1594
+
1595
+ The managed Pane is named `<agent-name>-pane`. With an explicit `--name
1596
+ reviewer` that is `reviewer-pane`; with no `--name` the Agent's own name is its
1597
+ exact full UID, so the Pane is `<agent-uid>-pane` -- readable as *that Agent's
1598
+ pane*, and still never the Pane's own UID. A launcher no longer has to issue a
1599
+ follow-up `rename pane` to get that spelling, and one that still does gets a
1600
+ successful no-op. Two consequences are worth knowing:
1601
+
1602
+ - If `<agent-name>-pane` is already used by another Pane anywhere in the same
1603
+ Project or ControlSession, the create refuses with exit code 2 and zero
1604
+ Registry, tmux, and provider writes. No suffix is invented.
1605
+ - An Agent name may be the full 128 bytes a name allows, which would make the
1606
+ derived Pane name 133 bytes and invalid. That single case falls back to the
1607
+ ordinary automatic Pane name -- the Pane's exact full UID -- rather than
1608
+ refusing a create that works today.
1609
+
1610
+ `rename pane` remains unrestricted on a managed Pane, and renaming the Agent
1611
+ afterwards does not move the Pane name. The provider picker remains available through
1369
1612
  `internal agent-pane picker`. Arguments after `--` are extra arguments appended to
1370
1613
  the resolved `claude`, `codex`, or `agy` executable inside the managed wrapper;
1371
1614
  projmux still sets the context directory, tmux title, AI pane metadata, and
@@ -1925,14 +2168,15 @@ human configuration work should prefer `config render` and `config apply`.
1925
2168
  the app session directly after resolving the target app session name and
1926
2169
  startup directory. With no saved startup preference, Alt-1 sidebar project
1927
2170
  open defaults to a two-action picker containing exactly `Continue project`
1928
- and `Open fresh`; Esc returns to Projects without writing config. Saved `on`
2171
+ and `Recreate Project`; Esc returns to Projects without writing config. Saved `on`
1929
2172
  keeps that picker, while saved `off` skips it and preserves the existing
1930
2173
  automatic registered-Continue/unregistered-Fresh decision. `Continue
1931
2174
  project` restores a deleted Project only from its usable exact snapshot and
1932
- otherwise refuses with zero Registry writes. `Open fresh` is a neutral,
1933
- confirmation-free one-step action that atomically replaces the Project with
1934
- a new Project/Window/shell UID chain and one same-root claimant. Repeating it
1935
- allocates another new identity. Neither action modifies snapshot
2175
+ otherwise refuses with zero Registry writes. `Recreate Project` confirms the
2176
+ exact old Project UID and its counts, then atomically replaces the Project
2177
+ with a new Project/Window/shell UID chain and one same-root claimant. A
2178
+ declined confirmation returns to the startup rows and writes nothing.
2179
+ Repeating it allocates another new identity. Neither action modifies snapshot
1936
2180
  bytes, the project directory, git/worktrees, unrelated roots, or trust state.
1937
2181
  - `quit` — open an action picker with `Save Project snapshots and quit`, `Quit
1938
2182
  without saving`, and `Cancel`. The safe first action takes one complete,