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.
Files changed (42) hide show
  1. package/README.md +14 -4
  2. package/dist/commands/doctor-checks.js +17 -10
  3. package/dist/commands/doctor-checks.js.map +1 -1
  4. package/dist/commands/implement.js +28 -12
  5. package/dist/commands/implement.js.map +1 -1
  6. package/dist/run/ralph-process.js +101 -7
  7. package/dist/run/ralph-process.js.map +1 -1
  8. package/dist/transition/artifact-collection.js +74 -0
  9. package/dist/transition/artifact-collection.js.map +1 -0
  10. package/dist/transition/artifacts.js +12 -1
  11. package/dist/transition/artifacts.js.map +1 -1
  12. package/dist/transition/context.js +34 -28
  13. package/dist/transition/context.js.map +1 -1
  14. package/dist/transition/fix-plan.js +8 -3
  15. package/dist/transition/fix-plan.js.map +1 -1
  16. package/dist/transition/orchestration.js +177 -134
  17. package/dist/transition/orchestration.js.map +1 -1
  18. package/dist/transition/preflight.js +37 -19
  19. package/dist/transition/preflight.js.map +1 -1
  20. package/dist/transition/section-patterns.js +59 -0
  21. package/dist/transition/section-patterns.js.map +1 -0
  22. package/dist/transition/specs-index.js +5 -2
  23. package/dist/transition/specs-index.js.map +1 -1
  24. package/dist/transition/specs-sync.js +23 -0
  25. package/dist/transition/specs-sync.js.map +1 -0
  26. package/dist/transition/sprint-status.js +91 -0
  27. package/dist/transition/sprint-status.js.map +1 -0
  28. package/dist/transition/story-parsing.js +25 -12
  29. package/dist/transition/story-parsing.js.map +1 -1
  30. package/dist/transition/tech-stack.js +10 -10
  31. package/dist/transition/tech-stack.js.map +1 -1
  32. package/package.json +2 -2
  33. package/ralph/RALPH-REFERENCE.md +50 -46
  34. package/ralph/drivers/cursor-agent-wrapper.sh +13 -0
  35. package/ralph/drivers/cursor.sh +168 -7
  36. package/ralph/lib/circuit_breaker.sh +5 -5
  37. package/ralph/lib/enable_core.sh +10 -10
  38. package/ralph/ralph_import.sh +14 -10
  39. package/ralph/ralph_loop.sh +94 -57
  40. package/ralph/ralph_monitor.sh +4 -4
  41. package/ralph/templates/AGENT.md +7 -7
  42. 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 (/^##\s+Functional Requirements/m.test(snippet) || /^##\s+Executive Summary/m.test(snippet))
34
+ if (matchesAnyPattern(snippet, FUNCTIONAL_REQUIREMENTS_SECTION_PATTERNS) ||
35
+ matchesAnyPattern(snippet, PROJECT_GOALS_SECTION_PATTERNS))
34
36
  return "prd";
35
- if (/^##\s+Tech Stack/m.test(snippet) || /^##\s+Architecture Decision/m.test(snippet))
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":"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"}
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 = /^\*?\*?Given\*?\*?\s/;
3
- const GWT_LINE_PATTERN = /^\*?\*?(Given|When|Then)\*?\*?\s/;
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 isGwtLine(line) {
14
- return GWT_LINE_PATTERN.test(line.trim());
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.map(stripBold).join(", "));
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 (isGwtLine(trimmed)) {
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.map(stripBold).join(", "));
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":"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"}
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
- // Find tech stack section
3
- const stackMatch = content.match(/^##\s+(?:Tech(?:nology)?\s+Stack|Stack)/im);
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\n${command}\n\`\`\``);
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":"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"}
1
+ {"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/transition/tech-stack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmalph",
3
- "version": "2.7.1",
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": "bash -c 'command -v bats &>/dev/null && bats tests/bash/*.bats tests/bash/drivers/*.bats || echo \"[skip] bats not installed\"'",
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",