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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/adapters/extractor/command-extractor.d.ts +9 -0
- package/dist/adapters/extractor/command-extractor.js +93 -0
- package/dist/adapters/extractor/command-extractor.js.map +1 -0
- package/dist/adapters/extractor/llm-judge-extractor.d.ts +9 -0
- package/dist/adapters/extractor/llm-judge-extractor.js +12 -0
- package/dist/adapters/extractor/llm-judge-extractor.js.map +1 -0
- package/dist/adapters/fs/json-file-decision-store.d.ts +10 -0
- package/dist/adapters/fs/json-file-decision-store.js +53 -0
- package/dist/adapters/fs/json-file-decision-store.js.map +1 -0
- package/dist/adapters/fs/json-file-frontier-store.d.ts +8 -0
- package/dist/adapters/fs/json-file-frontier-store.js +29 -0
- package/dist/adapters/fs/json-file-frontier-store.js.map +1 -0
- package/dist/adapters/fs/json-file-run-store.d.ts +10 -0
- package/dist/adapters/fs/json-file-run-store.js +53 -0
- package/dist/adapters/fs/json-file-run-store.js.map +1 -0
- package/dist/adapters/fs/lockfile.d.ts +24 -0
- package/dist/adapters/fs/lockfile.js +110 -0
- package/dist/adapters/fs/lockfile.js.map +1 -0
- package/dist/adapters/fs/manifest-loader.d.ts +10 -0
- package/dist/adapters/fs/manifest-loader.js +43 -0
- package/dist/adapters/fs/manifest-loader.js.map +1 -0
- package/dist/adapters/git/git-client.d.ts +9 -0
- package/dist/adapters/git/git-client.js +23 -0
- package/dist/adapters/git/git-client.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/judge/llm-judge-provider.d.ts +33 -0
- package/dist/adapters/judge/llm-judge-provider.js +90 -0
- package/dist/adapters/judge/llm-judge-provider.js.map +1 -0
- package/dist/adapters/proposer/command-proposer.d.ts +15 -0
- package/dist/adapters/proposer/command-proposer.js +29 -0
- package/dist/adapters/proposer/command-proposer.js.map +1 -0
- package/dist/app/context.d.ts +5 -0
- package/dist/app/context.js +7 -0
- package/dist/app/context.js.map +1 -0
- package/dist/app/services/manual-decision-service.d.ts +20 -0
- package/dist/app/services/manual-decision-service.js +143 -0
- package/dist/app/services/manual-decision-service.js.map +1 -0
- package/dist/app/services/project-state-service.d.ts +52 -0
- package/dist/app/services/project-state-service.js +92 -0
- package/dist/app/services/project-state-service.js.map +1 -0
- package/dist/app/services/run-cycle-service.d.ts +25 -0
- package/dist/app/services/run-cycle-service.js +69 -0
- package/dist/app/services/run-cycle-service.js.map +1 -0
- package/dist/cli/commands/accept.d.ts +10 -0
- package/dist/cli/commands/accept.js +54 -0
- package/dist/cli/commands/accept.js.map +1 -0
- package/dist/cli/commands/demo.d.ts +9 -0
- package/dist/cli/commands/demo.js +108 -0
- package/dist/cli/commands/demo.js.map +1 -0
- package/dist/cli/commands/frontier.d.ts +8 -0
- package/dist/cli/commands/frontier.js +48 -0
- package/dist/cli/commands/frontier.js.map +1 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.js +123 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +8 -0
- package/dist/cli/commands/inspect.js +55 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/reject.d.ts +10 -0
- package/dist/cli/commands/reject.js +54 -0
- package/dist/cli/commands/reject.js.map +1 -0
- package/dist/cli/commands/run.d.ts +13 -0
- package/dist/cli/commands/run.js +71 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/serve-mcp.d.ts +7 -0
- package/dist/cli/commands/serve-mcp.js +32 -0
- package/dist/cli/commands/serve-mcp.js.map +1 -0
- package/dist/cli/commands/status.d.ts +8 -0
- package/dist/cli/commands/status.js +53 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +11 -0
- package/dist/cli/commands/validate.js +56 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +38 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/engine/anchor-checker.d.ts +35 -0
- package/dist/core/engine/anchor-checker.js +84 -0
- package/dist/core/engine/anchor-checker.js.map +1 -0
- package/dist/core/engine/audit-sampler.d.ts +16 -0
- package/dist/core/engine/audit-sampler.js +25 -0
- package/dist/core/engine/audit-sampler.js.map +1 -0
- package/dist/core/engine/change-budget.d.ts +11 -0
- package/dist/core/engine/change-budget.js +10 -0
- package/dist/core/engine/change-budget.js.map +1 -0
- package/dist/core/engine/cycle-runner.d.ts +39 -0
- package/dist/core/engine/cycle-runner.js +652 -0
- package/dist/core/engine/cycle-runner.js.map +1 -0
- package/dist/core/engine/experiment-runner.d.ts +13 -0
- package/dist/core/engine/experiment-runner.js +24 -0
- package/dist/core/engine/experiment-runner.js.map +1 -0
- package/dist/core/engine/history-compactor.d.ts +15 -0
- package/dist/core/engine/history-compactor.js +76 -0
- package/dist/core/engine/history-compactor.js.map +1 -0
- package/dist/core/engine/judge-pack.d.ts +44 -0
- package/dist/core/engine/judge-pack.js +111 -0
- package/dist/core/engine/judge-pack.js.map +1 -0
- package/dist/core/engine/parallel-proposer.d.ts +21 -0
- package/dist/core/engine/parallel-proposer.js +58 -0
- package/dist/core/engine/parallel-proposer.js.map +1 -0
- package/dist/core/engine/scope-checker.d.ts +35 -0
- package/dist/core/engine/scope-checker.js +166 -0
- package/dist/core/engine/scope-checker.js.map +1 -0
- package/dist/core/engine/workspace-manager.d.ts +32 -0
- package/dist/core/engine/workspace-manager.js +145 -0
- package/dist/core/engine/workspace-manager.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/manifest/defaults.d.ts +55 -0
- package/dist/core/manifest/defaults.js +56 -0
- package/dist/core/manifest/defaults.js.map +1 -0
- package/dist/core/manifest/schema.d.ts +647 -0
- package/dist/core/manifest/schema.js +254 -0
- package/dist/core/manifest/schema.js.map +1 -0
- package/dist/core/model/decision-record.d.ts +38 -0
- package/dist/core/model/decision-record.js +29 -0
- package/dist/core/model/decision-record.js.map +1 -0
- package/dist/core/model/frontier-entry.d.ts +24 -0
- package/dist/core/model/frontier-entry.js +15 -0
- package/dist/core/model/frontier-entry.js.map +1 -0
- package/dist/core/model/metric.d.ts +13 -0
- package/dist/core/model/metric.js +10 -0
- package/dist/core/model/metric.js.map +1 -0
- package/dist/core/model/run-record.d.ts +110 -0
- package/dist/core/model/run-record.js +104 -0
- package/dist/core/model/run-record.js.map +1 -0
- package/dist/core/ports/decision-store.d.ts +6 -0
- package/dist/core/ports/decision-store.js +2 -0
- package/dist/core/ports/decision-store.js.map +1 -0
- package/dist/core/ports/frontier-store.d.ts +5 -0
- package/dist/core/ports/frontier-store.js +2 -0
- package/dist/core/ports/frontier-store.js.map +1 -0
- package/dist/core/ports/run-store.d.ts +6 -0
- package/dist/core/ports/run-store.js +2 -0
- package/dist/core/ports/run-store.js.map +1 -0
- package/dist/core/state/constraint-engine.d.ts +18 -0
- package/dist/core/state/constraint-engine.js +42 -0
- package/dist/core/state/constraint-engine.js.map +1 -0
- package/dist/core/state/frontier-engine.d.ts +24 -0
- package/dist/core/state/frontier-engine.js +178 -0
- package/dist/core/state/frontier-engine.js.map +1 -0
- package/dist/core/state/ratchet-engine.d.ts +28 -0
- package/dist/core/state/ratchet-engine.js +177 -0
- package/dist/core/state/ratchet-engine.js.map +1 -0
- package/dist/core/state/run-state-machine.d.ts +17 -0
- package/dist/core/state/run-state-machine.js +94 -0
- package/dist/core/state/run-state-machine.js.map +1 -0
- package/dist/mcp/main.d.ts +1 -0
- package/dist/mcp/main.js +8 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +97 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/shared/fs-errors.d.ts +1 -0
- package/dist/shared/fs-errors.js +4 -0
- package/dist/shared/fs-errors.js.map +1 -0
- package/dist/shared/logger.d.ts +2 -0
- package/dist/shared/logger.js +5 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/template-utils.d.ts +9 -0
- package/dist/shared/template-utils.js +50 -0
- package/dist/shared/template-utils.js.map +1 -0
- package/package.json +44 -0
- package/templates/writing/docs/draft.md +1 -0
- package/templates/writing/prompts/judge.md +15 -0
- package/templates/writing/ralph.yaml +63 -0
- package/templates/writing/scripts/experiment.mjs +6 -0
- package/templates/writing/scripts/metric.mjs +24 -0
- 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":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAqB,SAAS,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAuB,MAAM,mCAAmC,CAAC;AAqBlF,MAAM,OAAO,eAAe;IACT,aAAa,CAA4B;IACzC,GAAG,CAA2B;IAE/C,YAAmB,eAA4C,EAAE;QAC/D,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,KAA2B;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;YACpF,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAEhF,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACvD,OAAO;oBACL,MAAM,EAAE,iBAAiB;oBACzB,YAAY,EAAE,cAAc,CAAC,IAAI;oBACjC,QAAQ;oBACR,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC;iBACpC,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,gBAAgB,GAAG,IAAI,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B;gBACE,QAAQ;gBACR,YAAY,EAAE,cAAc,CAAC,IAAI;gBACjC,QAAQ,EAAE,cAAc,CAAC,QAAQ;gBACjC,eAAe,EAAE,QAAQ;aAC1B,EACD;gBACE,QAAQ;gBACR,aAAa;gBACb,aAAa;gBACb,gBAAgB;gBAChB,SAAS;gBACT,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvC,CACF,CAAC;YAEF,OAAO;gBACL,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,YAAY,EAAE,cAAc,CAAC,IAAI;gBACjC,QAAQ;gBACR,SAAS;aACV,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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":"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,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvG,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,mEAAmE,CAAC;SAChF,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACrC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACnD,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,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;
|