@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 +18 -4
- package/board/workflow.mjs +3 -1
- package/package.json +1 -1
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} →
|
|
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:
|
|
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
|
|
package/board/workflow.mjs
CHANGED
|
@@ -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.
|
|
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": {
|