ralphy-spec 0.1.1 → 0.2.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 (176) hide show
  1. package/README.ja.md +74 -130
  2. package/README.ko.md +74 -130
  3. package/README.md +75 -133
  4. package/README.zh.md +74 -130
  5. package/bin/ralphy-spec.js +0 -0
  6. package/dist/cli/checkpoint.d.ts +3 -0
  7. package/dist/cli/checkpoint.d.ts.map +1 -0
  8. package/dist/cli/checkpoint.js +23 -0
  9. package/dist/cli/checkpoint.js.map +1 -0
  10. package/dist/cli/init.d.ts +3 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +66 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/report.d.ts +3 -0
  15. package/dist/cli/report.d.ts.map +1 -0
  16. package/dist/cli/report.js +53 -0
  17. package/dist/cli/report.js.map +1 -0
  18. package/dist/cli/run.d.ts +3 -0
  19. package/dist/cli/run.d.ts.map +1 -0
  20. package/dist/cli/run.js +79 -0
  21. package/dist/cli/run.js.map +1 -0
  22. package/dist/cli/status.d.ts +3 -0
  23. package/dist/cli/status.d.ts.map +1 -0
  24. package/dist/cli/status.js +45 -0
  25. package/dist/cli/status.js.map +1 -0
  26. package/dist/cli/tail.d.ts +3 -0
  27. package/dist/cli/tail.d.ts.map +1 -0
  28. package/dist/cli/tail.js +46 -0
  29. package/dist/cli/tail.js.map +1 -0
  30. package/dist/cli/update.d.ts +3 -0
  31. package/dist/cli/update.d.ts.map +1 -0
  32. package/dist/cli/update.js +62 -0
  33. package/dist/cli/update.js.map +1 -0
  34. package/dist/cli/validate.d.ts +3 -0
  35. package/dist/cli/validate.d.ts.map +1 -0
  36. package/dist/cli/validate.js +83 -0
  37. package/dist/cli/validate.js.map +1 -0
  38. package/dist/core/backends/claude-code.d.ts +17 -0
  39. package/dist/core/backends/claude-code.d.ts.map +1 -0
  40. package/dist/core/backends/claude-code.js +75 -0
  41. package/dist/core/backends/claude-code.js.map +1 -0
  42. package/dist/core/backends/cursor.d.ts +17 -0
  43. package/dist/core/backends/cursor.d.ts.map +1 -0
  44. package/dist/core/backends/cursor.js +75 -0
  45. package/dist/core/backends/cursor.js.map +1 -0
  46. package/dist/core/backends/noop.d.ts +10 -0
  47. package/dist/core/backends/noop.d.ts.map +1 -0
  48. package/dist/core/backends/noop.js +17 -0
  49. package/dist/core/backends/noop.js.map +1 -0
  50. package/dist/core/backends/opencode.d.ts +16 -0
  51. package/dist/core/backends/opencode.d.ts.map +1 -0
  52. package/dist/core/backends/opencode.js +73 -0
  53. package/dist/core/backends/opencode.js.map +1 -0
  54. package/dist/core/backends/types.d.ts +21 -0
  55. package/dist/core/backends/types.d.ts.map +1 -0
  56. package/dist/core/backends/types.js +3 -0
  57. package/dist/core/backends/types.js.map +1 -0
  58. package/dist/core/budgets/manager.d.ts +21 -0
  59. package/dist/core/budgets/manager.d.ts.map +1 -0
  60. package/dist/core/budgets/manager.js +48 -0
  61. package/dist/core/budgets/manager.js.map +1 -0
  62. package/dist/core/budgets/state.d.ts +25 -0
  63. package/dist/core/budgets/state.d.ts.map +1 -0
  64. package/dist/core/budgets/state.js +33 -0
  65. package/dist/core/budgets/state.js.map +1 -0
  66. package/dist/core/budgets/tiers.d.ts +32 -0
  67. package/dist/core/budgets/tiers.d.ts.map +1 -0
  68. package/dist/core/budgets/tiers.js +67 -0
  69. package/dist/core/budgets/tiers.js.map +1 -0
  70. package/dist/core/engine/context-pack.d.ts +12 -0
  71. package/dist/core/engine/context-pack.d.ts.map +1 -0
  72. package/dist/core/engine/context-pack.js +45 -0
  73. package/dist/core/engine/context-pack.js.map +1 -0
  74. package/dist/core/engine/loop.d.ts +28 -0
  75. package/dist/core/engine/loop.d.ts.map +1 -0
  76. package/dist/core/engine/loop.js +366 -0
  77. package/dist/core/engine/loop.js.map +1 -0
  78. package/dist/core/engine/phases.d.ts +2 -0
  79. package/dist/core/engine/phases.d.ts.map +1 -0
  80. package/dist/core/engine/phases.js +3 -0
  81. package/dist/core/engine/phases.js.map +1 -0
  82. package/dist/core/engine/repair.d.ts +6 -0
  83. package/dist/core/engine/repair.d.ts.map +1 -0
  84. package/dist/core/engine/repair.js +23 -0
  85. package/dist/core/engine/repair.js.map +1 -0
  86. package/dist/core/folders.d.ts +26 -0
  87. package/dist/core/folders.d.ts.map +1 -0
  88. package/dist/core/folders.js +58 -0
  89. package/dist/core/folders.js.map +1 -0
  90. package/dist/core/memory/ledger.d.ts +13 -0
  91. package/dist/core/memory/ledger.d.ts.map +1 -0
  92. package/dist/core/memory/ledger.js +24 -0
  93. package/dist/core/memory/ledger.js.map +1 -0
  94. package/dist/core/memory/persistence.d.ts +45 -0
  95. package/dist/core/memory/persistence.d.ts.map +1 -0
  96. package/dist/core/memory/persistence.js +162 -0
  97. package/dist/core/memory/persistence.js.map +1 -0
  98. package/dist/core/reporting/spend.d.ts +40 -0
  99. package/dist/core/reporting/spend.d.ts.map +1 -0
  100. package/dist/core/reporting/spend.js +157 -0
  101. package/dist/core/reporting/spend.js.map +1 -0
  102. package/dist/core/spec/dag.d.ts +7 -0
  103. package/dist/core/spec/dag.d.ts.map +1 -0
  104. package/dist/core/spec/dag.js +65 -0
  105. package/dist/core/spec/dag.js.map +1 -0
  106. package/dist/core/spec/file-contract.d.ts +13 -0
  107. package/dist/core/spec/file-contract.d.ts.map +1 -0
  108. package/dist/core/spec/file-contract.js +29 -0
  109. package/dist/core/spec/file-contract.js.map +1 -0
  110. package/dist/core/spec/loader.d.ts +8 -0
  111. package/dist/core/spec/loader.d.ts.map +1 -0
  112. package/dist/core/spec/loader.js +51 -0
  113. package/dist/core/spec/loader.js.map +1 -0
  114. package/dist/core/spec/schemas.d.ts +278 -0
  115. package/dist/core/spec/schemas.d.ts.map +1 -0
  116. package/dist/core/spec/schemas.js +207 -0
  117. package/dist/core/spec/schemas.js.map +1 -0
  118. package/dist/core/spec/types.d.ts +71 -0
  119. package/dist/core/spec/types.d.ts.map +1 -0
  120. package/dist/core/spec/types.js +3 -0
  121. package/dist/core/spec/types.js.map +1 -0
  122. package/dist/core/validators/parsers/eslint.d.ts +3 -0
  123. package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
  124. package/dist/core/validators/parsers/eslint.js +35 -0
  125. package/dist/core/validators/parsers/eslint.js.map +1 -0
  126. package/dist/core/validators/parsers/jest.d.ts +3 -0
  127. package/dist/core/validators/parsers/jest.d.ts.map +1 -0
  128. package/dist/core/validators/parsers/jest.js +16 -0
  129. package/dist/core/validators/parsers/jest.js.map +1 -0
  130. package/dist/core/validators/parsers/tsc.d.ts +3 -0
  131. package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
  132. package/dist/core/validators/parsers/tsc.js +32 -0
  133. package/dist/core/validators/parsers/tsc.js.map +1 -0
  134. package/dist/core/validators/runner.d.ts +8 -0
  135. package/dist/core/validators/runner.d.ts.map +1 -0
  136. package/dist/core/validators/runner.js +85 -0
  137. package/dist/core/validators/runner.js.map +1 -0
  138. package/dist/core/validators/signatures.d.ts +3 -0
  139. package/dist/core/validators/signatures.d.ts.map +1 -0
  140. package/dist/core/validators/signatures.js +10 -0
  141. package/dist/core/validators/signatures.js.map +1 -0
  142. package/dist/core/validators/types.d.ts +27 -0
  143. package/dist/core/validators/types.d.ts.map +1 -0
  144. package/dist/core/validators/types.js +3 -0
  145. package/dist/core/validators/types.js.map +1 -0
  146. package/dist/core/workspace/contract-enforcer.d.ts +54 -0
  147. package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
  148. package/dist/core/workspace/contract-enforcer.js +128 -0
  149. package/dist/core/workspace/contract-enforcer.js.map +1 -0
  150. package/dist/core/workspace/manager.d.ts +28 -0
  151. package/dist/core/workspace/manager.d.ts.map +1 -0
  152. package/dist/core/workspace/manager.js +3 -0
  153. package/dist/core/workspace/manager.js.map +1 -0
  154. package/dist/core/workspace/merge.d.ts +38 -0
  155. package/dist/core/workspace/merge.d.ts.map +1 -0
  156. package/dist/core/workspace/merge.js +92 -0
  157. package/dist/core/workspace/merge.js.map +1 -0
  158. package/dist/core/workspace/patch-mode.d.ts +22 -0
  159. package/dist/core/workspace/patch-mode.d.ts.map +1 -0
  160. package/dist/core/workspace/patch-mode.js +91 -0
  161. package/dist/core/workspace/patch-mode.js.map +1 -0
  162. package/dist/core/workspace/worktree-mode.d.ts +28 -0
  163. package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
  164. package/dist/core/workspace/worktree-mode.js +156 -0
  165. package/dist/core/workspace/worktree-mode.js.map +1 -0
  166. package/dist/index.js +14 -4
  167. package/dist/index.js.map +1 -1
  168. package/dist/templates/shared/openspec-tasks-template.md +23 -3
  169. package/dist/templates/shared/project-template.yml +232 -0
  170. package/dist/utils/installer.d.ts.map +1 -1
  171. package/dist/utils/installer.js +31 -1
  172. package/dist/utils/installer.js.map +1 -1
  173. package/dist/utils/validator.d.ts.map +1 -1
  174. package/dist/utils/validator.js +10 -0
  175. package/dist/utils/validator.js.map +1 -1
  176. package/package.json +11 -4
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerReportCommand = registerReportCommand;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const persistence_1 = require("../core/memory/persistence");
10
+ function registerReportCommand(program) {
11
+ program
12
+ .command("report")
13
+ .description("Generate a markdown report for the latest run")
14
+ .option("--out <filepath>", "Output markdown file", "ralphy-report.md")
15
+ .option("--json", "Machine-readable output", false)
16
+ .action(async (opts) => {
17
+ const repoRoot = process.cwd();
18
+ const persistence = await persistence_1.PersistenceLayer.openForRepo(repoRoot);
19
+ try {
20
+ const run = persistence.getLatestRun();
21
+ if (!run) {
22
+ process.stderr.write("No runs found.\n");
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ const ledger = persistence.listLedger({ runId: run.runId, limit: 500 });
27
+ const md = [
28
+ `# Ralphy Spec Report`,
29
+ ``,
30
+ `- Run ID: \`${run.runId}\``,
31
+ `- Status: \`${run.status}\``,
32
+ `- Started: \`${run.startedAt}\``,
33
+ ``,
34
+ `## Recent ledger`,
35
+ ``,
36
+ ...ledger.map((e) => `- ${e.ts} \`${e.kind}\`${e.taskId ? ` (\`${e.taskId}\`)` : ""}: ${e.message}`),
37
+ ``,
38
+ ].join("\n");
39
+ const outPath = node_path_1.default.resolve(repoRoot, opts.out);
40
+ await promises_1.default.writeFile(outPath, md, "utf8");
41
+ if (opts.json) {
42
+ process.stdout.write(JSON.stringify({ ok: true, runId: run.runId, out: outPath }, null, 2) + "\n");
43
+ }
44
+ else {
45
+ process.stdout.write(`Wrote ${outPath}\n`);
46
+ }
47
+ }
48
+ finally {
49
+ persistence.close();
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":";;;;;AAKA,sDAgDC;AApDD,gEAAkC;AAClC,0DAA6B;AAC7B,4DAA8D;AAE9D,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;SACtE,MAAM,CAAC,QAAQ,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAoC,EAAE,EAAE;QACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,8BAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACxE,MAAM,EAAE,GAAG;gBACT,sBAAsB;gBACtB,EAAE;gBACF,eAAe,GAAG,CAAC,KAAK,IAAI;gBAC5B,eAAe,GAAG,CAAC,MAAM,IAAI;gBAC7B,gBAAgB,GAAG,CAAC,SAAS,IAAI;gBACjC,EAAE;gBACF,kBAAkB;gBAClB,EAAE;gBACF,GAAG,MAAM,CAAC,GAAG,CACX,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CACjF;gBACD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC7E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerRunCommand(program: Command): void;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+EzD"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerRunCommand = registerRunCommand;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const loader_1 = require("../core/spec/loader");
9
+ const dag_1 = require("../core/spec/dag");
10
+ const noop_1 = require("../core/backends/noop");
11
+ const patch_mode_1 = require("../core/workspace/patch-mode");
12
+ const loop_1 = require("../core/engine/loop");
13
+ function registerRunCommand(program) {
14
+ program
15
+ .command("run")
16
+ .description("Execute the ralphy-spec engine loop")
17
+ .option("--backend <id>", "Backend id: cursor|opencode|claude-code", "cursor")
18
+ .option("--workspace <mode>", "Workspace mode: worktree|patch", "patch")
19
+ .option("--task <taskId>", "Run a single task (skips dependency checks)")
20
+ .option("--dry-run", "Validate spec and print plan only", false)
21
+ .option("--json", "Machine-readable output", false)
22
+ .action(async (opts) => {
23
+ const repoRoot = process.cwd();
24
+ const loader = new loader_1.SpecLoader(repoRoot);
25
+ let spec;
26
+ try {
27
+ spec = await loader.loadProjectSpec();
28
+ }
29
+ catch (e) {
30
+ process.stderr.write(e?.message ? String(e.message) : String(e));
31
+ process.stderr.write("\n");
32
+ process.exitCode = 4;
33
+ return;
34
+ }
35
+ // Always build DAG in run/dry-run to validate deps/cycles unless --task is used.
36
+ try {
37
+ if (!opts.task)
38
+ (0, dag_1.buildTaskDAG)(spec.tasks ?? []);
39
+ }
40
+ catch (e) {
41
+ process.stderr.write(e?.message ? String(e.message) : String(e));
42
+ process.stderr.write("\n");
43
+ process.exitCode = 4;
44
+ return;
45
+ }
46
+ if (opts.dryRun) {
47
+ const dag = (0, dag_1.buildTaskDAG)(spec.tasks ?? []);
48
+ const plan = opts.task ? [opts.task] : dag.order;
49
+ const out = { ok: true, dryRun: true, plan };
50
+ process.stdout.write(opts.json ? JSON.stringify(out, null, 2) + "\n" : `${plan.join("\n")}\n`);
51
+ return;
52
+ }
53
+ if (opts.workspace === "worktree") {
54
+ process.stderr.write(`Workspace mode "worktree" is not implemented in this MVP. Use --workspace patch.\n`);
55
+ process.exitCode = 6;
56
+ return;
57
+ }
58
+ const backend = new noop_1.NoopBackend(opts.backend);
59
+ const workspace = new patch_mode_1.PatchModeWorkspace(node_path_1.default.resolve(repoRoot));
60
+ const engine = new loop_1.EngineLoop();
61
+ const outcome = await engine.run({
62
+ repoRoot,
63
+ spec,
64
+ backend,
65
+ workspace,
66
+ taskId: opts.task,
67
+ dryRun: false,
68
+ json: opts.json,
69
+ });
70
+ if (opts.json) {
71
+ process.stdout.write(JSON.stringify(outcome, null, 2) + "\n");
72
+ }
73
+ else {
74
+ process.stdout.write(outcome.ok ? `OK: ${outcome.runId}\n` : `STOP: ${outcome.runId} (${outcome.exitCode}) ${outcome.reason}\n`);
75
+ }
76
+ process.exitCode = outcome.ok ? 0 : outcome.exitCode;
77
+ });
78
+ }
79
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C5D"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerStatusCommand = registerStatusCommand;
7
+ const cli_table3_1 = __importDefault(require("cli-table3"));
8
+ const persistence_1 = require("../core/memory/persistence");
9
+ function registerStatusCommand(program) {
10
+ program
11
+ .command("status")
12
+ .description("Show current/most recent run status")
13
+ .option("--json", "Machine-readable output", false)
14
+ .action(async (opts) => {
15
+ const repoRoot = process.cwd();
16
+ const persistence = await persistence_1.PersistenceLayer.openForRepo(repoRoot);
17
+ try {
18
+ const run = persistence.getLatestRun();
19
+ if (!run) {
20
+ process.stdout.write(opts.json ? JSON.stringify({ ok: true, run: null }) + "\n" : "No runs found.\n");
21
+ return;
22
+ }
23
+ const ledger = persistence.listLedger({ runId: run.runId, limit: 20 });
24
+ if (opts.json) {
25
+ process.stdout.write(JSON.stringify({
26
+ ok: true,
27
+ runSummary: run,
28
+ recentLedger: ledger,
29
+ }, null, 2) + "\n");
30
+ return;
31
+ }
32
+ const table = new cli_table3_1.default({ head: ["Field", "Value"] });
33
+ table.push(["runId", run.runId], ["status", run.status], ["startedAt", run.startedAt]);
34
+ process.stdout.write(table.toString() + "\n\n");
35
+ process.stdout.write("Recent events:\n");
36
+ for (const ev of ledger) {
37
+ process.stdout.write(`- ${ev.ts} ${ev.kind}${ev.taskId ? ` [${ev.taskId}]` : ""}: ${ev.message}\n`);
38
+ }
39
+ }
40
+ finally {
41
+ persistence.close();
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":";;;;;AAIA,sDA2CC;AA9CD,4DAA+B;AAC/B,4DAA8D;AAE9D,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,8BAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBACtG,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CACZ;oBACE,EAAE,EAAE,IAAI;oBACR,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACzC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerTailCommand(program: Command): void;
3
+ //# sourceMappingURL=tail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../src/cli/tail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6C1D"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerTailCommand = registerTailCommand;
4
+ const persistence_1 = require("../core/memory/persistence");
5
+ function registerTailCommand(program) {
6
+ program
7
+ .command("tail")
8
+ .description("Stream ledger events for the latest run (polling)")
9
+ .option("--interval-ms <n>", "Polling interval (ms)", "1000")
10
+ .action(async (opts) => {
11
+ const intervalMs = Number(opts.intervalMs);
12
+ const repoRoot = process.cwd();
13
+ const persistence = await persistence_1.PersistenceLayer.openForRepo(repoRoot);
14
+ const run = persistence.getLatestRun();
15
+ if (!run) {
16
+ persistence.close();
17
+ process.stderr.write("No runs found.\n");
18
+ process.exitCode = 1;
19
+ return;
20
+ }
21
+ process.stdout.write(`Tailing run ${run.runId}...\n`);
22
+ let lastCount = 0;
23
+ const timer = setInterval(() => {
24
+ try {
25
+ const ledger = persistence.listLedger({ runId: run.runId, limit: 200 });
26
+ const newEvents = ledger.slice(lastCount);
27
+ for (const ev of newEvents) {
28
+ process.stdout.write(`${ev.ts} ${ev.kind}${ev.taskId ? ` [${ev.taskId}]` : ""}: ${ev.message}\n`);
29
+ }
30
+ lastCount = ledger.length;
31
+ }
32
+ catch (e) {
33
+ process.stderr.write(e?.message ? String(e.message) : String(e));
34
+ process.stderr.write("\n");
35
+ }
36
+ }, Number.isFinite(intervalMs) ? intervalMs : 1000);
37
+ const shutdown = () => {
38
+ clearInterval(timer);
39
+ persistence.close();
40
+ process.exit(0);
41
+ };
42
+ process.on("SIGINT", shutdown);
43
+ process.on("SIGTERM", shutdown);
44
+ });
45
+ }
46
+ //# sourceMappingURL=tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../src/cli/tail.ts"],"names":[],"mappings":";;AAGA,kDA6CC;AA/CD,4DAA8D;AAE9D,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAA4B,EAAE,EAAE;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,8BAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC;QAEtD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBACxE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC1C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,IAAI,CAC5E,CAAC;gBACJ,CAAC;gBACD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerUpdateCommand(program: Command): void;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB5D"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerUpdateCommand = registerUpdateCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const detector_1 = require("../utils/detector");
9
+ const installer_1 = require("../utils/installer");
10
+ const paths_1 = require("../utils/paths");
11
+ function parseToolsArg(arg) {
12
+ if (!arg)
13
+ return undefined;
14
+ const parts = arg
15
+ .split(",")
16
+ .map((s) => s.trim())
17
+ .filter(Boolean);
18
+ const allowed = ["cursor", "claude-code", "opencode"];
19
+ const tools = [];
20
+ for (const p of parts) {
21
+ if (allowed.includes(p))
22
+ tools.push(p);
23
+ }
24
+ return tools.length ? tools : undefined;
25
+ }
26
+ async function promptForTools(defaultTools) {
27
+ const { tools } = await inquirer_1.default.prompt([
28
+ {
29
+ type: "checkbox",
30
+ name: "tools",
31
+ message: "Which AI tools do you want to update templates for?",
32
+ choices: [
33
+ { name: "Cursor", value: "cursor" },
34
+ { name: "Claude Code", value: "claude-code" },
35
+ { name: "OpenCode", value: "opencode" },
36
+ ],
37
+ default: defaultTools,
38
+ },
39
+ ]);
40
+ return tools;
41
+ }
42
+ function registerUpdateCommand(program) {
43
+ program
44
+ .command("update")
45
+ .description("Update Ralph-OpenSpec templates in a project")
46
+ .option("--dir <path>", "Target project directory (default: current directory)")
47
+ .option("--tools <list>", "Comma-separated list: cursor,claude-code,opencode")
48
+ .option("--force", "Overwrite existing files", false)
49
+ .action(async (opts) => {
50
+ const dir = (0, paths_1.resolveProjectDir)(opts.dir);
51
+ const parsed = parseToolsArg(opts.tools);
52
+ const detected = await (0, detector_1.detectExistingTools)(dir);
53
+ const defaultTools = parsed ??
54
+ (detected.length
55
+ ? detected
56
+ : ["cursor", "claude-code", "opencode"]);
57
+ const tools = parsed ?? (await promptForTools(defaultTools));
58
+ await (0, installer_1.installToolTemplates)(dir, tools, { force: opts.force });
59
+ process.stdout.write(`Updated templates in ${dir}\nUpdated tools: ${tools.join(", ")}\n`);
60
+ });
61
+ }
62
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":";;;;;AAuCA,sDAwBC;AA9DD,wDAAgC;AAEhC,gDAAwD;AACxD,kDAA0D;AAC1D,0CAAmD;AAEnD,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAK,OAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,YAAsB;IAClD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAsB;QAC3D;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qDAAqD;YAC9D,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAyB,EAAE;gBACpD,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAA8B,EAAE;gBAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAA2B,EAAE;aACzD;YACD,OAAO,EAAE,YAAY;SACtB;KACF,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,cAAc,EAAE,uDAAuD,CAAC;SAC/E,MAAM,CAAC,gBAAgB,EAAE,mDAAmD,CAAC;SAC7E,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAsD,EAAE,EAAE;QACvE,MAAM,GAAG,GAAG,IAAA,yBAAiB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAmB,EAAC,GAAG,CAAC,CAAC;QAChD,MAAM,YAAY,GAChB,MAAM;YACN,CAAC,QAAQ,CAAC,MAAM;gBACd,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAc,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAA,gCAAoB,EAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,GAAG,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerValidateCommand(program: Command): void;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsE9D"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerValidateCommand = registerValidateCommand;
4
+ const detector_1 = require("../utils/detector");
5
+ const paths_1 = require("../utils/paths");
6
+ const validator_1 = require("../utils/validator");
7
+ const loader_1 = require("../core/spec/loader");
8
+ const runner_1 = require("../core/validators/runner");
9
+ function parseToolsArg(arg) {
10
+ if (!arg)
11
+ return undefined;
12
+ const parts = arg
13
+ .split(",")
14
+ .map((s) => s.trim())
15
+ .filter(Boolean);
16
+ const allowed = ["cursor", "claude-code", "opencode"];
17
+ const tools = [];
18
+ for (const p of parts) {
19
+ if (allowed.includes(p))
20
+ tools.push(p);
21
+ }
22
+ return tools.length ? tools : undefined;
23
+ }
24
+ function registerValidateCommand(program) {
25
+ program
26
+ .command("validate")
27
+ .description("Validate that Ralph-OpenSpec setup is complete")
28
+ .option("--dir <path>", "Target project directory (default: current directory)")
29
+ .option("--task <taskId>", "Validate a specific task via validators (v2)")
30
+ .option("--tools <list>", "Comma-separated list: cursor,claude-code,opencode (default: detect)")
31
+ .action(async (opts) => {
32
+ const dir = (0, paths_1.resolveProjectDir)(opts.dir);
33
+ if (opts.task) {
34
+ try {
35
+ const loader = new loader_1.SpecLoader(dir);
36
+ const spec = await loader.loadProjectSpec();
37
+ const task = (spec.tasks ?? []).find((t) => t.id === opts.task);
38
+ if (!task) {
39
+ process.stderr.write(`Unknown task id: ${opts.task}\n`);
40
+ process.exitCode = 4;
41
+ return;
42
+ }
43
+ const ids = task.validators ?? spec.defaults.validators ?? [];
44
+ const validators = (spec.validators ?? [])
45
+ .filter((v) => ids.includes(v.id))
46
+ .map((v) => ({
47
+ id: v.id,
48
+ run: v.run,
49
+ timeoutMs: v.timeoutSeconds ? v.timeoutSeconds * 1000 : undefined,
50
+ parser: v.parser,
51
+ })) ?? [];
52
+ const runner = new runner_1.ValidatorRunner({
53
+ cwd: dir,
54
+ commandTimeoutMs: (spec.budgets?.limits?.commandTimeoutSeconds ?? 900) * 1000,
55
+ });
56
+ const results = await runner.runAll(validators);
57
+ process.stdout.write(JSON.stringify({ ok: true, taskId: task.id, results }, null, 2) + "\n");
58
+ const hasErrors = Object.values(results).some((r) => !r.ok);
59
+ process.exitCode = hasErrors ? 1 : 0;
60
+ return;
61
+ }
62
+ catch (e) {
63
+ process.stderr.write(e?.message ? String(e.message) : String(e));
64
+ process.stderr.write("\n");
65
+ process.exitCode = 4;
66
+ return;
67
+ }
68
+ }
69
+ const tools = parseToolsArg(opts.tools) ?? (await (0, detector_1.detectExistingTools)(dir));
70
+ const issues = await (0, validator_1.validateProject)(dir, tools);
71
+ if (!issues.length) {
72
+ process.stdout.write("OK: Ralph-OpenSpec setup looks good.\n");
73
+ return;
74
+ }
75
+ for (const issue of issues) {
76
+ const prefix = issue.level === "error" ? "ERROR" : "WARN";
77
+ process.stdout.write(`${prefix}: ${issue.message}${issue.path ? ` (${issue.path})` : ""}\n`);
78
+ }
79
+ const hasErrors = issues.some((i) => i.level === "error");
80
+ process.exitCode = hasErrors ? 1 : 0;
81
+ });
82
+ }
83
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { BackendEnv, CodingBackend, ImplementInput, ImplementOutput } from "./types";
2
+ /**
3
+ * ClaudeCodeBackend shells out to the `claude` CLI for code implementation.
4
+ *
5
+ * Claude Code (Anthropic's coding assistant) supports headless operation
6
+ * via the claude CLI with --print or --output-format json flags.
7
+ */
8
+ export declare class ClaudeCodeBackend implements CodingBackend {
9
+ private readonly opts;
10
+ readonly id = "claude-code";
11
+ constructor(opts?: {
12
+ timeoutMs?: number;
13
+ });
14
+ implement(env: BackendEnv, input: ImplementInput): Promise<ImplementOutput>;
15
+ private buildPrompt;
16
+ }
17
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/backends/claude-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1F;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IAGzC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,iBAAiB;gBAEC,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAExD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAgDjF,OAAO,CAAC,WAAW;CA0BpB"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeCodeBackend = void 0;
4
+ const execa_1 = require("execa");
5
+ /**
6
+ * ClaudeCodeBackend shells out to the `claude` CLI for code implementation.
7
+ *
8
+ * Claude Code (Anthropic's coding assistant) supports headless operation
9
+ * via the claude CLI with --print or --output-format json flags.
10
+ */
11
+ class ClaudeCodeBackend {
12
+ opts;
13
+ id = "claude-code";
14
+ constructor(opts = {}) {
15
+ this.opts = opts;
16
+ }
17
+ async implement(env, input) {
18
+ const { task, iteration, repairNotes } = input;
19
+ // Build the prompt to send to Claude Code
20
+ const prompt = this.buildPrompt(task, iteration, repairNotes);
21
+ try {
22
+ // Claude CLI: `claude --print "prompt"` for headless operation
23
+ // The --print flag runs claude non-interactively
24
+ const result = await (0, execa_1.execa)("claude", ["--print", prompt], {
25
+ cwd: env.cwd,
26
+ timeout: this.opts.timeoutMs ?? 600_000, // 10 min default
27
+ reject: false,
28
+ stdio: "pipe",
29
+ });
30
+ if (result.exitCode === 0) {
31
+ return {
32
+ ok: true,
33
+ message: `Claude Code completed task "${task.id}" (iteration ${iteration})`,
34
+ };
35
+ }
36
+ // Non-zero exit code
37
+ return {
38
+ ok: false,
39
+ message: `Claude Code exited with code ${result.exitCode}: ${result.stderr || result.stdout}`.slice(0, 2000),
40
+ };
41
+ }
42
+ catch (err) {
43
+ // Handle cases where claude CLI is not available
44
+ if (err?.code === "ENOENT") {
45
+ return {
46
+ ok: false,
47
+ message: "Claude CLI not found. Please ensure Claude Code is installed and the CLI is in PATH.",
48
+ };
49
+ }
50
+ return {
51
+ ok: false,
52
+ message: err?.message ? String(err.message).slice(0, 2000) : "Unknown error",
53
+ };
54
+ }
55
+ }
56
+ buildPrompt(task, iteration, repairNotes) {
57
+ const lines = [];
58
+ lines.push(`# Task: ${task.title ?? task.id}`);
59
+ lines.push(``);
60
+ if (task.goal) {
61
+ lines.push(`## Goal`);
62
+ lines.push(task.goal);
63
+ lines.push(``);
64
+ }
65
+ if (repairNotes) {
66
+ lines.push(`## Repair Notes (iteration ${iteration})`);
67
+ lines.push(repairNotes);
68
+ lines.push(``);
69
+ }
70
+ lines.push(`Please implement this task and ensure all validators pass.`);
71
+ return lines.join("\n");
72
+ }
73
+ }
74
+ exports.ClaudeCodeBackend = ClaudeCodeBackend;
75
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/core/backends/claude-code.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAG9B;;;;;GAKG;AACH,MAAa,iBAAiB;IAGC;IAFpB,EAAE,GAAG,aAAa,CAAC;IAE5B,YAA6B,OAA+B,EAAE;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;IAElE,KAAK,CAAC,SAAS,CAAC,GAAe,EAAE,KAAqB;QACpD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QAE/C,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,+DAA+D;YAC/D,iDAAiD;YACjD,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;gBACxD,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,iBAAiB;gBAC1D,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,+BAA+B,IAAI,CAAC,EAAE,gBAAgB,SAAS,GAAG;iBAC5E,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,gCAAgC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CACjG,CAAC,EACD,IAAI,CACL;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,iDAAiD;YACjD,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,OAAO,EACL,sFAAsF;iBACzF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,IAAmD,EACnD,SAAiB,EACjB,WAAoB;QAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,8BAA8B,SAAS,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AA/ED,8CA+EC"}
@@ -0,0 +1,17 @@
1
+ import type { BackendEnv, CodingBackend, ImplementInput, ImplementOutput } from "./types";
2
+ /**
3
+ * CursorBackend shells out to the `cursor` CLI for code implementation.
4
+ *
5
+ * Note: Cursor IDE typically runs interactively. This backend sends prompts
6
+ * via the CLI and expects the user/AI to complete the task.
7
+ */
8
+ export declare class CursorBackend implements CodingBackend {
9
+ private readonly opts;
10
+ readonly id = "cursor";
11
+ constructor(opts?: {
12
+ timeoutMs?: number;
13
+ });
14
+ implement(env: BackendEnv, input: ImplementInput): Promise<ImplementOutput>;
15
+ private buildPrompt;
16
+ }
17
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/core/backends/cursor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1F;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,aAAa;IAGrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,YAAY;gBAEM,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAExD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAgDjF,OAAO,CAAC,WAAW;CA0BpB"}