cool-workflow 0.1.98 → 0.2.1
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 +18 -7
- 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 +236 -0
- package/dist/cli/entry.js +120 -0
- package/dist/cli/io.js +21 -4
- package/dist/cli/parseargv.js +157 -0
- package/dist/cli.js +6 -33
- package/dist/core/capability-table.js +3518 -0
- package/dist/core/format/help.js +314 -0
- package/dist/{state-explosion/format.js → core/format/state-explosion-text.js} +10 -1
- package/dist/core/hash.js +137 -0
- package/dist/core/multi-agent/candidate-scoring.js +219 -0
- package/dist/core/multi-agent/collaboration.js +481 -0
- package/dist/core/multi-agent/coordinator.js +515 -0
- package/dist/core/multi-agent/eval-replay.js +306 -0
- package/dist/core/multi-agent/runtime.js +929 -0
- package/dist/core/multi-agent/topology.js +298 -0
- package/dist/core/multi-agent/trust-policy.js +197 -0
- package/dist/core/pipeline/commit-gate.js +320 -0
- package/dist/{pipeline-contract.js → core/pipeline/contract.js} +24 -37
- package/dist/core/pipeline/dispatch.js +103 -0
- package/dist/core/pipeline/drive-decide.js +227 -0
- package/dist/core/pipeline/error-feedback.js +161 -0
- package/dist/core/pipeline/loop-expansion.js +124 -0
- package/dist/{result-normalize.js → core/pipeline/result-normalize.js} +14 -37
- package/dist/core/pipeline/runner.js +230 -0
- package/dist/{contract-migration.js → core/state/contract-migration.js} +68 -92
- package/dist/{state-migrations.js → core/state/migrations.js} +103 -96
- package/dist/core/state/node-projection.js +95 -0
- package/dist/core/state/node-snapshot.js +230 -0
- package/dist/core/state/run-paths.js +93 -0
- package/dist/{schema-validate.js → core/state/schema-validate.js} +35 -28
- package/dist/core/state/schema.js +50 -0
- package/dist/core/state/state-explosion/digest.js +243 -0
- package/dist/core/state/state-explosion/graph.js +527 -0
- package/dist/{state-explosion → core/state/state-explosion}/helpers.js +34 -3
- package/dist/core/state/state-explosion/report.js +187 -0
- package/dist/{state-explosion → core/state/state-explosion}/size.js +25 -7
- package/dist/{state-node.js → core/state/state-node.js} +90 -113
- package/dist/core/state/types.js +19 -0
- package/dist/{validation.js → core/state/validation.js} +64 -131
- package/dist/core/trust/evidence-grounding.js +134 -0
- package/dist/core/trust/ledger.js +199 -0
- package/dist/{telemetry-attestation.js → core/trust/telemetry-attestation.js} +94 -68
- package/dist/core/trust/telemetry-ledger.js +127 -0
- package/dist/core/types.js +20 -0
- package/dist/core/version.js +16 -0
- package/dist/{workflow-app-framework.js → core/workflow-apps/app-schema.js} +337 -426
- package/dist/mcp/dispatch.js +104 -0
- package/dist/mcp/server.js +144 -0
- package/dist/mcp-server.js +6 -84
- package/dist/{agent-config.js → shell/agent-config.js} +118 -71
- package/dist/shell/app-run-cli.js +88 -0
- package/dist/shell/audit-cli.js +259 -0
- package/dist/shell/audit-provenance.js +83 -0
- package/dist/shell/candidate-scoring-io.js +459 -0
- package/dist/shell/collaboration-io.js +264 -0
- package/dist/shell/commit-summary.js +104 -0
- package/dist/shell/commit.js +290 -0
- package/dist/shell/coordinator-io.js +476 -0
- package/dist/shell/demo-cli.js +19 -0
- package/dist/shell/dispatch.js +162 -0
- package/dist/shell/doctor.js +292 -0
- package/dist/shell/drive.js +885 -0
- package/dist/shell/error-feedback-io.js +305 -0
- package/dist/shell/eval-io.js +473 -0
- package/dist/{multi-agent-eval/format.js → shell/eval-text.js} +78 -49
- package/dist/{evidence-reasoning.js → shell/evidence-reasoning.js} +124 -255
- package/dist/shell/exec-backend-cli.js +88 -0
- package/dist/shell/execution-backend/agent.js +507 -0
- package/dist/shell/execution-backend/ci.js +15 -0
- package/dist/shell/execution-backend/container.js +69 -0
- package/dist/shell/execution-backend/envelopes.js +55 -0
- package/dist/shell/execution-backend/local.js +113 -0
- package/dist/shell/execution-backend/probes.js +175 -0
- package/dist/shell/execution-backend/registry.js +402 -0
- package/dist/shell/execution-backend/remote.js +128 -0
- package/dist/shell/execution-backend/types.js +11 -0
- package/dist/shell/feedback-cli.js +81 -0
- package/dist/shell/feedback-operations.js +48 -0
- package/dist/shell/fs-atomic.js +276 -0
- package/dist/shell/harness.js +98 -0
- package/dist/shell/ledger-cli.js +212 -0
- package/dist/shell/ledger-io.js +169 -0
- package/dist/shell/man-cli.js +89 -0
- package/dist/shell/metrics-cli.js +100 -0
- package/dist/shell/multi-agent-cli.js +1002 -0
- package/dist/shell/multi-agent-host.js +563 -0
- package/dist/shell/multi-agent-io.js +387 -0
- package/dist/{multi-agent-operator-ux.js → shell/multi-agent-operator-ux.js} +234 -191
- package/dist/shell/node-store.js +124 -0
- package/dist/{observability/format.js → shell/observability-format.js} +7 -1
- package/dist/{observability/intake.js → shell/observability-intake.js} +79 -56
- package/dist/{observability.js → shell/observability.js} +159 -332
- package/dist/{onramp.js → shell/onramp.js} +11 -0
- package/dist/{operator-ux/format.js → shell/operator-ux-text.js} +250 -239
- package/dist/shell/operator-ux.js +431 -0
- package/dist/shell/orchestrator.js +231 -0
- package/dist/shell/pipeline-cli.js +667 -0
- package/dist/shell/pipeline.js +217 -0
- package/dist/shell/reclamation-io.js +1366 -0
- package/dist/shell/registry-cli.js +344 -0
- package/dist/{remote-source.js → shell/remote-source.js} +2 -2
- package/dist/shell/report-cli.js +101 -0
- package/dist/shell/report-view-cli.js +117 -0
- package/dist/{orchestrator → shell}/report.js +289 -282
- package/dist/shell/reporter.js +62 -0
- package/dist/shell/run-export-cli.js +106 -0
- package/dist/shell/run-export.js +680 -0
- package/dist/shell/run-registry-io.js +1014 -0
- package/dist/shell/run-store.js +164 -0
- package/dist/{sandbox-profile.js → shell/sandbox-profile.js} +134 -95
- package/dist/{scheduler.js → shell/scheduler-io.js} +257 -48
- package/dist/shell/scheduling-io.js +321 -0
- package/dist/shell/state-cli.js +181 -0
- package/dist/shell/state-explosion-cli.js +197 -0
- package/dist/shell/telemetry-cli.js +85 -0
- package/dist/{telemetry-demo.js → shell/telemetry-demo.js} +149 -119
- package/dist/shell/telemetry-ledger-io.js +132 -0
- package/dist/{term.js → shell/term.js} +36 -46
- package/dist/shell/topology-io.js +361 -0
- package/dist/shell/trust-audit.js +472 -0
- package/dist/{multi-agent-trust.js → shell/trust-policy-io.js} +67 -205
- package/dist/shell/verifier.js +48 -0
- package/dist/shell/workbench-host.js +258 -0
- package/dist/shell/workbench-text.js +18 -0
- package/dist/shell/workbench.js +170 -0
- package/dist/shell/worker-cli.js +124 -0
- package/dist/shell/worker-isolation.js +852 -0
- package/dist/shell/workflow-app-loader.js +650 -0
- package/docs/agent-delegation-drive.7.md +4 -0
- package/docs/cli-mcp-parity.7.md +282 -219
- 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 +4 -0
- package/docs/evidence-adoption-reasoning-chain.7.md +4 -0
- package/docs/execution-backends.7.md +4 -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 +137 -71
- 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 +25 -0
- package/docs/security-trust-hardening.7.md +3 -1
- package/docs/state-explosion-management.7.md +4 -0
- package/docs/team-collaboration.7.md +4 -0
- package/docs/web-desktop-workbench.7.md +15 -1
- package/manifest/plugin.manifest.json +1 -1
- package/manifest/source-context-profiles.json +9 -13
- package/package.json +1 -1
- package/scripts/agents/agent-adapter-core.js +22 -2
- package/scripts/agents/claude-p-agent.js +8 -3
- package/scripts/agents/cw-attest-wrap.js +2 -2
- package/scripts/agents/gemini-agent.js +5 -1
- package/scripts/agents/opencode-agent.js +5 -1
- package/scripts/bump-version.js +4 -3
- package/scripts/canonical-apps.js +4 -4
- package/scripts/dogfood-architecture-review.js +2 -3
- package/scripts/dogfood-release.js +3 -3
- package/scripts/gen-parity-doc.js +15 -2
- package/scripts/golden-path.js +4 -4
- package/scripts/onramp-check.js +1 -1
- package/scripts/parity-check.js +38 -21
- package/scripts/release-flow.js +2 -2
- package/scripts/sync-project-index.js +51 -27
- package/scripts/validate-run-state-schema.js +2 -2
- package/scripts/version-sync-check.js +30 -30
- package/dist/candidate-scoring.js +0 -729
- package/dist/capability-core.js +0 -1189
- package/dist/capability-registry.js +0 -885
- package/dist/cli/command-surface.js +0 -494
- package/dist/cli/format.js +0 -56
- package/dist/cli/handlers/audit.js +0 -82
- package/dist/cli/handlers/blackboard.js +0 -81
- package/dist/cli/handlers/candidate.js +0 -40
- package/dist/cli/handlers/clones.js +0 -34
- package/dist/cli/handlers/collaboration.js +0 -61
- package/dist/cli/handlers/eval.js +0 -40
- package/dist/cli/handlers/ledger.js +0 -169
- package/dist/cli/handlers/maintenance.js +0 -107
- package/dist/cli/handlers/multi-agent.js +0 -165
- package/dist/cli/handlers/node.js +0 -41
- package/dist/cli/handlers/operational.js +0 -155
- package/dist/cli/handlers/operator.js +0 -146
- package/dist/cli/handlers/registry.js +0 -68
- package/dist/cli/handlers/run.js +0 -153
- package/dist/cli/handlers/scheduling.js +0 -132
- package/dist/cli/handlers/workbench.js +0 -41
- package/dist/cli/handlers/worker.js +0 -45
- package/dist/cli/run-summary.js +0 -45
- package/dist/clones.js +0 -162
- package/dist/collaboration.js +0 -726
- package/dist/commit.js +0 -592
- package/dist/compare.js +0 -18
- package/dist/coordinator/classify.js +0 -45
- package/dist/coordinator/paths.js +0 -42
- package/dist/coordinator/util.js +0 -126
- package/dist/coordinator.js +0 -990
- package/dist/daemon.js +0 -44
- package/dist/dispatch.js +0 -250
- package/dist/doctor.js +0 -212
- package/dist/drive.js +0 -864
- package/dist/error-feedback.js +0 -419
- package/dist/evidence-grounding.js +0 -184
- package/dist/execution-backend/agent.js +0 -354
- package/dist/execution-backend/probes.js +0 -112
- package/dist/execution-backend/util.js +0 -47
- package/dist/execution-backend.js +0 -961
- package/dist/gates.js +0 -48
- package/dist/harness.js +0 -61
- package/dist/ledger.js +0 -313
- package/dist/loop-expansion.js +0 -60
- package/dist/mcp/tool-call.js +0 -470
- package/dist/mcp/tool-definitions.js +0 -1066
- package/dist/mcp-surface.js +0 -30
- package/dist/multi-agent/graph.js +0 -84
- package/dist/multi-agent/helpers.js +0 -141
- package/dist/multi-agent/ids.js +0 -20
- package/dist/multi-agent/paths.js +0 -22
- package/dist/multi-agent-eval/normalize.js +0 -51
- package/dist/multi-agent-eval.js +0 -678
- package/dist/multi-agent-host.js +0 -777
- package/dist/multi-agent.js +0 -984
- package/dist/node-projection.js +0 -59
- package/dist/node-snapshot.js +0 -260
- package/dist/operator-ux.js +0 -631
- package/dist/orchestrator/app-operations.js +0 -211
- package/dist/orchestrator/audit-operations.js +0 -182
- package/dist/orchestrator/candidate-operations.js +0 -117
- package/dist/orchestrator/cli-options.js +0 -294
- package/dist/orchestrator/collaboration-operations.js +0 -86
- package/dist/orchestrator/feedback-operations.js +0 -81
- package/dist/orchestrator/host-operations.js +0 -78
- package/dist/orchestrator/lifecycle-operations.js +0 -650
- package/dist/orchestrator/migration-operations.js +0 -44
- package/dist/orchestrator/multi-agent-operations.js +0 -362
- package/dist/orchestrator/topology-operations.js +0 -84
- package/dist/orchestrator.js +0 -925
- package/dist/pipeline-runner.js +0 -285
- package/dist/reclamation/hash.js +0 -72
- package/dist/reclamation.js +0 -812
- package/dist/reporter.js +0 -67
- package/dist/run-export.js +0 -815
- package/dist/run-registry/derive.js +0 -175
- package/dist/run-registry/format.js +0 -124
- package/dist/run-registry/gc.js +0 -251
- package/dist/run-registry/policy.js +0 -16
- package/dist/run-registry/queue.js +0 -115
- package/dist/run-registry.js +0 -850
- package/dist/run-state-schema.js +0 -68
- package/dist/scheduling.js +0 -184
- package/dist/state-explosion.js +0 -1014
- package/dist/state.js +0 -367
- package/dist/telemetry-ledger.js +0 -196
- package/dist/topology.js +0 -565
- package/dist/triggers.js +0 -184
- package/dist/trust-audit.js +0 -644
- package/dist/types/blackboard.js +0 -2
- package/dist/types/candidate.js +0 -2
- package/dist/types/collaboration.js +0 -2
- package/dist/types/core.js +0 -2
- package/dist/types/drive.js +0 -10
- package/dist/types/error-feedback.js +0 -2
- package/dist/types/evidence-reasoning.js +0 -2
- package/dist/types/execution-backend.js +0 -2
- package/dist/types/multi-agent.js +0 -2
- package/dist/types/observability.js +0 -2
- package/dist/types/pipeline.js +0 -2
- package/dist/types/reclamation.js +0 -8
- package/dist/types/report-bundle.js +0 -6
- package/dist/types/result.js +0 -2
- package/dist/types/run-registry.js +0 -2
- package/dist/types/run.js +0 -2
- package/dist/types/sandbox.js +0 -2
- package/dist/types/schedule.js +0 -2
- package/dist/types/state-node.js +0 -2
- package/dist/types/topology.js +0 -2
- package/dist/types/trust.js +0 -2
- package/dist/types/workbench.js +0 -2
- package/dist/types/worker.js +0 -2
- package/dist/types/workflow-app.js +0 -2
- package/dist/types.js +0 -44
- package/dist/util/fingerprint.js +0 -19
- package/dist/util/fingerprint.test.js +0 -27
- package/dist/verifier.js +0 -78
- package/dist/version.js +0 -8
- package/dist/workbench-host.js +0 -192
- package/dist/workbench.js +0 -192
- package/dist/worker-accept/acceptance.js +0 -114
- package/dist/worker-accept/blackboard-fanout.js +0 -80
- package/dist/worker-accept/blackboard-linkage.js +0 -19
- package/dist/worker-accept/context.js +0 -2
- package/dist/worker-accept/telemetry-ledger.js +0 -126
- package/dist/worker-accept/validation.js +0 -77
- package/dist/worker-accept/verifier-completion.js +0 -73
- package/dist/worker-isolation/helpers.js +0 -51
- package/dist/worker-isolation/paths.js +0 -46
- package/dist/worker-isolation.js +0 -656
- package/dist/workflow-api.js +0 -131
- /package/dist/{types → core/types}/boundary.js +0 -0
|
@@ -18,7 +18,7 @@ cw:result block that EXACTLY follows this schema:
|
|
|
18
18
|
"findings": [
|
|
19
19
|
{
|
|
20
20
|
"id": "unique-kebab-id",
|
|
21
|
-
"title": "short
|
|
21
|
+
"title": "short finding title",
|
|
22
22
|
"severity": "P0",
|
|
23
23
|
"classification": "real",
|
|
24
24
|
"evidence": ["path/to/file.ts:42"]
|
|
@@ -471,6 +471,25 @@ function persistStderr(resultPath, text) {
|
|
|
471
471
|
}
|
|
472
472
|
}
|
|
473
473
|
|
|
474
|
+
// Build the failure-path diagnostic string for a non-zero exit. Real OS-level
|
|
475
|
+
// stderr wins when present (the common case: a crash, a killed process, a
|
|
476
|
+
// vendor CLI that DOES write to stderr) — byte-identical to before this
|
|
477
|
+
// helper existed. When stderr is EMPTY, fall back to whatever partial/
|
|
478
|
+
// structured text the wrapper already parsed from stdout before the child
|
|
479
|
+
// died (a stream-json `result` event with is_error:true is how claude
|
|
480
|
+
// reports terminal errors like an auth failure — that text was being parsed
|
|
481
|
+
// and then silently thrown away). If there is no partial text either, say so
|
|
482
|
+
// plainly instead of just repeating the bare exit code. Never throws; always
|
|
483
|
+
// returns a non-empty string.
|
|
484
|
+
function buildFailureDetail({ label, code, childStderr, partialText }) {
|
|
485
|
+
const stderrText = String(childStderr || "").trim();
|
|
486
|
+
if (stderrText) return stderrText;
|
|
487
|
+
const partial = String(partialText || "").trim();
|
|
488
|
+
const codeText = `${label} exited ${code === null ? "(timeout/killed)" : code}`;
|
|
489
|
+
if (partial) return `${codeText} — ${label} stdout (no stderr) said: ${partial}`;
|
|
490
|
+
return codeText;
|
|
491
|
+
}
|
|
492
|
+
|
|
474
493
|
module.exports = {
|
|
475
494
|
RESULT_CONTRACT,
|
|
476
495
|
buildPrompt,
|
|
@@ -485,5 +504,6 @@ module.exports = {
|
|
|
485
504
|
flushJsonLines,
|
|
486
505
|
writeResult,
|
|
487
506
|
emitReport,
|
|
488
|
-
persistStderr // save a failed agent's stderr to <workerDir>/logs/agent-stderr.log (shared by all wrappers)
|
|
507
|
+
persistStderr, // save a failed agent's stderr to <workerDir>/logs/agent-stderr.log (shared by all wrappers)
|
|
508
|
+
buildFailureDetail // fold in parsed partial stdout text when real stderr is empty (shared by all wrappers)
|
|
489
509
|
};
|
|
@@ -34,7 +34,7 @@ const { spawn, spawnSync } = require("node:child_process");
|
|
|
34
34
|
// wrappers instead of carrying a private copy. A drifted inline copy (ASCII
|
|
35
35
|
// hyphens silently became em-dashes here) meant claude was sent a different
|
|
36
36
|
// instruction text than the other providers for the same contract.
|
|
37
|
-
const { buildPrompt, createRenderer, persistStderr, toolLabel, summarizeToolResult } = require("./agent-adapter-core");
|
|
37
|
+
const { buildPrompt, createRenderer, persistStderr, toolLabel, summarizeToolResult, buildFailureDetail } = require("./agent-adapter-core");
|
|
38
38
|
|
|
39
39
|
const inputPath = process.argv[2];
|
|
40
40
|
const resultPath = process.argv[3];
|
|
@@ -179,9 +179,14 @@ child.on("close", (code) => {
|
|
|
179
179
|
render.finishLive(); // stop the spinner + restore the cursor BEFORE any further output
|
|
180
180
|
render.writeTranscript(transcriptPath); // full narration + tool I/O always saved
|
|
181
181
|
if (code !== 0) {
|
|
182
|
-
const
|
|
182
|
+
const stderrText = childStderr.trim();
|
|
183
|
+
// childStderr is the OS-level stream; claude's real failure reason (auth,
|
|
184
|
+
// rate limit, relay error) is often reported as a stream-json `result`
|
|
185
|
+
// event on STDOUT instead, already parsed into `resultText` above — fold
|
|
186
|
+
// it in here so a silent-stderr failure still leaves a readable reason.
|
|
187
|
+
const detail = buildFailureDetail({ label: "claude", code, childStderr: stderrText, partialText: resultText });
|
|
183
188
|
persistStderr(resultPath, detail);
|
|
184
|
-
if (
|
|
189
|
+
if (stderrText) process.stderr.write(`${stderrText}\n`);
|
|
185
190
|
process.stderr.write(`claude exited ${code === null ? "(timeout/killed)" : code}\n`);
|
|
186
191
|
process.exit(code === null ? 1 : code);
|
|
187
192
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
//
|
|
13
13
|
// It signs the EXACT same canonical payload CW verifies — {usage, runId, taskId,
|
|
14
14
|
// promptDigest} — sharing the canonicalization with the verifier via
|
|
15
|
-
// dist/telemetry-attestation.js, so signer and verifier can never drift.
|
|
15
|
+
// dist/core/trust/telemetry-attestation.js, so signer and verifier can never drift.
|
|
16
16
|
//
|
|
17
17
|
// Usage (wrap any agent that prints a {model, usage} JSON report on stdout):
|
|
18
18
|
// node cw-attest-wrap.js --manifest {{manifest}} -- <agent-cmd> [agent-args...]
|
|
@@ -32,7 +32,7 @@ const crypto = require("node:crypto");
|
|
|
32
32
|
const path = require("node:path");
|
|
33
33
|
const { spawnSync } = require("node:child_process");
|
|
34
34
|
|
|
35
|
-
const ta = require(path.resolve(__dirname, "..", "..", "dist", "telemetry-attestation.js"));
|
|
35
|
+
const ta = require(path.resolve(__dirname, "..", "..", "dist", "core", "trust", "telemetry-attestation.js"));
|
|
36
36
|
|
|
37
37
|
function fail(message) {
|
|
38
38
|
process.stderr.write(`cw-attest-wrap: ${message}\n`);
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
const path = require("node:path");
|
|
18
18
|
const { spawn } = require("node:child_process");
|
|
19
19
|
const {
|
|
20
|
+
buildFailureDetail,
|
|
20
21
|
buildPrompt,
|
|
21
22
|
createRenderer,
|
|
22
23
|
emitReport,
|
|
@@ -94,7 +95,10 @@ child.on("close", (code) => {
|
|
|
94
95
|
render.finishLive();
|
|
95
96
|
render.writeTranscript(transcriptPath);
|
|
96
97
|
if (code !== 0) {
|
|
97
|
-
|
|
98
|
+
// gemini's real failure reason is often only in the NDJSON text/result
|
|
99
|
+
// fragments already parsed into `state`, not in raw OS-level stderr.
|
|
100
|
+
const partial = state.finalResult || state.textFragments.join("\n\n");
|
|
101
|
+
const detail = buildFailureDetail({ label: "gemini", code, childStderr: childStderr.trim(), partialText: partial });
|
|
98
102
|
persistStderr(resultPath, detail);
|
|
99
103
|
process.stderr.write(`${detail}\n`);
|
|
100
104
|
process.exit(code === null ? 1 : code);
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
const path = require("node:path");
|
|
23
23
|
const { spawn } = require("node:child_process");
|
|
24
24
|
const {
|
|
25
|
+
buildFailureDetail,
|
|
25
26
|
buildPrompt,
|
|
26
27
|
createRenderer,
|
|
27
28
|
emitReport,
|
|
@@ -147,7 +148,10 @@ child.on("close", (code) => {
|
|
|
147
148
|
render.finishLive();
|
|
148
149
|
render.writeTranscript(transcriptPath);
|
|
149
150
|
if (code !== 0) {
|
|
150
|
-
|
|
151
|
+
// opencode's real failure reason is often only in the JSONL text/result
|
|
152
|
+
// fragments already parsed into `state`, not in raw OS-level stderr.
|
|
153
|
+
const partial = state.finalResult || state.lastMessageText || state.textFragments.join("\n\n");
|
|
154
|
+
const detail = buildFailureDetail({ label: "opencode", code, childStderr: childStderr.trim(), partialText: partial });
|
|
151
155
|
persistStderr(resultPath, detail);
|
|
152
156
|
process.stderr.write(`${detail}\n`);
|
|
153
157
|
process.exit(code === null ? 1 : code);
|
package/scripts/bump-version.js
CHANGED
|
@@ -89,8 +89,9 @@ function main() {
|
|
|
89
89
|
note("server.json");
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
// 3. src/version.ts runtime constant
|
|
93
|
-
|
|
92
|
+
// 3. src/core/version.ts runtime constant (v2 moved it from the old flat
|
|
93
|
+
// src/version.ts into the core state layer)
|
|
94
|
+
const versionTs = path.join(pluginRoot, "src", "core", "version.ts");
|
|
94
95
|
const vtsText = fs.readFileSync(versionTs, "utf8");
|
|
95
96
|
const vtsNext = vtsText.replace(
|
|
96
97
|
/(CURRENT_COOL_WORKFLOW_VERSION\s*=\s*)"[^"]*"/,
|
|
@@ -98,7 +99,7 @@ function main() {
|
|
|
98
99
|
);
|
|
99
100
|
if (vtsNext !== vtsText) {
|
|
100
101
|
fs.writeFileSync(versionTs, vtsNext);
|
|
101
|
-
note("src/version.ts");
|
|
102
|
+
note("src/core/version.ts");
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
// 4. manifest/plugin.manifest.json (identity.version) — gen:manifests then
|
|
@@ -83,7 +83,7 @@ const canonicalApps = [
|
|
|
83
83
|
"--source",
|
|
84
84
|
"plugins/cool-workflow/docs/workflow-app-framework.7.md",
|
|
85
85
|
"--scope",
|
|
86
|
-
"Cool Workflow v0.1
|
|
86
|
+
"Cool Workflow v0.2.1",
|
|
87
87
|
"--freshness",
|
|
88
88
|
"as of release preparation"
|
|
89
89
|
]
|
|
@@ -117,14 +117,14 @@ function main() {
|
|
|
117
117
|
assert.ok(summary, `${app.id} must appear in app list`);
|
|
118
118
|
assert.equal(summary.sourceKind, "app-directory");
|
|
119
119
|
assert.equal(summary.legacy, false);
|
|
120
|
-
assert.equal(summary.version, "0.1
|
|
120
|
+
assert.equal(summary.version, "0.2.1");
|
|
121
121
|
|
|
122
122
|
const validation = runJson(["app", "validate", manifestPath]);
|
|
123
123
|
assert.equal(validation.valid, true, `${app.id} manifest must validate`);
|
|
124
124
|
|
|
125
125
|
const shown = runJson(["app", "show", app.id]);
|
|
126
126
|
assert.equal(shown.app.id, app.id);
|
|
127
|
-
assert.equal(shown.app.version, "0.1
|
|
127
|
+
assert.equal(shown.app.version, "0.2.1");
|
|
128
128
|
assert.ok(shown.app.metadata.canonical, `${app.id} must be marked canonical`);
|
|
129
129
|
assert.ok(shown.app.sandboxProfiles.length > 0, `${app.id} must declare sandbox profiles`);
|
|
130
130
|
assertTaskIdsUnique(shown);
|
|
@@ -135,7 +135,7 @@ function main() {
|
|
|
135
135
|
const plan = runJson(["plan", app.id, ...app.args(workspace)]);
|
|
136
136
|
const state = JSON.parse(fs.readFileSync(plan.statePath, "utf8"));
|
|
137
137
|
assert.equal(state.workflow.app.id, app.id);
|
|
138
|
-
assert.equal(state.workflow.app.version, "0.1
|
|
138
|
+
assert.equal(state.workflow.app.version, "0.2.1");
|
|
139
139
|
assert.equal(state.workflow.app.metadata.canonical, true);
|
|
140
140
|
assert.ok(state.tasks.some((task) => task.requiresEvidence), `${app.id} plan must include evidence gates`);
|
|
141
141
|
assert.ok(state.tasks.every((task) => task.sandboxProfileId), `${app.id} plan must include sandbox hints`);
|
|
@@ -23,9 +23,8 @@ const os = require("node:os");
|
|
|
23
23
|
const path = require("node:path");
|
|
24
24
|
|
|
25
25
|
const pluginRoot = path.resolve(__dirname, "..");
|
|
26
|
-
const { CoolWorkflowRunner } = require(path.join(pluginRoot, "dist/orchestrator.js"));
|
|
27
|
-
const {
|
|
28
|
-
const { resolveAgentConfig } = require(path.join(pluginRoot, "dist/agent-config.js"));
|
|
26
|
+
const { CoolWorkflowRunner, drive } = require(path.join(pluginRoot, "dist/shell/orchestrator.js"));
|
|
27
|
+
const { resolveAgentConfig } = require(path.join(pluginRoot, "dist/shell/agent-config.js"));
|
|
29
28
|
|
|
30
29
|
const argv = process.argv.slice(2);
|
|
31
30
|
const flags = new Set(argv.filter((a) => a.startsWith("--")));
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
const { spawnSync } = require("node:child_process");
|
|
5
5
|
const fs = require("node:fs");
|
|
6
6
|
const path = require("node:path");
|
|
7
|
-
const { CoolWorkflowRunner } = require("../dist/orchestrator.js");
|
|
7
|
+
const { CoolWorkflowRunner } = require("../dist/shell/orchestrator.js");
|
|
8
8
|
|
|
9
|
-
const TARGET_VERSION = "0.1
|
|
9
|
+
const TARGET_VERSION = "0.2.1";
|
|
10
10
|
const PREVIOUS_VERSION = "0.1.31";
|
|
11
11
|
const pluginRoot = path.resolve(__dirname, "..");
|
|
12
12
|
const repoRoot = path.resolve(pluginRoot, "..", "..");
|
|
@@ -269,7 +269,7 @@ function commandsForTask(taskId, context) {
|
|
|
269
269
|
"-e",
|
|
270
270
|
[
|
|
271
271
|
releaseSourceReaderSnippet(),
|
|
272
|
-
"for (const f of ['plugins/cool-workflow/package.json','plugins/cool-workflow/src/version.ts','CHANGELOG.md','RELEASE.md']) {",
|
|
272
|
+
"for (const f of ['plugins/cool-workflow/package.json','plugins/cool-workflow/src/core/version.ts','CHANGELOG.md','RELEASE.md']) {",
|
|
273
273
|
" const t=readSurface(f);",
|
|
274
274
|
` if (t===null) throw new Error(f+' missing from release commit');`,
|
|
275
275
|
` if (!t.includes('${TARGET_VERSION}')) throw new Error(f+' missing ${TARGET_VERSION}');`,
|
|
@@ -22,7 +22,13 @@ const pluginRoot = path.resolve(__dirname, "..");
|
|
|
22
22
|
const DOC = path.join(pluginRoot, "docs", "cli-mcp-parity.7.md");
|
|
23
23
|
const CHECK = process.argv.includes("--check");
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
// v2 repoint: the flat dist/capability-registry.js is gone. The single
|
|
26
|
+
// source of truth is now core/capability-table's REGISTRY (same row shape:
|
|
27
|
+
// capability, surface, cli, mcp, payloadIdentical, reason, entry, ...),
|
|
28
|
+
// exported under the old name too (CAPABILITY_REGISTRY = REGISTRY, an
|
|
29
|
+
// alias declared in capability-table.ts for callers written against the
|
|
30
|
+
// old name).
|
|
31
|
+
const { CAPABILITY_REGISTRY } = require(path.join(pluginRoot, "dist", "core", "capability-table.js"));
|
|
26
32
|
|
|
27
33
|
const NUM_WORDS = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"];
|
|
28
34
|
const numWord = (n) => NUM_WORDS[n] || String(n);
|
|
@@ -41,6 +47,13 @@ function payload(cap) {
|
|
|
41
47
|
if (cap.surface !== "both") return cap.surface;
|
|
42
48
|
return cap.payloadIdentical === false ? "projected" : "identical";
|
|
43
49
|
}
|
|
50
|
+
// v2 adapt: this table's `entry` field is only set where a row names its
|
|
51
|
+
// shared core entry explicitly (most rows do not yet, unlike the old flat
|
|
52
|
+
// registry where every row named one). Fall back to the capability id
|
|
53
|
+
// itself so the doc table never prints a literal "undefined".
|
|
54
|
+
function coreEntry(cap) {
|
|
55
|
+
return cap.entry || cap.capability;
|
|
56
|
+
}
|
|
44
57
|
|
|
45
58
|
function buildCount() {
|
|
46
59
|
const caps = CAPABILITY_REGISTRY.length;
|
|
@@ -54,7 +67,7 @@ function buildTable() {
|
|
|
54
67
|
"| --- | --- | --- | --- | --- | --- |"
|
|
55
68
|
];
|
|
56
69
|
for (const cap of CAPABILITY_REGISTRY) {
|
|
57
|
-
lines.push(`| \`${cap.capability}\` | \`${cliCommand(cap)}\` | \`${mcpTool(cap)}\` | \`${cap
|
|
70
|
+
lines.push(`| \`${cap.capability}\` | \`${cliCommand(cap)}\` | \`${mcpTool(cap)}\` | \`${coreEntry(cap)}\` | ${payload(cap) === "cli-only" || cap.surface !== "both" ? cap.surface : "both"} | ${payload(cap)} |`);
|
|
58
71
|
}
|
|
59
72
|
return lines.join("\n");
|
|
60
73
|
}
|
package/scripts/golden-path.js
CHANGED
|
@@ -33,7 +33,7 @@ function main() {
|
|
|
33
33
|
const appValidation = runJson(["app", "validate", "end-to-end-golden-path"], pluginRoot);
|
|
34
34
|
assert.equal(appValidation.valid, true);
|
|
35
35
|
assert.equal(appValidation.summary.id, "end-to-end-golden-path");
|
|
36
|
-
assert.equal(appValidation.summary.version, "0.1
|
|
36
|
+
assert.equal(appValidation.summary.version, "0.2.1");
|
|
37
37
|
|
|
38
38
|
const plan = runJson(
|
|
39
39
|
[
|
|
@@ -42,7 +42,7 @@ function main() {
|
|
|
42
42
|
"--repo",
|
|
43
43
|
tmp,
|
|
44
44
|
"--question",
|
|
45
|
-
"Prove the deterministic v0.1
|
|
45
|
+
"Prove the deterministic v0.2.1 end-to-end golden path."
|
|
46
46
|
],
|
|
47
47
|
pluginRoot
|
|
48
48
|
);
|
|
@@ -52,7 +52,7 @@ function main() {
|
|
|
52
52
|
|
|
53
53
|
let state = readJson(plan.statePath);
|
|
54
54
|
assert.equal(state.workflow.app.id, "end-to-end-golden-path");
|
|
55
|
-
assert.equal(state.workflow.app.version, "0.1
|
|
55
|
+
assert.equal(state.workflow.app.version, "0.2.1");
|
|
56
56
|
assert.equal(state.loopStage, "interpret");
|
|
57
57
|
|
|
58
58
|
const dispatch = runJson(["dispatch", plan.runId, "--limit", "1", "--sandbox", "readonly"], tmp);
|
|
@@ -195,7 +195,7 @@ function main() {
|
|
|
195
195
|
assert.equal(reportPath, plan.reportPath);
|
|
196
196
|
assert.ok(fs.existsSync(reportPath));
|
|
197
197
|
const report = fs.readFileSync(reportPath, "utf8");
|
|
198
|
-
assert.match(report, /Workflow App: end-to-end-golden-path@0\.1
|
|
198
|
+
assert.match(report, /Workflow App: end-to-end-golden-path@0\.2\.1/);
|
|
199
199
|
assert.match(report, /## Candidates/);
|
|
200
200
|
assert.match(report, /## Trust Audit/);
|
|
201
201
|
assert.match(report, /## Acceptance Rationale/);
|
package/scripts/onramp-check.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// source/app/script changes need an iteration-log row.
|
|
7
7
|
|
|
8
8
|
const path = require("node:path");
|
|
9
|
-
const { evaluateOnrampContract, resolveChangedFiles } = require("../dist/onramp.js");
|
|
9
|
+
const { evaluateOnrampContract, resolveChangedFiles } = require("../dist/shell/onramp.js");
|
|
10
10
|
|
|
11
11
|
const pluginRoot = path.resolve(__dirname, "..");
|
|
12
12
|
|
package/scripts/parity-check.js
CHANGED
|
@@ -15,8 +15,16 @@
|
|
|
15
15
|
// `cw <cmd> --json` payload must equal the `cw_<tool>` MCP result on a real
|
|
16
16
|
// bootstrap run (whitespace + generation-moment ISO timestamps aside).
|
|
17
17
|
//
|
|
18
|
-
// The registry (src/capability-
|
|
19
|
-
// the single source of truth; this script never re-declares capabilities.
|
|
18
|
+
// The registry (src/core/capability-table.ts -> dist/core/capability-table.js)
|
|
19
|
+
// is the single source of truth; this script never re-declares capabilities.
|
|
20
|
+
//
|
|
21
|
+
// v2 repoint: the old flat dist/capability-registry.js, dist/orchestrator.js,
|
|
22
|
+
// dist/state.js, dist/state-node.js are gone. Each function this script
|
|
23
|
+
// actually calls now lives in its v2 core/shell home:
|
|
24
|
+
// - registry (capability + parity planning data) -> core/capability-table.js
|
|
25
|
+
// - formatHelp -> core/format/help.js
|
|
26
|
+
// - loadRunFromCwd, saveCheckpoint -> shell/run-store.js
|
|
27
|
+
// - appendRunNode, createStateNode -> core/state/state-node.js
|
|
20
28
|
|
|
21
29
|
const assert = require("node:assert/strict");
|
|
22
30
|
const { execFileSync, spawn } = require("node:child_process");
|
|
@@ -29,10 +37,10 @@ const pluginRoot = path.resolve(__dirname, "..");
|
|
|
29
37
|
const node = process.execPath;
|
|
30
38
|
const cli = path.join(pluginRoot, "dist", "cli.js");
|
|
31
39
|
const mcpServer = path.join(pluginRoot, "dist", "mcp-server.js");
|
|
32
|
-
const registry = require(path.join(pluginRoot, "dist", "capability-
|
|
33
|
-
const { formatHelp } = require(path.join(pluginRoot, "dist", "
|
|
34
|
-
const { loadRunFromCwd, saveCheckpoint } = require(path.join(pluginRoot, "dist", "
|
|
35
|
-
const { appendRunNode, createStateNode } = require(path.join(pluginRoot, "dist", "state-node.js"));
|
|
40
|
+
const registry = require(path.join(pluginRoot, "dist", "core", "capability-table.js"));
|
|
41
|
+
const { formatHelp } = require(path.join(pluginRoot, "dist", "core", "format", "help.js"));
|
|
42
|
+
const { loadRunFromCwd, saveCheckpoint } = require(path.join(pluginRoot, "dist", "shell", "run-store.js"));
|
|
43
|
+
const { appendRunNode, createStateNode } = require(path.join(pluginRoot, "dist", "core", "state", "state-node.js"));
|
|
36
44
|
|
|
37
45
|
function capById(id) {
|
|
38
46
|
const cap = registry.CAPABILITY_REGISTRY.find((entry) => entry.capability === id);
|
|
@@ -64,21 +72,20 @@ function liveMcpTools() {
|
|
|
64
72
|
}
|
|
65
73
|
|
|
66
74
|
function cliDispatchTokens() {
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
// v2 dispatch is table-driven (findCapabilityByCliPath over REGISTRY), not a
|
|
76
|
+
// switch, so the token set is the union of every CLI capability's accepted
|
|
77
|
+
// first tokens (cli.caseTokens where an alias set is declared, else cli.path).
|
|
78
|
+
// The reachability check below then proves each declared path resolves through
|
|
79
|
+
// the live dispatcher — replacing the old `case "x":` dist source-grep.
|
|
80
|
+
return [...new Set(registry.cliCapabilities().flatMap((cap) => cap.cli.caseTokens ?? cap.cli.path))];
|
|
69
81
|
}
|
|
70
82
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const handlerFiles = fs.existsSync(handlersDir)
|
|
78
|
-
? fs.readdirSync(handlersDir).filter((name) => name.endsWith(".js")).map((name) => path.join(handlersDir, name))
|
|
79
|
-
: [];
|
|
80
|
-
return [cli, path.join(pluginRoot, "dist", "cli", "command-surface.js"), ...handlerFiles].filter((file) => fs.existsSync(file));
|
|
81
|
-
}
|
|
83
|
+
// Old-build top-level verbs kept in the frozen help "More commands" index line
|
|
84
|
+
// but folded in v2 into subcommands / the shell layer: init->app.init,
|
|
85
|
+
// search->run.search (declaredCliHelpTokens collapses both to app/run), and
|
|
86
|
+
// update is a shell-level command with no capability-table row. Help-index
|
|
87
|
+
// discovery text, not dispatch-parity tokens — exclude them.
|
|
88
|
+
const HELP_INDEX_ONLY_TOKENS = new Set(["init", "search", "update"]);
|
|
82
89
|
|
|
83
90
|
function cliHelpTokens() {
|
|
84
91
|
const lines = formatHelp().split(/\r?\n/);
|
|
@@ -91,7 +98,7 @@ function cliHelpTokens() {
|
|
|
91
98
|
const first = trimmed.split(/\s+/)[0];
|
|
92
99
|
for (const token of first.split("|")) {
|
|
93
100
|
const clean = token.replace(/[<[].*$/, "");
|
|
94
|
-
if (clean) tokens.add(clean);
|
|
101
|
+
if (clean && !HELP_INDEX_ONLY_TOKENS.has(clean)) tokens.add(clean);
|
|
95
102
|
}
|
|
96
103
|
}
|
|
97
104
|
return [...tokens].sort();
|
|
@@ -101,8 +108,18 @@ function cliHelpTokens() {
|
|
|
101
108
|
// Generation-moment ISO timestamps are presentation metadata, not capability
|
|
102
109
|
// data: the same field carries the wall-clock instant of the render. Neutralize
|
|
103
110
|
// them (and only them) before comparison so we assert canonical-payload identity.
|
|
111
|
+
// Also neutralize the metrics fields derived from a live run's `updatedAt`
|
|
112
|
+
// (wallClockMs = elapsed-since-updatedAt; sourceFingerprint / freshness's
|
|
113
|
+
// current+persisted fingerprints = a hash folding updatedAt). These drift
|
|
114
|
+
// between two separate reads (the CLI subprocess vs the in-process MCP call) of
|
|
115
|
+
// the SAME unchanged run — the same non-determinism web-desktop-workbench-smoke
|
|
116
|
+
// neutralizes with its canonicalStable. Only the workbench/metrics payloads
|
|
117
|
+
// carry these fields, so the extra replacements are a no-op elsewhere.
|
|
104
118
|
function canonical(value) {
|
|
105
|
-
return JSON.stringify(value)
|
|
119
|
+
return JSON.stringify(value)
|
|
120
|
+
.replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z/g, "<ts>")
|
|
121
|
+
.replace(/"wallClockMs":\d+/g, '"wallClockMs":<ms>')
|
|
122
|
+
.replace(/"(sourceFingerprint|currentFingerprint|persistedFingerprint)":"[^"]*"/g, '"$1":"<fp>"');
|
|
106
123
|
}
|
|
107
124
|
|
|
108
125
|
function escapeRegExp(value) {
|
package/scripts/release-flow.js
CHANGED
|
@@ -233,9 +233,9 @@ function delegateReview(resultPath, inputPath) {
|
|
|
233
233
|
// Reuse the canonical agent-config resolver (flags > env > file).
|
|
234
234
|
let resolveAgentConfig;
|
|
235
235
|
try {
|
|
236
|
-
({ resolveAgentConfig } = require(path.join(pluginRoot, "dist", "agent-config.js")));
|
|
236
|
+
({ resolveAgentConfig } = require(path.join(pluginRoot, "dist", "shell", "agent-config.js")));
|
|
237
237
|
} catch (e) {
|
|
238
|
-
die("cannot load dist/agent-config.js — run `npm run build` first", String(e));
|
|
238
|
+
die("cannot load dist/shell/agent-config.js — run `npm run build` first", String(e));
|
|
239
239
|
}
|
|
240
240
|
const cfg = resolveAgentConfig(
|
|
241
241
|
{ "agent-command": val("--agent-command"), "agent-model": val("--agent-model") },
|
|
@@ -25,51 +25,55 @@ const CHECK = process.argv.includes("--check");
|
|
|
25
25
|
const REPO_ONLY = process.argv.includes("--repo-only");
|
|
26
26
|
const indexPathOverride = process.env.CW_PROJECT_INDEX_PATH || "";
|
|
27
27
|
|
|
28
|
+
// v2 layout: src/ splits into a pure core/ (state kernel, pipeline decisions,
|
|
29
|
+
// multi-agent decisions, workflow-app schema) and an impure shell/ (file IO,
|
|
30
|
+
// CLI/MCP wiring, worker sandboxing). Paths below are relative to src/ and
|
|
31
|
+
// may include a subdirectory — the render step keeps the full relative path
|
|
32
|
+
// as both the link target and the label, so the table also shows which
|
|
33
|
+
// layer (core vs shell) each module lives in.
|
|
28
34
|
const moduleCatalog = {
|
|
29
35
|
"Core runtime": [
|
|
30
|
-
["orchestrator.ts", "Plans runs, loads workflows, records results, writes reports, and exposes runner commands."],
|
|
31
|
-
["
|
|
32
|
-
["state-node.ts", "Defines explicit state nodes, pipeline transitions, evidence checks, and node persistence."],
|
|
33
|
-
["pipeline
|
|
34
|
-
["pipeline
|
|
35
|
-
["types.ts", "Owns the shared
|
|
36
|
+
["shell/orchestrator.ts", "Plans runs, loads workflows, records results, writes reports, and exposes runner commands (a thin facade over the shell functions below)."],
|
|
37
|
+
["shell/run-store.ts", "Persists run checkpoints, JSON state, run paths, and state migration entrypoints."],
|
|
38
|
+
["core/state/state-node.ts", "Defines explicit state nodes, pipeline transitions, evidence checks, and node persistence."],
|
|
39
|
+
["core/pipeline/contract.ts", "Builds the default pipeline contract used by run state."],
|
|
40
|
+
["core/pipeline/runner.ts", "Finds runnable stages and advances/fails pipeline nodes with retry-aware errors."],
|
|
41
|
+
["core/state/types.ts", "Owns the shared run/state types: WorkflowRun and everything it carries, StateNode, and the pipeline contract shape."]
|
|
36
42
|
],
|
|
37
43
|
"Verification and state gates": [
|
|
38
|
-
["verifier.ts", "Validates result envelopes, findings, evidence, and run gate completion."],
|
|
39
|
-
["commit.ts", "Creates verifier-gated commits and explicit manual checkpoints."],
|
|
40
|
-
["candidate-scoring.ts", "Registers, scores, ranks, selects, rejects, and summarizes candidate outputs."],
|
|
41
|
-
["error-feedback.ts", "Turns failures into persisted feedback records and correction tasks."],
|
|
42
|
-
["trust-audit.ts", "Records provenance, sandbox decisions, host attestations, and acceptance rationale."]
|
|
44
|
+
["shell/verifier.ts", "Validates result envelopes, findings, evidence, and run gate completion."],
|
|
45
|
+
["shell/commit.ts", "Creates verifier-gated commits and explicit manual checkpoints."],
|
|
46
|
+
["core/multi-agent/candidate-scoring.ts", "Registers, scores, ranks, selects, rejects, and summarizes candidate outputs."],
|
|
47
|
+
["core/pipeline/error-feedback.ts", "Turns failures into persisted feedback records and correction tasks."],
|
|
48
|
+
["shell/trust-audit.ts", "Records provenance, sandbox decisions, host attestations, and acceptance rationale."]
|
|
43
49
|
],
|
|
44
50
|
"Workers and policy": [
|
|
45
|
-
["dispatch.ts", "Selects runnable tasks and writes dispatch manifests."],
|
|
46
|
-
["worker-isolation.ts", "Allocates worker scopes, writes manifests, records worker outputs, and validates boundaries."],
|
|
47
|
-
["sandbox-profile.ts", "Resolves named sandbox policy contracts and validates read/write/command/network boundaries."],
|
|
48
|
-
["harness.ts", "Renders task files for dispatched work."]
|
|
51
|
+
["shell/dispatch.ts", "Selects runnable tasks and writes dispatch manifests."],
|
|
52
|
+
["shell/worker-isolation.ts", "Allocates worker scopes, writes manifests, records worker outputs, and validates boundaries."],
|
|
53
|
+
["shell/sandbox-profile.ts", "Resolves named sandbox policy contracts and validates read/write/command/network boundaries."],
|
|
54
|
+
["shell/harness.ts", "Renders task files for dispatched work."]
|
|
49
55
|
],
|
|
50
56
|
"Multi-agent layer": [
|
|
51
|
-
["multi-agent.ts", "Persists multi-agent runs, roles, groups, memberships, fanouts, and fanins."],
|
|
52
|
-
["coordinator.ts", "Owns blackboard topics, messages, context, artifacts, snapshots, and coordinator decisions."],
|
|
53
|
-
["topology.ts", "Defines and applies official map-reduce, debate, and judge-panel topologies."],
|
|
54
|
-
["multi-agent-host.ts", "Provides the preferred host loop for run, status, step, blackboard, score, and select."]
|
|
57
|
+
["core/multi-agent/runtime.ts", "Persists multi-agent runs, roles, groups, memberships, fanouts, and fanins."],
|
|
58
|
+
["core/multi-agent/coordinator.ts", "Owns blackboard topics, messages, context, artifacts, snapshots, and coordinator decisions."],
|
|
59
|
+
["core/multi-agent/topology.ts", "Defines and applies official map-reduce, debate, and judge-panel topologies."],
|
|
60
|
+
["shell/multi-agent-host.ts", "Provides the preferred host loop for run, status, step, blackboard, score, and select."]
|
|
55
61
|
],
|
|
56
62
|
"User and host surfaces": [
|
|
57
63
|
["cli.ts", "Routes human CLI commands to runtime, app, topology, multi-agent, and operator flows."],
|
|
58
64
|
["mcp-server.ts", "Exposes JSON-RPC/MCP tool parity for agent hosts."],
|
|
59
|
-
["operator-ux.ts", "Formats status, reports, graph, worker, candidate, feedback, commit, and trust summaries."],
|
|
60
|
-
["workflow-app-
|
|
61
|
-
["workflow-
|
|
62
|
-
["
|
|
63
|
-
["
|
|
64
|
-
["triggers.ts", "Bridges routine triggers to explicit workflow events."],
|
|
65
|
-
["version.ts", "Defines current package and state schema versions."]
|
|
65
|
+
["shell/operator-ux.ts", "Formats status, reports, graph, worker, candidate, feedback, commit, and trust summaries."],
|
|
66
|
+
["shell/workflow-app-loader.ts", "Validates app manifests and loads app entrypoints."],
|
|
67
|
+
["core/workflow-apps/app-schema.ts", "Provides the fluent workflow, phase, task, artifact, and input API."],
|
|
68
|
+
["shell/scheduler-io.ts", "Runs wall-clock schedules, the desktop scheduler daemon tick, and routine triggers."],
|
|
69
|
+
["core/version.ts", "Defines current package and state schema versions."]
|
|
66
70
|
]
|
|
67
71
|
};
|
|
68
72
|
|
|
69
73
|
function main() {
|
|
70
74
|
const apps = listApps();
|
|
71
75
|
const docs = listMarkdown(path.join(pluginRoot, "docs"));
|
|
72
|
-
const sourceFiles =
|
|
76
|
+
const sourceFiles = listFilesRecursive(path.join(pluginRoot, "src"), ".ts");
|
|
73
77
|
const smokeTests = listFiles(path.join(pluginRoot, "test"), ".js").filter((file) => file.endsWith("-smoke.js"));
|
|
74
78
|
const context = { apps, docs, sourceFiles, smokeTests };
|
|
75
79
|
|
|
@@ -184,6 +188,26 @@ function listFiles(dir, extension) {
|
|
|
184
188
|
.sort();
|
|
185
189
|
}
|
|
186
190
|
|
|
191
|
+
// v2's src/ splits into core/ and shell/ subdirectories (see moduleCatalog's
|
|
192
|
+
// header note), so a flat top-level scan misses almost every file. Walk the
|
|
193
|
+
// whole tree and return paths relative to `dir` with forward slashes, so a
|
|
194
|
+
// catalog entry like "shell/orchestrator.ts" matches what this returns.
|
|
195
|
+
function listFilesRecursive(dir, extension) {
|
|
196
|
+
const out = [];
|
|
197
|
+
const walk = (current) => {
|
|
198
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
199
|
+
const full = path.join(current, entry.name);
|
|
200
|
+
if (entry.isDirectory()) {
|
|
201
|
+
walk(full);
|
|
202
|
+
} else if (entry.isFile() && entry.name.endsWith(extension)) {
|
|
203
|
+
out.push(path.relative(dir, full).split(path.sep).join("/"));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
walk(dir);
|
|
208
|
+
return out.sort();
|
|
209
|
+
}
|
|
210
|
+
|
|
187
211
|
function renderIndex(target, context) {
|
|
188
212
|
const link = linkFactory(target);
|
|
189
213
|
const lines = [];
|
|
@@ -17,8 +17,8 @@ const fs = require("node:fs");
|
|
|
17
17
|
const path = require("node:path");
|
|
18
18
|
|
|
19
19
|
const PLUGIN_ROOT = path.resolve(__dirname, "..");
|
|
20
|
-
const TYPES_FILE = path.join(PLUGIN_ROOT, "src", "
|
|
21
|
-
const SCHEMA_MODULE = path.join(PLUGIN_ROOT, "dist", "
|
|
20
|
+
const TYPES_FILE = path.join(PLUGIN_ROOT, "src", "core", "state", "types.ts");
|
|
21
|
+
const SCHEMA_MODULE = path.join(PLUGIN_ROOT, "dist", "core", "state", "schema.js");
|
|
22
22
|
|
|
23
23
|
function main() {
|
|
24
24
|
const errors = [];
|