cool-workflow 0.1.92 → 0.1.94
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/README.md +104 -129
- package/apps/architecture-review/app.json +1 -1
- package/apps/architecture-review-fast/app.json +1 -1
- package/apps/architecture-review-fast/workflow.js +15 -2
- package/apps/end-to-end-golden-path/app.json +1 -1
- package/apps/pr-review-fix-ci/app.json +1 -1
- package/apps/release-cut/app.json +1 -1
- package/apps/research-synthesis/app.json +1 -1
- package/dist/capability-core.js +47 -0
- package/dist/capability-registry.js +2 -0
- package/dist/cli/command-surface.js +165 -1352
- package/dist/cli/format.js +56 -0
- package/dist/cli/handlers/audit.js +82 -0
- package/dist/cli/handlers/blackboard.js +81 -0
- package/dist/cli/handlers/candidate.js +40 -0
- package/dist/cli/handlers/clones.js +34 -0
- package/dist/cli/handlers/collaboration.js +61 -0
- package/dist/cli/handlers/eval.js +40 -0
- package/dist/cli/handlers/maintenance.js +107 -0
- package/dist/cli/handlers/multi-agent.js +165 -0
- package/dist/cli/handlers/node.js +41 -0
- package/dist/cli/handlers/operational.js +155 -0
- package/dist/cli/handlers/operator.js +146 -0
- package/dist/cli/handlers/registry.js +68 -0
- package/dist/cli/handlers/run.js +153 -0
- package/dist/cli/handlers/scheduling.js +126 -0
- package/dist/cli/handlers/workbench.js +41 -0
- package/dist/cli/handlers/worker.js +45 -0
- package/dist/cli/io.js +27 -0
- package/dist/cli/run-summary.js +45 -0
- package/dist/commit.js +0 -5
- package/dist/execution-backend.js +0 -11
- package/dist/mcp/tool-call.js +2 -0
- package/dist/mcp/tool-definitions.js +8 -0
- package/dist/orchestrator/app-operations.js +205 -0
- package/dist/orchestrator.js +41 -153
- package/dist/state-explosion.js +0 -7
- package/dist/term.js +0 -18
- package/dist/validation.js +0 -21
- package/dist/version.js +1 -1
- package/docs/agent-delegation-drive.7.md +13 -7
- package/docs/cli-mcp-parity.7.md +19 -2
- package/docs/contract-migration-tooling.7.md +3 -1
- package/docs/control-plane-scheduling.7.md +3 -1
- package/docs/durable-state-and-locking.7.md +3 -1
- package/docs/evidence-adoption-reasoning-chain.7.md +3 -1
- package/docs/execution-backends.7.md +3 -1
- package/docs/mcp-app-surface.7.md +12 -0
- package/docs/multi-agent-cli-mcp-surface.7.md +3 -1
- package/docs/multi-agent-eval-replay-harness.7.md +3 -1
- package/docs/multi-agent-operator-ux.7.md +3 -1
- package/docs/node-snapshot-diff-replay.7.md +3 -1
- package/docs/observability-cost-accounting.7.md +3 -1
- package/docs/project-index.md +16 -3
- package/docs/real-execution-backends.7.md +3 -1
- package/docs/release-and-migration.7.md +3 -1
- package/docs/release-tooling.7.md +3 -1
- package/docs/run-registry-control-plane.7.md +27 -3
- package/docs/run-retention-reclamation.7.md +3 -1
- package/docs/state-explosion-management.7.md +3 -1
- package/docs/team-collaboration.7.md +3 -1
- package/docs/web-desktop-workbench.7.md +3 -1
- package/manifest/plugin.manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/agents/builtin-templates.json +3 -2
- package/scripts/agents/claude-p-agent.js +6 -6
- package/scripts/agents/codex-agent.js +17 -3
- package/scripts/agents/deepseek-agent.js +23 -0
- package/scripts/agents/gemini-opencode-agent.js +25 -0
- package/scripts/agents/opencode-agent.js +57 -8
- package/scripts/architecture-review-fast.js +19 -5
- package/scripts/bump-version.js +16 -0
- package/scripts/canonical-apps.js +4 -4
- package/scripts/dogfood-release.js +1 -1
- package/scripts/golden-path.js +4 -4
- package/scripts/parity-check.js +9 -1
- package/scripts/release-flow.js +35 -0
- package/scripts/vendor-preflight.js +127 -0
- package/scripts/version-sync-check.js +5 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleMultiAgent = handleMultiAgent;
|
|
4
|
+
const operator_ux_1 = require("../../operator-ux");
|
|
5
|
+
const multi_agent_operator_ux_1 = require("../../multi-agent-operator-ux");
|
|
6
|
+
const state_explosion_1 = require("../../state-explosion");
|
|
7
|
+
const evidence_reasoning_1 = require("../../evidence-reasoning");
|
|
8
|
+
const io_1 = require("../io");
|
|
9
|
+
/** `cw multi-agent <verb> <run-id> [id]` — the multi-agent operator surface. */
|
|
10
|
+
function handleMultiAgent(args, runner) {
|
|
11
|
+
const [subcommand, runId, id] = args.positionals;
|
|
12
|
+
switch (subcommand) {
|
|
13
|
+
case "status":
|
|
14
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
15
|
+
(0, io_1.printJson)(runner.hostMultiAgentStatus((0, io_1.required)(runId, "run id")));
|
|
16
|
+
else
|
|
17
|
+
process.stdout.write(`${(0, multi_agent_operator_ux_1.formatMultiAgentOperatorStatus)(runner.multiAgentOperatorStatus((0, io_1.required)(runId, "run id")))}\n`);
|
|
18
|
+
return;
|
|
19
|
+
case "step":
|
|
20
|
+
(0, io_1.printJson)(runner.hostMultiAgentStep((0, io_1.required)(runId, "run id"), args.options));
|
|
21
|
+
return;
|
|
22
|
+
case "blackboard":
|
|
23
|
+
(0, io_1.printJson)(runner.hostMultiAgentBlackboard((0, io_1.required)(runId, "run id"), id, args.options));
|
|
24
|
+
return;
|
|
25
|
+
case "score":
|
|
26
|
+
(0, io_1.printJson)(runner.hostMultiAgentScore((0, io_1.required)(runId, "run id"), { ...args.options, candidate: args.options.candidate || args.options.candidateId || id }));
|
|
27
|
+
return;
|
|
28
|
+
case "select":
|
|
29
|
+
(0, io_1.printJson)(runner.hostMultiAgentSelect((0, io_1.required)(runId, "run id"), { ...args.options, candidate: args.options.candidate || args.options.candidateId || id }));
|
|
30
|
+
return;
|
|
31
|
+
case "summary": {
|
|
32
|
+
const summary = runner.multiAgentSummary((0, io_1.required)(runId, "run id"));
|
|
33
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
34
|
+
(0, io_1.printJson)(summary);
|
|
35
|
+
else
|
|
36
|
+
process.stdout.write(`${(0, operator_ux_1.formatMultiAgentSummary)(summary)}\n`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
case "summarize": {
|
|
40
|
+
const report = runner.multiAgentSummarize((0, io_1.required)(runId, "run id"));
|
|
41
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
42
|
+
(0, io_1.printJson)(report);
|
|
43
|
+
else
|
|
44
|
+
process.stdout.write(`${(0, state_explosion_1.formatStateExplosionReport)(report)}\n`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
case "graph": {
|
|
48
|
+
const wantsView = args.options.view || args.options.focus || args.options.depth;
|
|
49
|
+
if (wantsView) {
|
|
50
|
+
const graph = runner.multiAgentGraphView((0, io_1.required)(runId, "run id"), args.options);
|
|
51
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
52
|
+
(0, io_1.printJson)(graph);
|
|
53
|
+
else
|
|
54
|
+
process.stdout.write(`${(0, state_explosion_1.formatCompactGraph)(graph)}\n`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const graph = runner.multiAgentOperatorGraph((0, io_1.required)(runId, "run id"));
|
|
58
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
59
|
+
(0, io_1.printJson)(graph);
|
|
60
|
+
else
|
|
61
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorGraph)({ runId: (0, io_1.required)(runId, "run id"), nodes: graph.nodes, edges: graph.edges })}\n`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
case "dependencies": {
|
|
65
|
+
const rows = runner.multiAgentDependencies((0, io_1.required)(runId, "run id"));
|
|
66
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
67
|
+
(0, io_1.printJson)(rows);
|
|
68
|
+
else
|
|
69
|
+
process.stdout.write(`${(0, multi_agent_operator_ux_1.formatMultiAgentDependencies)(rows)}\n`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
case "failures": {
|
|
73
|
+
const rows = runner.multiAgentFailures((0, io_1.required)(runId, "run id"));
|
|
74
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
75
|
+
(0, io_1.printJson)(rows);
|
|
76
|
+
else
|
|
77
|
+
process.stdout.write(`${(0, multi_agent_operator_ux_1.formatMultiAgentFailures)(rows)}\n`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
case "evidence": {
|
|
81
|
+
const rows = runner.multiAgentEvidence((0, io_1.required)(runId, "run id"));
|
|
82
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
83
|
+
(0, io_1.printJson)(rows);
|
|
84
|
+
else
|
|
85
|
+
process.stdout.write(`${(0, multi_agent_operator_ux_1.formatMultiAgentEvidence)(rows)}\n`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
case "reasoning": {
|
|
89
|
+
if (args.options.refresh && !args.options.evidence && !args.options.evidenceId) {
|
|
90
|
+
const index = runner.multiAgentReasoningRefresh((0, io_1.required)(runId, "run id"));
|
|
91
|
+
(0, io_1.printJson)(index);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const report = runner.multiAgentReasoning((0, io_1.required)(runId, "run id"), { ...args.options, evidence: args.options.evidence || args.options.evidenceId || id });
|
|
95
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
96
|
+
(0, io_1.printJson)(report);
|
|
97
|
+
else
|
|
98
|
+
process.stdout.write(`${(0, evidence_reasoning_1.formatEvidenceReasoningReport)(report)}\n`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
case "run":
|
|
102
|
+
if (!runId ||
|
|
103
|
+
args.options.topology ||
|
|
104
|
+
args.options.topologyId ||
|
|
105
|
+
args.options.app ||
|
|
106
|
+
args.options.appId ||
|
|
107
|
+
args.options.workflow ||
|
|
108
|
+
args.options.workflowId) {
|
|
109
|
+
(0, io_1.printJson)(runner.hostMultiAgentRun(runId, args.options));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (id && !args.options.id && !args.options.status)
|
|
113
|
+
(0, io_1.printJson)(runner.showMultiAgentRun((0, io_1.required)(runId, "run id"), id));
|
|
114
|
+
else if (id && args.options.status)
|
|
115
|
+
(0, io_1.printJson)(runner.transitionMultiAgentRun((0, io_1.required)(runId, "run id"), id, args.options));
|
|
116
|
+
else
|
|
117
|
+
(0, io_1.printJson)(runner.createMultiAgentRun((0, io_1.required)(runId, "run id"), args.options));
|
|
118
|
+
return;
|
|
119
|
+
case "show":
|
|
120
|
+
(0, io_1.printJson)(runner.showMultiAgentRun((0, io_1.required)(runId, "run id"), (0, io_1.required)(id, "multi-agent run id")));
|
|
121
|
+
return;
|
|
122
|
+
case "role":
|
|
123
|
+
if (id && !args.options.id && !args.options["multi-agent-run"] && !args.options.multiAgentRun && !args.options.multiAgentRunId) {
|
|
124
|
+
(0, io_1.printJson)(runner.showAgentRole((0, io_1.required)(runId, "run id"), id));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
(0, io_1.printJson)(runner.createAgentRole((0, io_1.required)(runId, "run id"), { ...args.options, id: args.options.id || id }));
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
case "group":
|
|
131
|
+
if (id && !args.options.id && !args.options["multi-agent-run"] && !args.options.multiAgentRun && !args.options.multiAgentRunId) {
|
|
132
|
+
(0, io_1.printJson)(runner.showAgentGroup((0, io_1.required)(runId, "run id"), id));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
(0, io_1.printJson)(runner.createAgentGroup((0, io_1.required)(runId, "run id"), { ...args.options, id: args.options.id || id }));
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
case "membership":
|
|
139
|
+
if (id && !args.options.id && !args.options.group && !args.options.groupId && !args.options["multi-agent-group"]) {
|
|
140
|
+
(0, io_1.printJson)(runner.showAgentMembership((0, io_1.required)(runId, "run id"), id));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
(0, io_1.printJson)(runner.assignAgentMembership((0, io_1.required)(runId, "run id"), { ...args.options, id: args.options.id || id }));
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
case "fanout":
|
|
147
|
+
if (id && !args.options.id && !args.options.group && !args.options.groupId && !args.options["multi-agent-group"]) {
|
|
148
|
+
(0, io_1.printJson)(runner.showAgentFanout((0, io_1.required)(runId, "run id"), id));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
(0, io_1.printJson)(runner.createAgentFanout((0, io_1.required)(runId, "run id"), { ...args.options, id: args.options.id || id }));
|
|
152
|
+
}
|
|
153
|
+
return;
|
|
154
|
+
case "fanin":
|
|
155
|
+
if (id && !args.options.id && !args.options.group && !args.options.groupId && !args.options["multi-agent-group"] && !args.options.fanout) {
|
|
156
|
+
(0, io_1.printJson)(runner.showAgentFanin((0, io_1.required)(runId, "run id"), id));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
(0, io_1.printJson)(runner.collectAgentFanin((0, io_1.required)(runId, "run id"), { ...args.options, id: args.options.id || id }));
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
default:
|
|
163
|
+
throw new Error("Usage: cw.js multi-agent run|status|step|blackboard|score|select|summary|summarize|graph|dependencies|failures|evidence|reasoning|show|role|group|membership|fanout|fanin <run-id> [id]");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleNode = handleNode;
|
|
4
|
+
const operator_ux_1 = require("../../operator-ux");
|
|
5
|
+
const io_1 = require("../io");
|
|
6
|
+
/** `cw node list|show|graph|snapshot|diff|replay|verify <run-id> …` — node inspection. */
|
|
7
|
+
function handleNode(args, runner) {
|
|
8
|
+
const [subcommand, runId, nodeId] = args.positionals;
|
|
9
|
+
switch (subcommand) {
|
|
10
|
+
case "list":
|
|
11
|
+
(0, io_1.printJson)(runner.listNodes((0, io_1.required)(runId, "run id")));
|
|
12
|
+
return;
|
|
13
|
+
case "show":
|
|
14
|
+
(0, io_1.printJson)(runner.showNode((0, io_1.required)(runId, "run id"), (0, io_1.required)(nodeId, "node id")));
|
|
15
|
+
return;
|
|
16
|
+
case "graph":
|
|
17
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
18
|
+
(0, io_1.printJson)(runner.graphNodes((0, io_1.required)(runId, "run id")));
|
|
19
|
+
else
|
|
20
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorGraph)(runner.operatorGraph((0, io_1.required)(runId, "run id")))}\n`);
|
|
21
|
+
return;
|
|
22
|
+
case "snapshot":
|
|
23
|
+
(0, io_1.printJson)(runner.nodeSnapshot((0, io_1.required)(runId, "run id"), (0, io_1.required)(nodeId, "node id")));
|
|
24
|
+
return;
|
|
25
|
+
case "diff":
|
|
26
|
+
(0, io_1.printJson)(runner.nodeDiff((0, io_1.required)(runId, "run id"), (0, io_1.required)(nodeId, "baseline snapshot id"), (0, io_1.required)(args.positionals[3], "candidate snapshot id")));
|
|
27
|
+
return;
|
|
28
|
+
case "replay":
|
|
29
|
+
(0, io_1.printJson)(runner.nodeReplay((0, io_1.required)(runId, "run id"), (0, io_1.required)(nodeId, "snapshot id")));
|
|
30
|
+
return;
|
|
31
|
+
case "verify": {
|
|
32
|
+
const verdict = runner.nodeReplayVerify((0, io_1.required)(runId, "run id"), (0, io_1.required)(nodeId, "replay id"));
|
|
33
|
+
(0, io_1.printJson)(verdict);
|
|
34
|
+
if (!verdict.pass)
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
default:
|
|
39
|
+
throw new Error("Usage: cw.js node list|show|graph|snapshot|diff|replay|verify <run-id> [node-id|snapshot-id|replay-id]");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleSandbox = handleSandbox;
|
|
4
|
+
exports.handleBackend = handleBackend;
|
|
5
|
+
exports.handleContract = handleContract;
|
|
6
|
+
exports.handleMigration = handleMigration;
|
|
7
|
+
exports.handleFeedback = handleFeedback;
|
|
8
|
+
exports.handleMetrics = handleMetrics;
|
|
9
|
+
const capability_core_1 = require("../../capability-core");
|
|
10
|
+
const observability_1 = require("../../observability");
|
|
11
|
+
const operator_ux_1 = require("../../operator-ux");
|
|
12
|
+
const io_1 = require("../io");
|
|
13
|
+
/** `cw sandbox list|show|validate|choose|resolve [profile-id|profile-file]`. */
|
|
14
|
+
function handleSandbox(args, runner) {
|
|
15
|
+
const [subcommand, profileIdOrFile] = args.positionals;
|
|
16
|
+
switch (subcommand) {
|
|
17
|
+
case "list":
|
|
18
|
+
(0, io_1.printJson)(runner.listSandboxProfiles(args.options));
|
|
19
|
+
return;
|
|
20
|
+
case "show":
|
|
21
|
+
(0, io_1.printJson)(runner.showSandboxProfile((0, io_1.required)(profileIdOrFile, "profile id"), args.options));
|
|
22
|
+
return;
|
|
23
|
+
case "validate": {
|
|
24
|
+
const result = runner.validateSandboxProfile((0, io_1.required)(profileIdOrFile, "profile file"), args.options);
|
|
25
|
+
(0, io_1.printJson)(result);
|
|
26
|
+
if (!result.valid)
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
case "choose":
|
|
31
|
+
case "resolve":
|
|
32
|
+
(0, io_1.printJson)((0, capability_core_1.sandboxChoose)(runner, { ...args.options, profileId: profileIdOrFile || args.options.profileId }));
|
|
33
|
+
return;
|
|
34
|
+
default:
|
|
35
|
+
throw new Error("Usage: cw.js sandbox list|show|validate|choose|resolve [profile-id|profile-file]");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** `cw backend list|show|probe [backend-id] | cw backend agent config [show|set] …`. */
|
|
39
|
+
function handleBackend(args, runner) {
|
|
40
|
+
const [subcommand, backendId] = args.positionals;
|
|
41
|
+
switch (subcommand) {
|
|
42
|
+
case "list":
|
|
43
|
+
(0, io_1.printJson)(runner.listBackends(args.options));
|
|
44
|
+
return;
|
|
45
|
+
case "show":
|
|
46
|
+
(0, io_1.printJson)(runner.showBackend((0, io_1.required)(backendId, "backend id"), args.options));
|
|
47
|
+
return;
|
|
48
|
+
case "probe":
|
|
49
|
+
(0, io_1.printJson)(runner.probeBackend(backendId, args.options));
|
|
50
|
+
return;
|
|
51
|
+
case "agent": {
|
|
52
|
+
// `backend agent config [show]` = read-only; `backend agent config set ...` = mutating.
|
|
53
|
+
const [, , action] = args.positionals;
|
|
54
|
+
if (action === "set") {
|
|
55
|
+
(0, io_1.printJson)((0, capability_core_1.backendAgentConfigSet)(args.options));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
(0, io_1.printJson)((0, capability_core_1.backendAgentConfigShow)(args.options));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
throw new Error("Usage: cw.js backend list|show|probe [backend-id] | cw.js backend agent config [show|set] [--agent-command ... --agent-endpoint ... --agent-model ...]");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** `cw contract show <run-id> [contract-id]`. */
|
|
66
|
+
function handleContract(args, runner) {
|
|
67
|
+
const [subcommand, runId, contractId] = args.positionals;
|
|
68
|
+
switch (subcommand) {
|
|
69
|
+
case "show":
|
|
70
|
+
(0, io_1.printJson)(runner.showContract((0, io_1.required)(runId, "run id"), contractId));
|
|
71
|
+
return;
|
|
72
|
+
default:
|
|
73
|
+
throw new Error("Usage: cw.js contract show <run-id> [contract-id]");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** `cw migration list|check|prove [target] …`. */
|
|
77
|
+
function handleMigration(args, runner) {
|
|
78
|
+
const [subcommand, target] = args.positionals;
|
|
79
|
+
switch (subcommand) {
|
|
80
|
+
case "list":
|
|
81
|
+
(0, io_1.printJson)(runner.migrationList());
|
|
82
|
+
return;
|
|
83
|
+
case "check": {
|
|
84
|
+
const report = runner.migrationCheck((0, io_1.required)(target, "target (run-id or state/app file)"), args.options);
|
|
85
|
+
(0, io_1.printJson)(report);
|
|
86
|
+
if (report.status === "unsupported")
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
case "prove": {
|
|
91
|
+
const proof = runner.migrationProve((0, io_1.required)(target, "target (run-id or state/app file)"), args.options);
|
|
92
|
+
(0, io_1.printJson)(proof);
|
|
93
|
+
if (!proof.pass)
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
default:
|
|
98
|
+
throw new Error("Usage: cw.js migration list|check|prove [target] [--contract run-state|workflow-app]");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** `cw feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]`. */
|
|
102
|
+
function handleFeedback(args, runner) {
|
|
103
|
+
const [subcommand, runId, feedbackId] = args.positionals;
|
|
104
|
+
switch (subcommand) {
|
|
105
|
+
case "list":
|
|
106
|
+
(0, io_1.printJson)(runner.listFeedback((0, io_1.required)(runId, "run id"), args.options));
|
|
107
|
+
return;
|
|
108
|
+
case "show":
|
|
109
|
+
(0, io_1.printJson)(runner.showFeedback((0, io_1.required)(runId, "run id"), (0, io_1.required)(feedbackId, "feedback id")));
|
|
110
|
+
return;
|
|
111
|
+
case "collect":
|
|
112
|
+
(0, io_1.printJson)(runner.collectFeedback((0, io_1.required)(runId, "run id")));
|
|
113
|
+
return;
|
|
114
|
+
case "summary": {
|
|
115
|
+
const summary = runner.summarizeFeedbackRecords((0, io_1.required)(runId, "run id"));
|
|
116
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
117
|
+
(0, io_1.printJson)(summary);
|
|
118
|
+
else
|
|
119
|
+
process.stdout.write(`${(0, operator_ux_1.formatFeedbackSummary)(summary)}\n`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
case "task":
|
|
123
|
+
(0, io_1.printJson)(runner.createFeedbackTask((0, io_1.required)(runId, "run id"), (0, io_1.required)(feedbackId, "feedback id"), args.options));
|
|
124
|
+
return;
|
|
125
|
+
case "resolve":
|
|
126
|
+
(0, io_1.printJson)(runner.resolveFeedback((0, io_1.required)(runId, "run id"), (0, io_1.required)(feedbackId, "feedback id"), args.options));
|
|
127
|
+
return;
|
|
128
|
+
default:
|
|
129
|
+
throw new Error("Usage: cw.js feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** `cw metrics show <run-id> | metrics summary …`. */
|
|
133
|
+
function handleMetrics(args, runner) {
|
|
134
|
+
const [subcommand, runId] = args.positionals;
|
|
135
|
+
switch (subcommand) {
|
|
136
|
+
case "show": {
|
|
137
|
+
const report = runner.metricsShow((0, io_1.required)(runId, "run id"), args.options);
|
|
138
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
139
|
+
(0, io_1.printJson)(report);
|
|
140
|
+
else
|
|
141
|
+
process.stdout.write(`${(0, observability_1.formatMetricsReport)(report)}\n`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
case "summary": {
|
|
145
|
+
const report = (0, capability_core_1.metricsSummary)((0, capability_core_1.runRegistryFor)(args.options, runner), runner, args.options);
|
|
146
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
147
|
+
(0, io_1.printJson)(report);
|
|
148
|
+
else
|
|
149
|
+
process.stdout.write(`${(0, observability_1.formatMetricsSummary)(report)}\n`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
default:
|
|
153
|
+
throw new Error("Usage: cw.js metrics show <run-id> | metrics summary [--scope repo|home] [--pricing <path>|default] [--json]");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleReport = handleReport;
|
|
4
|
+
exports.handleOperator = handleOperator;
|
|
5
|
+
exports.handleGraph = handleGraph;
|
|
6
|
+
exports.handleTopology = handleTopology;
|
|
7
|
+
exports.handleSummary = handleSummary;
|
|
8
|
+
const capability_core_1 = require("../../capability-core");
|
|
9
|
+
const operator_ux_1 = require("../../operator-ux");
|
|
10
|
+
const state_explosion_1 = require("../../state-explosion");
|
|
11
|
+
const io_1 = require("../io");
|
|
12
|
+
/** `cw report <run-id> [--show] | report bundle <run-id> | report verify-bundle <path>`. */
|
|
13
|
+
function handleReport(args, runner) {
|
|
14
|
+
// `report verify-bundle <path>` is the offline self-contained bundle verifier;
|
|
15
|
+
// `report bundle <run-id>` exports a sealed bundle and self-verifies it;
|
|
16
|
+
// every other `report <run-id>` form prints/inspects a local run's report.
|
|
17
|
+
if (args.positionals[0] === "verify-bundle") {
|
|
18
|
+
const result = (0, capability_core_1.runVerifyReportBundle)(runner, { ...args.options, archive: args.positionals[1] || args.options.archive || args.options.path || args.options.file || args.options.bundle });
|
|
19
|
+
(0, io_1.printJson)(result);
|
|
20
|
+
// Fail closed: a forged/edited/corrupt bundle verifies false — surface it
|
|
21
|
+
// through the exit code so `cw report verify-bundle <file> && ship` cannot
|
|
22
|
+
// pass on a lie. Mirrors run inspect-archive / telemetry verify.
|
|
23
|
+
if (!result.ok)
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (args.positionals[0] === "bundle") {
|
|
28
|
+
const result = (0, capability_core_1.reportBundle)(runner, (0, io_1.required)(args.positionals[1] || (0, io_1.optionalArg)(args.options.runId || args.options.run), "run id"), args.options);
|
|
29
|
+
(0, io_1.printJson)(result);
|
|
30
|
+
// Fail closed: never report a "bundle made" success if the artifact does not
|
|
31
|
+
// self-verify — so `cw report bundle <run> && send-to-client` cannot ship an
|
|
32
|
+
// unverifiable report (e.g. no trust key under --strict-signatures).
|
|
33
|
+
if (!result.ok)
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const runId = (0, io_1.required)(args.positionals[0], "run id");
|
|
38
|
+
const report = runner.report(runId);
|
|
39
|
+
if ((0, io_1.wantsJson)(args.options)) {
|
|
40
|
+
(0, io_1.printJson)(report);
|
|
41
|
+
}
|
|
42
|
+
else if (args.options.show || args.options.summary) {
|
|
43
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorReport)(runner.operatorReport(runId))}\n`);
|
|
44
|
+
process.stdout.write(`\n${(0, state_explosion_1.formatStateExplosionReport)(runner.stateExplosionReport(runId))}\n`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
process.stdout.write(`${report.path}\n`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** `cw operator status|report <run-id> [--json]`. */
|
|
51
|
+
function handleOperator(args, runner) {
|
|
52
|
+
const [subcommand, runId] = args.positionals;
|
|
53
|
+
switch (subcommand) {
|
|
54
|
+
case "status":
|
|
55
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
56
|
+
(0, io_1.printJson)(runner.operatorStatus((0, io_1.required)(runId, "run id")));
|
|
57
|
+
else {
|
|
58
|
+
const summary = runner.operatorStatus((0, io_1.required)(runId, "run id"));
|
|
59
|
+
process.stdout.write(`${(args.options.summary || args.options.brief ? (0, operator_ux_1.formatOperatorSummary)(summary) : (0, operator_ux_1.formatOperatorStatus)(summary))}\n`);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
case "report":
|
|
63
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
64
|
+
(0, io_1.printJson)(runner.operatorReport((0, io_1.required)(runId, "run id")));
|
|
65
|
+
else
|
|
66
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorReport)(runner.operatorReport((0, io_1.required)(runId, "run id")))}\n`);
|
|
67
|
+
return;
|
|
68
|
+
default:
|
|
69
|
+
throw new Error("Usage: cw.js operator status|report <run-id> [--json]");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** `cw graph <run-id> [--json]` — the operator run graph. */
|
|
73
|
+
function handleGraph(args, runner) {
|
|
74
|
+
const graph = runner.operatorGraph((0, io_1.required)(args.positionals[0], "run id"));
|
|
75
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
76
|
+
(0, io_1.printJson)(graph);
|
|
77
|
+
else
|
|
78
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorGraph)(graph)}\n`);
|
|
79
|
+
}
|
|
80
|
+
/** `cw topology list|show|validate|apply|summary|graph …`. */
|
|
81
|
+
function handleTopology(args, runner) {
|
|
82
|
+
const [subcommand, first, second] = args.positionals;
|
|
83
|
+
switch (subcommand) {
|
|
84
|
+
case "list":
|
|
85
|
+
(0, io_1.printJson)(runner.listTopologies());
|
|
86
|
+
return;
|
|
87
|
+
case "show":
|
|
88
|
+
if (second)
|
|
89
|
+
(0, io_1.printJson)(runner.showTopologyRun((0, io_1.required)(first, "run id"), second));
|
|
90
|
+
else
|
|
91
|
+
(0, io_1.printJson)(runner.showTopology((0, io_1.required)(first, "topology id")));
|
|
92
|
+
return;
|
|
93
|
+
case "validate": {
|
|
94
|
+
const result = runner.validateTopology((0, io_1.required)(first, "topology id"));
|
|
95
|
+
(0, io_1.printJson)(result);
|
|
96
|
+
if (!result.valid)
|
|
97
|
+
process.exitCode = 1;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
case "apply":
|
|
101
|
+
(0, io_1.printJson)(runner.applyTopology((0, io_1.required)(first, "run id"), (0, io_1.required)(second, "topology id"), args.options));
|
|
102
|
+
return;
|
|
103
|
+
case "summary": {
|
|
104
|
+
const summary = runner.topologySummary((0, io_1.required)(first, "run id"));
|
|
105
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
106
|
+
(0, io_1.printJson)(summary);
|
|
107
|
+
else
|
|
108
|
+
process.stdout.write(`${(0, operator_ux_1.formatTopologySummary)(summary)}\n`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
case "graph": {
|
|
112
|
+
const graph = runner.topologyGraph((0, io_1.required)(first, "run id"));
|
|
113
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
114
|
+
(0, io_1.printJson)(graph);
|
|
115
|
+
else
|
|
116
|
+
process.stdout.write(`${(0, operator_ux_1.formatOperatorGraph)({ runId: (0, io_1.required)(first, "run id"), nodes: graph.nodes, edges: graph.edges })}\n`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
default:
|
|
120
|
+
throw new Error("Usage: cw.js topology list|show <topology-id>|show <run-id> <topology-run-id>|validate <topology-id>|apply <run-id> <topology-id>|summary <run-id>|graph <run-id>");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** `cw summary refresh|show <run-id> [--json]` — durable state-explosion summary. */
|
|
124
|
+
function handleSummary(args, runner) {
|
|
125
|
+
const [subcommand, runId] = args.positionals;
|
|
126
|
+
switch (subcommand) {
|
|
127
|
+
case "refresh": {
|
|
128
|
+
const index = runner.summaryRefresh((0, io_1.required)(runId, "run id"), args.options);
|
|
129
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
130
|
+
(0, io_1.printJson)(index);
|
|
131
|
+
else
|
|
132
|
+
process.stdout.write(`${(0, state_explosion_1.formatStateExplosionReport)(runner.summaryShow((0, io_1.required)(runId, "run id")))}\n`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
case "show": {
|
|
136
|
+
const report = runner.summaryShow((0, io_1.required)(runId, "run id"));
|
|
137
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
138
|
+
(0, io_1.printJson)(report);
|
|
139
|
+
else
|
|
140
|
+
process.stdout.write(`${(0, state_explosion_1.formatStateExplosionReport)(report)}\n`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
default:
|
|
144
|
+
throw new Error("Usage: cw.js summary refresh|show <run-id> [--json]");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleRegistry = handleRegistry;
|
|
4
|
+
exports.handleQueue = handleQueue;
|
|
5
|
+
exports.handleHistory = handleHistory;
|
|
6
|
+
const capability_core_1 = require("../../capability-core");
|
|
7
|
+
const run_registry_1 = require("../../run-registry");
|
|
8
|
+
const io_1 = require("../io");
|
|
9
|
+
/** `cw registry refresh|show [--scope repo|home] [--json]`. */
|
|
10
|
+
function handleRegistry(args, runner) {
|
|
11
|
+
const registry = (0, capability_core_1.runRegistryFor)(args.options, runner);
|
|
12
|
+
const [subcommand] = args.positionals;
|
|
13
|
+
switch (subcommand) {
|
|
14
|
+
case "refresh": {
|
|
15
|
+
const report = (0, capability_core_1.runRegistryRefresh)(registry, args.options);
|
|
16
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
17
|
+
(0, io_1.printJson)(report);
|
|
18
|
+
else
|
|
19
|
+
process.stdout.write(`${(0, run_registry_1.formatRegistryReport)(report)}\n`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
case "show": {
|
|
23
|
+
const report = (0, capability_core_1.runRegistryShow)(registry, args.options);
|
|
24
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
25
|
+
(0, io_1.printJson)(report);
|
|
26
|
+
else
|
|
27
|
+
process.stdout.write(`${(0, run_registry_1.formatRegistryReport)(report)}\n`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
default:
|
|
31
|
+
throw new Error("Usage: cw.js registry refresh|show [--scope repo|home] [--json]");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** `cw queue add|list|drain|show [queue-id] [--repo PATH] [--priority N]`. */
|
|
35
|
+
function handleQueue(args, runner) {
|
|
36
|
+
const registry = (0, capability_core_1.runRegistryFor)(args.options, runner);
|
|
37
|
+
const [subcommand, id] = args.positionals;
|
|
38
|
+
switch (subcommand) {
|
|
39
|
+
case "add":
|
|
40
|
+
(0, io_1.printJson)((0, capability_core_1.queueAdd)(registry, args.options));
|
|
41
|
+
return;
|
|
42
|
+
case "list": {
|
|
43
|
+
const result = (0, capability_core_1.queueList)(registry, args.options);
|
|
44
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
45
|
+
(0, io_1.printJson)(result);
|
|
46
|
+
else
|
|
47
|
+
process.stdout.write(`${(0, run_registry_1.formatQueueList)(result)}\n`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
case "drain":
|
|
51
|
+
(0, io_1.printJson)((0, capability_core_1.queueDrain)(registry, args.options));
|
|
52
|
+
return;
|
|
53
|
+
case "show":
|
|
54
|
+
(0, io_1.printJson)((0, capability_core_1.queueShow)(registry, (0, io_1.required)(id, "queue id")));
|
|
55
|
+
return;
|
|
56
|
+
default:
|
|
57
|
+
throw new Error("Usage: cw.js queue add|list|drain|show [queue-id] [--repo PATH] [--priority N]");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** `cw history [--json]` — recent runs across the resolved registry scope. */
|
|
61
|
+
function handleHistory(args, runner) {
|
|
62
|
+
const registry = (0, capability_core_1.runRegistryFor)(args.options, runner);
|
|
63
|
+
const result = (0, capability_core_1.runHistory)(registry, args.options);
|
|
64
|
+
if ((0, io_1.wantsJson)(args.options))
|
|
65
|
+
(0, io_1.printJson)(result);
|
|
66
|
+
else
|
|
67
|
+
process.stdout.write(`${(0, run_registry_1.formatHistory)(result)}\n`);
|
|
68
|
+
}
|