bmalph 2.7.5 → 2.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +20 -5
  2. package/dist/commands/doctor-runtime-checks.js +104 -86
  3. package/dist/commands/doctor-runtime-checks.js.map +1 -1
  4. package/dist/commands/run.js +11 -2
  5. package/dist/commands/run.js.map +1 -1
  6. package/dist/commands/watch.js +5 -0
  7. package/dist/commands/watch.js.map +1 -1
  8. package/dist/installer/bmad-assets.js +182 -0
  9. package/dist/installer/bmad-assets.js.map +1 -0
  10. package/dist/installer/commands.js +324 -0
  11. package/dist/installer/commands.js.map +1 -0
  12. package/dist/installer/install.js +42 -0
  13. package/dist/installer/install.js.map +1 -0
  14. package/dist/installer/metadata.js +56 -0
  15. package/dist/installer/metadata.js.map +1 -0
  16. package/dist/installer/project-files.js +169 -0
  17. package/dist/installer/project-files.js.map +1 -0
  18. package/dist/installer/ralph-assets.js +91 -0
  19. package/dist/installer/ralph-assets.js.map +1 -0
  20. package/dist/installer/template-files.js +187 -0
  21. package/dist/installer/template-files.js.map +1 -0
  22. package/dist/installer/types.js +2 -0
  23. package/dist/installer/types.js.map +1 -0
  24. package/dist/installer.js +5 -843
  25. package/dist/installer.js.map +1 -1
  26. package/dist/run/run-dashboard.js +20 -6
  27. package/dist/run/run-dashboard.js.map +1 -1
  28. package/dist/transition/artifact-loading.js +91 -0
  29. package/dist/transition/artifact-loading.js.map +1 -0
  30. package/dist/transition/context-output.js +85 -0
  31. package/dist/transition/context-output.js.map +1 -0
  32. package/dist/transition/context.js +11 -3
  33. package/dist/transition/context.js.map +1 -1
  34. package/dist/transition/fix-plan-sync.js +119 -0
  35. package/dist/transition/fix-plan-sync.js.map +1 -0
  36. package/dist/transition/orchestration.js +25 -362
  37. package/dist/transition/orchestration.js.map +1 -1
  38. package/dist/transition/specs-sync.js +78 -2
  39. package/dist/transition/specs-sync.js.map +1 -1
  40. package/dist/utils/ralph-runtime-state.js +222 -0
  41. package/dist/utils/ralph-runtime-state.js.map +1 -0
  42. package/dist/utils/state.js +17 -16
  43. package/dist/utils/state.js.map +1 -1
  44. package/dist/utils/validate.js +16 -0
  45. package/dist/utils/validate.js.map +1 -1
  46. package/dist/watch/dashboard.js +25 -21
  47. package/dist/watch/dashboard.js.map +1 -1
  48. package/dist/watch/frame-writer.js +83 -0
  49. package/dist/watch/frame-writer.js.map +1 -0
  50. package/dist/watch/renderer.js +214 -49
  51. package/dist/watch/renderer.js.map +1 -1
  52. package/dist/watch/state-reader.js +87 -44
  53. package/dist/watch/state-reader.js.map +1 -1
  54. package/package.json +1 -1
  55. package/ralph/RALPH-REFERENCE.md +34 -14
  56. package/ralph/drivers/claude-code.sh +27 -0
  57. package/ralph/drivers/codex.sh +11 -0
  58. package/ralph/drivers/copilot.sh +11 -0
  59. package/ralph/drivers/cursor.sh +11 -0
  60. package/ralph/lib/circuit_breaker.sh +3 -3
  61. package/ralph/lib/date_utils.sh +28 -9
  62. package/ralph/lib/enable_core.sh +10 -2
  63. package/ralph/lib/response_analyzer.sh +252 -40
  64. package/ralph/ralph_import.sh +9 -1
  65. package/ralph/ralph_loop.sh +548 -128
  66. package/ralph/templates/PROMPT.md +20 -5
  67. package/ralph/templates/ralphrc.template +14 -4
@@ -17,16 +17,120 @@ const BOX_CHARS = {
17
17
  const PROGRESS_FILLED = "\u2588";
18
18
  const PROGRESS_EMPTY = "\u2591";
19
19
  // eslint-disable-next-line no-control-regex
20
- const ANSI_PATTERN = /\x1B\[\d+m/g;
20
+ const ANSI_PATTERN = /\x1B\[[0-9;]*m/g;
21
+ // eslint-disable-next-line no-control-regex
22
+ const ANSI_PREFIX_PATTERN = /^\x1B\[[0-9;]*m/;
23
+ // eslint-disable-next-line no-control-regex
24
+ const VT_ESCAPE_PATTERN = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\))/g;
25
+ // eslint-disable-next-line no-control-regex
26
+ const CONTROL_CHAR_PATTERN = /[\x00-\x08\x0B-\x1F\x7F]/g;
27
+ const DISPLAY_SEGMENTER = new Intl.Segmenter(undefined, { granularity: "grapheme" });
28
+ const COMBINING_MARK_PATTERN = /\p{Mark}/u;
29
+ const EMOJI_PATTERN = /\p{Extended_Pictographic}/u;
21
30
  function stripAnsi(str) {
22
31
  return str.replace(ANSI_PATTERN, "");
23
32
  }
33
+ function sanitizeExternalText(str) {
34
+ return str
35
+ .replace(VT_ESCAPE_PATTERN, "")
36
+ .replace(/\r\n?/g, " ")
37
+ .replace(/\n/g, " ")
38
+ .replace(/\t/g, " ")
39
+ .replace(CONTROL_CHAR_PATTERN, "");
40
+ }
41
+ function displayWidth(str) {
42
+ return Array.from(DISPLAY_SEGMENTER.segment(stripAnsi(str))).reduce((width, segment) => {
43
+ return width + graphemeDisplayWidth(segment.segment);
44
+ }, 0);
45
+ }
46
+ function graphemeDisplayWidth(grapheme) {
47
+ let width = 0;
48
+ for (const char of grapheme) {
49
+ const codePoint = char.codePointAt(0);
50
+ if (codePoint === undefined || isZeroWidthChar(char, codePoint)) {
51
+ continue;
52
+ }
53
+ if (EMOJI_PATTERN.test(char) || isWideCodePoint(codePoint)) {
54
+ return 2;
55
+ }
56
+ width = 1;
57
+ }
58
+ return width;
59
+ }
60
+ function isZeroWidthChar(char, codePoint) {
61
+ return (COMBINING_MARK_PATTERN.test(char) ||
62
+ codePoint === 0x200c ||
63
+ codePoint === 0x200d ||
64
+ isVariationSelector(codePoint));
65
+ }
66
+ function isVariationSelector(codePoint) {
67
+ return ((codePoint >= 0xfe00 && codePoint <= 0xfe0f) || (codePoint >= 0xe0100 && codePoint <= 0xe01ef));
68
+ }
69
+ function isWideCodePoint(codePoint) {
70
+ return (codePoint >= 0x1100 &&
71
+ (codePoint <= 0x115f ||
72
+ codePoint === 0x2329 ||
73
+ codePoint === 0x232a ||
74
+ (codePoint >= 0x2e80 && codePoint <= 0x3247 && codePoint !== 0x303f) ||
75
+ (codePoint >= 0x3250 && codePoint <= 0x4dbf) ||
76
+ (codePoint >= 0x4e00 && codePoint <= 0xa4c6) ||
77
+ (codePoint >= 0xa960 && codePoint <= 0xa97c) ||
78
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
79
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
80
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
81
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6b) ||
82
+ (codePoint >= 0xff01 && codePoint <= 0xff60) ||
83
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
84
+ (codePoint >= 0x1f300 && codePoint <= 0x1f64f) ||
85
+ (codePoint >= 0x1f900 && codePoint <= 0x1f9ff) ||
86
+ (codePoint >= 0x20000 && codePoint <= 0x3fffd)));
87
+ }
88
+ function truncateAnsi(str, len) {
89
+ if (len <= 0) {
90
+ return "";
91
+ }
92
+ if (displayWidth(str) <= len) {
93
+ return str;
94
+ }
95
+ let result = "";
96
+ let index = 0;
97
+ let visibleCount = 0;
98
+ let sawAnsi = false;
99
+ outer: while (index < str.length) {
100
+ const ansiMatch = str.slice(index).match(ANSI_PREFIX_PATTERN);
101
+ if (ansiMatch) {
102
+ result += ansiMatch[0];
103
+ index += ansiMatch[0].length;
104
+ sawAnsi = true;
105
+ continue;
106
+ }
107
+ const nextAnsiIndex = str.indexOf("\x1B", index);
108
+ const textChunk = nextAnsiIndex === -1 ? str.slice(index) : str.slice(index, nextAnsiIndex);
109
+ for (const segment of DISPLAY_SEGMENTER.segment(textChunk)) {
110
+ const width = graphemeDisplayWidth(segment.segment);
111
+ if (visibleCount + width > len) {
112
+ break outer;
113
+ }
114
+ result += segment.segment;
115
+ visibleCount += width;
116
+ }
117
+ index += textChunk.length;
118
+ }
119
+ if (sawAnsi) {
120
+ result += "\x1B[0m";
121
+ }
122
+ return result;
123
+ }
24
124
  export function padRight(str, len) {
25
- const visualLen = stripAnsi(str).length;
125
+ if (len <= 0) {
126
+ return "";
127
+ }
128
+ const fitted = truncateAnsi(str, len);
129
+ const visualLen = displayWidth(fitted);
26
130
  if (visualLen >= len) {
27
- return str;
131
+ return fitted;
28
132
  }
29
- return str + " ".repeat(len - visualLen);
133
+ return fitted + " ".repeat(len - visualLen);
30
134
  }
31
135
  export function progressBar(completed, total, width) {
32
136
  if (total <= 0) {
@@ -36,10 +140,12 @@ export function progressBar(completed, total, width) {
36
140
  const filled = Math.round(ratio * width);
37
141
  return chalk.green(PROGRESS_FILLED.repeat(filled)) + PROGRESS_EMPTY.repeat(width - filled);
38
142
  }
39
- export function formatSessionAge(createdAt) {
40
- const now = Date.now();
143
+ export function formatSessionAge(createdAt, referenceTime = Date.now()) {
41
144
  const start = new Date(createdAt).getTime();
42
- const diffSeconds = Math.max(0, Math.floor((now - start) / 1000));
145
+ if (Number.isNaN(start)) {
146
+ return "0m 0s";
147
+ }
148
+ const diffSeconds = Math.max(0, Math.floor((referenceTime - start) / 1000));
43
149
  const hours = Math.floor(diffSeconds / 3600);
44
150
  const minutes = Math.floor((diffSeconds % 3600) / 60);
45
151
  const seconds = diffSeconds % 60;
@@ -48,6 +154,14 @@ export function formatSessionAge(createdAt) {
48
154
  }
49
155
  return `${String(minutes)}m ${String(seconds)}s`;
50
156
  }
157
+ export function formatElapsed(seconds) {
158
+ if (seconds < 60) {
159
+ return `${String(seconds)}s`;
160
+ }
161
+ const minutes = Math.floor(seconds / 60);
162
+ const remaining = seconds % 60;
163
+ return `${String(minutes)}m ${String(remaining)}s`;
164
+ }
51
165
  export function formatCBState(state) {
52
166
  switch (state) {
53
167
  case "CLOSED":
@@ -67,31 +181,33 @@ function formatTime(date) {
67
181
  return `${h}:${m}:${s}`;
68
182
  }
69
183
  function extractTime(timestamp) {
70
- const timePart = timestamp.split(" ")[1];
71
- return timePart ?? formatTime(new Date(timestamp));
184
+ const safeTimestamp = sanitizeExternalText(timestamp);
185
+ const timePart = safeTimestamp.split(" ")[1];
186
+ return timePart ?? formatTime(new Date(safeTimestamp));
72
187
  }
73
188
  export function box(title, lines, cols) {
74
- const innerWidth = cols - 2;
75
- const titleStr = title ? `\u2500 ${title} ` : "";
189
+ const innerWidth = Math.max(0, cols - 2);
190
+ const titleStr = title ? truncateAnsi(`\u2500 ${title} `, innerWidth) : "";
76
191
  const topBorder = BOX_CHARS.topLeft +
77
192
  titleStr +
78
- BOX_CHARS.horizontal.repeat(Math.max(0, innerWidth - titleStr.length)) +
193
+ BOX_CHARS.horizontal.repeat(Math.max(0, innerWidth - displayWidth(titleStr))) +
79
194
  BOX_CHARS.topRight;
80
195
  const bottomBorder = BOX_CHARS.bottomLeft + BOX_CHARS.horizontal.repeat(innerWidth) + BOX_CHARS.bottomRight;
81
- const contentLines = lines.map((line) => BOX_CHARS.vertical + " " + padRight(line, innerWidth - 1) + BOX_CHARS.vertical);
196
+ const contentLines = lines.map((line) => BOX_CHARS.vertical + " " + padRight(line, Math.max(0, innerWidth - 1)) + BOX_CHARS.vertical);
82
197
  return [topBorder, ...contentLines, bottomBorder].join("\n");
83
198
  }
84
199
  export function renderHeader(cols) {
85
- const innerWidth = cols - 2;
86
- const title = "RALPH MONITOR";
87
- const padding = Math.max(0, Math.floor((innerWidth - title.length) / 2));
88
- const centeredTitle = " ".repeat(padding) + title + " ".repeat(innerWidth - padding - title.length);
200
+ const innerWidth = Math.max(0, cols - 2);
201
+ const title = truncateAnsi("RALPH MONITOR", innerWidth);
202
+ const titleLength = displayWidth(title);
203
+ const padding = Math.max(0, Math.floor((innerWidth - titleLength) / 2));
204
+ const centeredTitle = " ".repeat(padding) + title + " ".repeat(Math.max(0, innerWidth - padding - titleLength));
89
205
  const topBorder = BOX_CHARS.headerLeft + BOX_CHARS.headerHoriz.repeat(innerWidth) + BOX_CHARS.headerRight;
90
206
  const titleLine = BOX_CHARS.headerVert + chalk.bold(centeredTitle) + BOX_CHARS.headerVert;
91
207
  const bottomBorder = BOX_CHARS.headerBottom + BOX_CHARS.headerHoriz.repeat(innerWidth) + BOX_CHARS.headerBottomRight;
92
208
  return [topBorder, titleLine, bottomBorder].join("\n");
93
209
  }
94
- export function renderLoopPanel(loop, execution, session, cols) {
210
+ export function renderLoopPanel(loop, execution, session, cols, referenceTime = Date.now()) {
95
211
  if (loop === null) {
96
212
  return box("Loop Status", ["Status: waiting for data"], cols);
97
213
  }
@@ -99,16 +215,32 @@ export function renderLoopPanel(loop, execution, session, cols) {
99
215
  ? Math.round((loop.callsMadeThisHour / loop.maxCallsPerHour) * 100)
100
216
  : 0;
101
217
  const loopStr = `Loop: #${String(loop.loopCount)}`;
102
- const statusStr = `Status: ${formatStatus(loop.status)}`;
218
+ const statusStr = `Status: ${formatStatus(sanitizeExternalText(loop.status))}`;
103
219
  const apiStr = `API: ${String(loop.callsMadeThisHour)}/${String(loop.maxCallsPerHour)} (${String(apiPercent)}%)`;
104
220
  const line1 = `${padRight(loopStr, 17)}${padRight(statusStr, 21)}${apiStr}`;
105
- const actionLabel = execution !== null ? execution.status : loop.lastAction;
106
- const actionStr = `Action: ${actionLabel}`;
107
- const sessionStr = session !== null ? `Session: ${formatSessionAge(session.createdAt)}` : "";
221
+ const sessionStr = session !== null ? `Session: ${formatSessionAge(session.createdAt, referenceTime)}` : "";
108
222
  const innerWidth = cols - 4;
109
- const sessionPad = Math.max(0, innerWidth - actionStr.length - sessionStr.length);
110
- const line2 = `${actionStr}${" ".repeat(sessionPad)}${sessionStr}`;
111
- return box("Loop Status", [line1, line2], cols);
223
+ let line2;
224
+ if (execution !== null) {
225
+ const elapsedStr = formatElapsed(execution.elapsedSeconds);
226
+ const safeIndicator = sanitizeExternalText(execution.indicator);
227
+ const executingStr = `${safeIndicator} executing (${elapsedStr})`;
228
+ const sessionPad = Math.max(0, innerWidth - displayWidth(executingStr) - displayWidth(sessionStr));
229
+ line2 = `${executingStr}${" ".repeat(sessionPad)}${sessionStr}`;
230
+ }
231
+ else {
232
+ const actionStr = `Action: ${sanitizeExternalText(loop.lastAction)}`;
233
+ const sessionPad = Math.max(0, innerWidth - displayWidth(actionStr) - displayWidth(sessionStr));
234
+ line2 = `${actionStr}${" ".repeat(sessionPad)}${sessionStr}`;
235
+ }
236
+ const lines = [line1, line2];
237
+ if (execution !== null && execution.lastOutput.length > 0) {
238
+ const safeOutput = sanitizeExternalText(execution.lastOutput);
239
+ const maxOutputLen = Math.max(0, innerWidth - 2);
240
+ const truncated = truncateAnsi(safeOutput, maxOutputLen);
241
+ lines.push(chalk.dim(` ${truncated}`));
242
+ }
243
+ return box("Loop Status", lines, cols);
112
244
  }
113
245
  export function renderCircuitBreakerPanel(cb, cols) {
114
246
  const halfCols = Math.floor(cols / 2) - 1;
@@ -116,12 +248,12 @@ export function renderCircuitBreakerPanel(cb, cols) {
116
248
  return box("Circuit Breaker", ["N/A"], halfCols);
117
249
  }
118
250
  const lines = [
119
- `State: ${formatCBState(cb.state)}`,
251
+ `State: ${formatCBState(sanitizeExternalText(cb.state))}`,
120
252
  `No-progress: ${String(cb.consecutiveNoProgress)}`,
121
253
  `Opens: ${String(cb.totalOpens)}`,
122
254
  ];
123
255
  if (cb.state === "OPEN" && cb.reason) {
124
- lines.push(`Reason: ${cb.reason}`);
256
+ lines.push(`Reason: ${sanitizeExternalText(cb.reason)}`);
125
257
  }
126
258
  return box("Circuit Breaker", lines, halfCols);
127
259
  }
@@ -139,7 +271,7 @@ export function renderStoriesPanel(stories, cols) {
139
271
  `[${bar}]`,
140
272
  ];
141
273
  if (stories.nextStory !== null) {
142
- lines.push(`Next: ${stories.nextStory}`);
274
+ lines.push(`Next: ${sanitizeExternalText(stories.nextStory)}`);
143
275
  }
144
276
  return box("Stories", lines, halfCols);
145
277
  }
@@ -161,17 +293,23 @@ export function renderAnalysisPanel(analysis, cols) {
161
293
  return box("Last Analysis", ["N/A"], cols);
162
294
  }
163
295
  const yesNo = (v) => (v ? "yes" : "no");
164
- const line1 = [
165
- `Files: ${String(analysis.filesModified)}`,
166
- `Confidence: ${String(analysis.confidenceScore)}%`,
167
- `Test-only: ${yesNo(analysis.isTestOnly)}`,
168
- `Stuck: ${yesNo(analysis.isStuck)}`,
169
- ].join(" ");
170
- const line2 = [
171
- `Exit signal: ${yesNo(analysis.exitSignal)}`,
172
- `Permission denials: ${String(analysis.permissionDenialCount)}`,
173
- ].join(" ");
174
- return box("Last Analysis", [line1, line2], cols);
296
+ const lines = [
297
+ [
298
+ `Files: ${String(analysis.filesModified)}`,
299
+ `Confidence: ${String(analysis.confidenceScore)}%`,
300
+ ].join(" "),
301
+ [`Test-only: ${yesNo(analysis.isTestOnly)}`, `Stuck: ${yesNo(analysis.isStuck)}`].join(" "),
302
+ [
303
+ `Exit signal: ${yesNo(analysis.exitSignal)}`,
304
+ `Permission denials: ${String(analysis.permissionDenialCount)}`,
305
+ ].join(" "),
306
+ [
307
+ `Claimed tasks: ${String(analysis.tasksCompletedThisLoop)}`,
308
+ `Checkbox delta: ${String(analysis.fixPlanCompletedDelta)}`,
309
+ ].join(" "),
310
+ `Progress mismatch: ${yesNo(analysis.hasProgressTrackingMismatch)}`,
311
+ ];
312
+ return box("Last Analysis", lines, cols);
175
313
  }
176
314
  export function renderLogsPanel(logs, cols) {
177
315
  if (logs.length === 0) {
@@ -180,19 +318,37 @@ export function renderLogsPanel(logs, cols) {
180
318
  const innerWidth = cols - 4;
181
319
  const lines = logs.map((entry) => {
182
320
  const time = extractTime(entry.timestamp);
183
- const level = padRight(entry.level, 7);
321
+ const level = padRight(sanitizeExternalText(entry.level), 7);
184
322
  const prefix = `[${time}] ${level}`;
185
- const maxMsg = Math.max(0, innerWidth - prefix.length - 1);
186
- const msg = entry.message.length > maxMsg ? entry.message.slice(0, maxMsg) : entry.message;
323
+ const maxMsg = Math.max(0, innerWidth - displayWidth(prefix) - 1);
324
+ const safeMessage = sanitizeExternalText(entry.message);
325
+ const msg = truncateAnsi(safeMessage, maxMsg);
187
326
  return `${chalk.dim(`[${time}]`)} ${level} ${msg}`;
188
327
  });
189
328
  return box("Recent Activity", lines, cols);
190
329
  }
330
+ export function renderLiveLogPanel(liveLog, cols) {
331
+ if (liveLog.length === 0) {
332
+ return box("Live Output", [chalk.dim("No live output yet")], cols);
333
+ }
334
+ const innerWidth = cols - 4;
335
+ const lines = liveLog.map((line) => {
336
+ const safeLine = sanitizeExternalText(line);
337
+ const trimmed = truncateAnsi(safeLine, innerWidth);
338
+ return chalk.dim(trimmed);
339
+ });
340
+ return box("Live Output", lines, cols);
341
+ }
191
342
  export function renderFooter(lastUpdated, cols) {
192
- const left = chalk.dim("q quit");
193
- const right = `Updated: ${formatTime(lastUpdated)}`;
194
- const gap = Math.max(1, cols - "q quit".length - right.length);
195
- return ` ${left}${" ".repeat(gap - 1)}${chalk.dim(right)}`;
343
+ const leftText = "q quit";
344
+ const rightText = `Updated: ${formatTime(lastUpdated)}`;
345
+ const availableWidth = Math.max(0, cols - 1);
346
+ const minimumWidth = displayWidth(leftText) + 1 + displayWidth(rightText);
347
+ if (availableWidth < minimumWidth) {
348
+ return ` ${truncateAnsi(`${leftText} ${rightText}`, availableWidth)}`;
349
+ }
350
+ const gap = availableWidth - displayWidth(leftText) - displayWidth(rightText);
351
+ return ` ${chalk.dim(leftText)}${" ".repeat(gap)}${chalk.dim(rightText)}`;
196
352
  }
197
353
  function hasAnyData(state) {
198
354
  return (state.loop !== null ||
@@ -201,10 +357,12 @@ function hasAnyData(state) {
201
357
  state.analysis !== null ||
202
358
  state.execution !== null ||
203
359
  state.session !== null ||
204
- state.recentLogs.length > 0);
360
+ state.recentLogs.length > 0 ||
361
+ state.liveLog.length > 0);
205
362
  }
206
363
  export function renderDashboard(state, cols) {
207
364
  const width = cols ?? process.stdout.columns ?? 80;
365
+ const referenceTime = state.lastUpdated.getTime();
208
366
  if (!hasAnyData(state)) {
209
367
  const lines = [];
210
368
  lines.push(renderHeader(width));
@@ -216,13 +374,20 @@ export function renderDashboard(state, cols) {
216
374
  }
217
375
  const sections = [];
218
376
  sections.push(renderHeader(width));
219
- sections.push(renderLoopPanel(state.loop, state.execution, state.session, width));
377
+ sections.push(renderLoopPanel(state.loop, state.execution, state.session, width, referenceTime));
220
378
  const leftPanel = renderCircuitBreakerPanel(state.circuitBreaker, width);
221
379
  const rightPanel = renderStoriesPanel(state.stories, width);
222
380
  sections.push(renderSideBySide(leftPanel, rightPanel, width));
223
381
  sections.push(renderAnalysisPanel(state.analysis, width));
382
+ if (state.execution !== null) {
383
+ sections.push(renderLiveLogPanel(state.liveLog, width));
384
+ }
224
385
  sections.push(renderLogsPanel(state.recentLogs, width));
225
386
  sections.push(renderFooter(state.lastUpdated, width));
226
- return sections.join("\n");
387
+ return sections
388
+ .join("\n")
389
+ .split("\n")
390
+ .map((line) => truncateAnsi(line, width))
391
+ .join("\n");
227
392
  }
228
393
  //# sourceMappingURL=renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/watch/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/watch/renderer.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,12 @@ import { RALPH_DIR } from "../utils/constants.js";
5
5
  import { parseFixPlan } from "../transition/fix-plan.js";
6
6
  import { debug } from "../utils/logger.js";
7
7
  import { formatError } from "../utils/errors.js";
8
- import { validateCircuitBreakerState, validateRalphSession, normalizeRalphStatus, } from "../utils/validate.js";
8
+ import { readRalphCircuitBreaker, readRalphRuntimeSession, readRalphRuntimeStatus, } from "../utils/ralph-runtime-state.js";
9
9
  const LOG_LINE_PATTERN = /^\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] \[(\w+)\] (.+)$/;
10
10
  const DEFAULT_MAX_LOG_LINES = 8;
11
11
  const TAIL_BYTES = 4096;
12
12
  export async function readDashboardState(projectDir) {
13
- const [loop, circuitBreaker, stories, analysis, execution, session, recentLogs] = await Promise.all([
13
+ const [loop, circuitBreaker, stories, analysis, execution, session, recentLogs, liveLog] = await Promise.all([
14
14
  readLoopInfo(projectDir),
15
15
  readCircuitBreakerInfo(projectDir),
16
16
  readStoryProgress(projectDir),
@@ -18,6 +18,7 @@ export async function readDashboardState(projectDir) {
18
18
  readExecutionProgress(projectDir),
19
19
  readSessionInfo(projectDir),
20
20
  readRecentLogs(projectDir),
21
+ readLiveLog(projectDir),
21
22
  ]);
22
23
  const ralphCompleted = loop !== null && loop.status === "completed";
23
24
  return {
@@ -28,50 +29,43 @@ export async function readDashboardState(projectDir) {
28
29
  execution,
29
30
  session,
30
31
  recentLogs,
32
+ liveLog,
31
33
  ralphCompleted,
32
34
  lastUpdated: new Date(),
33
35
  };
34
36
  }
35
37
  export async function readLoopInfo(projectDir) {
36
- try {
37
- const data = await readJsonFile(join(projectDir, RALPH_DIR, "status.json"));
38
- if (data === null)
39
- return null;
40
- const normalized = normalizeRalphStatus(data);
41
- const lastAction = typeof data.last_action === "string" ? data.last_action : "";
42
- const callsMadeThisHour = typeof data.calls_made_this_hour === "number" ? data.calls_made_this_hour : 0;
43
- const maxCallsPerHour = typeof data.max_calls_per_hour === "number" ? data.max_calls_per_hour : 0;
44
- return {
45
- loopCount: normalized.loopCount,
46
- status: normalized.status,
47
- lastAction,
48
- callsMadeThisHour,
49
- maxCallsPerHour,
50
- };
38
+ const result = await readRalphRuntimeStatus(projectDir);
39
+ if (result.kind === "missing") {
40
+ return null;
51
41
  }
52
- catch (err) {
53
- debug(`Failed to read loop info: ${formatError(err)}`);
42
+ if (result.kind !== "ok") {
43
+ debug(`Failed to read loop info: ${formatError(result.error)}`);
54
44
  return null;
55
45
  }
46
+ return {
47
+ loopCount: result.value.loopCount,
48
+ status: result.value.status,
49
+ lastAction: result.value.lastAction,
50
+ callsMadeThisHour: result.value.callsMadeThisHour,
51
+ maxCallsPerHour: result.value.maxCallsPerHour,
52
+ };
56
53
  }
57
54
  export async function readCircuitBreakerInfo(projectDir) {
58
- try {
59
- const data = await readJsonFile(join(projectDir, RALPH_DIR, ".circuit_breaker_state"));
60
- if (data === null)
61
- return null;
62
- const validated = validateCircuitBreakerState(data);
63
- const totalOpens = typeof data.total_opens === "number" ? data.total_opens : 0;
64
- return {
65
- state: validated.state,
66
- consecutiveNoProgress: validated.consecutive_no_progress,
67
- totalOpens,
68
- reason: validated.reason,
69
- };
55
+ const result = await readRalphCircuitBreaker(projectDir);
56
+ if (result.kind === "missing") {
57
+ return null;
70
58
  }
71
- catch (err) {
72
- debug(`Failed to read circuit breaker info: ${formatError(err)}`);
59
+ if (result.kind !== "ok") {
60
+ debug(`Failed to read circuit breaker info: ${formatError(result.error)}`);
73
61
  return null;
74
62
  }
63
+ return {
64
+ state: result.value.state,
65
+ consecutiveNoProgress: result.value.consecutiveNoProgress,
66
+ totalOpens: result.value.totalOpens,
67
+ reason: result.value.reason,
68
+ };
75
69
  }
76
70
  export async function readStoryProgress(projectDir) {
77
71
  let content;
@@ -103,6 +97,11 @@ export async function readAnalysisInfo(projectDir) {
103
97
  const isTestOnly = typeof a.is_test_only === "boolean" ? a.is_test_only : false;
104
98
  const isStuck = typeof a.is_stuck === "boolean" ? a.is_stuck : false;
105
99
  const exitSignal = typeof a.exit_signal === "boolean" ? a.exit_signal : false;
100
+ const tasksCompletedThisLoop = typeof a.tasks_completed_this_loop === "number" ? a.tasks_completed_this_loop : 0;
101
+ const fixPlanCompletedDelta = typeof a.fix_plan_completed_delta === "number" ? a.fix_plan_completed_delta : 0;
102
+ const hasProgressTrackingMismatch = typeof a.has_progress_tracking_mismatch === "boolean"
103
+ ? a.has_progress_tracking_mismatch
104
+ : false;
106
105
  const hasPermissionDenials = typeof a.has_permission_denials === "boolean" ? a.has_permission_denials : false;
107
106
  const permissionDenialCount = typeof a.permission_denial_count === "number" ? a.permission_denial_count : 0;
108
107
  return {
@@ -111,6 +110,9 @@ export async function readAnalysisInfo(projectDir) {
111
110
  isTestOnly,
112
111
  isStuck,
113
112
  exitSignal,
113
+ tasksCompletedThisLoop,
114
+ fixPlanCompletedDelta,
115
+ hasProgressTrackingMismatch,
114
116
  hasPermissionDenials,
115
117
  permissionDenialCount,
116
118
  };
@@ -129,7 +131,9 @@ export async function readExecutionProgress(projectDir) {
129
131
  if (status !== "executing")
130
132
  return null;
131
133
  const elapsedSeconds = typeof data.elapsed_seconds === "number" ? data.elapsed_seconds : 0;
132
- return { status, elapsedSeconds };
134
+ const indicator = typeof data.indicator === "string" ? data.indicator : "⠋";
135
+ const lastOutput = typeof data.last_output === "string" ? data.last_output : "";
136
+ return { status, elapsedSeconds, indicator, lastOutput };
133
137
  }
134
138
  catch (err) {
135
139
  debug(`Failed to read execution progress: ${formatError(err)}`);
@@ -137,20 +141,59 @@ export async function readExecutionProgress(projectDir) {
137
141
  }
138
142
  }
139
143
  export async function readSessionInfo(projectDir) {
144
+ const result = await readRalphRuntimeSession(projectDir);
145
+ if (result.kind === "missing") {
146
+ return null;
147
+ }
148
+ if (result.kind !== "ok") {
149
+ debug(`Failed to read session info: ${formatError(result.error)}`);
150
+ return null;
151
+ }
152
+ if (result.value.kind !== "active") {
153
+ return null;
154
+ }
155
+ return {
156
+ createdAt: result.value.created_at,
157
+ lastUsed: result.value.last_used,
158
+ };
159
+ }
160
+ const LIVE_LOG_MAX_LINES = 5;
161
+ const LIVE_LOG_TAIL_BYTES = 2048;
162
+ export async function readLiveLog(projectDir) {
163
+ const logPath = join(projectDir, RALPH_DIR, "live.log");
164
+ let content;
140
165
  try {
141
- const data = await readJsonFile(join(projectDir, RALPH_DIR, ".ralph_session"));
142
- if (data === null)
143
- return null;
144
- const validated = validateRalphSession(data);
145
- return {
146
- createdAt: validated.created_at,
147
- lastUsed: validated.last_used,
148
- };
166
+ const fh = await open(logPath, "r");
167
+ try {
168
+ const stats = await fh.stat();
169
+ if (stats.size === 0) {
170
+ return [];
171
+ }
172
+ if (stats.size <= LIVE_LOG_TAIL_BYTES) {
173
+ content = await fh.readFile("utf-8");
174
+ }
175
+ else {
176
+ const position = stats.size - LIVE_LOG_TAIL_BYTES;
177
+ const buf = Buffer.alloc(LIVE_LOG_TAIL_BYTES);
178
+ const { bytesRead } = await fh.read(buf, 0, LIVE_LOG_TAIL_BYTES, position);
179
+ const raw = buf.toString("utf-8", 0, bytesRead);
180
+ const newlineIdx = raw.indexOf("\n");
181
+ content = newlineIdx >= 0 ? raw.slice(newlineIdx + 1) : raw;
182
+ }
183
+ }
184
+ finally {
185
+ await fh.close();
186
+ }
149
187
  }
150
188
  catch (err) {
151
- debug(`Failed to read session info: ${formatError(err)}`);
152
- return null;
189
+ debug(`Failed to read live log: ${formatError(err)}`);
190
+ return [];
153
191
  }
192
+ const lines = content
193
+ .split(/\r?\n/)
194
+ .map((line) => line.trimEnd())
195
+ .filter((line) => line.length > 0);
196
+ return lines.slice(-LIVE_LOG_MAX_LINES);
154
197
  }
155
198
  export async function readRecentLogs(projectDir, maxLines = DEFAULT_MAX_LOG_LINES) {
156
199
  const logPath = join(projectDir, RALPH_DIR, "logs", "ralph.log");