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.
@@ -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, supervise it, 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.
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) is supervised
17
- with `judge: parent` — i.e. **the lead is the judge** that decides when the child is done
18
- (this is the `judge:parent` case of the Supervisor Gate; see the loop/supervisor skill).
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, attach a supervisor
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
- supervision verdicts all arrive in your inbox as `<feature-progress>`, `<feature-blocker>`,
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 supervisor's criteria) is injected each turn.
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 supervisor routes a verdict to the lead,
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 supervisor state
20
- // (loop-state.json, supervisor-verdict.json). Matches the daemon writer
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 durable thing the gate judges against. Read by the daemon
75
- // to populate the supervision:verdict event (docs/supervisor-gate-design.md).
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-C23-A9KM.mjs';
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-C23-A9KM.mjs').then(function (n) { return n.Z; });
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-BVx72l2K.mjs');
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-BVx72l2K.mjs');
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;
@@ -1,4 +1,4 @@
1
- import { D as resolveModel } from './run-C23-A9KM.mjs';
1
+ import { D as resolveModel } from './run-DMahGhJP.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';