bmalph 2.7.1 → 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/commands/implement.js +28 -12
- package/dist/commands/implement.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 +34 -28
- 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 +177 -134
- package/dist/transition/orchestration.js.map +1 -1
- package/dist/transition/preflight.js +37 -19
- package/dist/transition/preflight.js.map +1 -1
- package/dist/transition/section-patterns.js +59 -0
- package/dist/transition/section-patterns.js.map +1 -0
- 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 +25 -12
- package/dist/transition/story-parsing.js.map +1 -1
- package/dist/transition/tech-stack.js +10 -10
- package/dist/transition/tech-stack.js.map +1 -1
- package/package.json +2 -2
- 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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
function headingPattern(expression) {
|
|
2
|
+
return new RegExp(`^##\\s+${expression}(?:\\s*:)?\\s*$`, "im");
|
|
3
|
+
}
|
|
4
|
+
export const PROJECT_GOALS_SECTION_PATTERNS = [
|
|
5
|
+
headingPattern("Executive Summary"),
|
|
6
|
+
headingPattern("Vision"),
|
|
7
|
+
headingPattern("Goals"),
|
|
8
|
+
headingPattern("Project Goals"),
|
|
9
|
+
headingPattern("Resumo Executivo"),
|
|
10
|
+
headingPattern("Resumo"),
|
|
11
|
+
headingPattern("Objetivos(?: do Projeto)?"),
|
|
12
|
+
headingPattern("Resumen Ejecutivo"),
|
|
13
|
+
headingPattern("Resumen"),
|
|
14
|
+
headingPattern("Objetivos(?: del Proyecto)?"),
|
|
15
|
+
];
|
|
16
|
+
export const FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS = [
|
|
17
|
+
headingPattern("Functional Requirements"),
|
|
18
|
+
headingPattern("Requisitos Funcionais"),
|
|
19
|
+
headingPattern("Requisitos Funcionales"),
|
|
20
|
+
];
|
|
21
|
+
export const NON_FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS = [
|
|
22
|
+
headingPattern("Non-Functional(?: Requirements)?"),
|
|
23
|
+
headingPattern("NFR"),
|
|
24
|
+
headingPattern("Quality"),
|
|
25
|
+
headingPattern("Quality Attributes"),
|
|
26
|
+
headingPattern("Requisitos N(?:a|\\u00E3)o Funcionais"),
|
|
27
|
+
headingPattern("Qualidade"),
|
|
28
|
+
headingPattern("Atributos de Qualidade"),
|
|
29
|
+
headingPattern("Requisitos No Funcionales"),
|
|
30
|
+
headingPattern("Calidad"),
|
|
31
|
+
headingPattern("Atributos de Calidad"),
|
|
32
|
+
];
|
|
33
|
+
export const PRD_SCOPE_SECTION_PATTERNS = [
|
|
34
|
+
headingPattern("Scope"),
|
|
35
|
+
headingPattern("Product Scope"),
|
|
36
|
+
headingPattern("In Scope"),
|
|
37
|
+
headingPattern("Out of Scope"),
|
|
38
|
+
headingPattern("Escopo"),
|
|
39
|
+
headingPattern("Em Escopo"),
|
|
40
|
+
headingPattern("Fora de Escopo"),
|
|
41
|
+
headingPattern("Alcance"),
|
|
42
|
+
headingPattern("En Alcance"),
|
|
43
|
+
headingPattern("Fuera de Alcance"),
|
|
44
|
+
];
|
|
45
|
+
export const TECH_STACK_SOURCE_SECTION_PATTERNS = [
|
|
46
|
+
headingPattern("Tech Stack"),
|
|
47
|
+
headingPattern("Technology Stack"),
|
|
48
|
+
headingPattern("Stack"),
|
|
49
|
+
headingPattern("Core Architectural Decisions"),
|
|
50
|
+
headingPattern("Starter Template Evaluation"),
|
|
51
|
+
headingPattern("Pilha Tecnol(?:o|\\u00F3)gica"),
|
|
52
|
+
headingPattern("Decis(?:o|\\u00F5)es Arquitet(?:o|\\u00F4)nicas Principais"),
|
|
53
|
+
headingPattern("Pila Tecnol(?:o|\\u00F3)gica"),
|
|
54
|
+
headingPattern("Decisiones Arquitect(?:o|\\u00F3)nicas Principales"),
|
|
55
|
+
];
|
|
56
|
+
export function matchesAnyPattern(content, patterns) {
|
|
57
|
+
return patterns.some((pattern) => pattern.test(content));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=section-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-patterns.js","sourceRoot":"","sources":["../../src/transition/section-patterns.ts"],"names":[],"mappings":"AAAA,SAAS,cAAc,CAAC,UAAkB;IACxC,OAAO,IAAI,MAAM,CAAC,UAAU,UAAU,iBAAiB,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,cAAc,CAAC,mBAAmB,CAAC;IACnC,cAAc,CAAC,QAAQ,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC;IACvB,cAAc,CAAC,eAAe,CAAC;IAC/B,cAAc,CAAC,kBAAkB,CAAC;IAClC,cAAc,CAAC,QAAQ,CAAC;IACxB,cAAc,CAAC,2BAA2B,CAAC;IAC3C,cAAc,CAAC,mBAAmB,CAAC;IACnC,cAAc,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,6BAA6B,CAAC;CACrC,CAAC;AAEX,MAAM,CAAC,MAAM,wCAAwC,GAAG;IACtD,cAAc,CAAC,yBAAyB,CAAC;IACzC,cAAc,CAAC,uBAAuB,CAAC;IACvC,cAAc,CAAC,wBAAwB,CAAC;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,4CAA4C,GAAG;IAC1D,cAAc,CAAC,kCAAkC,CAAC;IAClD,cAAc,CAAC,KAAK,CAAC;IACrB,cAAc,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,oBAAoB,CAAC;IACpC,cAAc,CAAC,uCAAuC,CAAC;IACvD,cAAc,CAAC,WAAW,CAAC;IAC3B,cAAc,CAAC,wBAAwB,CAAC;IACxC,cAAc,CAAC,2BAA2B,CAAC;IAC3C,cAAc,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,sBAAsB,CAAC;CAC9B,CAAC;AAEX,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,cAAc,CAAC,OAAO,CAAC;IACvB,cAAc,CAAC,eAAe,CAAC;IAC/B,cAAc,CAAC,UAAU,CAAC;IAC1B,cAAc,CAAC,cAAc,CAAC;IAC9B,cAAc,CAAC,QAAQ,CAAC;IACxB,cAAc,CAAC,WAAW,CAAC;IAC3B,cAAc,CAAC,gBAAgB,CAAC;IAChC,cAAc,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,YAAY,CAAC;IAC5B,cAAc,CAAC,kBAAkB,CAAC;CAC1B,CAAC;AAEX,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,cAAc,CAAC,YAAY,CAAC;IAC5B,cAAc,CAAC,kBAAkB,CAAC;IAClC,cAAc,CAAC,OAAO,CAAC;IACvB,cAAc,CAAC,8BAA8B,CAAC;IAC9C,cAAc,CAAC,6BAA6B,CAAC;IAC7C,cAAc,CAAC,+BAA+B,CAAC;IAC/C,cAAc,CAAC,4DAA4D,CAAC;IAC5E,cAAc,CAAC,8BAA8B,CAAC;IAC9C,cAAc,CAAC,oDAAoD,CAAC;CAC5D,CAAC;AAEX,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAA2B;IAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getMarkdownFilesWithContent } from "../utils/file-system.js";
|
|
2
2
|
import { LARGE_FILE_THRESHOLD_BYTES, DEFAULT_SNIPPET_MAX_LENGTH } from "../utils/constants.js";
|
|
3
|
+
import { FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS, PROJECT_GOALS_SECTION_PATTERNS, TECH_STACK_SOURCE_SECTION_PATTERNS, matchesAnyPattern, } from "./section-patterns.js";
|
|
3
4
|
/**
|
|
4
5
|
* Detects the type of a spec file based on its filename.
|
|
5
6
|
*/
|
|
@@ -30,9 +31,11 @@ export function detectSpecFileType(filename, content) {
|
|
|
30
31
|
*/
|
|
31
32
|
function detectFromContent(content) {
|
|
32
33
|
const snippet = content.slice(0, 2000);
|
|
33
|
-
if (
|
|
34
|
+
if (matchesAnyPattern(snippet, FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS) ||
|
|
35
|
+
matchesAnyPattern(snippet, PROJECT_GOALS_SECTION_PATTERNS))
|
|
34
36
|
return "prd";
|
|
35
|
-
if (
|
|
37
|
+
if (matchesAnyPattern(snippet, TECH_STACK_SOURCE_SECTION_PATTERNS) ||
|
|
38
|
+
/^##\s+Architecture Decision/m.test(snippet))
|
|
36
39
|
return "architecture";
|
|
37
40
|
if (/^###\s+Story\s+\d+\.\d+:/m.test(snippet))
|
|
38
41
|
return "stories";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specs-index.js","sourceRoot":"","sources":["../../src/transition/specs-index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAE/
|
|
1
|
+
{"version":3,"file":"specs-index.js","sourceRoot":"","sources":["../../src/transition/specs-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { access, cp, mkdir, rm } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { exists } from "../utils/file-system.js";
|
|
4
|
+
import { resolvePlanningSpecsSubpath } from "./artifacts.js";
|
|
5
|
+
export async function prepareSpecsDirectory(projectDir, artifactsDir, artifactFiles, specsTmpDir) {
|
|
6
|
+
const bmadOutputDir = join(projectDir, "_bmad-output");
|
|
7
|
+
const bmadOutputExists = await exists(bmadOutputDir);
|
|
8
|
+
const planningSpecsSubpath = resolvePlanningSpecsSubpath(projectDir, artifactsDir);
|
|
9
|
+
await rm(specsTmpDir, { recursive: true, force: true });
|
|
10
|
+
await mkdir(specsTmpDir, { recursive: true });
|
|
11
|
+
if (bmadOutputExists) {
|
|
12
|
+
await cp(bmadOutputDir, specsTmpDir, { recursive: true, dereference: false });
|
|
13
|
+
}
|
|
14
|
+
for (const file of artifactFiles) {
|
|
15
|
+
const destinationPath = join(specsTmpDir, planningSpecsSubpath, file);
|
|
16
|
+
await mkdir(dirname(destinationPath), { recursive: true });
|
|
17
|
+
await cp(join(artifactsDir, file), destinationPath, {
|
|
18
|
+
dereference: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
await access(specsTmpDir);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=specs-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-sync.js","sourceRoot":"","sources":["../../src/transition/specs-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,YAAoB,EACpB,aAAgC,EAChC,WAAmB;IAEnB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEnF,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,eAAe,EAAE;YAClD,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const STORY_STATUSES = new Set([
|
|
2
|
+
"backlog",
|
|
3
|
+
"ready-for-dev",
|
|
4
|
+
"in-progress",
|
|
5
|
+
"review",
|
|
6
|
+
"done",
|
|
7
|
+
"drafted",
|
|
8
|
+
]);
|
|
9
|
+
const EPIC_STATUSES = new Set(["backlog", "in-progress", "done", "contexted"]);
|
|
10
|
+
const RETROSPECTIVE_STATUSES = new Set(["optional", "done"]);
|
|
11
|
+
function parseIndentedEntry(line) {
|
|
12
|
+
const match = /^\s+([^:#]+):\s*([a-z-]+)\s*$/i.exec(line);
|
|
13
|
+
if (!match)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
key: match[1].trim(),
|
|
17
|
+
status: match[2].trim().toLowerCase(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function storyIdFromKey(key) {
|
|
21
|
+
const match = /^(\d+)-(\d+)-.+$/.exec(key);
|
|
22
|
+
if (!match)
|
|
23
|
+
return null;
|
|
24
|
+
return `${match[1]}.${match[2]}`;
|
|
25
|
+
}
|
|
26
|
+
export function parseSprintStatus(content) {
|
|
27
|
+
const warnings = [];
|
|
28
|
+
const fatalWarnings = [];
|
|
29
|
+
const storyStatusById = new Map();
|
|
30
|
+
const lines = content.split(/\r?\n/);
|
|
31
|
+
const developmentStatusIndex = lines.findIndex((line) => /^development_status:\s*$/i.test(line));
|
|
32
|
+
if (developmentStatusIndex === -1) {
|
|
33
|
+
return {
|
|
34
|
+
storyStatusById,
|
|
35
|
+
warnings: ['Sprint status is missing a "development_status" section'],
|
|
36
|
+
valid: false,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
for (const line of lines.slice(developmentStatusIndex + 1)) {
|
|
40
|
+
if (!line.trim() || /^\s*#/.test(line)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (/^\S/.test(line)) {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
const entry = parseIndentedEntry(line);
|
|
47
|
+
if (!entry) {
|
|
48
|
+
fatalWarnings.push(`Sprint status entry could not be parsed: ${line.trim()}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (entry.key.endsWith("-retrospective")) {
|
|
52
|
+
if (!RETROSPECTIVE_STATUSES.has(entry.status)) {
|
|
53
|
+
warnings.push(`Sprint retrospective entry "${entry.key}" has invalid status "${entry.status}"`);
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (entry.key.startsWith("epic-")) {
|
|
58
|
+
if (!EPIC_STATUSES.has(entry.status)) {
|
|
59
|
+
warnings.push(`Sprint epic entry "${entry.key}" has invalid status "${entry.status}"`);
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (!STORY_STATUSES.has(entry.status)) {
|
|
64
|
+
fatalWarnings.push(`Sprint story entry "${entry.key}" has invalid status "${entry.status}"`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const storyId = storyIdFromKey(entry.key);
|
|
68
|
+
if (!storyId) {
|
|
69
|
+
fatalWarnings.push(`Sprint story entry "${entry.key}" does not match the expected N-M-name format`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (storyStatusById.has(storyId)) {
|
|
73
|
+
fatalWarnings.push(`Sprint story entry "${entry.key}" duplicates story ID "${storyId}"`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
storyStatusById.set(storyId, entry.status);
|
|
77
|
+
}
|
|
78
|
+
if (fatalWarnings.length > 0) {
|
|
79
|
+
return {
|
|
80
|
+
storyStatusById: new Map(),
|
|
81
|
+
warnings: [...warnings, ...fatalWarnings],
|
|
82
|
+
valid: false,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
storyStatusById,
|
|
87
|
+
warnings,
|
|
88
|
+
valid: true,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sprint-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-status.js","sourceRoot":"","sources":["../../src/transition/sprint-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Cached regex patterns for performance (compiled once at module load)
|
|
2
|
-
const GIVEN_LINE_PATTERN =
|
|
3
|
-
const
|
|
2
|
+
const GIVEN_LINE_PATTERN = /^(?:[-*]\s+)?(?:\*\*)?Given(?:\*\*)?\s/i;
|
|
3
|
+
const AC_KEYWORD_LINE_PATTERN = /^(?:[-*]\s+)?(?:\*\*)?(Given|When|Then|And)(?:\*\*)?\s/i;
|
|
4
4
|
const BOLD_PATTERN = /\*\*/g;
|
|
5
5
|
const EPIC_HEADER_PATTERN = /^##\s+Epic\s+\d+:\s+(.+)/;
|
|
6
6
|
const HEADING_PATTERN = /^#{2,3}\s/;
|
|
@@ -10,12 +10,21 @@ const AC_HEADING_PATTERN = /^\*?\*?Acceptance Criteria\*?\*?:?/i;
|
|
|
10
10
|
function isGivenLine(line) {
|
|
11
11
|
return GIVEN_LINE_PATTERN.test(line.trim());
|
|
12
12
|
}
|
|
13
|
-
function
|
|
14
|
-
return
|
|
13
|
+
function isAcKeywordLine(line) {
|
|
14
|
+
return AC_KEYWORD_LINE_PATTERN.test(line.trim());
|
|
15
15
|
}
|
|
16
16
|
function stripBold(text) {
|
|
17
17
|
return text.replace(BOLD_PATTERN, "");
|
|
18
18
|
}
|
|
19
|
+
function normalizeAcLine(line) {
|
|
20
|
+
return stripBold(line)
|
|
21
|
+
.replace(/^[-*]\s+/, "")
|
|
22
|
+
.trim();
|
|
23
|
+
}
|
|
24
|
+
function isAcContinuationLine(line) {
|
|
25
|
+
const trimmed = line.trim();
|
|
26
|
+
return (/^\s{2,}\S/.test(line) && !HEADING_PATTERN.test(trimmed) && !AC_HEADING_PATTERN.test(trimmed));
|
|
27
|
+
}
|
|
19
28
|
function parseAcBlocks(lines) {
|
|
20
29
|
const criteria = [];
|
|
21
30
|
let current = [];
|
|
@@ -26,23 +35,26 @@ function parseAcBlocks(lines) {
|
|
|
26
35
|
if (isGivenLine(trimmed)) {
|
|
27
36
|
// Start new criterion block
|
|
28
37
|
if (current.length > 0) {
|
|
29
|
-
criteria.push(current.
|
|
38
|
+
criteria.push(current.join(", "));
|
|
30
39
|
}
|
|
31
|
-
current = [trimmed];
|
|
40
|
+
current = [normalizeAcLine(trimmed)];
|
|
41
|
+
}
|
|
42
|
+
else if (current.length > 0 && isAcKeywordLine(trimmed)) {
|
|
43
|
+
current.push(normalizeAcLine(trimmed));
|
|
32
44
|
}
|
|
33
|
-
else if (
|
|
34
|
-
current.push(trimmed);
|
|
45
|
+
else if (current.length > 0 && isAcContinuationLine(line)) {
|
|
46
|
+
current.push(normalizeAcLine(trimmed));
|
|
35
47
|
}
|
|
36
48
|
}
|
|
37
49
|
if (current.length > 0) {
|
|
38
|
-
criteria.push(current.
|
|
50
|
+
criteria.push(current.join(", "));
|
|
39
51
|
}
|
|
40
52
|
return criteria;
|
|
41
53
|
}
|
|
42
|
-
export function parseStories(content) {
|
|
43
|
-
return parseStoriesWithWarnings(content).stories;
|
|
54
|
+
export function parseStories(content, sourceFile = "stories.md") {
|
|
55
|
+
return parseStoriesWithWarnings(content, sourceFile).stories;
|
|
44
56
|
}
|
|
45
|
-
export function parseStoriesWithWarnings(content) {
|
|
57
|
+
export function parseStoriesWithWarnings(content, sourceFile = "stories.md") {
|
|
46
58
|
const stories = [];
|
|
47
59
|
const warnings = [];
|
|
48
60
|
let currentEpic = "";
|
|
@@ -117,6 +129,7 @@ export function parseStoriesWithWarnings(content) {
|
|
|
117
129
|
title,
|
|
118
130
|
description: descLines.join(" "),
|
|
119
131
|
acceptanceCriteria,
|
|
132
|
+
sourceFile,
|
|
120
133
|
});
|
|
121
134
|
}
|
|
122
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story-parsing.js","sourceRoot":"","sources":["../../src/transition/story-parsing.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"story-parsing.js","sourceRoot":"","sources":["../../src/transition/story-parsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
+
import { extractFirstMatchingSection } from "./context.js";
|
|
2
|
+
import { TECH_STACK_SOURCE_SECTION_PATTERNS } from "./section-patterns.js";
|
|
3
|
+
export function extractTechStackSource(content) {
|
|
4
|
+
return extractFirstMatchingSection(content, TECH_STACK_SOURCE_SECTION_PATTERNS, Number.POSITIVE_INFINITY).trim();
|
|
5
|
+
}
|
|
1
6
|
export function detectTechStack(content) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (!stackMatch)
|
|
7
|
+
const sectionContent = extractTechStackSource(content);
|
|
8
|
+
if (!sectionContent)
|
|
5
9
|
return null;
|
|
6
|
-
const startIndex = stackMatch.index ?? 0;
|
|
7
|
-
// Extract section content until next ## heading or end
|
|
8
|
-
const rest = content.slice(startIndex);
|
|
9
|
-
const nextHeading = rest.slice(1).search(/^##\s/m);
|
|
10
|
-
const sectionContent = nextHeading > -1 ? rest.slice(0, nextHeading + 1) : rest;
|
|
11
10
|
// Detect language/runtime
|
|
12
11
|
const isNode = /\bnode(?:\.js)?\b/i.test(sectionContent) ||
|
|
13
12
|
/\btypescript\b/i.test(sectionContent) ||
|
|
@@ -63,6 +62,7 @@ export function detectTechStack(content) {
|
|
|
63
62
|
return null;
|
|
64
63
|
}
|
|
65
64
|
export function customizeAgentMd(template, stack) {
|
|
65
|
+
const newline = template.includes("\r\n") ? "\r\n" : "\n";
|
|
66
66
|
const sections = [
|
|
67
67
|
{ heading: "Project Setup", command: stack.setup },
|
|
68
68
|
{ heading: "Running Tests", command: stack.test },
|
|
@@ -72,8 +72,8 @@ export function customizeAgentMd(template, stack) {
|
|
|
72
72
|
let result = template;
|
|
73
73
|
for (const { heading, command } of sections) {
|
|
74
74
|
// Replace code block content after the section heading
|
|
75
|
-
const pattern = new RegExp(`(## ${heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*\\n)\`\`\`bash\\n[\\s\\S]*?\`\`\``, "m");
|
|
76
|
-
result = result.replace(pattern, `$1\`\`\`bash
|
|
75
|
+
const pattern = new RegExp(`(## ${heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*\\r?\\n)\`\`\`bash\\r?\\n[\\s\\S]*?\`\`\``, "m");
|
|
76
|
+
result = result.replace(pattern, `$1\`\`\`bash${newline}${command}${newline}\`\`\``);
|
|
77
77
|
}
|
|
78
78
|
return result;
|
|
79
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/transition/tech-stack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/transition/tech-stack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,2BAA2B,CAChC,OAAO,EACP,kCAAkC,EAClC,MAAM,CAAC,iBAAiB,CACzB,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,0BAA0B;IAC1B,MAAM,MAAM,GACV,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC;QACzC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,IAAI,GACR,oDAAoD,CAAC,IAAI,CAAC,cAAc,CAAC;QACzE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAErC,IAAI,MAAM,EAAE,CAAC;QACX,8BAA8B;QAC9B,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,IAAI,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,GAAG,gBAAgB,CAAC;aAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,GAAG,UAAU,CAAC;aAC3D,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,GAAG,WAAW,CAAC;QAElE,uBAAuB;QACvB,IAAI,QAAQ,GAAG,eAAe,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,QAAQ,GAAG,SAAS,CAAC;QAE1D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,OAAO,GAAG,kBAAkB,CAAC;QACjC,IAAI,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,GAAG,QAAQ,CAAC;aACtD,IAAI,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,GAAG,6BAA6B,CAAC;QAEvF,OAAO;YACL,KAAK,EAAE,iCAAiC;YACxC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,iBAAiB;YACxB,GAAG,EAAE,qCAAqC;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,uBAAuB;YAC9B,GAAG,EAAE,WAAW;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO;YACL,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,gBAAgB;YACvB,GAAG,EAAE,UAAU;SAChB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,KAAgB;IACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,QAAQ,GAA2C;QACvD,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;QAClD,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;QACjD,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;QACnD,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE;KACtD,CAAC;IAEF,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC5C,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,+CAA+C,EACpG,GAAG,CACJ,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,OAAO,GAAG,OAAO,GAAG,OAAO,QAAQ,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmalph",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.3",
|
|
4
4
|
"description": "Unified AI Development Framework - BMAD phases with Ralph execution loop",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"test:watch": "vitest",
|
|
13
13
|
"test:e2e": "vitest run --config vitest.config.e2e.ts",
|
|
14
14
|
"test:coverage": "vitest run --coverage",
|
|
15
|
-
"test:bash": "
|
|
15
|
+
"test:bash": "node scripts/run-bash-tests.mjs",
|
|
16
16
|
"test:all": "npm run test && npm run test:e2e && npm run test:bash",
|
|
17
17
|
"check": "npm run lint && npm run build && npm test",
|
|
18
18
|
"dev": "tsc --watch",
|