svamp-cli 0.2.128 → 0.2.130
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/bin/skills/crew/SKILL.md +11 -10
- package/bin/skills/loop/bin/checklist.mjs +3 -2
- package/bin/skills/loop/bin/loop-init.mjs +2 -2
- package/dist/{agentCommands-jGCEdEYn.mjs → agentCommands-DOUG625_.mjs} +4 -4
- package/dist/{auth-DVa-sVa9.mjs → auth-UNUDBJKU.mjs} +1 -1
- package/dist/cli.mjs +85 -95
- package/dist/{commands-CHUE-0Mz.mjs → commands-B8vUCW50.mjs} +1 -1
- package/dist/{commands-deNTJ9jb.mjs → commands-BFGR6-V-.mjs} +9 -9
- package/dist/{commands-BLYvHcrD.mjs → commands-BeOI6l78.mjs} +19 -8
- package/dist/{commands-Dif088xw.mjs → commands-D830hGXM.mjs} +2 -2
- package/dist/{commands-CO-lf8m_.mjs → commands-MdYMcyaZ.mjs} +2 -2
- package/dist/{commands-BVx72l2K.mjs → commands-QGaI-ukW.mjs} +12 -46
- package/dist/{fleet-D3L05h5k.mjs → fleet-nj6bMyhh.mjs} +1 -1
- package/dist/{frpc-CWyoLax7.mjs → frpc-DrfDPPux.mjs} +147 -8
- package/dist/{headlessCli-CB9HN7zY.mjs → headlessCli-D8x-uGEN.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{package-C5owhm4c.mjs → package-BK6btwnG.mjs} +2 -2
- package/dist/{run-CkPzZuKK.mjs → run---5cgexR.mjs} +1 -1
- package/dist/{run-C23-A9KM.mjs → run-DMahGhJP.mjs} +166 -102
- package/dist/{serveCommands-BBIKhjxn.mjs → serveCommands-C8iIs7jb.mjs} +5 -5
- package/dist/{serveManager-CxbgXYEo.mjs → serveManager-Csqa6icR.mjs} +2 -2
- package/dist/{sideband-D5F6XGss.mjs → sideband-Bk7iN3dp.mjs} +1 -1
- package/package.json +2 -2
package/bin/skills/crew/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: crew
|
|
3
3
|
version: 0.1.0
|
|
4
|
-
description: Coordinate work as a lead delegating features to managed worktree children — spawn a child per feature on its own branch,
|
|
4
|
+
description: Coordinate work as a lead delegating features to managed worktree children — spawn a child per feature on its own branch, run it as a loop until done, and pull finished work back to the base branch with merge-and-close. Use when one session should run a project and farm out features instead of piling many sessions on one working tree.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Crew — a lead session that delegates features to managed worktree children
|
|
@@ -13,16 +13,16 @@ the same working tree.
|
|
|
13
13
|
|
|
14
14
|
A **crew** is emergent, not a heavy object: it is just plain sessions linked by
|
|
15
15
|
`parentSessionId` + a `crew.role`. A **feature child** always (a) has the lead as its
|
|
16
|
-
parent, (b) lives in its own `.dev/worktree/<n>` on its own branch, and (c)
|
|
17
|
-
with `
|
|
18
|
-
(this is the `
|
|
16
|
+
parent, (b) lives in its own `.dev/worktree/<n>` on its own branch, and (c) runs as a loop
|
|
17
|
+
with `parent: <lead>` — i.e. **the lead is the judge** that decides when the child is done
|
|
18
|
+
(this is the `parent`-routed case of the loop … until gate; see the `loop` skill).
|
|
19
19
|
|
|
20
20
|
## The verbs (these are your tools)
|
|
21
21
|
|
|
22
22
|
```
|
|
23
23
|
svamp feature start "<brief>" [--oracle "<test cmd>"] [--base <branch>] [--action nudge|block]
|
|
24
|
-
# (lead) create a worktree child on a new branch,
|
|
25
|
-
# (oracle → parent), and brief it. Prints the child id.
|
|
24
|
+
# (lead) create a worktree child on a new branch, run it as a loop until done
|
|
25
|
+
# (oracle → parent verdict), and brief it. Prints the child id.
|
|
26
26
|
svamp feature list [--json]
|
|
27
27
|
# (lead) your children: branch, ahead/behind base, dirty, idle/active.
|
|
28
28
|
svamp feature report "<text>" [--blocker]
|
|
@@ -43,8 +43,9 @@ You coordinate the project. Keep your own working tree (the base branch, e.g. `m
|
|
|
43
43
|
`--oracle "<cmd>"` so it's auto-checked.
|
|
44
44
|
- **Stay aware:** run `svamp feature list` when you start working and whenever you manage the
|
|
45
45
|
crew. Your children also **push** to you: progress notes, blockers, merge-requests, and
|
|
46
|
-
|
|
47
|
-
`<merge-request>`, and `<supervision-verdict>` messages
|
|
46
|
+
loop verdicts all arrive in your inbox as `<feature-progress>`, `<feature-blocker>`,
|
|
47
|
+
`<merge-request>`, and `<supervision-verdict>` messages (the verdict's wire tag name is
|
|
48
|
+
unchanged for back-compat).
|
|
48
49
|
- **Review & merge — this is the gradient that closes the loop.** When a child sends a
|
|
49
50
|
`<merge-request>` or you receive a `<supervision-verdict … verdict="approved">` from a
|
|
50
51
|
child, **run `svamp feature merge <child-id>`**. With an oracle that passed, this is the
|
|
@@ -59,7 +60,7 @@ You coordinate the project. Keep your own working tree (the base branch, e.g. `m
|
|
|
59
60
|
## If you are a FEATURE CHILD
|
|
60
61
|
|
|
61
62
|
You own one feature in an isolated worktree on your own branch, reporting to your lead. Your
|
|
62
|
-
brief (and your
|
|
63
|
+
brief (and your loop's "until" criteria) is injected each turn.
|
|
63
64
|
|
|
64
65
|
- **Work in your worktree.** Implement the feature. Commit as you go. Keep the oracle/tests green.
|
|
65
66
|
- **Report.** Use `svamp feature report "<note>"` for milestones and `--blocker` when stuck —
|
|
@@ -75,7 +76,7 @@ brief (and your supervisor's criteria) is injected each turn.
|
|
|
75
76
|
|
|
76
77
|
- **One conversation, many features.** The lead is your single point of control; children run in
|
|
77
78
|
parallel isolation and report up.
|
|
78
|
-
- **Merge-and-close is the default, not a chore.** The
|
|
79
|
+
- **Merge-and-close is the default, not a chore.** The loop gate routes a verdict to the lead,
|
|
79
80
|
the lead merges, the child closes — the "gradient" that keeps finished work from rotting on a
|
|
80
81
|
stale branch.
|
|
81
82
|
- **Isolation by worktree.** Each feature has its own branch + tree, so children never collide on
|
|
@@ -16,8 +16,9 @@ import { join, dirname } from 'node:path';
|
|
|
16
16
|
import { execSync } from 'node:child_process';
|
|
17
17
|
|
|
18
18
|
// CANONICAL: the session checklist lives INSIDE the loop dir at
|
|
19
|
-
// <project>/.svamp/<sid>/loop/checklist.json — beside the other
|
|
20
|
-
// (loop-state.json, supervisor-verdict.json
|
|
19
|
+
// <project>/.svamp/<sid>/loop/checklist.json — beside the other loop-gate state
|
|
20
|
+
// (loop-state.json, supervisor-verdict.json — the latter is the daemon's legacy
|
|
21
|
+
// verdict file name). Matches the daemon writer
|
|
21
22
|
// (checklist/core.ts checklistPath) + the frontend (sync/ops.ts sessionChecklistRel).
|
|
22
23
|
export function sessionChecklistPath(loopDir) { return join(loopDir, 'checklist.json'); }
|
|
23
24
|
export function projectChecklistPath(projectDir) { return join(projectDir, '.svamp', 'checklist.json'); }
|
|
@@ -71,8 +71,8 @@ const config = {
|
|
|
71
71
|
// and resolve their own dir relatively) read this to run the oracle + fingerprint the
|
|
72
72
|
// work product, since their depth no longer encodes the project root.
|
|
73
73
|
project_dir: dir,
|
|
74
|
-
// The success contract — the
|
|
75
|
-
// to populate the
|
|
74
|
+
// The success contract — the "until" the loop gate runs against. Read by the daemon
|
|
75
|
+
// to populate the loop verdict event (legacy wire type: supervision:verdict).
|
|
76
76
|
...(criteria ? { criteria: criteria.trim() } : {}),
|
|
77
77
|
oracle: oracle ? { command: oracle, timeout_sec: 600 } : null,
|
|
78
78
|
evaluator: { enabled: evaluatorOn, model },
|
|
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync } from '
|
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { requireNotSandboxed } from './sandboxDetect-DNTcbgWD.mjs';
|
|
5
|
-
import { m as shortId } from './run-
|
|
5
|
+
import { m as shortId } from './run-DMahGhJP.mjs';
|
|
6
6
|
import 'os';
|
|
7
7
|
import 'fs/promises';
|
|
8
8
|
import 'fs';
|
|
@@ -96,7 +96,7 @@ async function sessionSetTitle(title) {
|
|
|
96
96
|
}
|
|
97
97
|
async function sessionSetProjectDescription(description) {
|
|
98
98
|
const dir = process.cwd();
|
|
99
|
-
const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-
|
|
99
|
+
const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-DMahGhJP.mjs').then(function (n) { return n.Z; });
|
|
100
100
|
const desc = sanitizeDescription(description, 240);
|
|
101
101
|
if (!desc) {
|
|
102
102
|
console.error("Project description is empty.");
|
|
@@ -180,7 +180,7 @@ async function sessionBroadcast(action, args) {
|
|
|
180
180
|
console.log(`Broadcast sent: ${action}`);
|
|
181
181
|
}
|
|
182
182
|
async function connectToMachineService() {
|
|
183
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
183
|
+
const { connectAndGetMachine } = await import('./commands-QGaI-ukW.mjs');
|
|
184
184
|
return connectAndGetMachine();
|
|
185
185
|
}
|
|
186
186
|
async function inboxSend(targetSessionId, opts) {
|
|
@@ -197,7 +197,7 @@ async function inboxSend(targetSessionId, opts) {
|
|
|
197
197
|
}
|
|
198
198
|
const { server, machine } = await connectToMachineService();
|
|
199
199
|
try {
|
|
200
|
-
const { resolveSessionId } = await import('./commands-
|
|
200
|
+
const { resolveSessionId } = await import('./commands-QGaI-ukW.mjs');
|
|
201
201
|
const sessions = await machine.listSessions();
|
|
202
202
|
const match = resolveSessionId(sessions, targetSessionId);
|
|
203
203
|
const fullTargetId = match.sessionId;
|