cool-workflow 0.2.0 → 0.2.2
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 +7 -5
- package/apps/architecture-review/app.json +2 -2
- package/apps/architecture-review/workflow.js +12 -12
- package/apps/architecture-review-fast/app.json +1 -1
- 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/cli/dispatch.js +20 -88
- package/dist/cli/parseargv.js +6 -3
- package/dist/core/capability-data.js +270 -0
- package/dist/core/capability-table.js +15 -3519
- package/dist/core/format/help.js +30 -7
- package/dist/core/hash.js +1 -1
- package/dist/core/multi-agent/candidate-scoring.js +1 -1
- package/dist/core/multi-agent/collaboration.js +3 -2
- package/dist/core/multi-agent/coordinator.js +4 -3
- package/dist/core/multi-agent/eval-replay.js +1 -1
- package/dist/core/multi-agent/runtime.js +2 -2
- package/dist/core/multi-agent/trust-policy.js +1 -1
- package/dist/core/pipeline/commit-gate.js +2 -1
- package/dist/core/pipeline/contract.js +1 -1
- package/dist/core/pipeline/drive-decide.js +1 -1
- package/dist/core/state/contract-migration.js +1 -1
- package/dist/core/state/migrations.js +2 -2
- package/dist/core/state/node-snapshot.js +1 -1
- package/dist/core/state/state-explosion/digest.js +3 -2
- package/dist/core/state/state-explosion/graph.js +13 -12
- package/dist/core/state/state-explosion/helpers.js +5 -4
- package/dist/core/state/state-explosion/report.js +1 -1
- package/dist/core/state/state-explosion/size.js +1 -1
- package/dist/core/state/state-node.js +2 -2
- package/dist/core/state/types.js +1 -1
- package/dist/core/trust/ledger.js +3 -2
- package/dist/core/trust/telemetry-attestation.js +3 -3
- package/dist/core/trust/telemetry-ledger.js +2 -2
- package/dist/core/types/execution-backend.js +18 -0
- package/dist/core/types/observability.js +7 -0
- package/dist/core/util/collate.js +23 -0
- package/dist/core/version.js +1 -1
- package/dist/core/workflow-apps/app-schema.js +1 -1
- package/dist/mcp/dispatch.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/shell/agent-config.js +1 -1
- package/dist/shell/audit-cli.js +46 -2
- package/dist/shell/commit-summary.js +2 -1
- package/dist/shell/doctor.js +17 -4
- package/dist/shell/drive.js +47 -19
- package/dist/shell/evidence-reasoning.js +4 -3
- package/dist/shell/execution-backend/agent.js +42 -10
- package/dist/shell/execution-backend/ci.js +1 -1
- package/dist/shell/execution-backend/container.js +1 -1
- package/dist/shell/execution-backend/envelopes.js +1 -1
- package/dist/shell/execution-backend/local.js +1 -1
- package/dist/shell/execution-backend/probes.js +1 -1
- package/dist/shell/execution-backend/registry.js +3 -2
- package/dist/shell/execution-backend/remote.js +1 -1
- package/dist/shell/execution-backend/types.js +0 -9
- package/dist/shell/fs-atomic.js +15 -2
- package/dist/shell/ledger-io.js +1 -1
- package/dist/shell/metrics-cli.js +4 -2
- package/dist/shell/multi-agent-host.js +1 -1
- package/dist/shell/multi-agent-operator-ux.js +4 -3
- package/dist/shell/observability.js +12 -11
- package/dist/shell/onramp.js +17 -1
- package/dist/shell/operator-ux-text.js +2 -1
- package/dist/shell/operator-ux.js +7 -6
- package/dist/shell/pipeline-cli.js +82 -72
- package/dist/shell/reclamation-io.js +3 -2
- package/dist/shell/registry-cli.js +15 -0
- package/dist/shell/report.js +2 -1
- package/dist/shell/run-registry-io.js +1 -1
- package/dist/shell/run-store.js +17 -0
- package/dist/shell/sandbox-profile.js +1 -1
- package/dist/shell/scheduler-io.js +46 -37
- package/dist/shell/scheduling-io.js +32 -22
- package/dist/shell/state-explosion-cli.js +2 -1
- package/dist/shell/telemetry-ledger-io.js +1 -1
- package/dist/shell/term.js +1 -1
- package/dist/shell/topology-io.js +2 -1
- package/dist/shell/trust-audit.js +45 -5
- package/dist/shell/workbench-host.js +9 -1
- package/dist/shell/workbench.js +6 -11
- package/dist/shell/worker-cli.js +9 -1
- package/dist/shell/worker-isolation.js +34 -9
- package/dist/shell/workflow-app-loader.js +3 -2
- package/dist/wiring/capability-table/basics.js +66 -0
- package/dist/wiring/capability-table/exec-backend.js +162 -0
- package/dist/wiring/capability-table/index.js +42 -0
- package/dist/wiring/capability-table/multi-agent.js +623 -0
- package/dist/wiring/capability-table/parity.js +466 -0
- package/dist/wiring/capability-table/pipeline.js +280 -0
- package/dist/wiring/capability-table/registry-core.js +189 -0
- package/dist/wiring/capability-table/reporting.js +394 -0
- package/dist/wiring/capability-table/scheduling-registry.js +558 -0
- package/dist/wiring/capability-table/state.js +173 -0
- package/dist/wiring/capability-table/trust-ledger.js +134 -0
- package/dist/wiring/capability-table/workflow-apps.js +366 -0
- package/docs/agent-delegation-drive.7.md +4 -0
- package/docs/cli-mcp-parity.7.md +9 -2
- package/docs/contract-migration-tooling.7.md +4 -0
- package/docs/control-plane-scheduling.7.md +4 -0
- package/docs/durable-state-and-locking.7.md +24 -0
- package/docs/evidence-adoption-reasoning-chain.7.md +4 -0
- package/docs/execution-backends.7.md +4 -0
- package/docs/index.md +1 -0
- package/docs/multi-agent-cli-mcp-surface.7.md +4 -0
- package/docs/multi-agent-eval-replay-harness.7.md +4 -0
- package/docs/multi-agent-operator-ux.7.md +4 -0
- package/docs/node-snapshot-diff-replay.7.md +4 -0
- package/docs/observability-cost-accounting.7.md +6 -1
- package/docs/project-index.md +30 -5
- package/docs/real-execution-backends.7.md +4 -0
- package/docs/release-and-migration.7.md +4 -0
- package/docs/release-tooling.7.md +4 -0
- package/docs/remote-source-review.7.md +4 -4
- package/docs/report-verifiable-bundle.7.md +1 -1
- package/docs/run-registry-control-plane.7.md +4 -0
- package/docs/run-retention-reclamation.7.md +4 -0
- package/docs/security-trust-hardening.7.md +33 -1
- package/docs/state-explosion-management.7.md +4 -0
- package/docs/team-collaboration.7.md +4 -0
- package/docs/trust-audit-anchor.7.md +69 -0
- package/docs/web-desktop-workbench.7.md +15 -1
- package/manifest/plugin.manifest.json +1 -1
- package/package.json +3 -1
- package/scripts/agents/agent-adapter-core.js +22 -2
- package/scripts/agents/claude-p-agent.js +8 -3
- package/scripts/agents/gemini-agent.js +5 -1
- package/scripts/agents/opencode-agent.js +5 -1
- package/scripts/bump-version.js +24 -2
- package/scripts/canonical-apps.js +4 -4
- package/scripts/dogfood-release.js +1 -1
- package/scripts/golden-path.js +4 -4
- package/scripts/purity-baseline.json +68 -0
- package/scripts/purity-gate.js +239 -0
- package/scripts/release-check.js +8 -1
- package/scripts/version-sync-check.js +33 -12
- package/workflows/README.md +19 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// wiring/capability-table/workflow-apps.ts — MILESTONE 12 (workflow-apps:
|
|
3
|
+
// app.*, info, man) CLI bindings, plus the `next` capability (a milestone
|
|
4
|
+
// 3/6 placeholder folded in alongside app.* per the file's own history).
|
|
5
|
+
// Split out of core/capability-table.ts, byte-for-byte (extracted with
|
|
6
|
+
// sed, not retyped).
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
const registry_core_1 = require("./registry-core");
|
|
9
|
+
const io_1 = require("../../cli/io");
|
|
10
|
+
const state_cli_1 = require("../../shell/state-cli");
|
|
11
|
+
const app_run_cli_1 = require("../../shell/app-run-cli");
|
|
12
|
+
// MILESTONE 12 (workflow-apps). Handler BODIES live in
|
|
13
|
+
// shell/workflow-app-loader.ts (impure — they scan apps/*/app.json +
|
|
14
|
+
// workflows/*.workflow.js on disk and `require()` each entrypoint); this
|
|
15
|
+
// table only wires argv/tool-args shape -> handler call, per SPEC/
|
|
16
|
+
// workflow-apps.md's "Exact outputs". `app.validate` is ALWAYS JSON
|
|
17
|
+
// (jsonMode "default") even without --json, and its handler sets
|
|
18
|
+
// exitCode 1 on `valid:false` — both the "not found" id case and a
|
|
19
|
+
// structurally-broken manifest case fail this same way.
|
|
20
|
+
const workflow_app_loader_1 = require("../../shell/workflow-app-loader");
|
|
21
|
+
const help_1 = require("../../core/format/help");
|
|
22
|
+
const man_cli_1 = require("../../shell/man-cli");
|
|
23
|
+
(0, registry_core_1.attachCliBinding)("app.list", {
|
|
24
|
+
path: ["app", "list"],
|
|
25
|
+
jsonMode: "default",
|
|
26
|
+
handler: () => ({ json: (0, workflow_app_loader_1.listWorkflowApps)() }),
|
|
27
|
+
});
|
|
28
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("app.list").mcp.handler = () => (0, workflow_app_loader_1.listWorkflowApps)();
|
|
29
|
+
(0, registry_core_1.attachCliBinding)("app.show", {
|
|
30
|
+
path: ["app", "show"],
|
|
31
|
+
jsonMode: "default",
|
|
32
|
+
handler: (args) => ({ json: (0, workflow_app_loader_1.showWorkflowApp)((0, io_1.required)(args.positionals[0], "workflow app id")) }),
|
|
33
|
+
});
|
|
34
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("app.show").mcp.handler = (args) => (0, workflow_app_loader_1.showWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "workflow app id"));
|
|
35
|
+
(0, registry_core_1.attachCliBinding)("app.validate", {
|
|
36
|
+
path: ["app", "validate"],
|
|
37
|
+
jsonMode: "default",
|
|
38
|
+
handler: (args) => {
|
|
39
|
+
const result = (0, workflow_app_loader_1.validateWorkflowAppTarget)((0, io_1.required)(args.positionals[0], "workflow app path or id"));
|
|
40
|
+
return { json: result, exitCode: result.valid ? undefined : 1 };
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("app.validate").mcp.handler = (args) => (0, workflow_app_loader_1.validateWorkflowAppTarget)((0, io_1.required)((0, io_1.optionalArg)(args.target ?? args.appId), "workflow app path or id"));
|
|
44
|
+
(0, registry_core_1.attachCliBinding)("app.init", {
|
|
45
|
+
path: ["app", "init"],
|
|
46
|
+
jsonMode: "default",
|
|
47
|
+
handler: (args) => ({ json: (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)(args.positionals[0], "app id"), args.options) }),
|
|
48
|
+
});
|
|
49
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("app.init").mcp.handler = (args) => (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "app id"), args);
|
|
50
|
+
// `cw init <id>` — the standalone scaffold verb. v2 folds `init` into
|
|
51
|
+
// `app.init` (the old build's legacy `.workflow.js` scaffold is gone), so
|
|
52
|
+
// both surfaces route through initWorkflowApp, same as `cw app init`. The
|
|
53
|
+
// `init` help token is folded away (declaredCliHelpTokens) — it stays in
|
|
54
|
+
// the frozen "More commands" index line only, matching the parity smoke's
|
|
55
|
+
// HELP_INDEX_ONLY_TOKENS treatment. `workflowId` is the old init arg name.
|
|
56
|
+
(0, registry_core_1.attachCliBinding)("init", {
|
|
57
|
+
path: ["init"],
|
|
58
|
+
jsonMode: "default",
|
|
59
|
+
handler: (args) => ({ json: (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.positionals[0]), "workflow id"), args.options) }),
|
|
60
|
+
});
|
|
61
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("init").mcp.handler = (args) => (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.workflowId ?? args.appId), "workflow id"), args);
|
|
62
|
+
(0, registry_core_1.attachCliBinding)("app.package", {
|
|
63
|
+
path: ["app", "package"],
|
|
64
|
+
jsonMode: "default",
|
|
65
|
+
handler: (args) => ({ json: (0, workflow_app_loader_1.packageWorkflowApp)((0, io_1.required)(args.positionals[0], "app id"), args.options) }),
|
|
66
|
+
});
|
|
67
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("app.package").mcp.handler = (args) => (0, workflow_app_loader_1.packageWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "app id"), args);
|
|
68
|
+
// `cw app run <app-id>` — plan+drive+report an app in one call. 2-token
|
|
69
|
+
// cli.path found before the ["app"] usage catch-all; `appRunCli` reads the
|
|
70
|
+
// app id from `appId`, so the first positional after "run" is forwarded as
|
|
71
|
+
// appId (old build: appRun(runner, { ...options, appId: <positional> })).
|
|
72
|
+
(0, registry_core_1.attachCliBinding)("app.run", {
|
|
73
|
+
path: ["app", "run"],
|
|
74
|
+
jsonMode: "default",
|
|
75
|
+
handler: (args) => ({ json: (0, app_run_cli_1.appRunCli)({ ...args.options, appId: (0, io_1.required)(args.positionals[0], "app id") }) }),
|
|
76
|
+
});
|
|
77
|
+
// A 1-token `["app"]` row that exists ONLY to own the fixed usage string
|
|
78
|
+
// for an unrecognized `app` subcommand (`app run` is not yet CLI-wired at
|
|
79
|
+
// this milestone — cw_app_run stays MCP-only — so a bogus or `run`
|
|
80
|
+
// subcommand both fall through to this same usage throw, matching
|
|
81
|
+
// SPEC/cli-surface.md's "Usage strings" table byte-for-byte). Per
|
|
82
|
+
// dispatchTable's reversed-candidate-order contract (cli/dispatch.ts),
|
|
83
|
+
// this 1-token row is only ever reached when no 2-token `app.*` row
|
|
84
|
+
// above matched. `hiddenFromHelp` keeps it off `cw help app`'s own line
|
|
85
|
+
// (see CliBinding.hiddenFromHelp's doc comment).
|
|
86
|
+
(0, registry_core_1.addCliOnlyCapability)("app.usage", "cw app list|show|validate|init|package|run [app-id|path] — the workflow-app framework.", {
|
|
87
|
+
path: ["app"],
|
|
88
|
+
jsonMode: "default",
|
|
89
|
+
hiddenFromHelp: true,
|
|
90
|
+
handler: () => {
|
|
91
|
+
throw new Error("Usage: cw.js app list|show|validate|init|package|run [app-id|path]");
|
|
92
|
+
},
|
|
93
|
+
}, "app.usage exists only to own the fixed usage-error text for an unrecognized app subcommand; every real app.* action is its own capability row above.");
|
|
94
|
+
// ---------------------------------------------------------------------
|
|
95
|
+
// 1-token usage-fallback rows: one per multi-verb family, each existing
|
|
96
|
+
// ONLY to own the fixed usage string for an unrecognized subcommand,
|
|
97
|
+
// same pattern and reasoning as app.usage above (SPEC/cli-surface.md's
|
|
98
|
+
// "Usage strings" table, byte-for-byte). Per dispatchTable's reversed-
|
|
99
|
+
// candidate-order contract (cli/dispatch.ts), each 1-token row here is
|
|
100
|
+
// only ever reached when no 2-token real row for that family matched.
|
|
101
|
+
// `hiddenFromHelp` keeps each off its own `cw help <verb>` line.
|
|
102
|
+
// ---------------------------------------------------------------------
|
|
103
|
+
(0, registry_core_1.addCliOnlyCapability)("sandbox.usage", "cw.js sandbox list|show|validate|choose|resolve [profile-id|profile-file]", {
|
|
104
|
+
path: ["sandbox"],
|
|
105
|
+
jsonMode: "default",
|
|
106
|
+
hiddenFromHelp: true,
|
|
107
|
+
handler: () => {
|
|
108
|
+
throw new Error("Usage: cw.js sandbox list|show|validate|choose|resolve [profile-id|profile-file]");
|
|
109
|
+
},
|
|
110
|
+
}, "sandbox.usage exists only to own the fixed usage-error text for an unrecognized sandbox subcommand; every real sandbox.* action is its own capability row above.");
|
|
111
|
+
(0, registry_core_1.addCliOnlyCapability)("state.usage", "cw.js state check <run-id> [--state PATH] [--write]", {
|
|
112
|
+
path: ["state"],
|
|
113
|
+
jsonMode: "default",
|
|
114
|
+
hiddenFromHelp: true,
|
|
115
|
+
handler: () => {
|
|
116
|
+
throw new Error("Usage: cw.js state check <run-id> [--state PATH] [--write]");
|
|
117
|
+
},
|
|
118
|
+
}, "state.usage exists only to own the fixed usage-error text for an unrecognized state subcommand; every real state.* action is its own capability row above.");
|
|
119
|
+
(0, registry_core_1.addCliOnlyCapability)("audit.usage", "cw.js audit summary|worker|provenance|multi-agent|policy|role|blackboard|judge|attest|decision <run-id> [worker-id|role-id]", {
|
|
120
|
+
path: ["audit"],
|
|
121
|
+
jsonMode: "default",
|
|
122
|
+
hiddenFromHelp: true,
|
|
123
|
+
handler: () => {
|
|
124
|
+
throw new Error("Usage: cw.js audit summary|worker|provenance|multi-agent|policy|role|blackboard|judge|attest|decision <run-id> [worker-id|role-id]");
|
|
125
|
+
},
|
|
126
|
+
}, "audit.usage exists only to own the fixed usage-error text for an unrecognized audit subcommand; every real audit.* action is its own capability row above.");
|
|
127
|
+
(0, registry_core_1.addCliOnlyCapability)("blackboard.usage", "cw.js blackboard summary|summarize|graph|resolve <run-id> | topic create <run-id> | message post|list <run-id> | context put <run-id> | artifact add|list <run-id> | snapshot <run-id>", {
|
|
128
|
+
path: ["blackboard"],
|
|
129
|
+
jsonMode: "default",
|
|
130
|
+
hiddenFromHelp: true,
|
|
131
|
+
handler: () => {
|
|
132
|
+
throw new Error("Usage: cw.js blackboard summary|summarize|graph|resolve <run-id> | topic create <run-id> | message post|list <run-id> | context put <run-id> | artifact add|list <run-id> | snapshot <run-id>");
|
|
133
|
+
},
|
|
134
|
+
}, "blackboard.usage exists only to own the fixed usage-error text for an unrecognized blackboard subcommand; every real blackboard.* action is its own capability row above.");
|
|
135
|
+
(0, registry_core_1.addCliOnlyCapability)("candidate.usage", "cw.js candidate list|show|register|score|rank|select|reject|summary <run-id> [candidate-id]", {
|
|
136
|
+
path: ["candidate"],
|
|
137
|
+
jsonMode: "default",
|
|
138
|
+
hiddenFromHelp: true,
|
|
139
|
+
handler: () => {
|
|
140
|
+
throw new Error("Usage: cw.js candidate list|show|register|score|rank|select|reject|summary <run-id> [candidate-id]");
|
|
141
|
+
},
|
|
142
|
+
}, "candidate.usage exists only to own the fixed usage-error text for an unrecognized candidate subcommand; every real candidate.* action is its own capability row above.");
|
|
143
|
+
(0, registry_core_1.addCliOnlyCapability)("comment.usage", "cw.js comment add <kind> <run-id> <target-id> --body <text> | comment list <run-id> [--json]", {
|
|
144
|
+
path: ["comment"],
|
|
145
|
+
jsonMode: "default",
|
|
146
|
+
hiddenFromHelp: true,
|
|
147
|
+
handler: () => {
|
|
148
|
+
throw new Error("Usage: cw.js comment add <kind> <run-id> <target-id> --body <text> | comment list <run-id> [--json]");
|
|
149
|
+
},
|
|
150
|
+
}, "comment.usage exists only to own the fixed usage-error text for an unrecognized comment subcommand; every real comment.* action is its own capability row above.");
|
|
151
|
+
(0, registry_core_1.addCliOnlyCapability)("eval.usage", "cw.js eval snapshot <run-id> --id <snapshot-id> | replay <snapshot-id-or-path> | compare <baseline-id-or-path> <replay-id-or-path> | score <replay-id-or-path> | gate <suite-id-or-path> | report <replay-id-or-path>", {
|
|
152
|
+
path: ["eval"],
|
|
153
|
+
jsonMode: "default",
|
|
154
|
+
hiddenFromHelp: true,
|
|
155
|
+
handler: () => {
|
|
156
|
+
throw new Error("Usage: cw.js eval snapshot <run-id> --id <snapshot-id> | replay <snapshot-id-or-path> | compare <baseline-id-or-path> <replay-id-or-path> | score <replay-id-or-path> | gate <suite-id-or-path> | report <replay-id-or-path>");
|
|
157
|
+
},
|
|
158
|
+
}, "eval.usage exists only to own the fixed usage-error text for an unrecognized eval subcommand; every real eval.* action is its own capability row above.");
|
|
159
|
+
(0, registry_core_1.addCliOnlyCapability)("telemetry.usage", "cw.js telemetry verify <run-id> [--pubkey <pem-or-path>] [--json]", {
|
|
160
|
+
path: ["telemetry"],
|
|
161
|
+
jsonMode: "default",
|
|
162
|
+
hiddenFromHelp: true,
|
|
163
|
+
handler: () => {
|
|
164
|
+
throw new Error("Usage: cw.js telemetry verify <run-id> [--pubkey <pem-or-path>] [--json]");
|
|
165
|
+
},
|
|
166
|
+
}, "telemetry.usage exists only to own the fixed usage-error text for an unrecognized telemetry subcommand; every real telemetry.* action is its own capability row above.");
|
|
167
|
+
(0, registry_core_1.addCliOnlyCapability)("demo.usage", "cw.js demo tamper|bundle [--json]", {
|
|
168
|
+
path: ["demo"],
|
|
169
|
+
jsonMode: "default",
|
|
170
|
+
hiddenFromHelp: true,
|
|
171
|
+
handler: () => {
|
|
172
|
+
throw new Error("Usage: cw.js demo tamper|bundle [--json]");
|
|
173
|
+
},
|
|
174
|
+
}, "demo.usage exists only to own the fixed usage-error text for an unrecognized demo subcommand; every real demo.* action is its own capability row above.");
|
|
175
|
+
(0, registry_core_1.addCliOnlyCapability)("multi-agent.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]", {
|
|
176
|
+
path: ["multi-agent"],
|
|
177
|
+
jsonMode: "default",
|
|
178
|
+
hiddenFromHelp: true,
|
|
179
|
+
handler: () => {
|
|
180
|
+
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]");
|
|
181
|
+
},
|
|
182
|
+
}, "multi-agent.usage exists only to own the fixed usage-error text for an unrecognized multi-agent subcommand; every real multi-agent.* action is its own capability row above.");
|
|
183
|
+
(0, registry_core_1.addCliOnlyCapability)("node.usage", "cw.js node list|show|graph|snapshot|diff|replay|verify <run-id> [node-id|snapshot-id|replay-id]", {
|
|
184
|
+
path: ["node"],
|
|
185
|
+
jsonMode: "default",
|
|
186
|
+
hiddenFromHelp: true,
|
|
187
|
+
handler: () => {
|
|
188
|
+
throw new Error("Usage: cw.js node list|show|graph|snapshot|diff|replay|verify <run-id> [node-id|snapshot-id|replay-id]");
|
|
189
|
+
},
|
|
190
|
+
}, "node.usage exists only to own the fixed usage-error text for an unrecognized node subcommand; every real node.* action is its own capability row above.");
|
|
191
|
+
(0, registry_core_1.addCliOnlyCapability)("backend.usage", "cw.js backend list|show|probe [backend-id] | cw.js backend agent config [show|set] [--agent-command ... --agent-endpoint ... --agent-model ...]", {
|
|
192
|
+
path: ["backend"],
|
|
193
|
+
jsonMode: "default",
|
|
194
|
+
hiddenFromHelp: true,
|
|
195
|
+
handler: () => {
|
|
196
|
+
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 ...]");
|
|
197
|
+
},
|
|
198
|
+
}, "backend.usage exists only to own the fixed usage-error text for an unrecognized backend subcommand; every real backend.* action is its own capability row above.");
|
|
199
|
+
(0, registry_core_1.addCliOnlyCapability)("contract.usage", "cw.js contract show <run-id> [contract-id]", {
|
|
200
|
+
path: ["contract"],
|
|
201
|
+
jsonMode: "default",
|
|
202
|
+
hiddenFromHelp: true,
|
|
203
|
+
handler: () => {
|
|
204
|
+
throw new Error("Usage: cw.js contract show <run-id> [contract-id]");
|
|
205
|
+
},
|
|
206
|
+
}, "contract.usage exists only to own the fixed usage-error text for an unrecognized contract subcommand; every real contract.* action is its own capability row above.");
|
|
207
|
+
(0, registry_core_1.addCliOnlyCapability)("migration.usage", "cw.js migration list|check|prove [target] [--contract run-state|workflow-app]", {
|
|
208
|
+
path: ["migration"],
|
|
209
|
+
jsonMode: "default",
|
|
210
|
+
hiddenFromHelp: true,
|
|
211
|
+
handler: () => {
|
|
212
|
+
throw new Error("Usage: cw.js migration list|check|prove [target] [--contract run-state|workflow-app]");
|
|
213
|
+
},
|
|
214
|
+
}, "migration.usage exists only to own the fixed usage-error text for an unrecognized migration subcommand; every real migration.* action is its own capability row above.");
|
|
215
|
+
(0, registry_core_1.addCliOnlyCapability)("feedback.usage", "cw.js feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]", {
|
|
216
|
+
path: ["feedback"],
|
|
217
|
+
jsonMode: "default",
|
|
218
|
+
hiddenFromHelp: true,
|
|
219
|
+
handler: () => {
|
|
220
|
+
throw new Error("Usage: cw.js feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]");
|
|
221
|
+
},
|
|
222
|
+
}, "feedback.usage exists only to own the fixed usage-error text for an unrecognized feedback subcommand; every real feedback.* action is its own capability row above.");
|
|
223
|
+
(0, registry_core_1.addCliOnlyCapability)("metrics.usage", "cw.js metrics show <run-id> | metrics summary [--scope repo|home] [--pricing <path>|default] [--limit N] [--json]", {
|
|
224
|
+
path: ["metrics"],
|
|
225
|
+
jsonMode: "default",
|
|
226
|
+
hiddenFromHelp: true,
|
|
227
|
+
handler: () => {
|
|
228
|
+
throw new Error("Usage: cw.js metrics show <run-id> | metrics summary [--scope repo|home] [--pricing <path>|default] [--limit N] [--json]");
|
|
229
|
+
},
|
|
230
|
+
}, "metrics.usage exists only to own the fixed usage-error text for an unrecognized metrics subcommand; every real metrics.* action is its own capability row above.");
|
|
231
|
+
(0, registry_core_1.addCliOnlyCapability)("operator.usage", "cw.js operator status|report <run-id> [--json]", {
|
|
232
|
+
path: ["operator"],
|
|
233
|
+
jsonMode: "default",
|
|
234
|
+
hiddenFromHelp: true,
|
|
235
|
+
handler: () => {
|
|
236
|
+
throw new Error("Usage: cw.js operator status|report <run-id> [--json]");
|
|
237
|
+
},
|
|
238
|
+
}, "operator.usage exists only to own the fixed usage-error text for an unrecognized operator subcommand; every real operator.* action is its own capability row above.");
|
|
239
|
+
(0, registry_core_1.addCliOnlyCapability)("topology.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>", {
|
|
240
|
+
path: ["topology"],
|
|
241
|
+
jsonMode: "default",
|
|
242
|
+
hiddenFromHelp: true,
|
|
243
|
+
handler: () => {
|
|
244
|
+
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>");
|
|
245
|
+
},
|
|
246
|
+
}, "topology.usage exists only to own the fixed usage-error text for an unrecognized topology subcommand; every real topology.* action is its own capability row above.");
|
|
247
|
+
(0, registry_core_1.addCliOnlyCapability)("summary.usage", "cw.js summary refresh|show <run-id> [--json]", {
|
|
248
|
+
path: ["summary"],
|
|
249
|
+
jsonMode: "default",
|
|
250
|
+
hiddenFromHelp: true,
|
|
251
|
+
handler: () => {
|
|
252
|
+
throw new Error("Usage: cw.js summary refresh|show <run-id> [--json]");
|
|
253
|
+
},
|
|
254
|
+
}, "summary.usage exists only to own the fixed usage-error text for an unrecognized summary subcommand; every real summary.* action is its own capability row above.");
|
|
255
|
+
(0, registry_core_1.addCliOnlyCapability)("workbench.usage", "cw.js workbench serve [--port N] [--once] [--require-token] | view <run-id> [--json]", {
|
|
256
|
+
path: ["workbench"],
|
|
257
|
+
jsonMode: "default",
|
|
258
|
+
hiddenFromHelp: true,
|
|
259
|
+
handler: () => {
|
|
260
|
+
throw new Error("Usage: cw.js workbench serve [--port N] [--once] [--require-token] | view <run-id> [--json]");
|
|
261
|
+
},
|
|
262
|
+
}, "workbench.usage exists only to own the fixed usage-error text for an unrecognized workbench subcommand; every real workbench.* action is its own capability row above.");
|
|
263
|
+
(0, registry_core_1.addCliOnlyCapability)("worker.usage", "cw.js worker list|summary|show|manifest|output|fail|validate <run-id> [worker-id] [result-file]", {
|
|
264
|
+
path: ["worker"],
|
|
265
|
+
jsonMode: "default",
|
|
266
|
+
hiddenFromHelp: true,
|
|
267
|
+
handler: () => {
|
|
268
|
+
throw new Error("Usage: cw.js worker list|summary|show|manifest|output|fail|validate <run-id> [worker-id] [result-file]");
|
|
269
|
+
},
|
|
270
|
+
}, "worker.usage exists only to own the fixed usage-error text for an unrecognized worker subcommand; every real worker.* action is its own capability row above.");
|
|
271
|
+
(0, registry_core_1.addCliOnlyCapability)("review.usage", "cw.js review status <run-id> [--json] | review policy <run-id> --required-approvals N --authorized-roles a,b --applies-to commit,selection", {
|
|
272
|
+
path: ["review"],
|
|
273
|
+
jsonMode: "default",
|
|
274
|
+
hiddenFromHelp: true,
|
|
275
|
+
handler: () => {
|
|
276
|
+
throw new Error("Usage: cw.js review status <run-id> [--json] | review policy <run-id> --required-approvals N --authorized-roles a,b --applies-to commit,selection");
|
|
277
|
+
},
|
|
278
|
+
}, "review.usage exists only to own the fixed usage-error text for an unrecognized review subcommand; every real review.* action is its own capability row above.");
|
|
279
|
+
(0, registry_core_1.addCliOnlyCapability)("coordinator.usage", "cw.js coordinator summary <run-id> | coordinator decision <run-id> --kind <kind> --outcome <outcome> --reason TEXT", {
|
|
280
|
+
path: ["coordinator"],
|
|
281
|
+
jsonMode: "default",
|
|
282
|
+
hiddenFromHelp: true,
|
|
283
|
+
handler: () => {
|
|
284
|
+
throw new Error("Usage: cw.js coordinator summary <run-id> | coordinator decision <run-id> --kind <kind> --outcome <outcome> --reason TEXT");
|
|
285
|
+
},
|
|
286
|
+
}, "coordinator.usage exists only to own the fixed usage-error text for an unrecognized coordinator subcommand; every real coordinator.* action is its own capability row above.");
|
|
287
|
+
// ---- man (CLI-only; raw manual-page bytes to stdout, no MCP peer) -----
|
|
288
|
+
//
|
|
289
|
+
// Writes the resolved doc file's raw bytes directly to stdout and
|
|
290
|
+
// returns an empty result — the generic renderCliResult (cli/dispatch.ts)
|
|
291
|
+
// always appends "\n" to `result.text` when it is missing one, which
|
|
292
|
+
// would violate "no added trailing newline" for any manual page that
|
|
293
|
+
// does not already end in one. A handler performing its own stdout write
|
|
294
|
+
// and returning `{}` is the established escape hatch (see
|
|
295
|
+
// workbench.serve's handler above for the same pattern/reasoning).
|
|
296
|
+
(0, registry_core_1.addCliOnlyCapability)("man", "cw man <topic> — read a manual page from docs/ (raw bytes, no added newline).", {
|
|
297
|
+
path: ["man"],
|
|
298
|
+
jsonMode: "human",
|
|
299
|
+
// core/format/help.ts's COMMAND_HELP_ROWS.man already owns the
|
|
300
|
+
// human-facing "cw man" help line (byte-ported from the old build's
|
|
301
|
+
// orchestrator.ts help table); hiddenFromHelp avoids a duplicate row.
|
|
302
|
+
hiddenFromHelp: true,
|
|
303
|
+
handler: (args) => {
|
|
304
|
+
const topic = args.positionals[0];
|
|
305
|
+
if (!topic) {
|
|
306
|
+
throw new Error("Missing topic.\n Tip: cw man release-tooling for the release tooling manual.");
|
|
307
|
+
}
|
|
308
|
+
process.stdout.write((0, man_cli_1.readManPage)(topic));
|
|
309
|
+
return {};
|
|
310
|
+
},
|
|
311
|
+
}, "man is a CLI-only raw-file reader over docs/; the old build never gave it an MCP peer.");
|
|
312
|
+
// ---- info (CLI-only; mirrors app.show with a human card by default) ----
|
|
313
|
+
(0, registry_core_1.addCliOnlyCapability)("info", "Show a workflow app's contract as a human card (or JSON with --json).", {
|
|
314
|
+
path: ["info"],
|
|
315
|
+
jsonMode: "flag",
|
|
316
|
+
handler: (args) => {
|
|
317
|
+
const appId = (0, io_1.required)(args.positionals[0], "workflow app id");
|
|
318
|
+
const data = (0, workflow_app_loader_1.showWorkflowApp)(appId);
|
|
319
|
+
return { json: data, text: `${(0, help_1.formatInfo)(appId, data)}\n` };
|
|
320
|
+
},
|
|
321
|
+
}, "info is a CLI-only convenience card over app.show; the old build never gave it an MCP peer.");
|
|
322
|
+
// ---- PARITY WIRING -------------------------------------------------------
|
|
323
|
+
//
|
|
324
|
+
// `next` had a raw `case "next"` arm in cli/dispatch.ts (a milestone 3/6
|
|
325
|
+
// PLACEHOLDER that always throws "not implemented in this milestone") but
|
|
326
|
+
// no row in this table's cli binding, so it had no cli-mcp-parity-smoke /
|
|
327
|
+
// cli-jsonmode-parity-smoke coverage. This row makes `next` a real,
|
|
328
|
+
// dual-bound capability (matching the old build's `cli: { path: ["next"],
|
|
329
|
+
// jsonMode: "default" }`) with the SAME placeholder body as the dispatch.ts
|
|
330
|
+
// arm — no new capability logic, just giving the existing placeholder a
|
|
331
|
+
// home in the one data table. dispatchTable() in cli/dispatch.ts tries this
|
|
332
|
+
// row before the switch statement is reached, so the old `case "next"` arm
|
|
333
|
+
// is now dead code for the CLI path (left in place, like the other
|
|
334
|
+
// superseded arms in that file, each with its own "dispatchTable() above
|
|
335
|
+
// always matches first" note).
|
|
336
|
+
(0, registry_core_1.attachCliBinding)("next", {
|
|
337
|
+
path: ["next"],
|
|
338
|
+
jsonMode: "default",
|
|
339
|
+
handler: (args) => ({ json: (0, state_cli_1.nextCli)((0, io_1.required)((0, io_1.optionalArg)(args.positionals[0]), "run id"), args.options) }),
|
|
340
|
+
});
|
|
341
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("next").mcp.handler = (args) => (0, state_cli_1.nextCli)((0, io_1.required)((0, io_1.optionalArg)(args.runId), "run id"), args);
|
|
342
|
+
// `ledger.propose`/`.review`/`.verify`/`.apply`/`.list` are documented
|
|
343
|
+
// payload-probe opt-outs in the old build (each mints a fresh timestamped/
|
|
344
|
+
// digested entry, or reads args that arrive by --file/stdin on the CLI vs
|
|
345
|
+
// a plain `entry` argument over MCP, or reads an on-disk ledger directory
|
|
346
|
+
// the generic probe does not populate) — same reasoning applies here
|
|
347
|
+
// unchanged, since both surfaces still route through the same
|
|
348
|
+
// buildLedgerProposal/buildLedgerReview/verifyLedgerEntry/
|
|
349
|
+
// applyLedgerProposal/listLedgerEntries core. Ported so these rows do not
|
|
350
|
+
// sit unclassified in the payload-identity probe.
|
|
351
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.propose").payloadIdentical = false;
|
|
352
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.propose").reason =
|
|
353
|
+
"Mints a fresh entry each call: createdAt is the wall-clock instant and the id/digest are derived from it, so the output is inherently non-deterministic and a byte-identity probe does not apply. Both surfaces call the same buildLedgerProposal core; round-trip + fail-closed behavior is covered by ledger-verify-smoke.";
|
|
354
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.review").payloadIdentical = false;
|
|
355
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.review").reason =
|
|
356
|
+
"Mints a fresh timestamped/digested verdict each call — non-deterministic output, same reasoning as ledger.propose. Both surfaces call the same buildLedgerReview core.";
|
|
357
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.verify").payloadIdentical = false;
|
|
358
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.verify").reason =
|
|
359
|
+
"The entry arrives by --file/stdin on the CLI and as an `entry` argument over MCP; there is no shared arg-bag the byte-identity probe can feed both. Both surfaces call the same verifyLedgerEntry core; ledger-verify-smoke proves the fail-closed contract.";
|
|
360
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.apply").payloadIdentical = false;
|
|
361
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.apply").reason =
|
|
362
|
+
"The entry arrives by --file/stdin on the CLI and as an `entry` argument over MCP; there is no shared arg-bag the byte-identity probe can feed both. Both surfaces call the same applyLedgerProposal core (a fail-closed wrapper over verifyLedgerEntry); ledger-apply-smoke proves the diff only escapes a verified proposal.";
|
|
363
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.list").payloadIdentical = false;
|
|
364
|
+
registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.list").reason =
|
|
365
|
+
"Output depends on the on-disk contents of the named ledger directory/directories, which the generic payload probe does not populate. Both surfaces call the same listLedgerEntries/unionLedgerEntries core; ledger-verify-smoke covers the fail-closed inbox and the multi-mirror union.";
|
|
366
|
+
// ---------------------------------------------------------------------------
|
package/docs/cli-mcp-parity.7.md
CHANGED
|
@@ -82,7 +82,7 @@ relationship. `identical` means `cw <cmd> --json` is equal to the `cw_<tool>`
|
|
|
82
82
|
payload; `projected` means a declared divergence with a reason; `cli-only` marks
|
|
83
83
|
a surface-specific capability with a recorded reason. The matrix is
|
|
84
84
|
<!-- gen:parity:count -->
|
|
85
|
-
machine-complete by design:
|
|
85
|
+
machine-complete by design: 239 capabilities, 197 MCP tools.
|
|
86
86
|
<!-- /gen:parity:count -->
|
|
87
87
|
|
|
88
88
|
<!-- gen:parity:table -->
|
|
@@ -284,7 +284,9 @@ machine-complete by design: 237 capabilities, 196 MCP tools.
|
|
|
284
284
|
| `orphans.gc` | `cw orphans gc` | `cw_orphans_gc` | `orphans.gc` | both | projected |
|
|
285
285
|
| `telemetry.verify` | `cw telemetry verify` | `cw_telemetry_verify` | `telemetry.verify` | both | identical |
|
|
286
286
|
| `history` | `cw history` | `cw_history` | `history` | both | identical |
|
|
287
|
+
| `audit.head` | `cw audit head` | `cw_audit_head` | `audit.head` | both | identical |
|
|
287
288
|
| `version` | `cw version` | `—` | `version` | cli-only | cli-only |
|
|
289
|
+
| `search` | `cw search` | `—` | `search` | cli-only | cli-only |
|
|
288
290
|
| `doctor` | `cw doctor` | `—` | `doctor` | cli-only | cli-only |
|
|
289
291
|
| `fix` | `cw fix` | `—` | `fix` | cli-only | cli-only |
|
|
290
292
|
| `quickstart` | `cw quickstart` | `—` | `quickstart` | cli-only | cli-only |
|
|
@@ -339,9 +341,10 @@ A capability may be on one surface only, but never without word of it — it mus
|
|
|
339
341
|
carry a recorded reason in the registry.
|
|
340
342
|
|
|
341
343
|
<!-- gen:parity:cliOnly -->
|
|
342
|
-
|
|
344
|
+
42 capabilities are CLI-only:
|
|
343
345
|
|
|
344
346
|
- `version` — version is a local, no-run-state print; the old build never gave it an MCP peer.
|
|
347
|
+
- `search` — CLI-only discovery helper over the same real app data cw list shows; no MCP client needs a free-text search tool alongside cw_list's structured output.
|
|
345
348
|
- `doctor` — Environment diagnostics are inherently local to the CLI host — Node version, $PATH, $CW_HOME/cwd writability. An MCP client diagnosing the server process's environment is not meaningful; agents already receive the same readiness facts in their typed results (e.g. status: blocked, agentConfigured). Inspired by `brew doctor`.
|
|
346
349
|
- `fix` — Environment fix commands are local diagnostics, same reasoning as doctor.
|
|
347
350
|
- `quickstart` — quickstart composes plan/runDrive/report; SPEC/mcp.md's declared cli-only list names it explicitly (no MCP peer). `audit-run` is a CLI-only alias of the same wrapper.
|
|
@@ -626,3 +629,7 @@ CLI golden-path fixes: `cw -q "…"` routes the question (was read as an app id
|
|
|
626
629
|
0.1.98
|
|
627
630
|
|
|
628
631
|
0.2.0
|
|
632
|
+
|
|
633
|
+
0.2.1
|
|
634
|
+
|
|
635
|
+
0.2.2
|
|
@@ -45,6 +45,26 @@ not just within one: a newly-added queue task can no longer go missing under a
|
|
|
45
45
|
concurrent drain, and two reclaimers can no longer lose a tombstone
|
|
46
46
|
(freed-without-proof).
|
|
47
47
|
|
|
48
|
+
### The whole-cycle run-state lock (unreleased)
|
|
49
|
+
|
|
50
|
+
`saveCheckpoint` locks only the WRITE of `state.json`. A verb that does
|
|
51
|
+
load → change → save on its own left a window where two processes both
|
|
52
|
+
load the same state and the later save silently drops the earlier change
|
|
53
|
+
— the same lost-update class the v0.2.1 fix closed for `queue.json`
|
|
54
|
+
and `triggers.json`. Two additions close it for the run state itself:
|
|
55
|
+
|
|
56
|
+
- **`withRunStateLock(runId, cwd, fn)`** (run-store) holds the
|
|
57
|
+
`state.json` lock over the whole load → change → save cycle. `fn` gets
|
|
58
|
+
the run loaded UNDER the lock. `cw dispatch` and `cw result` go
|
|
59
|
+
through it, so two `cw result` calls for two tasks of the same run can
|
|
60
|
+
no longer lose a completion. Keep `fn` short: a critical section past
|
|
61
|
+
the 30 s steal window can be stolen.
|
|
62
|
+
- **`withFileLock` is now re-entrant inside one process**: a nested call
|
|
63
|
+
on the same target runs its `fn` under the already-held lock instead
|
|
64
|
+
of waiting on its own lockfile until the tries run out. Save paths
|
|
65
|
+
inside `fn` (`saveCheckpoint`, worker-failure persists) keep their own
|
|
66
|
+
lock calls unchanged. Cross-process behavior is untouched.
|
|
67
|
+
|
|
48
68
|
## Reclamation durability (the write-ahead seam, v0.1.40)
|
|
49
69
|
|
|
50
70
|
The v0.1.39 reclamation transaction proved the *tombstone* crash-safe, but the
|
|
@@ -158,3 +178,7 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
|
|
|
158
178
|
0.1.98
|
|
159
179
|
|
|
160
180
|
0.2.0
|
|
181
|
+
|
|
182
|
+
0.2.1
|
|
183
|
+
|
|
184
|
+
0.2.2
|
package/docs/index.md
CHANGED
|
@@ -49,6 +49,7 @@ advanced pages only when you need those parts.
|
|
|
49
49
|
- [Durable State & Locking](durable-state-and-locking.7.md) - atomic writes, fsync durability, and portable file locks.
|
|
50
50
|
- [Source Context Profiles](source-context-profiles.7.md) - opt-in JSONL source exports for context slimming.
|
|
51
51
|
- [Security / Trust Hardening](security-trust-hardening.7.md) - audit records, provenance, sandbox attestations, and acceptance rationale.
|
|
52
|
+
- [Trust Audit Anchor](trust-audit-anchor.7.md) - head anchor that makes a cut-off audit-log tail visible.
|
|
52
53
|
- [State Explosion Management](state-explosion-management.7.md) - summaries, compact graph views, blackboard digests, and stale-aware compaction.
|
|
53
54
|
- [Evidence Adoption Reasoning Chain](evidence-adoption-reasoning-chain.7.md) - why evidence was adopted or rejected.
|
|
54
55
|
|
|
@@ -113,7 +113,8 @@ read-only metrics panel from the same payload, showing coverage and
|
|
|
113
113
|
- `cw metrics summary` — the cross-repo rollup over the v0.1.28 run registry:
|
|
114
114
|
pooled rates, summed attested usage/cost with coverage, and per-app and
|
|
115
115
|
per-backend breakdowns. `--scope repo|home`; runs that cannot be read are counted
|
|
116
|
-
(`unreadableRuns`), never quietly dropped.
|
|
116
|
+
(`unreadableRuns`), never quietly dropped. `--limit N` caps how many run
|
|
117
|
+
states are loaded (default 50, matching `run list`/`run search`'s own floor).
|
|
117
118
|
|
|
118
119
|
MCP hosts call `cw_metrics_show` and `cw_metrics_summary` with the same
|
|
119
120
|
payloads. Old runs load and report `unreported` cost while still giving correct
|
|
@@ -243,3 +244,7 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
|
|
|
243
244
|
0.1.98
|
|
244
245
|
|
|
245
246
|
0.2.0
|
|
247
|
+
|
|
248
|
+
0.2.1
|
|
249
|
+
|
|
250
|
+
0.2.2
|