@neriros/ralphy 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +85 -58
- package/dist/mcp/index.js +6014 -1642
- package/package.json +18 -18
package/dist/cli/index.js
CHANGED
|
@@ -38382,8 +38382,8 @@ var require_cjs = __commonJS((exports, module) => {
|
|
|
38382
38382
|
});
|
|
38383
38383
|
|
|
38384
38384
|
// apps/cli/src/index.ts
|
|
38385
|
-
import { resolve as resolve3, join as
|
|
38386
|
-
import { existsSync as
|
|
38385
|
+
import { resolve as resolve3, join as join14 } from "path";
|
|
38386
|
+
import { existsSync as existsSync7 } from "fs";
|
|
38387
38387
|
|
|
38388
38388
|
// node_modules/.bun/ink@5.2.1+1f88f629f0141b18/node_modules/ink/build/render.js
|
|
38389
38389
|
import { Stream } from "stream";
|
|
@@ -43760,7 +43760,7 @@ var import_react58 = __toESM(require_react(), 1);
|
|
|
43760
43760
|
|
|
43761
43761
|
// apps/cli/src/cli.ts
|
|
43762
43762
|
import { readFileSync as readFileSync2 } from "fs";
|
|
43763
|
-
var VALID_MODES = new Set(["task", "list", "status", "advance", "set-phase"]);
|
|
43763
|
+
var VALID_MODES = new Set(["task", "list", "status", "advance", "set-phase", "init"]);
|
|
43764
43764
|
var VALID_MODELS = new Set(["haiku", "sonnet", "opus"]);
|
|
43765
43765
|
function parseArgs(argv) {
|
|
43766
43766
|
const result2 = {
|
|
@@ -44137,13 +44137,29 @@ function scaffoldTasksDir(tasksDir) {
|
|
|
44137
44137
|
}
|
|
44138
44138
|
}
|
|
44139
44139
|
|
|
44140
|
+
// packages/core/src/init.ts
|
|
44141
|
+
import { mkdirSync as mkdirSync2, existsSync as existsSync4, writeFileSync as writeFileSync2 } from "fs";
|
|
44142
|
+
import { join as join3, dirname as dirname3 } from "path";
|
|
44143
|
+
var GITIGNORE_CONTENT = `tasks/
|
|
44144
|
+
`;
|
|
44145
|
+
function initRalph(ralphDir) {
|
|
44146
|
+
mkdirSync2(join3(ralphDir, "tasks"), { recursive: true });
|
|
44147
|
+
const gitignorePath = join3(ralphDir, ".gitignore");
|
|
44148
|
+
if (!existsSync4(gitignorePath)) {
|
|
44149
|
+
writeFileSync2(gitignorePath, GITIGNORE_CONTENT);
|
|
44150
|
+
}
|
|
44151
|
+
}
|
|
44152
|
+
function initRalphFromTasksDir(tasksDir) {
|
|
44153
|
+
initRalph(dirname3(tasksDir));
|
|
44154
|
+
}
|
|
44155
|
+
|
|
44140
44156
|
// apps/cli/src/components/App.tsx
|
|
44141
44157
|
var import_react57 = __toESM(require_react(), 1);
|
|
44142
|
-
import { join as
|
|
44143
|
-
import { existsSync as
|
|
44158
|
+
import { join as join13 } from "path";
|
|
44159
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync3 } from "fs";
|
|
44144
44160
|
|
|
44145
44161
|
// packages/core/src/state.ts
|
|
44146
|
-
import { join as
|
|
44162
|
+
import { join as join4 } from "path";
|
|
44147
44163
|
import { execSync } from "child_process";
|
|
44148
44164
|
|
|
44149
44165
|
// node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.js
|
|
@@ -48252,14 +48268,14 @@ function formatTaskName(name) {
|
|
|
48252
48268
|
// packages/core/src/state.ts
|
|
48253
48269
|
var STATE_FILE = "state.json";
|
|
48254
48270
|
function readState(taskDir) {
|
|
48255
|
-
const filePath =
|
|
48271
|
+
const filePath = join4(taskDir, STATE_FILE);
|
|
48256
48272
|
const raw = getStorage().read(filePath);
|
|
48257
48273
|
if (raw === null)
|
|
48258
48274
|
throw new Error(`state.json not found in ${taskDir}`);
|
|
48259
48275
|
return StateSchema.parse(JSON.parse(raw));
|
|
48260
48276
|
}
|
|
48261
48277
|
function writeState(taskDir, state) {
|
|
48262
|
-
const filePath =
|
|
48278
|
+
const filePath = join4(taskDir, STATE_FILE);
|
|
48263
48279
|
getStorage().write(filePath, JSON.stringify(state, null, 2) + `
|
|
48264
48280
|
`);
|
|
48265
48281
|
}
|
|
@@ -48288,10 +48304,10 @@ function buildInitialState(opts) {
|
|
|
48288
48304
|
}
|
|
48289
48305
|
function inferPhaseFromFiles(taskDir) {
|
|
48290
48306
|
const storage = getStorage();
|
|
48291
|
-
if (storage.read(
|
|
48307
|
+
if (storage.read(join4(taskDir, "RESEARCH.md")) === null)
|
|
48292
48308
|
return getFirstPhase().name;
|
|
48293
|
-
const plan = storage.read(
|
|
48294
|
-
const progress = storage.read(
|
|
48309
|
+
const plan = storage.read(join4(taskDir, "PLAN.md"));
|
|
48310
|
+
const progress = storage.read(join4(taskDir, "PROGRESS.md"));
|
|
48295
48311
|
if (plan === null || progress === null)
|
|
48296
48312
|
return "plan";
|
|
48297
48313
|
const unchecked = (progress.match(/^- \[ \]/gm) ?? []).length;
|
|
@@ -48305,12 +48321,12 @@ function migrateState(taskDir) {
|
|
|
48305
48321
|
return state;
|
|
48306
48322
|
}
|
|
48307
48323
|
function ensureState(taskDir) {
|
|
48308
|
-
const filePath =
|
|
48324
|
+
const filePath = join4(taskDir, STATE_FILE);
|
|
48309
48325
|
const storage = getStorage();
|
|
48310
48326
|
if (storage.read(filePath) !== null) {
|
|
48311
48327
|
return readState(taskDir);
|
|
48312
48328
|
}
|
|
48313
|
-
const hasFiles = storage.read(
|
|
48329
|
+
const hasFiles = storage.read(join4(taskDir, "RESEARCH.md")) !== null || storage.read(join4(taskDir, "PLAN.md")) !== null || storage.read(join4(taskDir, "PROGRESS.md")) !== null;
|
|
48314
48330
|
if (hasFiles) {
|
|
48315
48331
|
return migrateState(taskDir);
|
|
48316
48332
|
}
|
|
@@ -48321,7 +48337,7 @@ function ensureState(taskDir) {
|
|
|
48321
48337
|
}
|
|
48322
48338
|
|
|
48323
48339
|
// packages/core/src/phases.ts
|
|
48324
|
-
import { join as
|
|
48340
|
+
import { join as join5 } from "path";
|
|
48325
48341
|
|
|
48326
48342
|
// packages/core/src/progress.ts
|
|
48327
48343
|
function extractCurrentSection(content) {
|
|
@@ -48392,7 +48408,7 @@ function advancePhase(state, taskDir) {
|
|
|
48392
48408
|
throw new Error("Task is already done. Nothing to advance.");
|
|
48393
48409
|
}
|
|
48394
48410
|
if (config.loopBack) {
|
|
48395
|
-
const progress = storage.read(
|
|
48411
|
+
const progress = storage.read(join5(taskDir, "PROGRESS.md")) ?? "";
|
|
48396
48412
|
const hasIssues = /\u26A0\uFE0F/.test(progress);
|
|
48397
48413
|
if (hasIssues) {
|
|
48398
48414
|
return recordPhaseTransition(state, current, config.loopBack, "issues found -> loop back");
|
|
@@ -48416,19 +48432,19 @@ function advancePhase(state, taskDir) {
|
|
|
48416
48432
|
}
|
|
48417
48433
|
const nextConfig = getPhase(nextName);
|
|
48418
48434
|
for (const file of nextConfig.requires) {
|
|
48419
|
-
if (storage.read(
|
|
48435
|
+
if (storage.read(join5(taskDir, file)) === null) {
|
|
48420
48436
|
throw new Error(`Cannot advance to ${nextName} \u2014 ${file} does not exist yet`);
|
|
48421
48437
|
}
|
|
48422
48438
|
}
|
|
48423
48439
|
if (nextName === "exec" && current === "plan") {
|
|
48424
|
-
let progressContent = storage.read(
|
|
48440
|
+
let progressContent = storage.read(join5(taskDir, "PROGRESS.md"));
|
|
48425
48441
|
if (progressContent !== null) {
|
|
48426
48442
|
const { unchecked } = countProgress(progressContent);
|
|
48427
48443
|
if (unchecked === 0) {
|
|
48428
48444
|
throw new Error("Cannot advance to exec \u2014 PROGRESS.md has no unchecked items");
|
|
48429
48445
|
}
|
|
48430
48446
|
progressContent = appendChecklists(progressContent);
|
|
48431
|
-
storage.write(
|
|
48447
|
+
storage.write(join5(taskDir, "PROGRESS.md"), progressContent);
|
|
48432
48448
|
}
|
|
48433
48449
|
}
|
|
48434
48450
|
return recordPhaseTransition(state, current, nextName);
|
|
@@ -48442,7 +48458,7 @@ function setPhase(state, taskDir, targetPhase) {
|
|
|
48442
48458
|
function autoTransitionAfterIteration(state, taskDir) {
|
|
48443
48459
|
const config = getPhase(state.phase);
|
|
48444
48460
|
const storage = getStorage();
|
|
48445
|
-
const progress = storage.read(
|
|
48461
|
+
const progress = storage.read(join5(taskDir, "PROGRESS.md"));
|
|
48446
48462
|
if (progress === null)
|
|
48447
48463
|
return state;
|
|
48448
48464
|
if (config.loopBack) {
|
|
@@ -48493,7 +48509,7 @@ function appendChecklists(progress) {
|
|
|
48493
48509
|
const sectionMatches = progress.match(/^## Section \d+/gm);
|
|
48494
48510
|
let nextSection = (sectionMatches?.length ?? 0) + 1;
|
|
48495
48511
|
for (const name of names) {
|
|
48496
|
-
const raw = storage.read(
|
|
48512
|
+
const raw = storage.read(join5(dir, `${name}.md`));
|
|
48497
48513
|
if (raw === null)
|
|
48498
48514
|
continue;
|
|
48499
48515
|
const h1Match = raw.match(/^# (.+)\n/);
|
|
@@ -48511,7 +48527,7 @@ ${body.trimEnd()}
|
|
|
48511
48527
|
|
|
48512
48528
|
// packages/core/src/git.ts
|
|
48513
48529
|
import { execSync as execSync2 } from "child_process";
|
|
48514
|
-
import { join as
|
|
48530
|
+
import { join as join6 } from "path";
|
|
48515
48531
|
function getCurrentBranch() {
|
|
48516
48532
|
try {
|
|
48517
48533
|
return execSync2("git branch --show-current", { encoding: "utf-8" }).trim();
|
|
@@ -48544,7 +48560,7 @@ function gitPush() {
|
|
|
48544
48560
|
}
|
|
48545
48561
|
}
|
|
48546
48562
|
function commitState(taskDir, message) {
|
|
48547
|
-
const stateFile =
|
|
48563
|
+
const stateFile = join6(taskDir, "state.json");
|
|
48548
48564
|
try {
|
|
48549
48565
|
gitAdd([stateFile]);
|
|
48550
48566
|
gitCommit(`docs(ralph): ${message}`);
|
|
@@ -48559,14 +48575,14 @@ function commitTaskDir(taskDir, message) {
|
|
|
48559
48575
|
|
|
48560
48576
|
// apps/cli/src/components/TaskList.tsx
|
|
48561
48577
|
var import_react22 = __toESM(require_react(), 1);
|
|
48562
|
-
import { join as
|
|
48578
|
+
import { join as join7 } from "path";
|
|
48563
48579
|
var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
|
|
48564
48580
|
function buildRows(tasksDir) {
|
|
48565
48581
|
const storage = getStorage();
|
|
48566
48582
|
const entries = storage.list(tasksDir);
|
|
48567
48583
|
const rows = [];
|
|
48568
48584
|
for (const entry of entries) {
|
|
48569
|
-
const raw = storage.read(
|
|
48585
|
+
const raw = storage.read(join7(tasksDir, entry, "state.json"));
|
|
48570
48586
|
if (raw === null)
|
|
48571
48587
|
continue;
|
|
48572
48588
|
let state;
|
|
@@ -48582,7 +48598,7 @@ function buildRows(tasksDir) {
|
|
|
48582
48598
|
`).find((l) => l.trim() !== "") ?? "";
|
|
48583
48599
|
let progress = "\u2014";
|
|
48584
48600
|
let progressStyled = true;
|
|
48585
|
-
const progressContent = storage.read(
|
|
48601
|
+
const progressContent = storage.read(join7(tasksDir, entry, "PROGRESS.md"));
|
|
48586
48602
|
if (progressContent !== null) {
|
|
48587
48603
|
const { checked, unchecked } = countProgress(progressContent);
|
|
48588
48604
|
const total = checked + unchecked;
|
|
@@ -48709,7 +48725,7 @@ function TaskList({ tasksDir }) {
|
|
|
48709
48725
|
}
|
|
48710
48726
|
|
|
48711
48727
|
// apps/cli/src/components/TaskStatus.tsx
|
|
48712
|
-
import { join as
|
|
48728
|
+
import { join as join8 } from "path";
|
|
48713
48729
|
var jsx_dev_runtime2 = __toESM(require_jsx_dev_runtime(), 1);
|
|
48714
48730
|
var HEAVY_RULE = "============================================";
|
|
48715
48731
|
var LIGHT_RULE = "--------------------------------------------";
|
|
@@ -48719,9 +48735,9 @@ function TaskStatus({ state, taskDir }) {
|
|
|
48719
48735
|
const time = Math.round(state.usage.total_duration_ms / 1000 * 10) / 10 + "s";
|
|
48720
48736
|
const documents = getStatusDocuments().map((doc) => ({
|
|
48721
48737
|
name: doc.name,
|
|
48722
|
-
exists: storage.read(
|
|
48738
|
+
exists: storage.read(join8(taskDir, doc.name)) !== null
|
|
48723
48739
|
}));
|
|
48724
|
-
const progressContent = storage.read(
|
|
48740
|
+
const progressContent = storage.read(join8(taskDir, "PROGRESS.md"));
|
|
48725
48741
|
const progress = progressContent !== null ? countProgress(progressContent) : null;
|
|
48726
48742
|
const recent = state.history.slice(-10);
|
|
48727
48743
|
return /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(Box_default, {
|
|
@@ -48889,7 +48905,7 @@ function TaskStatus({ state, taskDir }) {
|
|
|
48889
48905
|
|
|
48890
48906
|
// apps/cli/src/components/TaskLoop.tsx
|
|
48891
48907
|
var import_react56 = __toESM(require_react(), 1);
|
|
48892
|
-
import { join as
|
|
48908
|
+
import { join as join12 } from "path";
|
|
48893
48909
|
|
|
48894
48910
|
// apps/cli/src/components/Banner.tsx
|
|
48895
48911
|
var jsx_dev_runtime3 = __toESM(require_jsx_dev_runtime(), 1);
|
|
@@ -52365,15 +52381,15 @@ function StopMessage({
|
|
|
52365
52381
|
|
|
52366
52382
|
// apps/cli/src/hooks/useLoop.ts
|
|
52367
52383
|
var import_react55 = __toESM(require_react(), 1);
|
|
52368
|
-
import { join as
|
|
52384
|
+
import { join as join11 } from "path";
|
|
52369
52385
|
|
|
52370
52386
|
// packages/engine/src/spawn.ts
|
|
52371
52387
|
var {spawn: bunSpawn } = globalThis.Bun;
|
|
52372
52388
|
var spawn = bunSpawn;
|
|
52373
52389
|
|
|
52374
52390
|
// packages/engine/src/engine.ts
|
|
52375
|
-
import { writeFileSync as
|
|
52376
|
-
import { join as
|
|
52391
|
+
import { writeFileSync as writeFileSync3, unlinkSync as unlinkSync2, existsSync as existsSync5, mkdtempSync } from "fs";
|
|
52392
|
+
import { join as join9 } from "path";
|
|
52377
52393
|
import { tmpdir } from "os";
|
|
52378
52394
|
|
|
52379
52395
|
// packages/output/src/output.ts
|
|
@@ -53129,8 +53145,8 @@ function buildCodexArgs() {
|
|
|
53129
53145
|
return ["exec", "--json", "--color", "never", "--dangerously-bypass-approvals-and-sandbox", "-"];
|
|
53130
53146
|
}
|
|
53131
53147
|
async function runInteractive(model, prompt, taskDir) {
|
|
53132
|
-
const promptFile = taskDir ?
|
|
53133
|
-
|
|
53148
|
+
const promptFile = taskDir ? join9(taskDir, "_interactive_prompt.md") : join9(mkdtempSync(join9(tmpdir(), "ralph-")), "prompt.md");
|
|
53149
|
+
writeFileSync3(promptFile, prompt);
|
|
53134
53150
|
try {
|
|
53135
53151
|
const cmd = [
|
|
53136
53152
|
"claude",
|
|
@@ -53155,8 +53171,8 @@ async function runInteractive(model, prompt, taskDir) {
|
|
|
53155
53171
|
stderr: "inherit"
|
|
53156
53172
|
});
|
|
53157
53173
|
const exitCode = await proc.exited;
|
|
53158
|
-
const doneFile = taskDir ?
|
|
53159
|
-
if (doneFile &&
|
|
53174
|
+
const doneFile = taskDir ? join9(taskDir, "_interactive_done") : null;
|
|
53175
|
+
if (doneFile && existsSync5(doneFile)) {
|
|
53160
53176
|
return { exitCode: 0, usage: null };
|
|
53161
53177
|
}
|
|
53162
53178
|
return { exitCode, usage: null };
|
|
@@ -53255,14 +53271,14 @@ async function runEngine(opts) {
|
|
|
53255
53271
|
}
|
|
53256
53272
|
|
|
53257
53273
|
// apps/cli/src/loop.ts
|
|
53258
|
-
import { join as
|
|
53274
|
+
import { join as join10 } from "path";
|
|
53259
53275
|
function buildTaskPrompt(state, taskDir) {
|
|
53260
53276
|
const phaseConfig = getPhase(state.phase);
|
|
53261
53277
|
let prompt = "";
|
|
53262
53278
|
const storage = getStorage();
|
|
53263
53279
|
for (const doc of getPromptDocuments(state.phase)) {
|
|
53264
53280
|
const injection = doc.promptInjection;
|
|
53265
|
-
const content = storage.read(
|
|
53281
|
+
const content = storage.read(join10(taskDir, doc.name));
|
|
53266
53282
|
if (content === null)
|
|
53267
53283
|
continue;
|
|
53268
53284
|
if (injection.filterHeaders) {
|
|
@@ -53302,7 +53318,7 @@ function buildTaskPrompt(state, taskDir) {
|
|
|
53302
53318
|
for (const entry of phaseConfig.context) {
|
|
53303
53319
|
switch (entry.type) {
|
|
53304
53320
|
case "file": {
|
|
53305
|
-
const content = storage.read(
|
|
53321
|
+
const content = storage.read(join10(taskDir, entry.file));
|
|
53306
53322
|
if (content !== null) {
|
|
53307
53323
|
prompt += `
|
|
53308
53324
|
---
|
|
@@ -53315,7 +53331,7 @@ function buildTaskPrompt(state, taskDir) {
|
|
|
53315
53331
|
break;
|
|
53316
53332
|
}
|
|
53317
53333
|
case "currentSection": {
|
|
53318
|
-
const progressContent = storage.read(
|
|
53334
|
+
const progressContent = storage.read(join10(taskDir, "PROGRESS.md"));
|
|
53319
53335
|
if (progressContent !== null) {
|
|
53320
53336
|
const section = extractCurrentSection(progressContent);
|
|
53321
53337
|
if (section) {
|
|
@@ -53367,7 +53383,7 @@ function buildTemplateVars(state, taskDir) {
|
|
|
53367
53383
|
}
|
|
53368
53384
|
function checkStopSignal(taskDir) {
|
|
53369
53385
|
const storage = getStorage();
|
|
53370
|
-
const stopFile =
|
|
53386
|
+
const stopFile = join10(taskDir, "STOP");
|
|
53371
53387
|
const reason = storage.read(stopFile);
|
|
53372
53388
|
if (reason === null)
|
|
53373
53389
|
return null;
|
|
@@ -53478,10 +53494,10 @@ function useLoop(opts) {
|
|
|
53478
53494
|
setLogLines((prev) => [...prev, { id: nextId(), kind: "feed", event }]);
|
|
53479
53495
|
};
|
|
53480
53496
|
runWithContext(createDefaultContext(), async () => {
|
|
53481
|
-
const taskDir =
|
|
53497
|
+
const taskDir = join11(opts.tasksDir, opts.name);
|
|
53482
53498
|
const storage = getStorage();
|
|
53483
53499
|
let currentState;
|
|
53484
|
-
const existingState = storage.read(
|
|
53500
|
+
const existingState = storage.read(join11(taskDir, "state.json"));
|
|
53485
53501
|
if (existingState !== null) {
|
|
53486
53502
|
currentState = readState(taskDir);
|
|
53487
53503
|
if (currentState.engine !== opts.engine || currentState.model !== opts.model) {
|
|
@@ -53519,7 +53535,7 @@ function useLoop(opts) {
|
|
|
53519
53535
|
const time = new Date().toLocaleTimeString("en-US", { hour12: false });
|
|
53520
53536
|
addIterationHeader(iter, time);
|
|
53521
53537
|
addInfo(`Phase: ${currentState.phase} (iteration ${currentState.phaseIteration})`);
|
|
53522
|
-
const progressContent = storage.read(
|
|
53538
|
+
const progressContent = storage.read(join11(taskDir, "PROGRESS.md"));
|
|
53523
53539
|
if (progressContent !== null) {
|
|
53524
53540
|
const section = extractCurrentSection(progressContent);
|
|
53525
53541
|
if (section) {
|
|
@@ -53531,10 +53547,11 @@ function useLoop(opts) {
|
|
|
53531
53547
|
setProgress(p);
|
|
53532
53548
|
addInfo(`Progress: ${p.checked} done / ${p.unchecked} remaining`);
|
|
53533
53549
|
}
|
|
53550
|
+
const phaseBeforeEngine = currentState.phase;
|
|
53534
53551
|
const prompt = buildTaskPrompt(currentState, taskDir);
|
|
53535
53552
|
const iterStart = new Date().toISOString();
|
|
53536
53553
|
try {
|
|
53537
|
-
const interactiveDone = storage.read(
|
|
53554
|
+
const interactiveDone = storage.read(join11(taskDir, "_interactive_done")) !== null;
|
|
53538
53555
|
const isInteractivePhase = opts.interactive && currentState.phase === "research" && !interactiveDone;
|
|
53539
53556
|
const engineResult = await runEngine({
|
|
53540
53557
|
engine: opts.engine,
|
|
@@ -53557,14 +53574,16 @@ function useLoop(opts) {
|
|
|
53557
53574
|
lastResult = result2;
|
|
53558
53575
|
}
|
|
53559
53576
|
setConsecutiveFailures(consFailures);
|
|
53560
|
-
|
|
53577
|
+
continue;
|
|
53561
53578
|
}
|
|
53562
53579
|
currentState = updateStateIteration(taskDir, "success", iterStart, opts.engine, opts.model, engineResult.usage);
|
|
53563
53580
|
setState(currentState);
|
|
53564
53581
|
consFailures = 0;
|
|
53565
53582
|
lastResult = "";
|
|
53566
53583
|
setConsecutiveFailures(0);
|
|
53567
|
-
|
|
53584
|
+
if (currentState.phase === phaseBeforeEngine) {
|
|
53585
|
+
currentState = autoTransitionAfterIteration(currentState, taskDir);
|
|
53586
|
+
}
|
|
53568
53587
|
setState(currentState);
|
|
53569
53588
|
setCurrentPhase(currentState.phase);
|
|
53570
53589
|
try {
|
|
@@ -53585,8 +53604,8 @@ function useLoop(opts) {
|
|
|
53585
53604
|
break;
|
|
53586
53605
|
}
|
|
53587
53606
|
}
|
|
53588
|
-
storage.remove(
|
|
53589
|
-
const finalProgressContent = storage.read(
|
|
53607
|
+
storage.remove(join11(taskDir, "_interactive_done"));
|
|
53608
|
+
const finalProgressContent = storage.read(join11(taskDir, "PROGRESS.md"));
|
|
53590
53609
|
if (finalProgressContent !== null) {
|
|
53591
53610
|
setProgress(countProgress(finalProgressContent));
|
|
53592
53611
|
}
|
|
@@ -53677,7 +53696,7 @@ function TaskLoop({ opts }) {
|
|
|
53677
53696
|
}, [loop.isRunning, exit]);
|
|
53678
53697
|
if (!loop.state)
|
|
53679
53698
|
return null;
|
|
53680
|
-
const taskDir =
|
|
53699
|
+
const taskDir = join12(opts.tasksDir, opts.name);
|
|
53681
53700
|
return /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(Box_default, {
|
|
53682
53701
|
flexDirection: "column",
|
|
53683
53702
|
children: [
|
|
@@ -53777,8 +53796,8 @@ function App2({ args, tasksDir }) {
|
|
|
53777
53796
|
message: "Error: --name is required for status mode"
|
|
53778
53797
|
}, undefined, false, undefined, this);
|
|
53779
53798
|
}
|
|
53780
|
-
const taskDir =
|
|
53781
|
-
if (!
|
|
53799
|
+
const taskDir = join13(tasksDir, args.name);
|
|
53800
|
+
if (!existsSync6(join13(taskDir, "state.json"))) {
|
|
53782
53801
|
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ErrorMessage, {
|
|
53783
53802
|
message: `Error: task '${args.name}' not found`
|
|
53784
53803
|
}, undefined, false, undefined, this);
|
|
@@ -53797,7 +53816,7 @@ function App2({ args, tasksDir }) {
|
|
|
53797
53816
|
message: "Error: --name is required for advance mode"
|
|
53798
53817
|
}, undefined, false, undefined, this);
|
|
53799
53818
|
}
|
|
53800
|
-
const taskDir =
|
|
53819
|
+
const taskDir = join13(tasksDir, args.name);
|
|
53801
53820
|
const state = ensureState(taskDir);
|
|
53802
53821
|
const updated = advancePhase(state, taskDir);
|
|
53803
53822
|
writeState(taskDir, updated);
|
|
@@ -53819,7 +53838,7 @@ function App2({ args, tasksDir }) {
|
|
|
53819
53838
|
message: "Error: --phase is required for set-phase mode"
|
|
53820
53839
|
}, undefined, false, undefined, this);
|
|
53821
53840
|
}
|
|
53822
|
-
const taskDir =
|
|
53841
|
+
const taskDir = join13(tasksDir, args.name);
|
|
53823
53842
|
const state = ensureState(taskDir);
|
|
53824
53843
|
const updated = setPhase(state, taskDir, args.phase);
|
|
53825
53844
|
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ExitAfterRender, {
|
|
@@ -53828,13 +53847,20 @@ function App2({ args, tasksDir }) {
|
|
|
53828
53847
|
}, undefined, false, undefined, this)
|
|
53829
53848
|
}, undefined, false, undefined, this);
|
|
53830
53849
|
}
|
|
53850
|
+
case "init":
|
|
53851
|
+
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ExitAfterRender, {
|
|
53852
|
+
children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
|
|
53853
|
+
color: "green",
|
|
53854
|
+
children: "Initialized .ralph directory"
|
|
53855
|
+
}, undefined, false, undefined, this)
|
|
53856
|
+
}, undefined, false, undefined, this);
|
|
53831
53857
|
case "task": {
|
|
53832
53858
|
if (!args.name) {
|
|
53833
53859
|
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ErrorMessage, {
|
|
53834
53860
|
message: "Error: --name is required for task mode"
|
|
53835
53861
|
}, undefined, false, undefined, this);
|
|
53836
53862
|
}
|
|
53837
|
-
|
|
53863
|
+
mkdirSync3(join13(tasksDir, args.name), { recursive: true });
|
|
53838
53864
|
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(TaskLoop, {
|
|
53839
53865
|
opts: {
|
|
53840
53866
|
name: args.name,
|
|
@@ -53861,17 +53887,18 @@ function App2({ args, tasksDir }) {
|
|
|
53861
53887
|
function resolveTasksDir2() {
|
|
53862
53888
|
let dir = process.cwd();
|
|
53863
53889
|
while (dir !== "/") {
|
|
53864
|
-
const candidate =
|
|
53865
|
-
if (
|
|
53890
|
+
const candidate = join14(dir, ".ralph", "tasks");
|
|
53891
|
+
if (existsSync7(candidate))
|
|
53866
53892
|
return candidate;
|
|
53867
53893
|
dir = resolve3(dir, "..");
|
|
53868
53894
|
}
|
|
53869
|
-
return
|
|
53895
|
+
return join14(process.cwd(), ".ralph", "tasks");
|
|
53870
53896
|
}
|
|
53871
53897
|
try {
|
|
53872
53898
|
const args = parseArgs(process.argv.slice(2));
|
|
53873
53899
|
const tasksDir = resolveTasksDir2();
|
|
53874
53900
|
runWithContext(createDefaultContext(), () => {
|
|
53901
|
+
initRalphFromTasksDir(tasksDir);
|
|
53875
53902
|
scaffoldTasksDir(tasksDir);
|
|
53876
53903
|
render_default(import_react58.createElement(App2, { args, tasksDir }));
|
|
53877
53904
|
});
|