@alevental/cccp 0.1.0

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 (127) hide show
  1. package/.claude/skills/cccp-pipeline/SKILL.md +562 -0
  2. package/.claude/skills/cccp-run/SKILL.md +111 -0
  3. package/README.md +280 -0
  4. package/dist/activity-bus.d.ts +9 -0
  5. package/dist/activity-bus.js +10 -0
  6. package/dist/activity-bus.js.map +1 -0
  7. package/dist/agent-resolver.d.ts +29 -0
  8. package/dist/agent-resolver.js +122 -0
  9. package/dist/agent-resolver.js.map +1 -0
  10. package/dist/agent.d.ts +39 -0
  11. package/dist/agent.js +117 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/autoresearch.d.ts +11 -0
  14. package/dist/autoresearch.js +295 -0
  15. package/dist/autoresearch.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +157 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +126 -0
  20. package/dist/config.js +76 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/context.d.ts +24 -0
  23. package/dist/context.js +82 -0
  24. package/dist/context.js.map +1 -0
  25. package/dist/contract.d.ts +26 -0
  26. package/dist/contract.js +65 -0
  27. package/dist/contract.js.map +1 -0
  28. package/dist/db.d.ts +70 -0
  29. package/dist/db.js +358 -0
  30. package/dist/db.js.map +1 -0
  31. package/dist/dispatcher.d.ts +9 -0
  32. package/dist/dispatcher.js +7 -0
  33. package/dist/dispatcher.js.map +1 -0
  34. package/dist/errors.d.ts +16 -0
  35. package/dist/errors.js +30 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/evaluator.d.ts +23 -0
  38. package/dist/evaluator.js +49 -0
  39. package/dist/evaluator.js.map +1 -0
  40. package/dist/gate/auto-approve.d.ts +9 -0
  41. package/dist/gate/auto-approve.js +11 -0
  42. package/dist/gate/auto-approve.js.map +1 -0
  43. package/dist/gate/gate-strategy.d.ts +22 -0
  44. package/dist/gate/gate-strategy.js +2 -0
  45. package/dist/gate/gate-strategy.js.map +1 -0
  46. package/dist/gate/gate-watcher.d.ts +15 -0
  47. package/dist/gate/gate-watcher.js +64 -0
  48. package/dist/gate/gate-watcher.js.map +1 -0
  49. package/dist/logger.d.ts +24 -0
  50. package/dist/logger.js +22 -0
  51. package/dist/logger.js.map +1 -0
  52. package/dist/mcp/gate-notifier.d.ts +26 -0
  53. package/dist/mcp/gate-notifier.js +161 -0
  54. package/dist/mcp/gate-notifier.js.map +1 -0
  55. package/dist/mcp/mcp-config.d.ts +25 -0
  56. package/dist/mcp/mcp-config.js +80 -0
  57. package/dist/mcp/mcp-config.js.map +1 -0
  58. package/dist/mcp/mcp-server.d.ts +1 -0
  59. package/dist/mcp/mcp-server.js +262 -0
  60. package/dist/mcp/mcp-server.js.map +1 -0
  61. package/dist/pge.d.ts +12 -0
  62. package/dist/pge.js +361 -0
  63. package/dist/pge.js.map +1 -0
  64. package/dist/pipeline.d.ts +6 -0
  65. package/dist/pipeline.js +120 -0
  66. package/dist/pipeline.js.map +1 -0
  67. package/dist/prompt.d.ts +67 -0
  68. package/dist/prompt.js +121 -0
  69. package/dist/prompt.js.map +1 -0
  70. package/dist/runner.d.ts +11 -0
  71. package/dist/runner.js +494 -0
  72. package/dist/runner.js.map +1 -0
  73. package/dist/scaffold/index.d.ts +14 -0
  74. package/dist/scaffold/index.js +260 -0
  75. package/dist/scaffold/index.js.map +1 -0
  76. package/dist/scaffold/templates.d.ts +47 -0
  77. package/dist/scaffold/templates.js +2177 -0
  78. package/dist/scaffold/templates.js.map +1 -0
  79. package/dist/stage-helpers.d.ts +7 -0
  80. package/dist/stage-helpers.js +27 -0
  81. package/dist/stage-helpers.js.map +1 -0
  82. package/dist/state.d.ts +43 -0
  83. package/dist/state.js +177 -0
  84. package/dist/state.js.map +1 -0
  85. package/dist/stream/stream-tail.d.ts +17 -0
  86. package/dist/stream/stream-tail.js +95 -0
  87. package/dist/stream/stream-tail.js.map +1 -0
  88. package/dist/stream/stream.d.ts +142 -0
  89. package/dist/stream/stream.js +251 -0
  90. package/dist/stream/stream.js.map +1 -0
  91. package/dist/temp-tracker.d.ts +6 -0
  92. package/dist/temp-tracker.js +24 -0
  93. package/dist/temp-tracker.js.map +1 -0
  94. package/dist/tui/cmux.d.ts +22 -0
  95. package/dist/tui/cmux.js +82 -0
  96. package/dist/tui/cmux.js.map +1 -0
  97. package/dist/tui/components.d.ts +21 -0
  98. package/dist/tui/components.js +108 -0
  99. package/dist/tui/components.js.map +1 -0
  100. package/dist/tui/dashboard.d.ts +6 -0
  101. package/dist/tui/dashboard.js +125 -0
  102. package/dist/tui/dashboard.js.map +1 -0
  103. package/dist/tui/detail-log.d.ts +10 -0
  104. package/dist/tui/detail-log.js +171 -0
  105. package/dist/tui/detail-log.js.map +1 -0
  106. package/dist/types.d.ts +273 -0
  107. package/dist/types.js +2 -0
  108. package/dist/types.js.map +1 -0
  109. package/examples/agents/diff-evaluator.md +57 -0
  110. package/examples/agents/prompt-tuner.md +30 -0
  111. package/examples/agents/summarizer.md +14 -0
  112. package/examples/autoresearch-artifacts/expected-output.md +17 -0
  113. package/examples/autoresearch-artifacts/prompt.md +35 -0
  114. package/examples/autoresearch-artifacts/source-material.md +28 -0
  115. package/examples/business-case.yaml +41 -0
  116. package/examples/cccp.yaml +48 -0
  117. package/examples/content-calendar.yaml +59 -0
  118. package/examples/customer-feedback-loop.yaml +44 -0
  119. package/examples/design-sprint.yaml +54 -0
  120. package/examples/feature-development.yaml +96 -0
  121. package/examples/growth-experiment.yaml +49 -0
  122. package/examples/incident-runbook.yaml +43 -0
  123. package/examples/product-launch.yaml +85 -0
  124. package/examples/prompt-tuning.yaml +25 -0
  125. package/examples/quarterly-planning.yaml +51 -0
  126. package/examples/sprint-cycle.yaml +67 -0
  127. package/package.json +47 -0
package/dist/runner.js ADDED
@@ -0,0 +1,494 @@
1
+ import { resolve } from "node:path";
2
+ import { activityBus } from "./activity-bus.js";
3
+ import { resolveAgent } from "./agent-resolver.js";
4
+ import { DefaultAgentDispatcher } from "./dispatcher.js";
5
+ import { AgentCrashError, MissingOutputError } from "./errors.js";
6
+ import { FilesystemGateStrategy } from "./gate/gate-watcher.js";
7
+ import { ConsoleLogger } from "./logger.js";
8
+ import { writeMcpConfigFile } from "./mcp/mcp-config.js";
9
+ import { runAutoresearchCycle } from "./autoresearch.js";
10
+ import { runPgeCycle } from "./pge.js";
11
+ import { interpolate, resolveTaskBody, loadAgentMarkdown, buildTaskContext, writeSystemPromptFile } from "./prompt.js";
12
+ import { updatePipelineStatus, notifyPipelineComplete } from "./tui/cmux.js";
13
+ import { createState, saveState, saveStateWithEvent, updateStageStatus, finishPipeline, findResumePoint, } from "./state.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers
16
+ // ---------------------------------------------------------------------------
17
+ function getLogger(ctx) {
18
+ return ctx.logger ?? new ConsoleLogger();
19
+ }
20
+ function getDispatcher(ctx) {
21
+ return ctx.dispatcher ?? new DefaultAgentDispatcher();
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Stage dispatch — type: agent
25
+ // ---------------------------------------------------------------------------
26
+ async function runAgentStage(stage, ctx) {
27
+ const start = Date.now();
28
+ const vars = { ...ctx.variables, ...(stage.variables ?? {}) };
29
+ const taskDescription = await resolveTaskBody(stage, vars, `Execute stage: ${stage.name}`);
30
+ const output = stage.output ? interpolate(stage.output, vars) : undefined;
31
+ const inputs = stage.inputs?.map((i) => interpolate(i, vars));
32
+ const userPrompt = buildTaskContext({
33
+ task: taskDescription,
34
+ inputs,
35
+ output,
36
+ });
37
+ // In dry-run mode, try to resolve but don't fail if files are missing.
38
+ if (ctx.dryRun) {
39
+ let resolvedPath = stage.agent;
40
+ try {
41
+ const resolved = await resolveAgent(stage.agent, ctx.agentSearchPaths, stage.operation, ctx.projectDir);
42
+ resolvedPath = resolved.agentPath;
43
+ }
44
+ catch {
45
+ resolvedPath = `${stage.agent} (not found — will resolve at runtime)`;
46
+ }
47
+ const logger = getLogger(ctx);
48
+ logger.log("\n[dry-run] Stage:", stage.name);
49
+ logger.log(" agent: ", resolvedPath);
50
+ if (stage.operation)
51
+ logger.log(" operation: ", stage.operation);
52
+ if (stage.mcp_profile)
53
+ logger.log(" mcp: ", stage.mcp_profile);
54
+ if (inputs?.length)
55
+ logger.log(" inputs: ", inputs.join(", "));
56
+ if (output)
57
+ logger.log(" output: ", output);
58
+ logger.log(" user prompt:");
59
+ for (const line of userPrompt.split("\n")) {
60
+ logger.log(" " + line);
61
+ }
62
+ return {
63
+ stageName: stage.name,
64
+ status: "passed",
65
+ result: { exitCode: 0, outputExists: false, durationMs: 0 },
66
+ durationMs: 0,
67
+ };
68
+ }
69
+ // Resolve agent via search paths.
70
+ const resolved = await resolveAgent(stage.agent, ctx.agentSearchPaths, stage.operation, ctx.projectDir);
71
+ const agentMarkdown = await loadAgentMarkdown(resolved.agentPath, resolved.operationPath);
72
+ const systemPromptFile = await writeSystemPromptFile(agentMarkdown, ctx.tempTracker);
73
+ const mcpConfigFile = ctx.projectConfig
74
+ ? await writeMcpConfigFile(stage.mcp_profile, ctx.projectConfig, ctx.tempTracker)
75
+ : undefined;
76
+ const result = await getDispatcher(ctx).dispatch({
77
+ userPrompt,
78
+ systemPromptFile,
79
+ mcpConfigFile,
80
+ expectedOutput: output ? resolve(ctx.projectDir, output) : undefined,
81
+ cwd: ctx.projectDir,
82
+ allowedTools: stage.allowed_tools,
83
+ agentName: stage.agent.replace(/[/\\]/g, "-").replace(/\.md$/, ""),
84
+ streamLogDir: resolve(ctx.artifactDir, ".cccp"),
85
+ claudeConfigDir: ctx.projectConfig?.claude_config_dir,
86
+ permissionMode: ctx.projectConfig?.permission_mode,
87
+ onActivity: (activity) => activityBus.emit("activity", activity),
88
+ quiet: ctx.quiet,
89
+ });
90
+ if (result.exitCode !== 0) {
91
+ throw new AgentCrashError(stage.agent, result.exitCode);
92
+ }
93
+ if (output && !result.outputExists) {
94
+ throw new MissingOutputError(stage.agent, output);
95
+ }
96
+ return {
97
+ stageName: stage.name,
98
+ status: "passed",
99
+ result,
100
+ durationMs: Date.now() - start,
101
+ };
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // Stage dispatch — type: pge
105
+ // ---------------------------------------------------------------------------
106
+ async function runPgeStage(stage, ctx, state) {
107
+ const start = Date.now();
108
+ const pgeResult = await runPgeCycle(stage, ctx, state, async (eventType, eventData) => {
109
+ if (eventType) {
110
+ await saveStateWithEvent(state, eventType, stage.name, eventData);
111
+ }
112
+ else {
113
+ await saveState(state);
114
+ }
115
+ });
116
+ if (pgeResult.outcome === "pass") {
117
+ return {
118
+ stageName: stage.name,
119
+ status: "passed",
120
+ result: pgeResult,
121
+ durationMs: Date.now() - start,
122
+ };
123
+ }
124
+ if (pgeResult.outcome === "error") {
125
+ return {
126
+ stageName: stage.name,
127
+ status: "error",
128
+ result: pgeResult,
129
+ error: "Evaluation parse error",
130
+ durationMs: Date.now() - start,
131
+ };
132
+ }
133
+ // outcome === "fail" — apply escalation strategy
134
+ const strategy = stage.on_fail ?? "stop";
135
+ switch (strategy) {
136
+ case "stop":
137
+ return {
138
+ stageName: stage.name,
139
+ status: "failed",
140
+ result: pgeResult,
141
+ error: `Failed after ${pgeResult.iterations}/${pgeResult.maxIterations} iterations`,
142
+ durationMs: Date.now() - start,
143
+ };
144
+ case "skip":
145
+ getLogger(ctx).log(` escalation: skip — continuing pipeline`);
146
+ return {
147
+ stageName: stage.name,
148
+ status: "skipped",
149
+ result: pgeResult,
150
+ durationMs: Date.now() - start,
151
+ };
152
+ case "human_gate":
153
+ if (!ctx.gateStrategy) {
154
+ getLogger(ctx).log(` escalation: human_gate — no gate strategy, stopping`);
155
+ return {
156
+ stageName: stage.name,
157
+ status: "failed",
158
+ result: pgeResult,
159
+ error: `Failed after ${pgeResult.iterations} iterations (no gate strategy configured)`,
160
+ durationMs: Date.now() - start,
161
+ };
162
+ }
163
+ getLogger(ctx).log(` escalation: human_gate — awaiting approval`);
164
+ const gateInfo = {
165
+ stageName: stage.name,
166
+ status: "pending",
167
+ prompt: `PGE stage "${stage.name}" failed after ${pgeResult.iterations} iterations. Approve to continue or reject to stop.`,
168
+ };
169
+ state.gate = gateInfo;
170
+ await saveState(state);
171
+ const gateResponse = await ctx.gateStrategy.waitForGate(gateInfo);
172
+ state.gate = undefined;
173
+ await saveState(state);
174
+ if (gateResponse.approved) {
175
+ getLogger(ctx).log(` gate approved — continuing pipeline`);
176
+ return {
177
+ stageName: stage.name,
178
+ status: "skipped",
179
+ result: pgeResult,
180
+ durationMs: Date.now() - start,
181
+ };
182
+ }
183
+ return {
184
+ stageName: stage.name,
185
+ status: "failed",
186
+ result: pgeResult,
187
+ error: `Failed and gate rejected${gateResponse.feedback ? `: ${gateResponse.feedback}` : ""}`,
188
+ durationMs: Date.now() - start,
189
+ };
190
+ }
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Stage dispatch — type: autoresearch
194
+ // ---------------------------------------------------------------------------
195
+ async function runAutoresearchStage(stage, ctx, state) {
196
+ const start = Date.now();
197
+ const result = await runAutoresearchCycle(stage, ctx, state, async (eventType, eventData) => {
198
+ if (eventType) {
199
+ await saveStateWithEvent(state, eventType, stage.name, eventData);
200
+ }
201
+ else {
202
+ await saveState(state);
203
+ }
204
+ });
205
+ if (result.outcome === "pass") {
206
+ return {
207
+ stageName: stage.name,
208
+ status: "passed",
209
+ result,
210
+ durationMs: Date.now() - start,
211
+ };
212
+ }
213
+ if (result.outcome === "error") {
214
+ return {
215
+ stageName: stage.name,
216
+ status: "error",
217
+ result,
218
+ error: "Evaluation parse error",
219
+ durationMs: Date.now() - start,
220
+ };
221
+ }
222
+ // outcome === "fail" — apply escalation strategy
223
+ const strategy = stage.on_fail ?? "stop";
224
+ const iterLabel = result.maxIterations
225
+ ? `${result.iterations}/${result.maxIterations}`
226
+ : `${result.iterations}`;
227
+ switch (strategy) {
228
+ case "stop":
229
+ return {
230
+ stageName: stage.name,
231
+ status: "failed",
232
+ result,
233
+ error: `Failed after ${iterLabel} iterations`,
234
+ durationMs: Date.now() - start,
235
+ };
236
+ case "skip":
237
+ getLogger(ctx).log(` escalation: skip — continuing pipeline`);
238
+ return {
239
+ stageName: stage.name,
240
+ status: "skipped",
241
+ result,
242
+ durationMs: Date.now() - start,
243
+ };
244
+ case "human_gate":
245
+ if (!ctx.gateStrategy) {
246
+ getLogger(ctx).log(` escalation: human_gate — no gate strategy, stopping`);
247
+ return {
248
+ stageName: stage.name,
249
+ status: "failed",
250
+ result,
251
+ error: `Failed after ${iterLabel} iterations (no gate strategy configured)`,
252
+ durationMs: Date.now() - start,
253
+ };
254
+ }
255
+ getLogger(ctx).log(` escalation: human_gate — awaiting approval`);
256
+ const gateInfo = {
257
+ stageName: stage.name,
258
+ status: "pending",
259
+ prompt: `Autoresearch stage "${stage.name}" failed after ${iterLabel} iterations. Approve to continue or reject to stop.`,
260
+ };
261
+ state.gate = gateInfo;
262
+ await saveState(state);
263
+ const gateResponse = await ctx.gateStrategy.waitForGate(gateInfo);
264
+ state.gate = undefined;
265
+ await saveState(state);
266
+ if (gateResponse.approved) {
267
+ getLogger(ctx).log(` gate approved — continuing pipeline`);
268
+ return {
269
+ stageName: stage.name,
270
+ status: "skipped",
271
+ result,
272
+ durationMs: Date.now() - start,
273
+ };
274
+ }
275
+ return {
276
+ stageName: stage.name,
277
+ status: "failed",
278
+ result,
279
+ error: `Failed and gate rejected${gateResponse.feedback ? `: ${gateResponse.feedback}` : ""}`,
280
+ durationMs: Date.now() - start,
281
+ };
282
+ }
283
+ }
284
+ // ---------------------------------------------------------------------------
285
+ // Stage dispatch — type: human_gate
286
+ // ---------------------------------------------------------------------------
287
+ async function runHumanGateStage(stage, ctx, state) {
288
+ const start = Date.now();
289
+ // Dry-run: just show what would happen.
290
+ if (ctx.dryRun) {
291
+ const logger = getLogger(ctx);
292
+ logger.log("\n[dry-run] Human Gate:", stage.name);
293
+ if (stage.prompt)
294
+ logger.log(" prompt: ", stage.prompt);
295
+ if (stage.artifacts?.length)
296
+ logger.log(" artifacts: ", stage.artifacts.join(", "));
297
+ logger.log(" on_reject: ", stage.on_reject ?? "stop");
298
+ return {
299
+ stageName: stage.name,
300
+ status: "passed",
301
+ durationMs: 0,
302
+ };
303
+ }
304
+ // No gate strategy configured — skip with warning.
305
+ if (!ctx.gateStrategy) {
306
+ getLogger(ctx).log(` [skip] No gate strategy configured (stage: ${stage.name})`);
307
+ return {
308
+ stageName: stage.name,
309
+ status: "skipped",
310
+ durationMs: 0,
311
+ };
312
+ }
313
+ // Write gate_pending to state.
314
+ const gateInfo = {
315
+ stageName: stage.name,
316
+ status: "pending",
317
+ prompt: stage.prompt,
318
+ };
319
+ state.gate = gateInfo;
320
+ await saveState(state);
321
+ // Wait for response via the gate strategy.
322
+ const response = await ctx.gateStrategy.waitForGate(gateInfo);
323
+ // Clear gate from state.
324
+ state.gate = undefined;
325
+ await saveState(state);
326
+ if (response.approved) {
327
+ return {
328
+ stageName: stage.name,
329
+ status: "passed",
330
+ durationMs: Date.now() - start,
331
+ };
332
+ }
333
+ // Rejected.
334
+ const onReject = stage.on_reject ?? "stop";
335
+ if (onReject === "stop") {
336
+ return {
337
+ stageName: stage.name,
338
+ status: "failed",
339
+ error: `Gate rejected${response.feedback ? `: ${response.feedback}` : ""}`,
340
+ durationMs: Date.now() - start,
341
+ };
342
+ }
343
+ // on_reject: retry — for now, treat same as stop since retry needs
344
+ // the previous generator context which is stage-dependent.
345
+ return {
346
+ stageName: stage.name,
347
+ status: "failed",
348
+ error: `Gate rejected (retry not yet supported)${response.feedback ? `: ${response.feedback}` : ""}`,
349
+ durationMs: Date.now() - start,
350
+ };
351
+ }
352
+ // ---------------------------------------------------------------------------
353
+ // Stage router
354
+ // ---------------------------------------------------------------------------
355
+ async function runStage(stage, ctx, state) {
356
+ switch (stage.type) {
357
+ case "agent":
358
+ return runAgentStage(stage, ctx);
359
+ case "pge":
360
+ return runPgeStage(stage, ctx, state);
361
+ case "human_gate":
362
+ return runHumanGateStage(stage, ctx, state);
363
+ case "autoresearch":
364
+ return runAutoresearchStage(stage, ctx, state);
365
+ }
366
+ }
367
+ /**
368
+ * Run all stages in a pipeline sequentially.
369
+ * Persists state to disk after every stage transition.
370
+ * Returns the overall pipeline result.
371
+ */
372
+ export async function runPipeline(ctx, opts) {
373
+ const start = Date.now();
374
+ const results = [];
375
+ let pipelineStatus = "passed";
376
+ // --- State initialization ---
377
+ let state;
378
+ let skipUntilIndex = -1;
379
+ if (opts?.existingState) {
380
+ state = opts.existingState;
381
+ state.status = "running";
382
+ const resume = findResumePoint(state);
383
+ if (resume) {
384
+ skipUntilIndex = resume.stageIndex;
385
+ getLogger(ctx).log(`\nCCCP: Resuming pipeline "${ctx.pipeline.name}" from stage "${resume.stageName}"\n`);
386
+ }
387
+ else {
388
+ getLogger(ctx).log(`\nCCCP: Pipeline "${ctx.pipeline.name}" has no resumable stages\n`);
389
+ return {
390
+ pipeline: ctx.pipeline.name,
391
+ project: ctx.project,
392
+ stages: [],
393
+ status: "passed",
394
+ durationMs: 0,
395
+ };
396
+ }
397
+ }
398
+ else {
399
+ state = createState(ctx.pipeline.name, ctx.project, ctx.pipelineFile, ctx.pipeline.stages.map((s) => ({ name: s.name, type: s.type })), ctx.artifactDir, ctx.projectDir);
400
+ getLogger(ctx).log(`\nCCCP: Running pipeline "${ctx.pipeline.name}" for project "${ctx.project}"\n`);
401
+ }
402
+ // Create gate strategy now that we have a runId.
403
+ if (!ctx.gateStrategy && !ctx.headless) {
404
+ ctx.gateStrategy = new FilesystemGateStrategy(state.runId, ctx.projectDir, ctx.quiet);
405
+ }
406
+ if (!ctx.dryRun) {
407
+ await saveState(state);
408
+ }
409
+ try {
410
+ for (let i = 0; i < ctx.pipeline.stages.length; i++) {
411
+ const stage = ctx.pipeline.stages[i];
412
+ // Skip completed stages on resume.
413
+ if (opts?.existingState && i < skipUntilIndex) {
414
+ const stageState = state.stages[stage.name];
415
+ if (stageState?.status === "passed" || stageState?.status === "skipped") {
416
+ getLogger(ctx).log(` ⏭ ${stage.name}: already ${stageState.status}`);
417
+ results.push({
418
+ stageName: stage.name,
419
+ status: stageState.status,
420
+ durationMs: stageState.durationMs ?? 0,
421
+ });
422
+ continue;
423
+ }
424
+ }
425
+ getLogger(ctx).log(`▸ Stage: ${stage.name} (${stage.type})`);
426
+ // Mark in_progress in state + update cmux.
427
+ if (!ctx.dryRun) {
428
+ updateStageStatus(state, stage.name, "in_progress");
429
+ await saveStateWithEvent(state, "stage_start", stage.name);
430
+ await updatePipelineStatus(stage.name, i, ctx.pipeline.stages.length);
431
+ }
432
+ try {
433
+ const result = await runStage(stage, ctx, state);
434
+ results.push(result);
435
+ // Persist stage result to state.
436
+ if (!ctx.dryRun) {
437
+ updateStageStatus(state, stage.name, result.status, {
438
+ durationMs: result.durationMs,
439
+ error: result.error,
440
+ });
441
+ await saveStateWithEvent(state, "stage_complete", stage.name, {
442
+ status: result.status,
443
+ durationMs: result.durationMs,
444
+ });
445
+ }
446
+ if (result.status === "failed" || result.status === "error") {
447
+ pipelineStatus = "failed";
448
+ getLogger(ctx).log(` ✗ ${stage.name}: ${result.status}${result.error ? ` — ${result.error}` : ""}`);
449
+ break;
450
+ }
451
+ const duration = result.durationMs > 0
452
+ ? ` (${(result.durationMs / 1000).toFixed(1)}s)`
453
+ : "";
454
+ getLogger(ctx).log(` ✓ ${stage.name}: ${result.status}${duration}`);
455
+ }
456
+ catch (err) {
457
+ const message = err instanceof Error ? err.message : String(err);
458
+ results.push({
459
+ stageName: stage.name,
460
+ status: "error",
461
+ error: message,
462
+ durationMs: Date.now() - start,
463
+ });
464
+ pipelineStatus = "error";
465
+ if (!ctx.dryRun) {
466
+ updateStageStatus(state, stage.name, "error", { error: message });
467
+ await saveState(state);
468
+ }
469
+ getLogger(ctx).error(` ✗ ${stage.name}: error — ${message}`);
470
+ break;
471
+ }
472
+ }
473
+ // Finalize state + notify cmux.
474
+ if (!ctx.dryRun) {
475
+ const finalStatus = pipelineStatus === "passed" ? "passed" : pipelineStatus === "error" ? "error" : "failed";
476
+ finishPipeline(state, finalStatus);
477
+ await saveStateWithEvent(state, "pipeline_complete", undefined, { status: finalStatus });
478
+ await notifyPipelineComplete(ctx.pipeline.name, pipelineStatus);
479
+ }
480
+ const durationMs = Date.now() - start;
481
+ getLogger(ctx).log(`\nPipeline "${ctx.pipeline.name}": ${pipelineStatus} (${(durationMs / 1000).toFixed(1)}s)\n`);
482
+ return {
483
+ pipeline: ctx.pipeline.name,
484
+ project: ctx.project,
485
+ stages: results,
486
+ status: pipelineStatus,
487
+ durationMs,
488
+ };
489
+ }
490
+ finally {
491
+ await ctx.tempTracker?.cleanup();
492
+ }
493
+ }
494
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Scaffold a minimal CCCP project: cccp.yaml, one example pipeline,
3
+ * and the core agents it references.
4
+ */
5
+ export declare function scaffoldProject(dir: string): Promise<void>;
6
+ export interface ExamplesOptions {
7
+ agentsOnly?: boolean;
8
+ pipelinesOnly?: boolean;
9
+ }
10
+ /**
11
+ * Scaffold the full set of template agents and example pipelines.
12
+ * Skips files that already exist.
13
+ */
14
+ export declare function scaffoldExamples(dir: string, opts?: ExamplesOptions): Promise<void>;