bmalph 2.7.2 → 2.7.3
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 +14 -4
- package/dist/commands/doctor-checks.js +17 -10
- package/dist/commands/doctor-checks.js.map +1 -1
- package/dist/run/ralph-process.js +101 -7
- package/dist/run/ralph-process.js.map +1 -1
- package/dist/transition/artifact-collection.js +74 -0
- package/dist/transition/artifact-collection.js.map +1 -0
- package/dist/transition/artifacts.js +12 -1
- package/dist/transition/artifacts.js.map +1 -1
- package/dist/transition/context.js +17 -25
- package/dist/transition/context.js.map +1 -1
- package/dist/transition/fix-plan.js +8 -3
- package/dist/transition/fix-plan.js.map +1 -1
- package/dist/transition/orchestration.js +176 -111
- package/dist/transition/orchestration.js.map +1 -1
- package/dist/transition/preflight.js +21 -16
- package/dist/transition/preflight.js.map +1 -1
- package/dist/transition/section-patterns.js +56 -4
- package/dist/transition/section-patterns.js.map +1 -1
- package/dist/transition/specs-index.js +5 -2
- package/dist/transition/specs-index.js.map +1 -1
- package/dist/transition/specs-sync.js +23 -0
- package/dist/transition/specs-sync.js.map +1 -0
- package/dist/transition/sprint-status.js +91 -0
- package/dist/transition/sprint-status.js.map +1 -0
- package/dist/transition/story-parsing.js +4 -3
- package/dist/transition/story-parsing.js.map +1 -1
- package/dist/transition/tech-stack.js +1 -7
- package/dist/transition/tech-stack.js.map +1 -1
- package/package.json +1 -1
- package/ralph/RALPH-REFERENCE.md +50 -46
- package/ralph/drivers/cursor-agent-wrapper.sh +13 -0
- package/ralph/drivers/cursor.sh +168 -7
- package/ralph/lib/circuit_breaker.sh +5 -5
- package/ralph/lib/enable_core.sh +10 -10
- package/ralph/ralph_import.sh +14 -10
- package/ralph/ralph_loop.sh +94 -57
- package/ralph/ralph_monitor.sh +4 -4
- package/ralph/templates/AGENT.md +7 -7
- package/ralph/templates/PROMPT.md +13 -13
package/README.md
CHANGED
|
@@ -55,7 +55,7 @@ bmalph works with multiple AI coding assistants. Each platform gets BMAD plannin
|
|
|
55
55
|
- Node.js 20+
|
|
56
56
|
- Bash (WSL or Git Bash on Windows)
|
|
57
57
|
- A supported AI coding platform (see table above)
|
|
58
|
-
- For Ralph loop (Phase 4): Claude Code (`claude`), Codex CLI (`codex`), Copilot CLI (`copilot`), or Cursor CLI (`agent`
|
|
58
|
+
- For Ralph loop (Phase 4): Claude Code (`claude`), Codex CLI (`codex`), Copilot CLI (`copilot`), or Cursor CLI (`cursor-agent`; older `agent` installs are also supported)
|
|
59
59
|
|
|
60
60
|
## Installation
|
|
61
61
|
|
|
@@ -175,7 +175,7 @@ Then start Ralph:
|
|
|
175
175
|
bmalph run
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
-
> **Advanced:**
|
|
178
|
+
> **Advanced:** Ralph loads the platform drivers internally. Start the loop with `bmalph run`, or run `bash .ralph/ralph_loop.sh` directly if you need to bypass the CLI.
|
|
179
179
|
|
|
180
180
|
Ralph picks stories one by one, implements with TDD, and commits. The loop stops when all stories are done or the circuit breaker triggers.
|
|
181
181
|
|
|
@@ -354,7 +354,8 @@ project/
|
|
|
354
354
|
│ │ ├── claude-code.sh # Claude Code driver (uses `claude`)
|
|
355
355
|
│ │ ├── codex.sh # OpenAI Codex driver (uses `codex exec`)
|
|
356
356
|
│ │ ├── copilot.sh # GitHub Copilot driver (uses `copilot`, experimental)
|
|
357
|
-
│ │
|
|
357
|
+
│ │ ├── cursor.sh # Cursor driver (uses `cursor-agent`/`agent`, experimental)
|
|
358
|
+
│ │ └── cursor-agent-wrapper.sh # Wrapper for Windows .cmd Cursor installs
|
|
358
359
|
│ ├── lib/ # Shell libraries
|
|
359
360
|
│ ├── docs/generated/ # Generated documentation
|
|
360
361
|
│ ├── specs/ # Copied from _bmad-output during transition
|
|
@@ -382,7 +383,7 @@ Ralph is a bash loop that spawns fresh AI coding sessions using a **platform dri
|
|
|
382
383
|
- **Claude Code driver** — invokes `claude` with `--allowedTools` and session resume
|
|
383
384
|
- **Codex driver** — invokes `codex exec` with `--sandbox workspace-write`
|
|
384
385
|
- **Copilot driver** _(experimental)_ — invokes `copilot --autopilot --yolo` with plain-text output
|
|
385
|
-
- **Cursor driver** _(experimental)_ — invokes `agent --print --force` with NDJSON streaming
|
|
386
|
+
- **Cursor driver** _(experimental)_ — invokes `cursor-agent --print --force` (or compatible `agent` installs) with NDJSON streaming
|
|
386
387
|
|
|
387
388
|
Each iteration:
|
|
388
389
|
|
|
@@ -410,6 +411,7 @@ Ralph requires bash to run. On Windows, install one of:
|
|
|
410
411
|
```bash
|
|
411
412
|
# Install Git for Windows from https://git-scm.com/downloads
|
|
412
413
|
# Git Bash is included and works well with bmalph
|
|
414
|
+
# bmalph prefers Git Bash over broken Windows bash.exe shims
|
|
413
415
|
```
|
|
414
416
|
|
|
415
417
|
**WSL (Windows Subsystem for Linux)**
|
|
@@ -443,6 +445,14 @@ ls -la .ralph/
|
|
|
443
445
|
| Wrong platform detected | Re-run `bmalph init --platform <id>` with the correct platform |
|
|
444
446
|
| Ralph unavailable on platform | Ralph requires a full tier platform (claude-code, codex, copilot, or cursor) |
|
|
445
447
|
|
|
448
|
+
### Windows: Cursor Driver
|
|
449
|
+
|
|
450
|
+
`bmalph run --driver cursor` is experimental on Windows and is designed for Git Bash.
|
|
451
|
+
|
|
452
|
+
- `bmalph` prefers a working Git Bash install instead of Windows `bash.exe` shims.
|
|
453
|
+
- The Cursor driver detects `cursor-agent`, `cursor-agent.cmd`, `agent`, `agent.cmd`, and `%LOCALAPPDATA%\\cursor-agent\\agent.cmd`.
|
|
454
|
+
- On Windows, the driver sends Cursor a short bootstrap prompt that tells it to read the Ralph files from `.ralph/` instead of trying to inline the full prompt on the command line.
|
|
455
|
+
|
|
446
456
|
### Reset Installation
|
|
447
457
|
|
|
448
458
|
The simplest way to remove all bmalph files:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile, stat } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { resolveBashCommand } from "../run/ralph-process.js";
|
|
3
4
|
import { readJsonFile } from "../utils/json.js";
|
|
4
5
|
import { isEnoent, formatError } from "../utils/errors.js";
|
|
5
6
|
import { CONFIG_FILE } from "../utils/constants.js";
|
|
@@ -24,17 +25,23 @@ export async function checkNodeVersion(_projectDir) {
|
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
export async function checkBash(_projectDir) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
try {
|
|
29
|
+
await resolveBashCommand();
|
|
30
|
+
return {
|
|
31
|
+
label: "bash available",
|
|
32
|
+
passed: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return {
|
|
37
|
+
label: "bash available",
|
|
38
|
+
passed: false,
|
|
39
|
+
detail: formatError(err),
|
|
40
|
+
hint: process.platform === "win32"
|
|
41
|
+
? "Install Git Bash and ensure its bash.exe is available: https://git-scm.com/downloads"
|
|
36
42
|
: "Install bash via your package manager (apt, brew, etc.)",
|
|
37
|
-
|
|
43
|
+
};
|
|
44
|
+
}
|
|
38
45
|
}
|
|
39
46
|
export async function checkJq(_projectDir) {
|
|
40
47
|
const available = await checkCommandAvailable("jq");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-checks.js","sourceRoot":"","sources":["../../src/commands/doctor-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC7D,OAAO;QACL,KAAK,EAAE,oBAAoB;QAC3B,MAAM,EAAE,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QACnF,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,4DAA4D;KAC7F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,
|
|
1
|
+
{"version":3,"file":"doctor-checks.js","sourceRoot":"","sources":["../../src/commands/doctor-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,32 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
1
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { RALPH_DIR } from "../utils/constants.js";
|
|
4
4
|
import { exists } from "../utils/file-system.js";
|
|
5
5
|
const RALPH_LOOP_PATH = `${RALPH_DIR}/ralph_loop.sh`;
|
|
6
6
|
const BASH_RALPH_LOOP_PATH = `./${RALPH_LOOP_PATH}`;
|
|
7
|
+
const BASH_VALIDATION_TIMEOUT_MS = 3000;
|
|
8
|
+
const DEFAULT_WINDOWS_GIT_BASH_PATHS = [
|
|
9
|
+
"C:\\Program Files\\Git\\bin\\bash.exe",
|
|
10
|
+
"C:\\Program Files\\Git\\usr\\bin\\bash.exe",
|
|
11
|
+
"C:\\Program Files (x86)\\Git\\bin\\bash.exe",
|
|
12
|
+
"C:\\Program Files (x86)\\Git\\usr\\bin\\bash.exe",
|
|
13
|
+
];
|
|
14
|
+
let cachedBashCommand;
|
|
15
|
+
export async function resolveBashCommand() {
|
|
16
|
+
if (cachedBashCommand) {
|
|
17
|
+
return cachedBashCommand;
|
|
18
|
+
}
|
|
19
|
+
const candidates = process.platform === "win32" ? getWindowsBashCandidates() : ["bash"];
|
|
20
|
+
for (const candidate of candidates) {
|
|
21
|
+
if (await canExecuteBash(candidate)) {
|
|
22
|
+
cachedBashCommand = candidate;
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
throw new Error(getMissingBashMessage());
|
|
27
|
+
}
|
|
7
28
|
export async function validateBashAvailable() {
|
|
8
|
-
|
|
9
|
-
const child = spawn("bash", ["--version"], { stdio: "ignore" });
|
|
10
|
-
child.on("close", () => resolve());
|
|
11
|
-
child.on("error", () => reject(new Error("bash is not available. Install bash to run Ralph.")));
|
|
12
|
-
});
|
|
29
|
+
await resolveBashCommand();
|
|
13
30
|
}
|
|
14
31
|
export async function validateRalphLoop(projectDir) {
|
|
15
32
|
const loopPath = join(projectDir, RALPH_LOOP_PATH);
|
|
@@ -18,11 +35,12 @@ export async function validateRalphLoop(projectDir) {
|
|
|
18
35
|
}
|
|
19
36
|
}
|
|
20
37
|
export function spawnRalphLoop(projectDir, platformId, options) {
|
|
21
|
-
const child = spawn("bash", [BASH_RALPH_LOOP_PATH], {
|
|
38
|
+
const child = spawn(cachedBashCommand ?? "bash", [BASH_RALPH_LOOP_PATH], {
|
|
22
39
|
cwd: projectDir,
|
|
23
40
|
env: { ...process.env, PLATFORM_DRIVER: platformId },
|
|
24
41
|
stdio: options.inheritStdio ? "inherit" : ["ignore", "pipe", "pipe"],
|
|
25
42
|
detached: process.platform !== "win32",
|
|
43
|
+
windowsHide: true,
|
|
26
44
|
});
|
|
27
45
|
let state = "running";
|
|
28
46
|
let exitCode = null;
|
|
@@ -92,4 +110,80 @@ export function spawnRalphLoop(projectDir, platformId, options) {
|
|
|
92
110
|
},
|
|
93
111
|
};
|
|
94
112
|
}
|
|
113
|
+
function getWindowsBashCandidates() {
|
|
114
|
+
const discoveredPaths = [];
|
|
115
|
+
try {
|
|
116
|
+
const output = execFileSync("where", ["bash"], {
|
|
117
|
+
encoding: "utf8",
|
|
118
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
119
|
+
windowsHide: true,
|
|
120
|
+
});
|
|
121
|
+
for (const line of output.split(/\r?\n/)) {
|
|
122
|
+
const candidate = line.trim();
|
|
123
|
+
if (candidate.length === 0 || isWindowsBashShim(candidate)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
discoveredPaths.push(candidate);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Ignore failed discovery and fall back to common Git Bash locations.
|
|
131
|
+
}
|
|
132
|
+
return uniqueWindowsPaths([...discoveredPaths, ...DEFAULT_WINDOWS_GIT_BASH_PATHS]);
|
|
133
|
+
}
|
|
134
|
+
function isWindowsBashShim(candidate) {
|
|
135
|
+
const normalized = candidate.replaceAll("/", "\\").toLowerCase();
|
|
136
|
+
return (normalized.endsWith("\\windows\\system32\\bash.exe") ||
|
|
137
|
+
(normalized.includes("\\windowsapps\\") && normalized.endsWith("\\bash.exe")));
|
|
138
|
+
}
|
|
139
|
+
function uniqueWindowsPaths(paths) {
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
const unique = [];
|
|
142
|
+
for (const path of paths) {
|
|
143
|
+
const normalized = path.trim();
|
|
144
|
+
if (normalized.length === 0) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const key = normalized.toLowerCase();
|
|
148
|
+
if (seen.has(key)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
seen.add(key);
|
|
152
|
+
unique.push(normalized);
|
|
153
|
+
}
|
|
154
|
+
return unique;
|
|
155
|
+
}
|
|
156
|
+
async function canExecuteBash(command) {
|
|
157
|
+
return new Promise((resolve) => {
|
|
158
|
+
const child = spawn(command, ["--version"], {
|
|
159
|
+
stdio: "ignore",
|
|
160
|
+
windowsHide: true,
|
|
161
|
+
});
|
|
162
|
+
let settled = false;
|
|
163
|
+
const finish = (result) => {
|
|
164
|
+
if (settled) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
settled = true;
|
|
168
|
+
clearTimeout(timeoutId);
|
|
169
|
+
resolve(result);
|
|
170
|
+
};
|
|
171
|
+
const timeoutId = setTimeout(() => {
|
|
172
|
+
try {
|
|
173
|
+
child.kill();
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Ignore kill failures for already exited processes.
|
|
177
|
+
}
|
|
178
|
+
finish(false);
|
|
179
|
+
}, BASH_VALIDATION_TIMEOUT_MS);
|
|
180
|
+
child.on("close", (code) => finish(code === 0));
|
|
181
|
+
child.on("error", () => finish(false));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function getMissingBashMessage() {
|
|
185
|
+
return process.platform === "win32"
|
|
186
|
+
? "bash is not available. Install Git Bash to run Ralph on Windows."
|
|
187
|
+
: "bash is not available. Install bash to run Ralph.";
|
|
188
|
+
}
|
|
95
189
|
//# sourceMappingURL=ralph-process.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ralph-process.js","sourceRoot":"","sources":["../../src/run/ralph-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ralph-process.js","sourceRoot":"","sources":["../../src/run/ralph-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function sortFiles(files) {
|
|
2
|
+
return [...files].sort((left, right) => left.localeCompare(right));
|
|
3
|
+
}
|
|
4
|
+
function isMarkdownFile(file) {
|
|
5
|
+
return /\.md$/i.test(file);
|
|
6
|
+
}
|
|
7
|
+
function hasSeparatedToken(file, expression) {
|
|
8
|
+
return new RegExp(`(?:^|[\\/._-])${expression}(?=$|[\\/._-])`, "i").test(file);
|
|
9
|
+
}
|
|
10
|
+
function isPrdPath(file) {
|
|
11
|
+
return hasSeparatedToken(file, "prd");
|
|
12
|
+
}
|
|
13
|
+
function isPrdFile(file) {
|
|
14
|
+
return isPrdPath(file) && isMarkdownFile(file);
|
|
15
|
+
}
|
|
16
|
+
function isPrdDocumentDirectory(segment) {
|
|
17
|
+
return isPrdPath(segment);
|
|
18
|
+
}
|
|
19
|
+
function isArchitectureFile(file) {
|
|
20
|
+
return /architect/i.test(file) && isMarkdownFile(file);
|
|
21
|
+
}
|
|
22
|
+
function isReadinessFile(file) {
|
|
23
|
+
return /readiness/i.test(file) && isMarkdownFile(file);
|
|
24
|
+
}
|
|
25
|
+
function isStoryFile(file) {
|
|
26
|
+
return ((hasSeparatedToken(file, "epics?") || hasSeparatedToken(file, "stor(?:y|ies)")) &&
|
|
27
|
+
isMarkdownFile(file));
|
|
28
|
+
}
|
|
29
|
+
function isSprintStatusFile(file) {
|
|
30
|
+
return /(?:^|\/)sprint[-_]status\.ya?ml$/i.test(file);
|
|
31
|
+
}
|
|
32
|
+
function topLevelSegment(file) {
|
|
33
|
+
return file.split("/")[0] ?? file;
|
|
34
|
+
}
|
|
35
|
+
function buildArtifactGroups(files, matchesGroupDirectory) {
|
|
36
|
+
const groupedFiles = new Map();
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
const topLevel = topLevelSegment(file);
|
|
39
|
+
const key = file.includes("/") && matchesGroupDirectory(topLevel) ? topLevel : file;
|
|
40
|
+
const existingGroup = groupedFiles.get(key);
|
|
41
|
+
if (existingGroup) {
|
|
42
|
+
existingGroup.push(file);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
groupedFiles.set(key, [file]);
|
|
46
|
+
}
|
|
47
|
+
return [...groupedFiles.entries()]
|
|
48
|
+
.map(([label, groupFiles]) => ({
|
|
49
|
+
label,
|
|
50
|
+
files: sortFiles(groupFiles),
|
|
51
|
+
}))
|
|
52
|
+
.sort((left, right) => left.label.localeCompare(right.label));
|
|
53
|
+
}
|
|
54
|
+
export function collectTransitionArtifacts(files) {
|
|
55
|
+
const sortedFiles = sortFiles(files);
|
|
56
|
+
const prdFiles = sortedFiles.filter(isPrdFile);
|
|
57
|
+
const sprintStatusFiles = sortedFiles.filter(isSprintStatusFile);
|
|
58
|
+
return {
|
|
59
|
+
files: sortedFiles,
|
|
60
|
+
prdFiles,
|
|
61
|
+
prdDocuments: buildArtifactGroups(prdFiles, isPrdDocumentDirectory),
|
|
62
|
+
architectureFiles: sortedFiles.filter(isArchitectureFile),
|
|
63
|
+
readinessFiles: sortedFiles.filter(isReadinessFile),
|
|
64
|
+
storyFiles: sortedFiles.filter(isStoryFile),
|
|
65
|
+
sprintStatusFile: sprintStatusFiles[0] ?? null,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function combineArtifactContents(files, artifactContents) {
|
|
69
|
+
return files
|
|
70
|
+
.map((file) => artifactContents.get(file)?.trim())
|
|
71
|
+
.filter((content) => Boolean(content))
|
|
72
|
+
.join("\n\n");
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=artifact-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-collection.js","sourceRoot":"","sources":["../../src/transition/artifact-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
1
|
+
import { join, relative } from "node:path";
|
|
2
2
|
import { debug } from "../utils/logger.js";
|
|
3
3
|
import { exists } from "../utils/file-system.js";
|
|
4
4
|
export async function findArtifactsDir(projectDir) {
|
|
@@ -18,4 +18,15 @@ export async function findArtifactsDir(projectDir) {
|
|
|
18
18
|
debug(`No artifacts found. Checked: ${candidates.join(", ")}`);
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
|
+
export function resolvePlanningSpecsSubpath(projectDir, artifactsDir) {
|
|
22
|
+
const bmadOutputDir = join(projectDir, "_bmad-output");
|
|
23
|
+
const relativePath = relative(bmadOutputDir, artifactsDir).replace(/\\/g, "/");
|
|
24
|
+
if (!relativePath || relativePath === "." || relativePath === "..") {
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
if (relativePath.startsWith("../")) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
return relativePath;
|
|
31
|
+
}
|
|
21
32
|
//# sourceMappingURL=artifacts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/transition/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/transition/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,UAAU,GAAG;QACjB,iCAAiC;QACjC,iCAAiC;QACjC,eAAe;KAChB,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC7C,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;YACzC,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAkB,EAAE,YAAoB;IAClF,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE/E,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { PRD_SCOPE_SECTION_PATTERNS } from "./section-patterns.js";
|
|
1
|
+
import { NON_FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS, PRD_SCOPE_SECTION_PATTERNS, PROJECT_GOALS_SECTION_PATTERNS, } from "./section-patterns.js";
|
|
2
2
|
import { SECTION_EXTRACT_MAX_LENGTH } from "../utils/constants.js";
|
|
3
|
+
import { collectTransitionArtifacts } from "./artifact-collection.js";
|
|
3
4
|
export function extractSection(content, headingPattern, maxLength = SECTION_EXTRACT_MAX_LENGTH) {
|
|
4
5
|
return extractSectionWithInfo(content, headingPattern, maxLength).content;
|
|
5
6
|
}
|
|
@@ -53,12 +54,13 @@ export function extractProjectContext(artifacts) {
|
|
|
53
54
|
let archContent = "";
|
|
54
55
|
let uxContent = "";
|
|
55
56
|
let researchContent = "";
|
|
57
|
+
const collectedArtifacts = collectTransitionArtifacts([...artifacts.keys()]);
|
|
56
58
|
for (const [filename, content] of artifacts) {
|
|
57
|
-
if (
|
|
59
|
+
if (collectedArtifacts.prdFiles.includes(filename))
|
|
58
60
|
prdContent += "\n" + content;
|
|
59
|
-
if (
|
|
61
|
+
if (collectedArtifacts.architectureFiles.includes(filename))
|
|
60
62
|
archContent += "\n" + content;
|
|
61
|
-
if (
|
|
63
|
+
if (collectedArtifacts.readinessFiles.includes(filename))
|
|
62
64
|
archContent += "\n" + content;
|
|
63
65
|
if (/ux/i.test(filename))
|
|
64
66
|
uxContent += "\n" + content;
|
|
@@ -71,12 +73,7 @@ export function extractProjectContext(artifacts) {
|
|
|
71
73
|
{
|
|
72
74
|
field: "projectGoals",
|
|
73
75
|
source: prdContent || allContent,
|
|
74
|
-
patterns: [
|
|
75
|
-
/^##\s+Executive Summary/m,
|
|
76
|
-
/^##\s+Vision/m,
|
|
77
|
-
/^##\s+Goals/m,
|
|
78
|
-
/^##\s+Project Goals/m,
|
|
79
|
-
],
|
|
76
|
+
patterns: [...PROJECT_GOALS_SECTION_PATTERNS],
|
|
80
77
|
},
|
|
81
78
|
{
|
|
82
79
|
field: "successMetrics",
|
|
@@ -111,12 +108,7 @@ export function extractProjectContext(artifacts) {
|
|
|
111
108
|
{
|
|
112
109
|
field: "nonFunctionalRequirements",
|
|
113
110
|
source: prdContent || allContent,
|
|
114
|
-
patterns: [
|
|
115
|
-
/^##\s+Non-Functional/m,
|
|
116
|
-
/^##\s+NFR/m,
|
|
117
|
-
/^##\s+Quality/m,
|
|
118
|
-
/^##\s+Quality Attributes/m,
|
|
119
|
-
],
|
|
111
|
+
patterns: [...NON_FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS],
|
|
120
112
|
},
|
|
121
113
|
{
|
|
122
114
|
field: "designGuidelines",
|
|
@@ -249,15 +241,15 @@ For each story in @fix_plan.md:
|
|
|
249
241
|
## Current Objectives
|
|
250
242
|
1. Read .ralph/PROJECT_CONTEXT.md for project goals, constraints, and scope
|
|
251
243
|
2. Read .ralph/SPECS_INDEX.md for prioritized spec file overview
|
|
252
|
-
3. Study .ralph/specs/ following the reading order in SPECS_INDEX.md
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
244
|
+
3. Study .ralph/specs/ following the reading order in SPECS_INDEX.md
|
|
245
|
+
4. Use the exact spec paths listed in SPECS_INDEX.md instead of assuming a fixed subdirectory layout
|
|
246
|
+
5. Prioritize planning specs first (PRD, architecture, epics/stories, test design, UX)
|
|
247
|
+
6. Review implementation artifacts next (sprint plans, detailed stories) when they exist
|
|
248
|
+
7. Check docs/ for project knowledge and research documents (if present)
|
|
249
|
+
8. Review .ralph/@fix_plan.md for current priorities
|
|
250
|
+
9. Implement the highest priority story using TDD
|
|
251
|
+
10. Run tests after each implementation
|
|
252
|
+
11. Update @fix_plan.md with your progress
|
|
261
253
|
|
|
262
254
|
## Key Principles
|
|
263
255
|
- ONE story per loop - focus completely on it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/transition/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/transition/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
function buildSpecPath(planningSpecsSubpath, fileName) {
|
|
2
|
+
const normalizedPath = [planningSpecsSubpath, fileName].filter(Boolean).join("/");
|
|
3
|
+
return `specs/${normalizedPath}`;
|
|
4
|
+
}
|
|
5
|
+
export function generateFixPlan(stories, storiesFileName, planningSpecsSubpath = "planning-artifacts") {
|
|
2
6
|
const lines = ["# Ralph Fix Plan", "", "## Stories to Implement", ""];
|
|
3
7
|
let currentEpic = "";
|
|
4
8
|
for (const story of stories) {
|
|
@@ -25,8 +29,9 @@ export function generateFixPlan(stories, storiesFileName) {
|
|
|
25
29
|
}
|
|
26
30
|
// Add spec-link for easy reference to full story details
|
|
27
31
|
const anchor = story.id.replace(".", "-");
|
|
28
|
-
const fileName = storiesFileName
|
|
29
|
-
|
|
32
|
+
const fileName = storiesFileName || story.sourceFile || "stories.md";
|
|
33
|
+
const specPath = buildSpecPath(planningSpecsSubpath, fileName);
|
|
34
|
+
lines.push(` > Spec: ${specPath}#story-${anchor}`);
|
|
30
35
|
}
|
|
31
36
|
lines.push("", "## Completed", "", "## Notes", "- Follow TDD methodology (red-green-refactor)", "- One story per Ralph loop iteration", "- Update this file after completing each story", "");
|
|
32
37
|
return lines.join("\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-plan.js","sourceRoot":"","sources":["../../src/transition/fix-plan.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"fix-plan.js","sourceRoot":"","sources":["../../src/transition/fix-plan.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAC,oBAA4B,EAAE,QAAgB;IACnE,MAAM,cAAc,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,OAAO,SAAS,cAAc,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,eAAwB,EACxB,oBAAoB,GAAG,oBAAoB;IAE3C,MAAM,KAAK,GAAG,CAAC,kBAAkB,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAEtE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAEtD,8DAA8D;QAC9D,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC/E,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,yDAAyD;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,eAAe,IAAI,KAAK,CAAC,UAAU,IAAI,YAAY,CAAC;QACrE,MAAM,QAAQ,GAAG,aAAa,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,UAAU,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,cAAc,EACd,EAAE,EACF,UAAU,EACV,+CAA+C,EAC/C,sCAAsC,EACtC,gDAAgD,EAChD,EAAE,CACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,4DAA4D;IAC5D,MAAM,OAAO,GAAG,sDAAsD,CAAC;IACvE,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE;YACb,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,KAAK,GAAG;YAC1C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,aAAqC,EACrC,WAAwB;IAExB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,CACX,mBAAmB,IAAI,CAAC,EAAE,GAAG,SAAS,sDAAsD,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAAqC,EACrC,UAAmB,EACnB,YAA0B;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,sDAAsD;IACtD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,SAAS;QAE7C,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAEhD,+DAA+D;QAC/D,yCAAyC;QACzC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CACX,UAAU,IAAI,CAAC,KAAK,0CAA0C,IAAI,CAAC,EAAE,OAAO,KAAK,wCAAwC,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,YAAyB,EACzB,QAA8B,EAC9B,eAAqC;IAErC,gEAAgE;IAChE,OAAO,UAAU,CAAC,OAAO,CACvB,2CAA2C,EAC3C,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;QAC5B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;QAEzD,iEAAiE;QACjE,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,KAAK,IAAI,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxD,OAAO,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CACF,CAAC;AACJ,CAAC"}
|