@volter/supercode-orchestrator 0.4.34 → 0.4.35

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/board/cli.mjs CHANGED
@@ -45,6 +45,7 @@ supercode's own:
45
45
  move <id> <machine|none> adopt <id> <session> [--assignee P] close <id> serve (= daemon) list --machine M
46
46
  notify-subscribe <id> --address sc:<machine>:<harness>:<id> [--role creator|worker|dependency]
47
47
  Any verb … --at sc:<machine>:board:<home>: sent as mail to a board kept on another machine.
48
+ <event> <id>... [reason] [--<field> value]: any other event the board's workflow declares, its flags the event's fields.
48
49
 
49
50
  specify/decompose with no spec start a session on the triage card to write it. A card's own session may comment on,
50
51
  block (with --kind), heartbeat and request review of its card, specify or decompose it in triage, and file, complete,
@@ -555,8 +556,8 @@ export async function runWorkflow(argv) {
555
556
  const results = [];
556
557
  for (const t of targets) {
557
558
  if (verb === 'specify' && (args.title !== undefined || args.body !== undefined)) {
558
- await withBoardAsync((b) => engine.specify(b, t, { title: args.title ?? null, body: args.body ?? null, author: args.author ?? callerAddress() ?? callerName() }));
559
- results.push({ id: t, specified: true });
559
+ const moved = await withBoardAsync((b) => engine.specify(b, t, { title: args.title ?? null, body: args.body ?? null, author: args.author ?? callerAddress() ?? callerName() }));
560
+ results.push({ id: t, specified: true, status: moved.to });
560
561
  } else if (verb === 'decompose' && args.child?.length) {
561
562
  const children = args.child.map((c) => { const [title, assignee] = c.split(/@(?=[^@]*$)/); return { title: title.trim(), assignee: assignee?.trim() || undefined }; });
562
563
  results.push({ id: t, children: await withBoardAsync((b) => engine.decompose(b, t, children, { author: args.author ?? callerAddress() ?? callerName() })) });
@@ -565,7 +566,7 @@ export async function runWorkflow(argv) {
565
566
  results.push({ id: t, session: session.address, mode: session.mode });
566
567
  }
567
568
  }
568
- say(args, results.map((r) => (r.specified ? `Specified ${r.id} → todo` : r.children ? `Decomposed ${r.id} into ${r.children.join(', ')}` : `${r.id}: session ${r.session} (${r.mode}) is writing its ${verb === 'specify' ? 'spec' : 'breakdown'}`)).join('\n'), results);
569
+ say(args, results.map((r) => (r.specified ? `Specified ${r.id} → ${r.status}` : r.children ? `Decomposed ${r.id} into ${r.children.join(', ')}` : `${r.id}: session ${r.session} (${r.mode}) is writing its ${verb === 'specify' ? 'spec' : 'breakdown'}`)).join('\n'), results);
569
570
  return 0;
570
571
  }
571
572
 
@@ -746,7 +747,20 @@ export async function runWorkflow(argv) {
746
747
  return 0;
747
748
  }
748
749
 
749
- default: throw new Error(`no workflow verb ${verb}; \`supercode workflow help\` lists them`);
750
+ default: {
751
+ // any other event the board's workflow declares is a verb of its own: `<event> <id>... [reason] [--<field> value]`,
752
+ // the flags its payload (the doors a session is told name these)
753
+ const name = verb.replace(/-/g, '_');
754
+ const { workflow } = workflowFor(root);
755
+ const declared = Object.values(workflow.statuses).some((s) => s.on?.[name]) || Boolean(workflow.on?.[name]);
756
+ if (!declared) throw new Error(`no workflow verb ${verb}; \`supercode workflow help\` lists them`);
757
+ need(1, 'a card id');
758
+ const { _: _words, root: _r, board: _b, json: _j, at: _a, ids: _i, ...fields } = args;
759
+ const payload = { ...fields, reason: args.reason ?? (rest.slice(1).join(' ') || null) };
760
+ const results = [];
761
+ for (const t of [id, ...(args.ids ?? [])]) results.push([t, (await withBoardAsync((b) => engine.act(b, t, name, { payload }))).to]);
762
+ say(args, results.map(([t, s]) => `${t} → ${s}`).join('\n'), { ok: true, results }); return 0;
763
+ }
750
764
  }
751
765
  }
752
766
 
@@ -94,7 +94,9 @@ export function scopeOf(db, board, task, { params, event = {}, extra = {} } = {}
94
94
  goal_mode: Boolean(task.goal_mode),
95
95
  implementer: asked.implementer ?? task.assignee,
96
96
  last_reviewer: changes.reviewer ?? null,
97
- arc: task.subtask_of ? one(db, 'SELECT id, status, title FROM tasks WHERE id = ?', task.subtask_of) ?? null : null,
97
+ arc: task.subtask_of ? one(db, 'SELECT id, status, title, assignee FROM tasks WHERE id = ?', task.subtask_of) ?? null : null,
98
+ // the cards filed as its subtasks (`create --subtask-of`), in the order they were filed
99
+ subtasks: all(db, 'SELECT t.id, t.status, t.title, t.assignee FROM tasks t JOIN supercode_cards c ON c.task_id = t.id WHERE c.subtask_of = ? ORDER BY t.created_at', task.id),
98
100
  queue_reason: json(one(db, "SELECT payload FROM task_events WHERE task_id = ? AND kind = 'respawn_guarded' AND created_at >= ? ORDER BY id DESC LIMIT 1",
99
101
  task.id, Number(one(db, 'SELECT since FROM supercode_cards WHERE task_id = ?', task.id)?.since ?? 0))?.payload, {})?.reason ?? null,
100
102
  last_block_event: one(db, "SELECT kind FROM task_events WHERE task_id = ? AND kind IN ('blocked', 'unblocked') ORDER BY id DESC LIMIT 1", task.id)?.kind ?? null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/supercode-orchestrator",
3
- "version": "0.4.34",
3
+ "version": "0.4.35",
4
4
  "type": "module",
5
5
  "description": "The orchestrator runtime over the Volter Harness ontology: one typed operational model whose folder is its serialization, read and written through the harness orchestration doors (docs/ORCHESTRATOR-IR.md)",
6
6
  "exports": {