cool-workflow 0.2.0 → 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.
Files changed (97) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +7 -5
  4. package/apps/architecture-review/app.json +2 -2
  5. package/apps/architecture-review/workflow.js +12 -12
  6. package/apps/architecture-review-fast/app.json +1 -1
  7. package/apps/end-to-end-golden-path/app.json +1 -1
  8. package/apps/pr-review-fix-ci/app.json +1 -1
  9. package/apps/release-cut/app.json +1 -1
  10. package/apps/research-synthesis/app.json +1 -1
  11. package/dist/cli/dispatch.js +2 -2
  12. package/dist/cli/parseargv.js +2 -2
  13. package/dist/core/capability-table.js +13 -29
  14. package/dist/core/format/help.js +2 -2
  15. package/dist/core/hash.js +1 -1
  16. package/dist/core/multi-agent/candidate-scoring.js +1 -1
  17. package/dist/core/multi-agent/eval-replay.js +1 -1
  18. package/dist/core/multi-agent/runtime.js +2 -2
  19. package/dist/core/multi-agent/trust-policy.js +1 -1
  20. package/dist/core/pipeline/contract.js +1 -1
  21. package/dist/core/pipeline/drive-decide.js +1 -1
  22. package/dist/core/state/contract-migration.js +1 -1
  23. package/dist/core/state/migrations.js +2 -2
  24. package/dist/core/state/node-snapshot.js +1 -1
  25. package/dist/core/state/state-explosion/graph.js +4 -4
  26. package/dist/core/state/state-explosion/helpers.js +3 -3
  27. package/dist/core/state/state-explosion/report.js +1 -1
  28. package/dist/core/state/state-explosion/size.js +1 -1
  29. package/dist/core/state/state-node.js +2 -2
  30. package/dist/core/state/types.js +1 -1
  31. package/dist/core/trust/ledger.js +1 -1
  32. package/dist/core/trust/telemetry-attestation.js +3 -3
  33. package/dist/core/trust/telemetry-ledger.js +2 -2
  34. package/dist/core/version.js +1 -1
  35. package/dist/core/workflow-apps/app-schema.js +1 -1
  36. package/dist/mcp/dispatch.js +1 -1
  37. package/dist/mcp/server.js +1 -1
  38. package/dist/shell/agent-config.js +1 -1
  39. package/dist/shell/doctor.js +17 -4
  40. package/dist/shell/drive.js +21 -9
  41. package/dist/shell/execution-backend/agent.js +42 -10
  42. package/dist/shell/execution-backend/ci.js +1 -1
  43. package/dist/shell/execution-backend/container.js +1 -1
  44. package/dist/shell/execution-backend/envelopes.js +1 -1
  45. package/dist/shell/execution-backend/local.js +1 -1
  46. package/dist/shell/execution-backend/probes.js +1 -1
  47. package/dist/shell/execution-backend/registry.js +1 -1
  48. package/dist/shell/execution-backend/remote.js +1 -1
  49. package/dist/shell/execution-backend/types.js +1 -1
  50. package/dist/shell/fs-atomic.js +1 -1
  51. package/dist/shell/ledger-io.js +1 -1
  52. package/dist/shell/metrics-cli.js +4 -2
  53. package/dist/shell/multi-agent-host.js +1 -1
  54. package/dist/shell/reclamation-io.js +1 -1
  55. package/dist/shell/registry-cli.js +15 -0
  56. package/dist/shell/run-registry-io.js +1 -1
  57. package/dist/shell/sandbox-profile.js +1 -1
  58. package/dist/shell/scheduler-io.js +46 -37
  59. package/dist/shell/scheduling-io.js +32 -22
  60. package/dist/shell/telemetry-ledger-io.js +1 -1
  61. package/dist/shell/term.js +1 -1
  62. package/dist/shell/trust-audit.js +4 -3
  63. package/dist/shell/workbench-host.js +9 -1
  64. package/dist/shell/workbench.js +6 -11
  65. package/docs/agent-delegation-drive.7.md +2 -0
  66. package/docs/cli-mcp-parity.7.md +2 -0
  67. package/docs/contract-migration-tooling.7.md +2 -0
  68. package/docs/control-plane-scheduling.7.md +2 -0
  69. package/docs/durable-state-and-locking.7.md +2 -0
  70. package/docs/evidence-adoption-reasoning-chain.7.md +2 -0
  71. package/docs/execution-backends.7.md +2 -0
  72. package/docs/multi-agent-cli-mcp-surface.7.md +2 -0
  73. package/docs/multi-agent-eval-replay-harness.7.md +2 -0
  74. package/docs/multi-agent-operator-ux.7.md +2 -0
  75. package/docs/node-snapshot-diff-replay.7.md +2 -0
  76. package/docs/observability-cost-accounting.7.md +4 -1
  77. package/docs/project-index.md +8 -3
  78. package/docs/real-execution-backends.7.md +2 -0
  79. package/docs/release-and-migration.7.md +2 -0
  80. package/docs/release-tooling.7.md +2 -0
  81. package/docs/remote-source-review.7.md +4 -4
  82. package/docs/report-verifiable-bundle.7.md +1 -1
  83. package/docs/run-registry-control-plane.7.md +2 -0
  84. package/docs/run-retention-reclamation.7.md +2 -0
  85. package/docs/security-trust-hardening.7.md +3 -1
  86. package/docs/state-explosion-management.7.md +2 -0
  87. package/docs/team-collaboration.7.md +2 -0
  88. package/docs/web-desktop-workbench.7.md +13 -1
  89. package/manifest/plugin.manifest.json +1 -1
  90. package/package.json +1 -1
  91. package/scripts/agents/agent-adapter-core.js +22 -2
  92. package/scripts/agents/claude-p-agent.js +8 -3
  93. package/scripts/agents/gemini-agent.js +5 -1
  94. package/scripts/agents/opencode-agent.js +5 -1
  95. package/scripts/canonical-apps.js +4 -4
  96. package/scripts/dogfood-release.js +1 -1
  97. package/scripts/golden-path.js +4 -4
@@ -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 detail = childStderr.trim() || `claude exited ${code === null ? "(timeout/killed)" : code}`;
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 (childStderr.trim()) process.stderr.write(`${childStderr.trim()}\n`);
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
  }
@@ -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
- const detail = childStderr.trim() || `gemini exited ${code === null ? "(timeout/killed)" : code}`;
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
- const detail = childStderr.trim() || `opencode exited ${code === null ? "(timeout/killed)" : code}`;
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);
@@ -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.2.0",
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.2.0");
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.2.0");
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.2.0");
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`);
@@ -6,7 +6,7 @@ const fs = require("node:fs");
6
6
  const path = require("node:path");
7
7
  const { CoolWorkflowRunner } = require("../dist/shell/orchestrator.js");
8
8
 
9
- const TARGET_VERSION = "0.2.0";
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, "..", "..");
@@ -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.2.0");
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.2.0 end-to-end golden path."
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.2.0");
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\.2\.0/);
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/);