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/README-ko.md +58 -114
- package/README.md +49 -110
- package/docs/agent-workflow.md +1420 -37
- package/docs/architecture.md +95 -70
- package/docs/assets/projmux-ai-attention-ko.gif +0 -0
- package/docs/assets/projmux-ai-attention.gif +0 -0
- package/docs/assets/projmux-overview-ko.gif +0 -0
- package/docs/assets/projmux-overview.gif +0 -0
- package/docs/assets/projmux-three-pane-workflow-ko.gif +0 -0
- package/docs/assets/projmux-three-pane-workflow.gif +0 -0
- package/docs/claude-coordination-endpoints.md +254 -0
- package/docs/cli-guide.md +283 -39
- package/docs/cli.md +2059 -56
- package/docs/codex-generation-pool.md +618 -0
- package/docs/codex-installed-compatibility.md +69 -0
- package/docs/codex-native-required-migration.md +98 -9
- package/docs/column-profiles.md +83 -0
- package/docs/configuration.md +43 -4
- package/docs/heterogeneous-dialogue-canary.md +339 -0
- package/docs/hooks.md +48 -15
- package/docs/npm-distribution.md +31 -0
- package/docs/operational-diagnostics.md +125 -0
- package/docs/pr-guideline.md +3 -2
- package/docs/replacement-contract.md +555 -0
- package/docs/session-restore.md +15 -5
- package/docs/settings-ia.md +5 -4
- package/docs/testing.md +12 -7
- package/docs/troubleshooting.md +19 -0
- package/docs/upgrading.md +48 -3
- package/npm/projmux.js +65 -0
- package/package.json +5 -5
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
|
|
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
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
is resolved
|
|
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 #
|
|
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`,
|
|
255
|
-
`--
|
|
256
|
-
an anchor from somewhere you did not address.
|
|
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 `
|
|
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
|
|
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. `
|
|
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
|
|
363
|
-
|
|
364
|
-
|
|
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. `
|
|
585
|
-
|
|
586
|
-
UID and
|
|
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
|
|
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
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
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,
|
|
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 <
|
|
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).
|
|
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 `
|
|
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. `
|
|
1933
|
-
|
|
1934
|
-
a new Project/Window/shell UID chain and one same-root claimant.
|
|
1935
|
-
|
|
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,
|