cyberfleet 0.6.0 → 0.8.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.plugin/pins.json +1 -1
- package/CHANGELOG.md +18 -0
- package/agents/headless-operator.md +3 -3
- package/dist/cli.mjs +11810 -1683
- package/package.json +3 -2
- package/plugin.json +1 -1
- package/readme.md +4 -3
- package/skills/close-sessions/README.md +37 -0
- package/skills/close-sessions/SKILL.md +172 -0
- package/skills/crimp/SKILL.md +3 -3
- package/skills/jump/SKILL.md +97 -0
- package/skills/operator/SKILL.md +3 -3
- package/skills/pod/SKILL.md +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cyberfleet",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Harness-agnostic, MCP-free inter-agent sessions and messaging over the filesystem",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^24.10.1",
|
|
40
40
|
"commander": "^15.0.0",
|
|
41
|
-
"
|
|
41
|
+
"cyber-mux": "^0.12.0",
|
|
42
|
+
"cyberlegion": "^1.7.0",
|
|
42
43
|
"tsdown": "^0.23.0",
|
|
43
44
|
"tsx": "^4.22.3",
|
|
44
45
|
"typescript": "^7.0.0",
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "cyberfleet",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"description": "Fleet & crew personas over cyberlegion — Pod (ship's bridge), Operator (command center), Crimp (crew recruitment), and Mechanic (automaton building).",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "unional"
|
package/readme.md
CHANGED
|
@@ -26,8 +26,8 @@ npx cyberfleet@0.0.4 <command>
|
|
|
26
26
|
npx cyberfleet missions
|
|
27
27
|
npx cyberfleet missions --agents-root <path>
|
|
28
28
|
|
|
29
|
-
#
|
|
30
|
-
npx cyberfleet jump <
|
|
29
|
+
# Focus the one live unit a repo, branch, unit, or task names, or go back along the last jump
|
|
30
|
+
npx cyberfleet jump <target> [--repo <name>] [--branch <name>]... [--mentions <n>]
|
|
31
31
|
|
|
32
32
|
# Pause a ship's mission — a cyberfleet-level status marker only (NOT the SDD pause-mission checkpoint)
|
|
33
33
|
npx cyberfleet pause <peer>
|
|
@@ -112,7 +112,8 @@ Under the automatons sit two CLIs — cold, deterministic mechanism with no judg
|
|
|
112
112
|
**`cyberfleet`** is the thin fleet layer on top, and carries only what is fleet-specific:
|
|
113
113
|
|
|
114
114
|
- `missions` — the Council view: ships × mission × gate × leash, derived from SDD state
|
|
115
|
-
- `jump` — focus a
|
|
115
|
+
- `jump` — focus the one live unit a repo, branch, unit, or task names, or go `back`; on several
|
|
116
|
+
matches, a task ref, or free text it focuses nothing and returns what the `/jump` skill decides
|
|
116
117
|
- `pause` — mark a ship's mission paused (a status marker only, not an SDD mission checkpoint)
|
|
117
118
|
- `gate approve` — deliberately stubbed: a Council ratification can't be safely relayed through a
|
|
118
119
|
CLI, so it refuses and tells you to ratify in-session
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# close-sessions
|
|
2
|
+
|
|
3
|
+
A mechanical sweep that closes every agent session whose work has landed, and keeps every session
|
|
4
|
+
that might still have work. It has no persona and no judgment step, so it runs on a low-tier model.
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- The Council asks to close finished agent sessions, panes, or pods, clean up idle sessions, or tidy the fleet.
|
|
9
|
+
|
|
10
|
+
Not for marking dead records only: that is `cyberlegion unit prune`, which this skill runs first. Not
|
|
11
|
+
for retiring a pod's record: that belongs to the pod's Captain (`cyberfleet pod retire`).
|
|
12
|
+
|
|
13
|
+
## What it does
|
|
14
|
+
|
|
15
|
+
- Reads every unit with `cyberlegion unit who --all --format json`, and acts only on units in the
|
|
16
|
+
caller's current multiplexer session (records do not yet store the multiplexer session, cyberuni/cyberlegion#241, so
|
|
17
|
+
units whose pane `mux` matches the caller's). Other units are kept, since another session may resume them.
|
|
18
|
+
- Fetches pull requests once per repository and matches branches locally, instead of one `gh` call per unit.
|
|
19
|
+
- Classifies each unit by its worktree and its branch's pull requests. A unit is closable only when
|
|
20
|
+
every pull request from its branch is merged or closed and its `HEAD` is contained in a pull
|
|
21
|
+
request's head commit. Mechanical evidence decides first. A unit whose worktree was deleted is
|
|
22
|
+
closed only once its session has exited.
|
|
23
|
+
- Lists a landed unit with leftover uncommitted files separately, with the files, and closes it
|
|
24
|
+
(discarding them) only when the Council names it.
|
|
25
|
+
- Asks each live unit that passes the mechanical close one question by mail: "Do you have unfinished
|
|
26
|
+
work? Reply DONE or UNFINISHED: <reason>". A unit the multiplexer shows working is kept without
|
|
27
|
+
asking. UNFINISHED or no reply keeps the unit, with the reason listed. A reply never closes a unit
|
|
28
|
+
the evidence keeps. It never types into a pane or reads its screen, and needs no transcript or hook.
|
|
29
|
+
- Keeps this session, standing owners, units with no worktree, and every session in a main
|
|
30
|
+
checkout (Captain, Coordinator, Operator, the Council's desk).
|
|
31
|
+
- Shows the Council the close, ask, and keep groups, and asks about the close and ask groups
|
|
32
|
+
separately before closing anything.
|
|
33
|
+
- Closes each confirmed unit with `cyberlegion unit close <id>`, adding `--force` only for a confirmed
|
|
34
|
+
unit with leftover files.
|
|
35
|
+
|
|
36
|
+
This is the interim home for the sweep. The planned design moves the close into the Coordinator, at the
|
|
37
|
+
moment a unit's last pull request lands, and leaves this sweep for the leftovers.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: close-sessions
|
|
3
|
+
description: "Use this skill when the Council asks to close finished agent sessions, panes, or pods, clean up idle sessions, or tidy the fleet — it closes each unit whose worktree branch has landed and keeps everything else. Not for sweeping dead records only (`cyberlegion unit prune`), and not for retiring a Captain's pod record."
|
|
4
|
+
model: haiku
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Close sessions
|
|
8
|
+
|
|
9
|
+
Close every agent session whose work has landed, and keep every session that might still have work.
|
|
10
|
+
This is a mechanical sweep: each step below is a command and a rule. The one question to a unit is
|
|
11
|
+
mail, and its answer can only keep the unit.
|
|
12
|
+
|
|
13
|
+
A unit is closable only when **all** of its work is visible on the host as finished: every pull
|
|
14
|
+
request from its branch is merged or closed, and none of its commits are missing from those pull
|
|
15
|
+
requests. Mechanical evidence always decides first; nothing a unit says can close one the evidence keeps.
|
|
16
|
+
A live unit that passes that evidence is then asked one question (step 4), because the unit is the best
|
|
17
|
+
judge of whether it has unfinished work. A unit whose work landed but whose worktree still has
|
|
18
|
+
uncommitted files is shown to the Council with those files, and closed only if the Council says so.
|
|
19
|
+
When a check cannot be run or reads unclear, keep the unit. Closing destroys the session, its inbox,
|
|
20
|
+
and its worktree, and cannot be undone. Keeping a finished unit only costs a pane.
|
|
21
|
+
|
|
22
|
+
Act only on units in the caller's current multiplexer session. Another session or multiplexer may
|
|
23
|
+
resume those agents, and this skill cannot know.
|
|
24
|
+
|
|
25
|
+
## 1. Resolve `cyberlegion`
|
|
26
|
+
|
|
27
|
+
Take the first rung that resolves and whose `cyberlegion --version` is `1.6.0` or later:
|
|
28
|
+
|
|
29
|
+
1. `cyberlegion` on `PATH`.
|
|
30
|
+
2. The installed cyberlegion plugin: read `~/.claude/plugins/installed_plugins.json`, take the
|
|
31
|
+
`installPath` of its `cyberlegion@<marketplace>` entry, and run `node <installPath>/bin/cyberlegion.mjs`.
|
|
32
|
+
3. `npx -y cyberlegion@1.6.0`.
|
|
33
|
+
|
|
34
|
+
When no rung resolves, stop and tell the Council to install the `cyberlegion` plugin.
|
|
35
|
+
|
|
36
|
+
## 2. Read the fleet
|
|
37
|
+
|
|
38
|
+
1. `cyberlegion unit prune` marks units whose pane is gone as exited.
|
|
39
|
+
2. `cyberlegion unit whoami` gives this session's own id and handle.
|
|
40
|
+
3. Name the caller's multiplexer: `herdr` when `HERDR_ENV` is set, `tmux` when `TMUX` is set.
|
|
41
|
+
When neither is set, stop and tell the Council.
|
|
42
|
+
4. `cyberlegion unit who --all --format json` lists every unit. Each record has `id`, `handle`,
|
|
43
|
+
`harness`, `status`, `cwd`, a pane, and `worktree` (`root` and `branch`). The pane is under `pane`
|
|
44
|
+
(`mux` and `id`), or, in records written by older versions, under the legacy `tmux` key. Read it from
|
|
45
|
+
whichever is present. The `conversation` field is optional, and this skill does not use it.
|
|
46
|
+
5. Fetch pull requests once per repository, not once per unit. For each distinct repository among the
|
|
47
|
+
in-scope units, run inside one of its worktrees:
|
|
48
|
+
`gh pr list --state all --limit 1000 --json number,state,headRefOid,headRefName`.
|
|
49
|
+
Match each unit's branch to `headRefName` locally. Per-unit `gh` calls made a 400-unit sweep take
|
|
50
|
+
about 7 minutes.
|
|
51
|
+
6. When the caller's multiplexer is `herdr`, read each live in-scope pane's state once, with
|
|
52
|
+
`herdr pane list` (or `herdr pane get <pane id>`). It reports `agent_status` from metadata. Never read a pane's screen.
|
|
53
|
+
|
|
54
|
+
## 3. Classify each unit
|
|
55
|
+
|
|
56
|
+
Apply these rules in order to each unit. The first rule that matches decides it.
|
|
57
|
+
|
|
58
|
+
| # | Check | Result |
|
|
59
|
+
| - | ----- | ------ |
|
|
60
|
+
| 1 | `id` is this session's own id | keep: this session |
|
|
61
|
+
| 2 | It is a standing owner (no pane, and no `harness` field or `harness` is `-`) | keep: standing owner |
|
|
62
|
+
| 3 | Its pane is absent, or its `mux` (or legacy `tmux` key) is not the caller's multiplexer | keep: out of scope |
|
|
63
|
+
| 4 | It has no `worktree` | keep: no worktree |
|
|
64
|
+
| 5 | `worktree.root` does not exist on disk, and `status` is not `exited` | keep: worktree gone, session live |
|
|
65
|
+
| 6 | `worktree.root` does not exist on disk, and `status` is `exited` | close: worktree gone, session ended |
|
|
66
|
+
| 7 | Either `git -C <root> rev-parse --git-dir` or `git -C <root> rev-parse --git-common-dir` fails | keep: cannot read worktree |
|
|
67
|
+
| 8 | Those two commands print the same path | keep: primary checkout |
|
|
68
|
+
| 9 | The repository's pull request list (step 2.5) failed to load | keep: cannot read pull requests |
|
|
69
|
+
| 10 | No pull request in that list has `headRefName` equal to the branch | keep: no pull request yet |
|
|
70
|
+
| 11 | Any matching pull request has state `OPEN` | keep: pull request open |
|
|
71
|
+
| 12 | `git -C <root> merge-base --is-ancestor HEAD <headRefOid>` exits non-zero for every matching pull request | keep: commits after the last pull request |
|
|
72
|
+
| 13 | `git -C <root> status --porcelain --untracked-files=all` prints any line other than `?? .agents/cyberlegion/config.json` | ask: work landed, leftover files |
|
|
73
|
+
| 14 | Anything else (every pull request is `MERGED` or `CLOSED`, `HEAD` is inside one of them, and the worktree is clean) | close: pull requests merged or closed |
|
|
74
|
+
|
|
75
|
+
Rules 5 and 6 handle a worktree that was deleted from disk. Nothing is left on disk to check, so
|
|
76
|
+
the session's own state decides: a live session may still be in use, and an exited one has nothing
|
|
77
|
+
left to lose.
|
|
78
|
+
|
|
79
|
+
Rule 3 is the scope rule. Records do not yet store the multiplexer session (cyberuni/cyberlegion#241),
|
|
80
|
+
so scope is the multiplexer kind. A record with no pane, or with only the legacy `tmux` key while the caller is
|
|
81
|
+
on herdr, is out of scope. herdr restores panes with the same ids and resumes Claude itself, so a
|
|
82
|
+
unit on another herdr session may come back.
|
|
83
|
+
|
|
84
|
+
Rule 8 keeps every session in a project's main checkout: a Captain, a Coordinator, the Operator, or
|
|
85
|
+
the Council's own desk. Those are standing seats, not spawned units, so this skill never closes one.
|
|
86
|
+
|
|
87
|
+
Rule 13 catches a unit whose work landed but left files behind: build output, scratch files, an edit it
|
|
88
|
+
never committed. Those are often safe to drop, but only the Council can say, so the unit is listed
|
|
89
|
+
with its files and closed only on the Council's word. The one line it skips is the marker cyberlegion
|
|
90
|
+
stamps into every worktree it spawns; `cyberlegion unit close` sets that file aside too, so it never
|
|
91
|
+
counts as leftover work.
|
|
92
|
+
|
|
93
|
+
Rule 12 is the unpushed-work check. It compares the local `HEAD` with each pull request's head commit
|
|
94
|
+
rather than with the remote branch, because the host usually deletes a branch once its pull request
|
|
95
|
+
merges. One pull request containing `HEAD` is enough. A head commit missing locally makes that
|
|
96
|
+
command exit non-zero; it counts like any other non-zero exit.
|
|
97
|
+
|
|
98
|
+
Do not retry a failed command. A failure keeps the unit, and the next sweep checks it again.
|
|
99
|
+
|
|
100
|
+
A held merge always keeps its unit, because a held pull request is still open (rule 11).
|
|
101
|
+
|
|
102
|
+
`stopped` is not `exited`. A stopped unit was kept on purpose so it can be restarted.
|
|
103
|
+
|
|
104
|
+
## 4. Ask the live units
|
|
105
|
+
|
|
106
|
+
An **exited** unit's step-3 result stands: its session ended, so there is nobody to ask.
|
|
107
|
+
|
|
108
|
+
For each **live** unit (`status` is not `exited`) that step 3 put in **close**:
|
|
109
|
+
|
|
110
|
+
1. When the multiplexer shows it working, keep it: **keep: working**. On herdr that is `agent_status`
|
|
111
|
+
`working` or `blocked`. Skip the question.
|
|
112
|
+
2. Otherwise mail it one structured question on a fresh thread:
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
cyberlegion mail send --to <id> --thread close-<id>-<timestamp> --subject "Closing?" \
|
|
116
|
+
--body "Do you have unfinished work? Reply with: cyberlegion mail send --to <caller handle> --thread <thread> --body 'DONE' (or --body 'UNFINISHED: <reason>')"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`<caller handle>` is the handle from `unit whoami`, and `<thread>` is the same thread id. A reply
|
|
120
|
+
sent without that thread never matches the wait.
|
|
121
|
+
|
|
122
|
+
Send the questions to all such units first. Then wait on each thread with
|
|
123
|
+
`cyberlegion mail await --thread <thread> --timeout <ms>`, giving each the remaining share of a
|
|
124
|
+
total budget of about 2 minutes (120000 ms), not 2 minutes per unit. `await` prints the reply and acks
|
|
125
|
+
it; it exits non-zero on timeout.
|
|
126
|
+
3. Read the reply:
|
|
127
|
+
- `DONE` → the unit stays in **close**.
|
|
128
|
+
- `UNFINISHED: <reason>` → **keep: unit reports unfinished work**, and show the reason.
|
|
129
|
+
- No reply in time, or a reply that is neither → **keep: no answer**.
|
|
130
|
+
|
|
131
|
+
A reply can only keep a unit. It never moves a unit from keep to close, and never overrides
|
|
132
|
+
rule 13: a live unit that passed the mechanical close but has leftover files stays in **ask**, and is
|
|
133
|
+
not mailed.
|
|
134
|
+
|
|
135
|
+
Never type into a pane or read its screen. The mail is the only way this skill talks to a unit.
|
|
136
|
+
|
|
137
|
+
## 5. Confirm with the Council
|
|
138
|
+
|
|
139
|
+
Show the units in three groups: **close**, **ask**, then **keep**. Each row gives the unit id, the
|
|
140
|
+
handle, the branch, the result, and the pull request numbers. Handles are not unique, so the id is what
|
|
141
|
+
identifies a unit. Under each ask row, show what the Council needs to decide:
|
|
142
|
+
|
|
143
|
+
- for leftover files (rule 13): the lines rule 13 counted, the first 10, then how many more;
|
|
144
|
+
|
|
145
|
+
Then ask two questions, in this order:
|
|
146
|
+
|
|
147
|
+
1. "Close these N units?" for the close group.
|
|
148
|
+
2. "These M units have leftover files, listed above. Closing one deletes its worktree with those
|
|
149
|
+
files. Which should I close?"
|
|
150
|
+
|
|
151
|
+
The Council may drop units from either list. A yes to the first question never covers the ask group.
|
|
152
|
+
Close only the units the Council's answer names or covers. If an answer names a handle that more than
|
|
153
|
+
one candidate shares, ask which id it means. If an answer is not a yes, close nothing from that group.
|
|
154
|
+
|
|
155
|
+
## 6. Close
|
|
156
|
+
|
|
157
|
+
For each confirmed unit, run `cyberlegion unit close <id>`. Add `--force` only for a unit that rule 13
|
|
158
|
+
put in ask, which discards its leftover files.
|
|
159
|
+
|
|
160
|
+
- Pass `--force` only for a rule-13 unit the Council confirmed in answer to the second question.
|
|
161
|
+
Never pass `--keep-worktree`.
|
|
162
|
+
- If a close refuses (for example, a close-group worktree that became dirty since step 3), report the
|
|
163
|
+
refusal and move on. Do not retry it, add `--force`, or reach around it.
|
|
164
|
+
- Never run `cyberfleet pod retire`. A pod's record belongs to its Captain, who retires it.
|
|
165
|
+
- Mail a unit only with the step-4 question. Never type into a pane or read its screen.
|
|
166
|
+
|
|
167
|
+
## 7. Report
|
|
168
|
+
|
|
169
|
+
Lead with the count closed and the count kept (an ask-group unit the Council did not confirm counts as
|
|
170
|
+
kept). List the closed handles. Then list the kept units grouped by result, so the Council can see which
|
|
171
|
+
ones are waiting on a pull request, which reported unfinished work (with the reason), and which are
|
|
172
|
+
out of scope.
|
package/skills/crimp/SKILL.md
CHANGED
|
@@ -50,7 +50,7 @@ and never re-implements the fleet registry — it only invokes them.
|
|
|
50
50
|
Every `cyberlegion …` command in this skill runs whichever CLI resolves below, resolved afresh in each
|
|
51
51
|
session and again after any plugin reload. Never hardcode a versioned
|
|
52
52
|
`~/.claude/plugins/cache/…/<version>/` path: a reload installs a new version beside the old one, and a
|
|
53
|
-
remembered path keeps running the old CLI. The pin is `1.
|
|
53
|
+
remembered path keeps running the old CLI. The pin is `1.7.0`. Take the first rung that
|
|
54
54
|
resolves and whose `cyberlegion --version` is at or above it; skip a rung that reports an older
|
|
55
55
|
version:
|
|
56
56
|
|
|
@@ -58,11 +58,11 @@ version:
|
|
|
58
58
|
2. The installed cyberlegion plugin: read `~/.claude/plugins/installed_plugins.json` now, take the
|
|
59
59
|
`installPath` of its `cyberlegion@<marketplace>` entry, and run `node
|
|
60
60
|
<installPath>/bin/cyberlegion.mjs`.
|
|
61
|
-
3. `npx -y cyberlegion@1.
|
|
61
|
+
3. `npx -y cyberlegion@1.7.0`.
|
|
62
62
|
|
|
63
63
|
When no rung resolves, stop and report it to the Council with the
|
|
64
64
|
install hint: install the `cyberlegion` plugin beside this one, or `npm install -g
|
|
65
|
-
cyberlegion@1.
|
|
65
|
+
cyberlegion@1.7.0`.
|
|
66
66
|
|
|
67
67
|
## Output
|
|
68
68
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jump
|
|
3
|
+
description: "Moves the attached view to the one pane working on a repo, a branch, a pod, a GitHub issue or pull request (`#123`, `color-map#123`), or a task described in words, and back along the last jump. Use when the Council runs /jump, or asks to go to, switch to, or show the pane working on one of these, or to go back to the pane the last jump came from (`/jump back`). Not for opening a new pane or spawning a pod, and not for messaging a unit."
|
|
4
|
+
argument-hint: "[repo|branch|pod|task|back|<prose>]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Jump
|
|
8
|
+
|
|
9
|
+
Move the attached view to the one pane working on what the argument names, or back along the last
|
|
10
|
+
jump. `cyberfleet jump` does the matching and the focusing. This skill does the two steps the
|
|
11
|
+
command leaves to it: the GitHub lookup for a task ref, and matching free text to a unit.
|
|
12
|
+
|
|
13
|
+
The one rule above all others: **more than one match lists the candidates and stops.** Never pick
|
|
14
|
+
one, not even the newest or the most likely.
|
|
15
|
+
|
|
16
|
+
## Running `cyberfleet`
|
|
17
|
+
|
|
18
|
+
This plugin ships the `cyberfleet` CLI, so its version always matches this skill. Run it from this
|
|
19
|
+
skill's directory, with no install:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
node <this skill's directory>/../../bin/cyberfleet.mjs jump <argument>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Every `cyberfleet jump …` below means that command. Add `--format json` to read the result as JSON;
|
|
26
|
+
its `result` field names the kind.
|
|
27
|
+
|
|
28
|
+
## 1. Run `cyberfleet jump <argument>`
|
|
29
|
+
|
|
30
|
+
Claude Code appends the argument as `ARGUMENTS: <value>`; other runtimes pass the text after the
|
|
31
|
+
skill name. With no argument, ask the Council where to jump and stop.
|
|
32
|
+
|
|
33
|
+
Pass the argument as it came, quoted as one value. The command prints one result:
|
|
34
|
+
|
|
35
|
+
| `result` | What it means | Next |
|
|
36
|
+
| -------- | ------------- | ---- |
|
|
37
|
+
| `jumped` | It focused one unit: its `id`, `handle`, and `pane` (`back` also gives `from`). | Step 4 |
|
|
38
|
+
| `candidates` | More than one unit matched. Nothing was focused. | Step 4 |
|
|
39
|
+
| `task` | A task ref: its `repo` name, `slug` (`<owner>/<repo>` from that checkout's `origin`), and `number`. Nothing was focused. | Step 2 |
|
|
40
|
+
| `prose` | No exact match: the `words`, and the live units with `id`, `handle`, `branch`, `repo`, and `brief` (a path). Nothing was focused. | Step 3 |
|
|
41
|
+
|
|
42
|
+
A non-zero exit is an error. Go to step 4 with it.
|
|
43
|
+
|
|
44
|
+
The command already applies these rules, so do not repeat them by hand: it never focuses this
|
|
45
|
+
session or lists it, it jumps past this session when this session was one of the matches, a bare
|
|
46
|
+
word must exactly equal a unit's id, handle, branch, or repo name, and `back` follows the jump
|
|
47
|
+
history for this pane.
|
|
48
|
+
|
|
49
|
+
## 2. On `task`, look up the branches with `gh`
|
|
50
|
+
|
|
51
|
+
A task is a GitHub issue or pull request; one number names exactly one of them. This step needs an
|
|
52
|
+
authenticated `gh`. When `gh` is missing or not logged in, quote its error and stop.
|
|
53
|
+
|
|
54
|
+
1. **Read what the number is.** `gh api repos/<slug>/issues/<number> --jq '.pull_request != null'`
|
|
55
|
+
prints `true` for a pull request and `false` for an issue. If it fails, quote the error and stop.
|
|
56
|
+
2. **Find the branches.**
|
|
57
|
+
- A pull request: `gh pr view <number> -R <slug> --json headRefName --jq .headRefName`.
|
|
58
|
+
- An issue: `gh issue view <number> -R <slug> --json closedByPullRequestsReferences` lists the
|
|
59
|
+
linked pull requests. Read each one's `headRefName` as above, in that pull request's own
|
|
60
|
+
repository. An issue with no linked pull request has no branches.
|
|
61
|
+
3. **Focus.** Run `cyberfleet jump --repo <repo> --branch <b>... --mentions <number>`, one `--branch`
|
|
62
|
+
per branch found, with the `repo` the `task` result gave. When no branch has a live unit,
|
|
63
|
+
`--mentions` falls back to a unit whose handle or brief names the number. Go to step 4 with what
|
|
64
|
+
it prints.
|
|
65
|
+
|
|
66
|
+
## 3. On `prose`, match the words to one unit
|
|
67
|
+
|
|
68
|
+
Match the `words` against each listed unit's handle, branch, repo name, and brief (read the brief
|
|
69
|
+
file when the unit has one). A match is a unit the words plainly describe, not one they could be
|
|
70
|
+
stretched to fit.
|
|
71
|
+
|
|
72
|
+
- Exactly one: run `cyberfleet jump <id>` with that unit's id, and go to step 4 with what it prints.
|
|
73
|
+
- More than one plausible unit: list them and stop.
|
|
74
|
+
- None: say no live unit matches, and list the units so the Council can name one.
|
|
75
|
+
|
|
76
|
+
## 4. Report the result
|
|
77
|
+
|
|
78
|
+
- `jumped`: one line naming the unit's handle and id and the pane, then that `/jump back` returns.
|
|
79
|
+
After a `back` with no unit at the pane, name the pane alone.
|
|
80
|
+
- `candidates`: one row per unit with its id, handle, branch, and repo name, then a line saying the
|
|
81
|
+
Council can narrow the argument (a repo, a branch, or an id). Do not jump.
|
|
82
|
+
- An error: quote the command's error verbatim with its exit code. Do not retry with other flags,
|
|
83
|
+
prune, or reach the pane any other way.
|
|
84
|
+
|
|
85
|
+
`/jump back` waits for this session's turn. When the Council uses `back` often, mention the tmux key
|
|
86
|
+
(prefix+B) that cyber-mux's `setup-tmux` binds to `focus --back`.
|
|
87
|
+
|
|
88
|
+
## Validate
|
|
89
|
+
|
|
90
|
+
Before reporting, check the result against what the commands printed:
|
|
91
|
+
|
|
92
|
+
- A reported jump comes from a `jumped` result, and names the `id`, `handle`, and `pane` it gave.
|
|
93
|
+
- Every `cyberfleet jump` run after the first took an id from a result, or `--repo` with the
|
|
94
|
+
branches `gh` returned. None took a handle, and none was guessed.
|
|
95
|
+
- A candidates report has at least two rows, each a unit from the `candidates` or `prose` result,
|
|
96
|
+
and no `cyberfleet jump` ran after the candidates were collected.
|
|
97
|
+
- An error report quotes the command's error and exit code, and no other command ran after it.
|
package/skills/operator/SKILL.md
CHANGED
|
@@ -150,7 +150,7 @@ the Council's words with `unit nudge --message`, never reaches for an MCP messag
|
|
|
150
150
|
Every `cyberlegion …` command in this skill runs whichever CLI resolves below, resolved afresh in each
|
|
151
151
|
session and again after any plugin reload. Never hardcode a versioned
|
|
152
152
|
`~/.claude/plugins/cache/…/<version>/` path: a reload installs a new version beside the old one, and a
|
|
153
|
-
remembered path keeps running the old CLI. The pin is `1.
|
|
153
|
+
remembered path keeps running the old CLI. The pin is `1.7.0`. Take the first rung that
|
|
154
154
|
resolves and whose `cyberlegion --version` is at or above it; skip a rung that reports an older
|
|
155
155
|
version:
|
|
156
156
|
|
|
@@ -158,11 +158,11 @@ version:
|
|
|
158
158
|
2. The installed cyberlegion plugin: read `~/.claude/plugins/installed_plugins.json` now, take the
|
|
159
159
|
`installPath` of its `cyberlegion@<marketplace>` entry, and run `node
|
|
160
160
|
<installPath>/bin/cyberlegion.mjs`.
|
|
161
|
-
3. `npx -y cyberlegion@1.
|
|
161
|
+
3. `npx -y cyberlegion@1.7.0`.
|
|
162
162
|
|
|
163
163
|
When no rung resolves, stop and report it to the Council with the
|
|
164
164
|
install hint: install the `cyberlegion` plugin beside this one, or `npm install -g
|
|
165
|
-
cyberlegion@1.
|
|
165
|
+
cyberlegion@1.7.0`.
|
|
166
166
|
|
|
167
167
|
## Headless — the lifecycle loop
|
|
168
168
|
|
package/skills/pod/SKILL.md
CHANGED
|
@@ -153,7 +153,7 @@ leash state itself.
|
|
|
153
153
|
Every `cyberlegion …` command in this skill runs whichever CLI resolves below, resolved afresh in each
|
|
154
154
|
session and again after any plugin reload. Never hardcode a versioned
|
|
155
155
|
`~/.claude/plugins/cache/…/<version>/` path: a reload installs a new version beside the old one, and a
|
|
156
|
-
remembered path keeps running the old CLI. The pin is `1.
|
|
156
|
+
remembered path keeps running the old CLI. The pin is `1.7.0`. Take the first rung that
|
|
157
157
|
resolves and whose `cyberlegion --version` is at or above it; skip a rung that reports an older
|
|
158
158
|
version:
|
|
159
159
|
|
|
@@ -161,11 +161,11 @@ version:
|
|
|
161
161
|
2. The installed cyberlegion plugin: read `~/.claude/plugins/installed_plugins.json` now, take the
|
|
162
162
|
`installPath` of its `cyberlegion@<marketplace>` entry, and run `node
|
|
163
163
|
<installPath>/bin/cyberlegion.mjs`.
|
|
164
|
-
3. `npx -y cyberlegion@1.
|
|
164
|
+
3. `npx -y cyberlegion@1.7.0`.
|
|
165
165
|
|
|
166
166
|
When no rung resolves, stop and report it to the Council with the
|
|
167
167
|
install hint: install the `cyberlegion` plugin beside this one, or `npm install -g
|
|
168
|
-
cyberlegion@1.
|
|
168
|
+
cyberlegion@1.7.0`.
|
|
169
169
|
|
|
170
170
|
## Output
|
|
171
171
|
|