ralph-research 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 (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/adapters/extractor/command-extractor.d.ts +9 -0
  4. package/dist/adapters/extractor/command-extractor.js +93 -0
  5. package/dist/adapters/extractor/command-extractor.js.map +1 -0
  6. package/dist/adapters/extractor/llm-judge-extractor.d.ts +9 -0
  7. package/dist/adapters/extractor/llm-judge-extractor.js +12 -0
  8. package/dist/adapters/extractor/llm-judge-extractor.js.map +1 -0
  9. package/dist/adapters/fs/json-file-decision-store.d.ts +10 -0
  10. package/dist/adapters/fs/json-file-decision-store.js +53 -0
  11. package/dist/adapters/fs/json-file-decision-store.js.map +1 -0
  12. package/dist/adapters/fs/json-file-frontier-store.d.ts +8 -0
  13. package/dist/adapters/fs/json-file-frontier-store.js +29 -0
  14. package/dist/adapters/fs/json-file-frontier-store.js.map +1 -0
  15. package/dist/adapters/fs/json-file-run-store.d.ts +10 -0
  16. package/dist/adapters/fs/json-file-run-store.js +53 -0
  17. package/dist/adapters/fs/json-file-run-store.js.map +1 -0
  18. package/dist/adapters/fs/lockfile.d.ts +24 -0
  19. package/dist/adapters/fs/lockfile.js +110 -0
  20. package/dist/adapters/fs/lockfile.js.map +1 -0
  21. package/dist/adapters/fs/manifest-loader.d.ts +10 -0
  22. package/dist/adapters/fs/manifest-loader.js +43 -0
  23. package/dist/adapters/fs/manifest-loader.js.map +1 -0
  24. package/dist/adapters/git/git-client.d.ts +9 -0
  25. package/dist/adapters/git/git-client.js +23 -0
  26. package/dist/adapters/git/git-client.js.map +1 -0
  27. package/dist/adapters/index.d.ts +1 -0
  28. package/dist/adapters/index.js +3 -0
  29. package/dist/adapters/index.js.map +1 -0
  30. package/dist/adapters/judge/llm-judge-provider.d.ts +33 -0
  31. package/dist/adapters/judge/llm-judge-provider.js +90 -0
  32. package/dist/adapters/judge/llm-judge-provider.js.map +1 -0
  33. package/dist/adapters/proposer/command-proposer.d.ts +15 -0
  34. package/dist/adapters/proposer/command-proposer.js +29 -0
  35. package/dist/adapters/proposer/command-proposer.js.map +1 -0
  36. package/dist/app/context.d.ts +5 -0
  37. package/dist/app/context.js +7 -0
  38. package/dist/app/context.js.map +1 -0
  39. package/dist/app/services/manual-decision-service.d.ts +20 -0
  40. package/dist/app/services/manual-decision-service.js +143 -0
  41. package/dist/app/services/manual-decision-service.js.map +1 -0
  42. package/dist/app/services/project-state-service.d.ts +52 -0
  43. package/dist/app/services/project-state-service.js +92 -0
  44. package/dist/app/services/project-state-service.js.map +1 -0
  45. package/dist/app/services/run-cycle-service.d.ts +25 -0
  46. package/dist/app/services/run-cycle-service.js +69 -0
  47. package/dist/app/services/run-cycle-service.js.map +1 -0
  48. package/dist/cli/commands/accept.d.ts +10 -0
  49. package/dist/cli/commands/accept.js +54 -0
  50. package/dist/cli/commands/accept.js.map +1 -0
  51. package/dist/cli/commands/demo.d.ts +9 -0
  52. package/dist/cli/commands/demo.js +108 -0
  53. package/dist/cli/commands/demo.js.map +1 -0
  54. package/dist/cli/commands/frontier.d.ts +8 -0
  55. package/dist/cli/commands/frontier.js +48 -0
  56. package/dist/cli/commands/frontier.js.map +1 -0
  57. package/dist/cli/commands/init.d.ts +10 -0
  58. package/dist/cli/commands/init.js +123 -0
  59. package/dist/cli/commands/init.js.map +1 -0
  60. package/dist/cli/commands/inspect.d.ts +8 -0
  61. package/dist/cli/commands/inspect.js +55 -0
  62. package/dist/cli/commands/inspect.js.map +1 -0
  63. package/dist/cli/commands/reject.d.ts +10 -0
  64. package/dist/cli/commands/reject.js +54 -0
  65. package/dist/cli/commands/reject.js.map +1 -0
  66. package/dist/cli/commands/run.d.ts +13 -0
  67. package/dist/cli/commands/run.js +71 -0
  68. package/dist/cli/commands/run.js.map +1 -0
  69. package/dist/cli/commands/serve-mcp.d.ts +7 -0
  70. package/dist/cli/commands/serve-mcp.js +32 -0
  71. package/dist/cli/commands/serve-mcp.js.map +1 -0
  72. package/dist/cli/commands/status.d.ts +8 -0
  73. package/dist/cli/commands/status.js +53 -0
  74. package/dist/cli/commands/status.js.map +1 -0
  75. package/dist/cli/commands/validate.d.ts +11 -0
  76. package/dist/cli/commands/validate.js +56 -0
  77. package/dist/cli/commands/validate.js.map +1 -0
  78. package/dist/cli/main.d.ts +2 -0
  79. package/dist/cli/main.js +38 -0
  80. package/dist/cli/main.js.map +1 -0
  81. package/dist/core/engine/anchor-checker.d.ts +35 -0
  82. package/dist/core/engine/anchor-checker.js +84 -0
  83. package/dist/core/engine/anchor-checker.js.map +1 -0
  84. package/dist/core/engine/audit-sampler.d.ts +16 -0
  85. package/dist/core/engine/audit-sampler.js +25 -0
  86. package/dist/core/engine/audit-sampler.js.map +1 -0
  87. package/dist/core/engine/change-budget.d.ts +11 -0
  88. package/dist/core/engine/change-budget.js +10 -0
  89. package/dist/core/engine/change-budget.js.map +1 -0
  90. package/dist/core/engine/cycle-runner.d.ts +39 -0
  91. package/dist/core/engine/cycle-runner.js +652 -0
  92. package/dist/core/engine/cycle-runner.js.map +1 -0
  93. package/dist/core/engine/experiment-runner.d.ts +13 -0
  94. package/dist/core/engine/experiment-runner.js +24 -0
  95. package/dist/core/engine/experiment-runner.js.map +1 -0
  96. package/dist/core/engine/history-compactor.d.ts +15 -0
  97. package/dist/core/engine/history-compactor.js +76 -0
  98. package/dist/core/engine/history-compactor.js.map +1 -0
  99. package/dist/core/engine/judge-pack.d.ts +44 -0
  100. package/dist/core/engine/judge-pack.js +111 -0
  101. package/dist/core/engine/judge-pack.js.map +1 -0
  102. package/dist/core/engine/parallel-proposer.d.ts +21 -0
  103. package/dist/core/engine/parallel-proposer.js +58 -0
  104. package/dist/core/engine/parallel-proposer.js.map +1 -0
  105. package/dist/core/engine/scope-checker.d.ts +35 -0
  106. package/dist/core/engine/scope-checker.js +166 -0
  107. package/dist/core/engine/scope-checker.js.map +1 -0
  108. package/dist/core/engine/workspace-manager.d.ts +32 -0
  109. package/dist/core/engine/workspace-manager.js +145 -0
  110. package/dist/core/engine/workspace-manager.js.map +1 -0
  111. package/dist/core/index.d.ts +1 -0
  112. package/dist/core/index.js +3 -0
  113. package/dist/core/index.js.map +1 -0
  114. package/dist/core/manifest/defaults.d.ts +55 -0
  115. package/dist/core/manifest/defaults.js +56 -0
  116. package/dist/core/manifest/defaults.js.map +1 -0
  117. package/dist/core/manifest/schema.d.ts +647 -0
  118. package/dist/core/manifest/schema.js +254 -0
  119. package/dist/core/manifest/schema.js.map +1 -0
  120. package/dist/core/model/decision-record.d.ts +38 -0
  121. package/dist/core/model/decision-record.js +29 -0
  122. package/dist/core/model/decision-record.js.map +1 -0
  123. package/dist/core/model/frontier-entry.d.ts +24 -0
  124. package/dist/core/model/frontier-entry.js +15 -0
  125. package/dist/core/model/frontier-entry.js.map +1 -0
  126. package/dist/core/model/metric.d.ts +13 -0
  127. package/dist/core/model/metric.js +10 -0
  128. package/dist/core/model/metric.js.map +1 -0
  129. package/dist/core/model/run-record.d.ts +110 -0
  130. package/dist/core/model/run-record.js +104 -0
  131. package/dist/core/model/run-record.js.map +1 -0
  132. package/dist/core/ports/decision-store.d.ts +6 -0
  133. package/dist/core/ports/decision-store.js +2 -0
  134. package/dist/core/ports/decision-store.js.map +1 -0
  135. package/dist/core/ports/frontier-store.d.ts +5 -0
  136. package/dist/core/ports/frontier-store.js +2 -0
  137. package/dist/core/ports/frontier-store.js.map +1 -0
  138. package/dist/core/ports/run-store.d.ts +6 -0
  139. package/dist/core/ports/run-store.js +2 -0
  140. package/dist/core/ports/run-store.js.map +1 -0
  141. package/dist/core/state/constraint-engine.d.ts +18 -0
  142. package/dist/core/state/constraint-engine.js +42 -0
  143. package/dist/core/state/constraint-engine.js.map +1 -0
  144. package/dist/core/state/frontier-engine.d.ts +24 -0
  145. package/dist/core/state/frontier-engine.js +178 -0
  146. package/dist/core/state/frontier-engine.js.map +1 -0
  147. package/dist/core/state/ratchet-engine.d.ts +28 -0
  148. package/dist/core/state/ratchet-engine.js +177 -0
  149. package/dist/core/state/ratchet-engine.js.map +1 -0
  150. package/dist/core/state/run-state-machine.d.ts +17 -0
  151. package/dist/core/state/run-state-machine.js +94 -0
  152. package/dist/core/state/run-state-machine.js.map +1 -0
  153. package/dist/mcp/main.d.ts +1 -0
  154. package/dist/mcp/main.js +8 -0
  155. package/dist/mcp/main.js.map +1 -0
  156. package/dist/mcp/server.d.ts +6 -0
  157. package/dist/mcp/server.js +97 -0
  158. package/dist/mcp/server.js.map +1 -0
  159. package/dist/shared/fs-errors.d.ts +1 -0
  160. package/dist/shared/fs-errors.js +4 -0
  161. package/dist/shared/fs-errors.js.map +1 -0
  162. package/dist/shared/logger.d.ts +2 -0
  163. package/dist/shared/logger.js +5 -0
  164. package/dist/shared/logger.js.map +1 -0
  165. package/dist/shared/template-utils.d.ts +9 -0
  166. package/dist/shared/template-utils.js +50 -0
  167. package/dist/shared/template-utils.js.map +1 -0
  168. package/package.json +44 -0
  169. package/templates/writing/docs/draft.md +1 -0
  170. package/templates/writing/prompts/judge.md +15 -0
  171. package/templates/writing/ralph.yaml +63 -0
  172. package/templates/writing/scripts/experiment.mjs +6 -0
  173. package/templates/writing/scripts/metric.mjs +24 -0
  174. package/templates/writing/scripts/propose.mjs +13 -0
@@ -0,0 +1,69 @@
1
+ import { join, resolve } from "node:path";
2
+ import { JsonFileDecisionStore } from "../../adapters/fs/json-file-decision-store.js";
3
+ import { JsonFileFrontierStore } from "../../adapters/fs/json-file-frontier-store.js";
4
+ import { JsonFileRunStore } from "../../adapters/fs/json-file-run-store.js";
5
+ import { GitClient } from "../../adapters/git/git-client.js";
6
+ import { acquireLock, releaseLock } from "../../adapters/fs/lockfile.js";
7
+ import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
8
+ import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
9
+ import { DEFAULT_STORAGE_ROOT } from "../../core/manifest/defaults.js";
10
+ import { canResume, recoverRun } from "../../core/state/run-state-machine.js";
11
+ import { GitWorktreeWorkspaceManager } from "../../core/engine/workspace-manager.js";
12
+ import { runCycle } from "../../core/engine/cycle-runner.js";
13
+ export class RunCycleService {
14
+ judgeProvider;
15
+ now;
16
+ constructor(dependencies = {}) {
17
+ this.judgeProvider = dependencies.judgeProvider;
18
+ this.now = dependencies.now;
19
+ }
20
+ async run(input) {
21
+ const repoRoot = resolve(input.repoRoot);
22
+ const manifestPath = resolve(repoRoot, input.manifestPath ?? DEFAULT_MANIFEST_FILENAME);
23
+ const lockPath = join(repoRoot, DEFAULT_STORAGE_ROOT, "lock");
24
+ const lock = await acquireLock(lockPath);
25
+ try {
26
+ const loadedManifest = await loadManifestFromFile(manifestPath);
27
+ const storageRoot = join(repoRoot, loadedManifest.manifest.storage.root);
28
+ const runStore = new JsonFileRunStore(join(storageRoot, "runs"));
29
+ const frontierStore = new JsonFileFrontierStore(join(storageRoot, "frontier.json"));
30
+ const decisionStore = new JsonFileDecisionStore(join(storageRoot, "decisions"));
31
+ const latestRun = (await runStore.list()).at(-1);
32
+ if (latestRun && canResume(latestRun) && !input.resume) {
33
+ return {
34
+ status: "resume_required",
35
+ manifestPath: loadedManifest.path,
36
+ lockPath,
37
+ recoveryPlan: recoverRun(latestRun),
38
+ };
39
+ }
40
+ const frontier = await frontierStore.load();
41
+ const workspaceManager = new GitWorktreeWorkspaceManager(repoRoot, storageRoot);
42
+ const gitClient = new GitClient(repoRoot);
43
+ const runResult = await runCycle({
44
+ repoRoot,
45
+ manifestPath: loadedManifest.path,
46
+ manifest: loadedManifest.manifest,
47
+ currentFrontier: frontier,
48
+ }, {
49
+ runStore,
50
+ frontierStore,
51
+ decisionStore,
52
+ workspaceManager,
53
+ gitClient,
54
+ ...(this.judgeProvider ? { judgeProvider: this.judgeProvider } : {}),
55
+ ...(this.now ? { now: this.now } : {}),
56
+ });
57
+ return {
58
+ status: runResult.status,
59
+ manifestPath: loadedManifest.path,
60
+ lockPath,
61
+ runResult,
62
+ };
63
+ }
64
+ finally {
65
+ await releaseLock(lock.path, lock.metadata.token);
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=run-cycle-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cycle-service.js","sourceRoot":"","sources":["../../../src/app/services/run-cycle-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface AcceptCommandOptions {
4
+ path?: string;
5
+ note?: string;
6
+ by?: string;
7
+ json?: boolean;
8
+ }
9
+ export declare function runAcceptCommand(runId: string, options: AcceptCommandOptions, io?: CommandIO): Promise<number>;
10
+ export declare function registerAcceptCommand(program: Command): void;
@@ -0,0 +1,54 @@
1
+ import { ManualDecisionService } from "../../app/services/manual-decision-service.js";
2
+ const defaultCommandIO = {
3
+ stdout: (message) => {
4
+ process.stdout.write(`${message}\n`);
5
+ },
6
+ stderr: (message) => {
7
+ process.stderr.write(`${message}\n`);
8
+ },
9
+ };
10
+ export async function runAcceptCommand(runId, options, io = defaultCommandIO) {
11
+ try {
12
+ const result = await new ManualDecisionService().accept({
13
+ repoRoot: process.cwd(),
14
+ runId,
15
+ ...(options.path ? { manifestPath: options.path } : {}),
16
+ ...(options.note ? { note: options.note } : {}),
17
+ ...(options.by ? { by: options.by } : {}),
18
+ });
19
+ if (options.json) {
20
+ io.stdout(JSON.stringify({ ok: true, result }, null, 2));
21
+ }
22
+ else {
23
+ io.stdout(`Accepted ${runId}${result.decision.commitSha ? ` at ${result.decision.commitSha}` : ""}`);
24
+ }
25
+ return 0;
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : "Failed to accept run";
29
+ if (options.json) {
30
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
31
+ }
32
+ else {
33
+ io.stderr(message);
34
+ }
35
+ return 1;
36
+ }
37
+ }
38
+ export function registerAcceptCommand(program) {
39
+ program
40
+ .command("accept")
41
+ .description("Accept a pending human review run and promote it to the frontier.")
42
+ .argument("<runId>", "Run identifier")
43
+ .option("-p, --path <path>", "Path to the manifest file")
44
+ .option("--note <note>", "Optional acceptance note")
45
+ .option("--by <actor>", "Human actor identifier")
46
+ .option("--json", "Emit machine-readable output", false)
47
+ .action(async (runId, options) => {
48
+ const exitCode = await runAcceptCommand(runId, options);
49
+ if (exitCode !== 0) {
50
+ process.exitCode = exitCode;
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=accept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/cli/commands/accept.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface DemoCommandOptions {
4
+ path?: string;
5
+ force?: boolean;
6
+ json?: boolean;
7
+ }
8
+ export declare function runDemoCommand(template: string, options: DemoCommandOptions, io?: CommandIO): Promise<number>;
9
+ export declare function registerDemoCommand(program: Command): void;
@@ -0,0 +1,108 @@
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { execa } from "execa";
5
+ import { inspectRun } from "../../app/services/project-state-service.js";
6
+ import { RunCycleService } from "../../app/services/run-cycle-service.js";
7
+ import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
8
+ import { copyTemplate } from "../../shared/template-utils.js";
9
+ const defaultCommandIO = {
10
+ stdout: (message) => {
11
+ process.stdout.write(`${message}\n`);
12
+ },
13
+ stderr: (message) => {
14
+ process.stderr.write(`${message}\n`);
15
+ },
16
+ };
17
+ export async function runDemoCommand(template, options, io = defaultCommandIO) {
18
+ if (template !== "writing") {
19
+ const message = `Unsupported demo template ${template}; only writing is available in v0.1`;
20
+ if (options.json) {
21
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
22
+ }
23
+ else {
24
+ io.stderr(message);
25
+ }
26
+ return 1;
27
+ }
28
+ try {
29
+ const targetDir = options.path
30
+ ? resolve(options.path)
31
+ : await mkdtemp(join(tmpdir(), "rrx-demo-writing-"));
32
+ if (options.force) {
33
+ await rm(targetDir, { recursive: true, force: true });
34
+ }
35
+ await mkdir(targetDir, { recursive: true });
36
+ await copyTemplate(template, targetDir, {
37
+ ...(options.force === undefined ? {} : { force: options.force }),
38
+ });
39
+ await initializeDemoRepo(targetDir);
40
+ const service = new RunCycleService();
41
+ const result = await service.run({
42
+ repoRoot: targetDir,
43
+ manifestPath: join(targetDir, DEFAULT_MANIFEST_FILENAME),
44
+ });
45
+ const runId = result.runResult?.run.runId;
46
+ if (!runId) {
47
+ throw new Error(`Demo run did not produce a run record; status=${result.status}`);
48
+ }
49
+ const inspection = await inspectRun({
50
+ repoRoot: targetDir,
51
+ manifestPath: join(targetDir, DEFAULT_MANIFEST_FILENAME),
52
+ runId,
53
+ });
54
+ if (options.json) {
55
+ io.stdout(JSON.stringify({
56
+ ok: true,
57
+ template,
58
+ targetDir,
59
+ status: result.status,
60
+ runId,
61
+ inspect: inspection.explainability,
62
+ }, null, 2));
63
+ }
64
+ else {
65
+ io.stdout([
66
+ `Demo created at ${targetDir}`,
67
+ `Cycle status: ${result.status}`,
68
+ `Run: ${runId}`,
69
+ `Decision: ${inspection.explainability.decisionReason ?? "n/a"}`,
70
+ `Next: cd ${targetDir} && rrx inspect ${runId} --json`,
71
+ ].join("\n"));
72
+ }
73
+ return 0;
74
+ }
75
+ catch (error) {
76
+ const message = error instanceof Error ? error.message : "Failed to run demo";
77
+ if (options.json) {
78
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
79
+ }
80
+ else {
81
+ io.stderr(message);
82
+ }
83
+ return 1;
84
+ }
85
+ }
86
+ export function registerDemoCommand(program) {
87
+ program
88
+ .command("demo")
89
+ .description("Create and run a zero-config demo.")
90
+ .argument("<template>", "Demo template name")
91
+ .option("-p, --path <path>", "Destination directory")
92
+ .option("--force", "Replace the destination directory if it already exists", false)
93
+ .option("--json", "Emit machine-readable output", false)
94
+ .action(async (template, options) => {
95
+ const exitCode = await runDemoCommand(template, options);
96
+ if (exitCode !== 0) {
97
+ process.exitCode = exitCode;
98
+ }
99
+ });
100
+ }
101
+ async function initializeDemoRepo(repoRoot) {
102
+ await execa("git", ["init"], { cwd: repoRoot });
103
+ await execa("git", ["config", "user.name", "ralph-research demo"], { cwd: repoRoot });
104
+ await execa("git", ["config", "user.email", "demo@example.com"], { cwd: repoRoot });
105
+ await execa("git", ["add", "."], { cwd: repoRoot });
106
+ await execa("git", ["commit", "-m", "demo fixture"], { cwd: repoRoot });
107
+ }
108
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../../src/cli/commands/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface FrontierCommandOptions {
4
+ path?: string;
5
+ json?: boolean;
6
+ }
7
+ export declare function runFrontierCommand(options: FrontierCommandOptions, io?: CommandIO): Promise<number>;
8
+ export declare function registerFrontierCommand(program: Command): void;
@@ -0,0 +1,48 @@
1
+ import { getProjectFrontier } from "../../app/services/project-state-service.js";
2
+ const defaultCommandIO = {
3
+ stdout: (message) => {
4
+ process.stdout.write(`${message}\n`);
5
+ },
6
+ stderr: (message) => {
7
+ process.stderr.write(`${message}\n`);
8
+ },
9
+ };
10
+ export async function runFrontierCommand(options, io = defaultCommandIO) {
11
+ try {
12
+ const frontier = await getProjectFrontier({
13
+ repoRoot: process.cwd(),
14
+ ...(options.path ? { manifestPath: options.path } : {}),
15
+ });
16
+ if (options.json) {
17
+ io.stdout(JSON.stringify(frontier, null, 2));
18
+ }
19
+ else {
20
+ io.stdout(`frontier entries: ${frontier.frontier.length}`);
21
+ }
22
+ return 0;
23
+ }
24
+ catch (error) {
25
+ const message = error instanceof Error ? error.message : "Failed to load frontier";
26
+ if (options.json) {
27
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
28
+ }
29
+ else {
30
+ io.stderr(message);
31
+ }
32
+ return 1;
33
+ }
34
+ }
35
+ export function registerFrontierCommand(program) {
36
+ program
37
+ .command("frontier")
38
+ .description("Show the current frontier.")
39
+ .option("-p, --path <path>", "Path to the manifest file")
40
+ .option("--json", "Emit machine-readable output", false)
41
+ .action(async (options) => {
42
+ const exitCode = await runFrontierCommand(options);
43
+ if (exitCode !== 0) {
44
+ process.exitCode = exitCode;
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=frontier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontier.js","sourceRoot":"","sources":["../../../src/cli/commands/frontier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAQjF,MAAM,gBAAgB,GAAc;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA+B,EAC/B,KAAgB,gBAAgB;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;YACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,qBAAqB,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;QACnF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA+B,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface InitCommandOptions {
4
+ template: string;
5
+ path?: string;
6
+ force?: boolean;
7
+ json?: boolean;
8
+ }
9
+ export declare function runInitCommand(options: InitCommandOptions, io?: CommandIO): Promise<number>;
10
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,123 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { execa } from "execa";
4
+ import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
5
+ import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
6
+ import { copyTemplate } from "../../shared/template-utils.js";
7
+ const defaultCommandIO = {
8
+ stdout: (message) => {
9
+ process.stdout.write(`${message}\n`);
10
+ },
11
+ stderr: (message) => {
12
+ process.stderr.write(`${message}\n`);
13
+ },
14
+ };
15
+ export async function runInitCommand(options, io = defaultCommandIO) {
16
+ try {
17
+ const targetDir = resolve(options.path ?? process.cwd());
18
+ await mkdir(targetDir, { recursive: true });
19
+ const copied = await copyTemplate(options.template, targetDir, {
20
+ ...(options.force === undefined ? {} : { force: options.force }),
21
+ });
22
+ const manifestPath = resolve(targetDir, DEFAULT_MANIFEST_FILENAME);
23
+ const manifest = await loadManifestFromFile(manifestPath);
24
+ const initializedGit = await ensureRunnableGitRepo(targetDir, `rrx: init ${options.template} template`);
25
+ if (options.json) {
26
+ io.stdout(JSON.stringify({
27
+ ok: true,
28
+ template: options.template,
29
+ targetDir,
30
+ copiedFiles: copied.copiedFiles,
31
+ manifestPath: manifest.path,
32
+ project: manifest.manifest.project.name,
33
+ initializedGit,
34
+ }, null, 2));
35
+ }
36
+ else {
37
+ io.stdout([
38
+ `Initialized ${options.template} template in ${targetDir}`,
39
+ `Manifest: ${manifest.path}`,
40
+ initializedGit ? "Git: initialized runnable repository with first commit" : "Git: reused existing repository",
41
+ "Next: rrx run --json",
42
+ ].join("\n"));
43
+ }
44
+ return 0;
45
+ }
46
+ catch (error) {
47
+ const message = error instanceof Error ? error.message : "Failed to initialize template";
48
+ if (options.json) {
49
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
50
+ }
51
+ else {
52
+ io.stderr(message);
53
+ }
54
+ return 1;
55
+ }
56
+ }
57
+ async function ensureRunnableGitRepo(repoRoot, message) {
58
+ const insideGitRepo = await isInsideGitRepo(repoRoot);
59
+ if (!insideGitRepo) {
60
+ await execa("git", ["init"], { cwd: repoRoot });
61
+ }
62
+ await ensureGitIdentity(repoRoot);
63
+ const hasHead = await hasGitHead(repoRoot);
64
+ if (!hasHead) {
65
+ await execa("git", ["add", "."], { cwd: repoRoot });
66
+ await execa("git", ["commit", "-m", message], { cwd: repoRoot });
67
+ }
68
+ return !insideGitRepo || !hasHead;
69
+ }
70
+ async function isInsideGitRepo(repoRoot) {
71
+ try {
72
+ await execa("git", ["rev-parse", "--is-inside-work-tree"], { cwd: repoRoot });
73
+ return true;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ async function hasGitHead(repoRoot) {
80
+ try {
81
+ await execa("git", ["rev-parse", "--verify", "HEAD"], { cwd: repoRoot });
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ async function ensureGitIdentity(repoRoot) {
89
+ const name = await readGitConfig(repoRoot, "user.name");
90
+ if (!name) {
91
+ await execa("git", ["config", "user.name", "ralph-research"], { cwd: repoRoot });
92
+ }
93
+ const email = await readGitConfig(repoRoot, "user.email");
94
+ if (!email) {
95
+ await execa("git", ["config", "user.email", "rrx@example.invalid"], { cwd: repoRoot });
96
+ }
97
+ }
98
+ async function readGitConfig(repoRoot, key) {
99
+ try {
100
+ const { stdout } = await execa("git", ["config", "--get", key], { cwd: repoRoot });
101
+ const value = stdout.trim();
102
+ return value.length > 0 ? value : null;
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ export function registerInitCommand(program) {
109
+ program
110
+ .command("init")
111
+ .description("Copy a starter template into the current directory or a target path.")
112
+ .requiredOption("--template <name>", "Template name", "writing")
113
+ .option("-p, --path <path>", "Destination directory", process.cwd())
114
+ .option("--force", "Overwrite existing files when needed", false)
115
+ .option("--json", "Emit machine-readable output", false)
116
+ .action(async (options) => {
117
+ const exitCode = await runInitCommand(options);
118
+ if (exitCode !== 0) {
119
+ process.exitCode = exitCode;
120
+ }
121
+ });
122
+ }
123
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface InspectCommandOptions {
4
+ path?: string;
5
+ json?: boolean;
6
+ }
7
+ export declare function runInspectCommand(runId: string, options: InspectCommandOptions, io?: CommandIO): Promise<number>;
8
+ export declare function registerInspectCommand(program: Command): void;
@@ -0,0 +1,55 @@
1
+ import { RunNotFoundError, inspectRun } from "../../app/services/project-state-service.js";
2
+ const defaultCommandIO = {
3
+ stdout: (message) => {
4
+ process.stdout.write(`${message}\n`);
5
+ },
6
+ stderr: (message) => {
7
+ process.stderr.write(`${message}\n`);
8
+ },
9
+ };
10
+ export async function runInspectCommand(runId, options, io = defaultCommandIO) {
11
+ try {
12
+ const result = await inspectRun({
13
+ repoRoot: process.cwd(),
14
+ runId,
15
+ ...(options.path ? { manifestPath: options.path } : {}),
16
+ });
17
+ if (options.json) {
18
+ io.stdout(JSON.stringify(result, null, 2));
19
+ }
20
+ else {
21
+ io.stdout([
22
+ `run: ${result.run.runId} (${result.run.status})`,
23
+ `decision: ${result.decision?.outcome ?? "n/a"}`,
24
+ `reason: ${result.explainability.decisionReason ?? "n/a"}`,
25
+ `judge rationales: ${result.explainability.judgeRationales.length}`,
26
+ ].join("\n"));
27
+ }
28
+ return 0;
29
+ }
30
+ catch (error) {
31
+ const message = error instanceof RunNotFoundError ? error.message : "Failed to inspect run";
32
+ if (options.json) {
33
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
34
+ }
35
+ else {
36
+ io.stderr(message);
37
+ }
38
+ return 1;
39
+ }
40
+ }
41
+ export function registerInspectCommand(program) {
42
+ program
43
+ .command("inspect")
44
+ .description("Inspect a run with diff, metrics, and decision rationale.")
45
+ .argument("<runId>", "Run identifier")
46
+ .option("-p, --path <path>", "Path to the manifest file")
47
+ .option("--json", "Emit machine-readable output", false)
48
+ .action(async (runId, options) => {
49
+ const exitCode = await runInspectCommand(runId, options);
50
+ if (exitCode !== 0) {
51
+ process.exitCode = exitCode;
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/cli/commands/inspect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAQ3F,MAAM,gBAAgB,GAAc;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,OAA8B,EAC9B,KAAgB,gBAAgB;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;YACvB,KAAK;YACL,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CACP;gBACE,QAAQ,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG;gBACjD,aAAa,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK,EAAE;gBAChD,WAAW,MAAM,CAAC,cAAc,CAAC,cAAc,IAAI,KAAK,EAAE;gBAC1D,qBAAqB,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,MAAM,EAAE;aACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC5F,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2DAA2D,CAAC;SACxE,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACrC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA8B,EAAE,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandIO } from "./run.js";
3
+ export interface RejectCommandOptions {
4
+ path?: string;
5
+ note?: string;
6
+ by?: string;
7
+ json?: boolean;
8
+ }
9
+ export declare function runRejectCommand(runId: string, options: RejectCommandOptions, io?: CommandIO): Promise<number>;
10
+ export declare function registerRejectCommand(program: Command): void;
@@ -0,0 +1,54 @@
1
+ import { ManualDecisionService } from "../../app/services/manual-decision-service.js";
2
+ const defaultCommandIO = {
3
+ stdout: (message) => {
4
+ process.stdout.write(`${message}\n`);
5
+ },
6
+ stderr: (message) => {
7
+ process.stderr.write(`${message}\n`);
8
+ },
9
+ };
10
+ export async function runRejectCommand(runId, options, io = defaultCommandIO) {
11
+ try {
12
+ const result = await new ManualDecisionService().reject({
13
+ repoRoot: process.cwd(),
14
+ runId,
15
+ ...(options.path ? { manifestPath: options.path } : {}),
16
+ ...(options.note ? { note: options.note } : {}),
17
+ ...(options.by ? { by: options.by } : {}),
18
+ });
19
+ if (options.json) {
20
+ io.stdout(JSON.stringify({ ok: true, result }, null, 2));
21
+ }
22
+ else {
23
+ io.stdout(`Rejected ${runId}`);
24
+ }
25
+ return 0;
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : "Failed to reject run";
29
+ if (options.json) {
30
+ io.stderr(JSON.stringify({ ok: false, error: message }, null, 2));
31
+ }
32
+ else {
33
+ io.stderr(message);
34
+ }
35
+ return 1;
36
+ }
37
+ }
38
+ export function registerRejectCommand(program) {
39
+ program
40
+ .command("reject")
41
+ .description("Reject a pending human review run and discard its workspace.")
42
+ .argument("<runId>", "Run identifier")
43
+ .option("-p, --path <path>", "Path to the manifest file")
44
+ .option("--note <note>", "Optional rejection note")
45
+ .option("--by <actor>", "Human actor identifier")
46
+ .option("--json", "Emit machine-readable output", false)
47
+ .action(async (runId, options) => {
48
+ const exitCode = await runRejectCommand(runId, options);
49
+ if (exitCode !== 0) {
50
+ process.exitCode = exitCode;
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=reject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reject.js","sourceRoot":"","sources":["../../../src/cli/commands/reject.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAUtF,MAAM,gBAAgB,GAAc;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,OAA6B,EAC7B,KAAgB,gBAAgB;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,qBAAqB,EAAE,CAAC,MAAM,CAAC;YACtD,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;YACvB,KAAK;YACL,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAChF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACrC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;SAClD,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA6B,EAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Command } from "commander";
2
+ export interface RunCommandOptions {
3
+ path?: string;
4
+ cycles?: number;
5
+ json?: boolean;
6
+ resume?: boolean;
7
+ }
8
+ export interface CommandIO {
9
+ stdout(message: string): void;
10
+ stderr(message: string): void;
11
+ }
12
+ export declare function runRunCommand(options: RunCommandOptions, io?: CommandIO): Promise<number>;
13
+ export declare function registerRunCommand(program: Command): void;