ralph-cursor 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/README.md +724 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +60 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +69 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +162 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +28 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/loop.d.ts +3 -0
- package/dist/commands/loop.d.ts.map +1 -0
- package/dist/commands/loop.js +186 -0
- package/dist/commands/loop.js.map +1 -0
- package/dist/commands/once.d.ts +3 -0
- package/dist/commands/once.d.ts.map +1 -0
- package/dist/commands/once.js +187 -0
- package/dist/commands/once.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +328 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +33 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/task.d.ts +3 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +161 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +48 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/last-run.d.ts +12 -0
- package/dist/lib/last-run.d.ts.map +1 -0
- package/dist/lib/last-run.js +33 -0
- package/dist/lib/last-run.js.map +1 -0
- package/dist/lib/ralph-dir.d.ts +6 -0
- package/dist/lib/ralph-dir.d.ts.map +1 -0
- package/dist/lib/ralph-dir.js +96 -0
- package/dist/lib/ralph-dir.js.map +1 -0
- package/dist/lib/spawn.d.ts +11 -0
- package/dist/lib/spawn.d.ts.map +1 -0
- package/dist/lib/spawn.js +29 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/tail.d.ts +9 -0
- package/dist/lib/tail.d.ts.map +1 -0
- package/dist/lib/tail.js +58 -0
- package/dist/lib/tail.js.map +1 -0
- package/dist/loop/index.d.ts +32 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/index.js +165 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/prompt.d.ts +5 -0
- package/dist/loop/prompt.d.ts.map +1 -0
- package/dist/loop/prompt.js +77 -0
- package/dist/loop/prompt.js.map +1 -0
- package/dist/loop/retry.d.ts +22 -0
- package/dist/loop/retry.d.ts.map +1 -0
- package/dist/loop/retry.js +65 -0
- package/dist/loop/retry.js.map +1 -0
- package/dist/parallel/lock.d.ts +7 -0
- package/dist/parallel/lock.d.ts.map +1 -0
- package/dist/parallel/lock.js +110 -0
- package/dist/parallel/lock.js.map +1 -0
- package/dist/parallel/merge.d.ts +5 -0
- package/dist/parallel/merge.d.ts.map +1 -0
- package/dist/parallel/merge.js +39 -0
- package/dist/parallel/merge.js.map +1 -0
- package/dist/parallel/run.d.ts +18 -0
- package/dist/parallel/run.d.ts.map +1 -0
- package/dist/parallel/run.js +407 -0
- package/dist/parallel/run.js.map +1 -0
- package/dist/parallel/worktree.d.ts +12 -0
- package/dist/parallel/worktree.d.ts.map +1 -0
- package/dist/parallel/worktree.js +69 -0
- package/dist/parallel/worktree.js.map +1 -0
- package/dist/stream-parser/index.d.ts +18 -0
- package/dist/stream-parser/index.d.ts.map +1 -0
- package/dist/stream-parser/index.js +248 -0
- package/dist/stream-parser/index.js.map +1 -0
- package/dist/task-parser/index.d.ts +21 -0
- package/dist/task-parser/index.d.ts.map +1 -0
- package/dist/task-parser/index.js +195 -0
- package/dist/task-parser/index.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
const PROMPT_CHARS_DEFAULT = 3000;
|
|
4
|
+
const DEFAULT_WARN = 70_000;
|
|
5
|
+
const DEFAULT_ROTATE = 80_000;
|
|
6
|
+
const THRASH_WINDOW_MS = 10 * 60 * 1000; // 10 min
|
|
7
|
+
const THRASH_COUNT = 5;
|
|
8
|
+
const SHELL_FAIL_COUNT = 3;
|
|
9
|
+
/** Retryable error patterns (rate limit, network, 5xx). */
|
|
10
|
+
const RETRYABLE_PATTERNS = [
|
|
11
|
+
/rate\s*limit|rate_limit|rate-limit/i,
|
|
12
|
+
/quota\s*exceeded|quota\s*limit|hit\s*your\s*limit/i,
|
|
13
|
+
/too\s*many\s*requests|429|http\s*429/i,
|
|
14
|
+
/timeout|timed\s*out|connection\s*timeout/i,
|
|
15
|
+
/network\s*error|network\s*unavailable/i,
|
|
16
|
+
/connection\s*refused|connection\s*reset|econnreset/i,
|
|
17
|
+
/connection\s*closed|connection\s*failed|etimedout|enotfound/i,
|
|
18
|
+
/service\s*unavailable|503/i,
|
|
19
|
+
/bad\s*gateway|502/i,
|
|
20
|
+
/gateway\s*timeout|504/i,
|
|
21
|
+
/overloaded|server\s*busy|try\s*again/i,
|
|
22
|
+
];
|
|
23
|
+
/** Returns true if the error message matches retryable patterns (rate limit, timeout, 5xx). */
|
|
24
|
+
export function isRetryableError(msg) {
|
|
25
|
+
return RETRYABLE_PATTERNS.some((re) => re.test(msg));
|
|
26
|
+
}
|
|
27
|
+
export function createStreamParser(workspace, options = {}) {
|
|
28
|
+
const ralphDir = join(workspace, ".ralph");
|
|
29
|
+
const warnThreshold = options.warnThreshold ?? DEFAULT_WARN;
|
|
30
|
+
const rotateThreshold = options.rotateThreshold ?? DEFAULT_ROTATE;
|
|
31
|
+
const promptChars = options.promptChars ?? PROMPT_CHARS_DEFAULT;
|
|
32
|
+
let bytesRead = 0;
|
|
33
|
+
let bytesWritten = 0;
|
|
34
|
+
let assistantChars = 0;
|
|
35
|
+
let shellOutputChars = 0;
|
|
36
|
+
let warnSent = false;
|
|
37
|
+
const signalCbs = [];
|
|
38
|
+
const shellFailures = new Map();
|
|
39
|
+
const fileWrites = [];
|
|
40
|
+
if (!existsSync(ralphDir)) {
|
|
41
|
+
mkdirSync(ralphDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
function emit(signal) {
|
|
44
|
+
signalCbs.forEach((cb) => cb(signal));
|
|
45
|
+
}
|
|
46
|
+
function getTokens() {
|
|
47
|
+
const total = promptChars + bytesRead + bytesWritten + assistantChars + shellOutputChars;
|
|
48
|
+
return Math.floor(total / 4);
|
|
49
|
+
}
|
|
50
|
+
/** Health emoji by token % (integer division). */
|
|
51
|
+
function getHealthEmoji(tokens) {
|
|
52
|
+
const pct = Math.floor((tokens * 100) / rotateThreshold);
|
|
53
|
+
if (pct < 60)
|
|
54
|
+
return "🟢";
|
|
55
|
+
if (pct < 80)
|
|
56
|
+
return "🟡";
|
|
57
|
+
return "🔴";
|
|
58
|
+
}
|
|
59
|
+
function logActivity(message) {
|
|
60
|
+
const ts = new Date().toLocaleTimeString("en-GB", { hour12: false });
|
|
61
|
+
const tokens = getTokens();
|
|
62
|
+
const emoji = getHealthEmoji(tokens);
|
|
63
|
+
appendFileSync(join(ralphDir, "activity.log"), `[${ts}] ${emoji} ${message}\n`);
|
|
64
|
+
}
|
|
65
|
+
function logError(message) {
|
|
66
|
+
const ts = new Date().toLocaleTimeString("en-GB", { hour12: false });
|
|
67
|
+
appendFileSync(join(ralphDir, "errors.log"), `[${ts}] ${message}\n`);
|
|
68
|
+
}
|
|
69
|
+
function checkThresholds() {
|
|
70
|
+
const tokens = getTokens();
|
|
71
|
+
if (tokens >= rotateThreshold) {
|
|
72
|
+
logActivity(`ROTATE: Token threshold reached (${tokens} >= ${rotateThreshold})`);
|
|
73
|
+
emit("ROTATE");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (tokens >= warnThreshold && !warnSent) {
|
|
77
|
+
warnSent = true;
|
|
78
|
+
logActivity(`WARN: Approaching token limit (${tokens} >= ${warnThreshold})`);
|
|
79
|
+
emit("WARN");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function startSession() {
|
|
83
|
+
const sep = "═══════════════════════════════════════════════════════════════";
|
|
84
|
+
appendFileSync(join(ralphDir, "activity.log"), `\n${sep}\nRalph Session Started: ${new Date().toString()}\n${sep}\n`);
|
|
85
|
+
}
|
|
86
|
+
function logTokenStatus() {
|
|
87
|
+
const tokens = getTokens();
|
|
88
|
+
const pct = Math.floor((tokens * 100) / rotateThreshold);
|
|
89
|
+
const emoji = getHealthEmoji(tokens);
|
|
90
|
+
const ts = new Date().toLocaleTimeString("en-GB", { hour12: false });
|
|
91
|
+
let statusMsg = `TOKENS: ${tokens} / ${rotateThreshold} (${pct}%)`;
|
|
92
|
+
if (pct >= 90)
|
|
93
|
+
statusMsg += " - rotation imminent";
|
|
94
|
+
else if (pct >= 72)
|
|
95
|
+
statusMsg += " - approaching limit";
|
|
96
|
+
const breakdown = `[read:${Math.floor(bytesRead / 1024)}KB write:${Math.floor(bytesWritten / 1024)}KB assist:${Math.floor(assistantChars / 1024)}KB shell:${Math.floor(shellOutputChars / 1024)}KB]`;
|
|
97
|
+
appendFileSync(join(ralphDir, "activity.log"), `[${ts}] ${emoji} ${statusMsg} ${breakdown}\n`);
|
|
98
|
+
}
|
|
99
|
+
function trackFileWrite(path) {
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
fileWrites.push({ ts: now, path });
|
|
102
|
+
const cutoff = now - THRASH_WINDOW_MS;
|
|
103
|
+
const recent = fileWrites.filter((w) => w.ts >= cutoff && w.path === path);
|
|
104
|
+
if (recent.length >= THRASH_COUNT) {
|
|
105
|
+
logError(`⚠️ THRASHING: ${path} written ${recent.length}x in 10 min`);
|
|
106
|
+
emit("GUTTER");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function trackShellFailure(cmd, exitCode) {
|
|
110
|
+
const count = (shellFailures.get(cmd) ?? 0) + 1;
|
|
111
|
+
shellFailures.set(cmd, count);
|
|
112
|
+
logError(`SHELL FAIL: ${cmd} → exit ${exitCode} (attempt ${count})`);
|
|
113
|
+
if (count >= SHELL_FAIL_COUNT) {
|
|
114
|
+
logError(`⚠️ GUTTER: same command failed ${count}x`);
|
|
115
|
+
emit("GUTTER");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function isRetryableError(msg) {
|
|
119
|
+
return RETRYABLE_PATTERNS.some((re) => re.test(msg));
|
|
120
|
+
}
|
|
121
|
+
function processLine(line) {
|
|
122
|
+
const trimmed = line.trim();
|
|
123
|
+
if (!trimmed)
|
|
124
|
+
return;
|
|
125
|
+
let obj;
|
|
126
|
+
try {
|
|
127
|
+
obj = JSON.parse(trimmed);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const rec = obj;
|
|
133
|
+
const type = rec.type;
|
|
134
|
+
const subtype = rec.subtype;
|
|
135
|
+
switch (type) {
|
|
136
|
+
case "system":
|
|
137
|
+
if (subtype === "init") {
|
|
138
|
+
const model = rec.model ?? "unknown";
|
|
139
|
+
logActivity(`SESSION START: model=${model}`);
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
case "error": {
|
|
143
|
+
const err = rec.error;
|
|
144
|
+
const data = err?.data;
|
|
145
|
+
const msg = data?.message ??
|
|
146
|
+
err?.message ??
|
|
147
|
+
rec.message ??
|
|
148
|
+
"Unknown error";
|
|
149
|
+
const msgStr = String(msg);
|
|
150
|
+
logError(`API ERROR: ${msgStr}`);
|
|
151
|
+
logActivity(`❌ API ERROR: ${msgStr}`);
|
|
152
|
+
if (isRetryableError(msgStr)) {
|
|
153
|
+
logError("⚠️ RETRYABLE: Error may be transient (rate limit/network)");
|
|
154
|
+
emit("DEFER");
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
logError("🚨 NON-RETRYABLE: Error requires attention");
|
|
158
|
+
emit("GUTTER");
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case "assistant": {
|
|
163
|
+
const msg = rec.message;
|
|
164
|
+
const text = msg?.content?.[0]?.text ?? "";
|
|
165
|
+
if (text) {
|
|
166
|
+
assistantChars += text.length;
|
|
167
|
+
if (text.includes("<ralph>COMPLETE</ralph>")) {
|
|
168
|
+
logActivity("✅ Agent signaled COMPLETE");
|
|
169
|
+
emit("COMPLETE");
|
|
170
|
+
}
|
|
171
|
+
if (text.includes("<ralph>GUTTER</ralph>")) {
|
|
172
|
+
logActivity("🚨 Agent signaled GUTTER (stuck)");
|
|
173
|
+
emit("GUTTER");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case "tool_call":
|
|
179
|
+
if (subtype === "started") {
|
|
180
|
+
// just count if needed
|
|
181
|
+
}
|
|
182
|
+
else if (subtype === "completed") {
|
|
183
|
+
const tc = rec.tool_call;
|
|
184
|
+
const readTool = tc?.readToolCall;
|
|
185
|
+
if (readTool?.result && readTool.result.success) {
|
|
186
|
+
const success = readTool.result.success;
|
|
187
|
+
const path = readTool.args?.path ?? "unknown";
|
|
188
|
+
const contentSize = success.contentSize ?? 0;
|
|
189
|
+
const lines = success.totalLines ?? 0;
|
|
190
|
+
const bytes = contentSize > 0 ? contentSize : lines * 100;
|
|
191
|
+
bytesRead += bytes;
|
|
192
|
+
const kb = (bytes / 1024).toFixed(1);
|
|
193
|
+
logActivity(`READ ${path} (${lines} lines, ~${kb}KB)`);
|
|
194
|
+
}
|
|
195
|
+
const writeTool = tc?.writeToolCall;
|
|
196
|
+
if (writeTool?.result && writeTool.result.success) {
|
|
197
|
+
const success = writeTool.result.success;
|
|
198
|
+
const path = writeTool.args?.path ?? "unknown";
|
|
199
|
+
const bytes = success.fileSize ?? 0;
|
|
200
|
+
const lines = success.linesCreated ?? 0;
|
|
201
|
+
bytesWritten += bytes;
|
|
202
|
+
trackFileWrite(path);
|
|
203
|
+
const kb = (bytes / 1024).toFixed(1);
|
|
204
|
+
logActivity(`WRITE ${path} (${lines} lines, ${kb}KB)`);
|
|
205
|
+
}
|
|
206
|
+
const shellTool = tc?.shellToolCall;
|
|
207
|
+
if (shellTool?.result) {
|
|
208
|
+
const result = shellTool.result;
|
|
209
|
+
const cmd = shellTool.args?.command ?? "unknown";
|
|
210
|
+
const exitCode = result.exitCode ?? 0;
|
|
211
|
+
const stdout = result.stdout ?? "";
|
|
212
|
+
const stderr = result.stderr ?? "";
|
|
213
|
+
shellOutputChars += stdout.length + stderr.length;
|
|
214
|
+
if (exitCode === 0) {
|
|
215
|
+
if (stdout.length + stderr.length > 1024) {
|
|
216
|
+
logActivity(`SHELL ${cmd} → exit 0 (${stdout.length + stderr.length} chars output)`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
logActivity(`SHELL ${cmd} → exit 0`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
logActivity(`SHELL ${cmd} → exit ${exitCode}`);
|
|
224
|
+
trackShellFailure(cmd, exitCode);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
checkThresholds();
|
|
228
|
+
}
|
|
229
|
+
break;
|
|
230
|
+
case "result": {
|
|
231
|
+
const duration = rec.duration_ms ?? 0;
|
|
232
|
+
const tokens = getTokens();
|
|
233
|
+
logActivity(`SESSION END: ${duration}ms, ~${tokens} tokens used`);
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
processLine,
|
|
240
|
+
onSignal(cb) {
|
|
241
|
+
signalCbs.push(cb);
|
|
242
|
+
},
|
|
243
|
+
getTokens,
|
|
244
|
+
startSession,
|
|
245
|
+
logTokenStatus,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stream-parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function getTaskFilePath(workspace: string, taskFile?: string): string;
|
|
2
|
+
export interface TaskItem {
|
|
3
|
+
id: string;
|
|
4
|
+
status: "pending" | "completed";
|
|
5
|
+
description: string;
|
|
6
|
+
group?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseTasks(workspace: string, taskFilePath?: string): void;
|
|
9
|
+
export declare function getProgress(workspace: string, taskFilePath?: string): string;
|
|
10
|
+
export declare function countRemaining(workspace: string, taskFilePath?: string): number;
|
|
11
|
+
export declare function getNextTask(workspace: string, taskFilePath?: string): TaskItem | null;
|
|
12
|
+
export declare function getAllTasks(workspace: string, taskFilePath?: string): TaskItem[];
|
|
13
|
+
/** Pending tasks in a given group (for parallel mode). */
|
|
14
|
+
export declare function getTasksByGroup(workspace: string, groupId: number, taskFilePath?: string): TaskItem[];
|
|
15
|
+
/** Unique group IDs that have at least one pending task, sorted numerically. */
|
|
16
|
+
export declare function getPendingGroups(workspace: string, taskFilePath?: string): number[];
|
|
17
|
+
export declare function checkTaskComplete(workspace: string, taskFilePath?: string): string;
|
|
18
|
+
export declare function getTaskById(workspace: string, taskId: string, taskFilePath?: string): TaskItem | null;
|
|
19
|
+
export declare function markTaskComplete(workspace: string, taskId: string, taskFilePath?: string): void;
|
|
20
|
+
export declare function markTaskIncomplete(workspace: string, taskId: string, taskFilePath?: string): void;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task-parser/index.ts"],"names":[],"mappings":"AAoBA,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CA8BzE;AAmBD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGrF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAEhF;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,QAAQ,EAAE,CAIZ;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGrG;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAiB/F;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBjG"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, statSync, unlinkSync } from "fs";
|
|
2
|
+
import { join, isAbsolute } from "path";
|
|
3
|
+
const TASK_CACHE_FILE = "tasks.yaml";
|
|
4
|
+
const TASK_MTIME_FILE = "tasks.mtime";
|
|
5
|
+
const DEFAULT_GROUP_FALLBACK = 999999;
|
|
6
|
+
/** Default group for tasks without <!-- group: N -->. Override via DEFAULT_GROUP or RALPH_DEFAULT_GROUP env. */
|
|
7
|
+
function getDefaultGroup() {
|
|
8
|
+
const env = process.env.RALPH_DEFAULT_GROUP ?? process.env.DEFAULT_GROUP;
|
|
9
|
+
if (env === undefined || env === "")
|
|
10
|
+
return DEFAULT_GROUP_FALLBACK;
|
|
11
|
+
const n = parseInt(env, 10);
|
|
12
|
+
return Number.isNaN(n) ? DEFAULT_GROUP_FALLBACK : n;
|
|
13
|
+
}
|
|
14
|
+
const CHECKBOX_REGEX = /^\s*([-*]|\d+\.)\s+\[(x|X| )]\s+(.*)$/;
|
|
15
|
+
const GROUP_REGEX = /<!--\s*group:\s*(\d+)\s*-->/;
|
|
16
|
+
export function getTaskFilePath(workspace, taskFile) {
|
|
17
|
+
if (taskFile)
|
|
18
|
+
return isAbsolute(taskFile) ? taskFile : join(workspace, taskFile);
|
|
19
|
+
const envPath = process.env.RALPH_TASK_FILE;
|
|
20
|
+
if (envPath)
|
|
21
|
+
return envPath;
|
|
22
|
+
return join(workspace, "RALPH_TASK.md");
|
|
23
|
+
}
|
|
24
|
+
/** File mtime in seconds for cache invalidation. */
|
|
25
|
+
function getFileMtime(filePath) {
|
|
26
|
+
try {
|
|
27
|
+
return Math.floor(statSync(filePath).mtimeMs / 1000);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function parseTaskFileContent(content) {
|
|
34
|
+
const lines = content.replace(/\r\n/g, "\n").split("\n");
|
|
35
|
+
const tasks = [];
|
|
36
|
+
lines.forEach((line, i) => {
|
|
37
|
+
const lineNum = i + 1;
|
|
38
|
+
const m = line.match(CHECKBOX_REGEX);
|
|
39
|
+
if (!m)
|
|
40
|
+
return;
|
|
41
|
+
const statusChar = m[2];
|
|
42
|
+
let description = m[3];
|
|
43
|
+
const groupMatch = line.match(GROUP_REGEX);
|
|
44
|
+
const group = groupMatch ? parseInt(groupMatch[1], 10) : getDefaultGroup();
|
|
45
|
+
description = description.replace(/\s*<!--\s*group:\s*\d+\s*-->\s*/g, "").trim();
|
|
46
|
+
const status = statusChar === "x" || statusChar === "X" ? "completed" : "pending";
|
|
47
|
+
tasks.push({
|
|
48
|
+
id: `line_${lineNum}`,
|
|
49
|
+
status,
|
|
50
|
+
description,
|
|
51
|
+
group,
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
return tasks;
|
|
55
|
+
}
|
|
56
|
+
const taskCache = new Map();
|
|
57
|
+
export function parseTasks(workspace, taskFilePath) {
|
|
58
|
+
const path = getTaskFilePath(workspace, taskFilePath);
|
|
59
|
+
if (!existsSync(path)) {
|
|
60
|
+
throw new Error(`No task file found at ${path}`);
|
|
61
|
+
}
|
|
62
|
+
const ralphDir = join(workspace, ".ralph");
|
|
63
|
+
const cachePath = join(ralphDir, TASK_CACHE_FILE);
|
|
64
|
+
const mtimePath = join(ralphDir, TASK_MTIME_FILE);
|
|
65
|
+
const currentMtime = getFileMtime(path);
|
|
66
|
+
if (existsSync(cachePath) && existsSync(mtimePath)) {
|
|
67
|
+
const cachedMtime = Number(readFileSync(mtimePath, "utf-8").trim());
|
|
68
|
+
if (cachedMtime === currentMtime && taskCache.has(workspace)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const content = readFileSync(path, "utf-8");
|
|
73
|
+
const tasks = parseTaskFileContent(content);
|
|
74
|
+
if (!existsSync(ralphDir)) {
|
|
75
|
+
mkdirSync(ralphDir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
const mtime = currentMtime;
|
|
78
|
+
writeFileSync(mtimePath, String(mtime));
|
|
79
|
+
const defaultGroup = getDefaultGroup();
|
|
80
|
+
let yaml = "# Ralph Task Cache\nsource_file: RALPH_TASK.md\nsource_mtime: " + mtime + "\ntasks:\n";
|
|
81
|
+
tasks.forEach((t) => {
|
|
82
|
+
const desc = t.description.includes(":") || t.description.includes('"') ? `"${t.description.replace(/"/g, '\\"')}"` : t.description;
|
|
83
|
+
yaml += ` - id: ${t.id}\n status: ${t.status}\n parallel_group: ${t.group ?? defaultGroup}\n description: ${desc}\n`;
|
|
84
|
+
});
|
|
85
|
+
writeFileSync(cachePath, yaml);
|
|
86
|
+
taskCache.set(workspace, tasks);
|
|
87
|
+
}
|
|
88
|
+
function getTasks(workspace, taskFilePath) {
|
|
89
|
+
const path = getTaskFilePath(workspace, taskFilePath);
|
|
90
|
+
if (!existsSync(path))
|
|
91
|
+
return [];
|
|
92
|
+
const ralphDir = join(workspace, ".ralph");
|
|
93
|
+
const cachePath = join(ralphDir, TASK_CACHE_FILE);
|
|
94
|
+
const mtimePath = join(ralphDir, TASK_MTIME_FILE);
|
|
95
|
+
const currentMtime = getFileMtime(path);
|
|
96
|
+
if (existsSync(cachePath) && existsSync(mtimePath)) {
|
|
97
|
+
const cachedMtime = Number(readFileSync(mtimePath, "utf-8").trim());
|
|
98
|
+
if (cachedMtime === currentMtime && taskCache.has(workspace)) {
|
|
99
|
+
return taskCache.get(workspace);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
parseTasks(workspace, taskFilePath);
|
|
103
|
+
return taskCache.get(workspace);
|
|
104
|
+
}
|
|
105
|
+
export function getProgress(workspace, taskFilePath) {
|
|
106
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
107
|
+
const completed = tasks.filter((t) => t.status === "completed").length;
|
|
108
|
+
return `${completed}:${tasks.length}`;
|
|
109
|
+
}
|
|
110
|
+
export function countRemaining(workspace, taskFilePath) {
|
|
111
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
112
|
+
return tasks.filter((t) => t.status === "pending").length;
|
|
113
|
+
}
|
|
114
|
+
export function getNextTask(workspace, taskFilePath) {
|
|
115
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
116
|
+
return tasks.find((t) => t.status === "pending") ?? null;
|
|
117
|
+
}
|
|
118
|
+
export function getAllTasks(workspace, taskFilePath) {
|
|
119
|
+
return getTasks(workspace, taskFilePath);
|
|
120
|
+
}
|
|
121
|
+
/** Pending tasks in a given group (for parallel mode). */
|
|
122
|
+
export function getTasksByGroup(workspace, groupId, taskFilePath) {
|
|
123
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
124
|
+
const defaultGroup = getDefaultGroup();
|
|
125
|
+
return tasks.filter((t) => t.status === "pending" && (t.group ?? defaultGroup) === groupId);
|
|
126
|
+
}
|
|
127
|
+
/** Unique group IDs that have at least one pending task, sorted numerically. */
|
|
128
|
+
export function getPendingGroups(workspace, taskFilePath) {
|
|
129
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
130
|
+
const defaultGroup = getDefaultGroup();
|
|
131
|
+
const pendingGroups = new Set();
|
|
132
|
+
for (const t of tasks) {
|
|
133
|
+
if (t.status === "pending")
|
|
134
|
+
pendingGroups.add(t.group ?? defaultGroup);
|
|
135
|
+
}
|
|
136
|
+
return [...pendingGroups].sort((a, b) => a - b);
|
|
137
|
+
}
|
|
138
|
+
export function checkTaskComplete(workspace, taskFilePath) {
|
|
139
|
+
const path = getTaskFilePath(workspace, taskFilePath);
|
|
140
|
+
if (!existsSync(path))
|
|
141
|
+
return "NO_TASK_FILE";
|
|
142
|
+
const remaining = countRemaining(workspace, taskFilePath);
|
|
143
|
+
if (remaining === 0)
|
|
144
|
+
return "COMPLETE";
|
|
145
|
+
return `INCOMPLETE:${remaining}`;
|
|
146
|
+
}
|
|
147
|
+
export function getTaskById(workspace, taskId, taskFilePath) {
|
|
148
|
+
const tasks = getTasks(workspace, taskFilePath);
|
|
149
|
+
return tasks.find((t) => t.id === taskId) ?? null;
|
|
150
|
+
}
|
|
151
|
+
export function markTaskComplete(workspace, taskId, taskFilePath) {
|
|
152
|
+
const path = getTaskFilePath(workspace, taskFilePath);
|
|
153
|
+
const content = readFileSync(path, "utf-8");
|
|
154
|
+
const lineMatch = taskId.match(/^line_(\d+)$/);
|
|
155
|
+
if (!lineMatch)
|
|
156
|
+
throw new Error(`Invalid task ID: ${taskId}`);
|
|
157
|
+
const lineNum = parseInt(lineMatch[1], 10);
|
|
158
|
+
const lines = content.split("\n");
|
|
159
|
+
const idx = lineNum - 1;
|
|
160
|
+
if (idx < 0 || idx >= lines.length)
|
|
161
|
+
throw new Error(`Line ${lineNum} out of range`);
|
|
162
|
+
const line = lines[idx];
|
|
163
|
+
const newLine = line.replace(/\[\s\]/, "[x]").replace(/\[ \]/, "[x]");
|
|
164
|
+
if (newLine === line)
|
|
165
|
+
return;
|
|
166
|
+
lines[idx] = newLine;
|
|
167
|
+
writeFileSync(path, lines.join("\n"));
|
|
168
|
+
taskCache.delete(workspace);
|
|
169
|
+
const mtimePath = join(workspace, ".ralph", TASK_MTIME_FILE);
|
|
170
|
+
if (existsSync(mtimePath))
|
|
171
|
+
unlinkSync(mtimePath);
|
|
172
|
+
}
|
|
173
|
+
export function markTaskIncomplete(workspace, taskId, taskFilePath) {
|
|
174
|
+
const path = getTaskFilePath(workspace, taskFilePath);
|
|
175
|
+
const content = readFileSync(path, "utf-8");
|
|
176
|
+
const lineMatch = taskId.match(/^line_(\d+)$/);
|
|
177
|
+
if (!lineMatch)
|
|
178
|
+
throw new Error(`Invalid task ID: ${taskId}`);
|
|
179
|
+
const lineNum = parseInt(lineMatch[1], 10);
|
|
180
|
+
const lines = content.split("\n");
|
|
181
|
+
const idx = lineNum - 1;
|
|
182
|
+
if (idx < 0 || idx >= lines.length)
|
|
183
|
+
throw new Error(`Line ${lineNum} out of range`);
|
|
184
|
+
const line = lines[idx];
|
|
185
|
+
const newLine = line.replace(/\[[xX]\]/, "[ ]");
|
|
186
|
+
if (newLine === line)
|
|
187
|
+
return;
|
|
188
|
+
lines[idx] = newLine;
|
|
189
|
+
writeFileSync(path, lines.join("\n"));
|
|
190
|
+
taskCache.delete(workspace);
|
|
191
|
+
const mtimePath = join(workspace, ".ralph", TASK_MTIME_FILE);
|
|
192
|
+
if (existsSync(mtimePath))
|
|
193
|
+
unlinkSync(mtimePath);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task-parser/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ralph-cursor",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Ralph Wiggum autonomous development loop for Cursor",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ralph-cursor": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"ralph-cursor": "node dist/cli.js",
|
|
16
|
+
"test": "bun run build && vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"lint": "eslint src",
|
|
19
|
+
"lint:fix": "eslint src --fix",
|
|
20
|
+
"prepublishOnly": "bun run build"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"ralph",
|
|
27
|
+
"cursor",
|
|
28
|
+
"ai",
|
|
29
|
+
"autonomous"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@eslint/js": "^9.39.4",
|
|
34
|
+
"@types/node": "^22.10.0",
|
|
35
|
+
"eslint": "^9.39.4",
|
|
36
|
+
"typescript": "^5.7.0",
|
|
37
|
+
"typescript-eslint": "^8.56.1",
|
|
38
|
+
"vitest": "^2.1.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@clack/prompts": "^0.7.0",
|
|
42
|
+
"commander": "^12.1.0"
|
|
43
|
+
}
|
|
44
|
+
}
|