bmalph 2.7.2 → 2.7.4
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 +12 -7
- package/dist/transition/fix-plan.js.map +1 -1
- package/dist/transition/orchestration.js +213 -116
- package/dist/transition/orchestration.js.map +1 -1
- package/dist/transition/preflight.js +30 -17
- 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-id.js +46 -0
- package/dist/transition/story-id.js.map +1 -0
- package/dist/transition/story-parsing.js +7 -7
- 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/claude-code.sh +44 -2
- package/ralph/drivers/codex.sh +10 -1
- package/ralph/drivers/copilot.sh +5 -0
- package/ralph/drivers/cursor-agent-wrapper.sh +13 -0
- package/ralph/drivers/cursor.sh +178 -14
- package/ralph/lib/circuit_breaker.sh +5 -5
- package/ralph/lib/enable_core.sh +10 -10
- package/ralph/lib/response_analyzer.sh +357 -111
- package/ralph/ralph_import.sh +14 -10
- package/ralph/ralph_loop.sh +168 -119
- package/ralph/ralph_monitor.sh +4 -4
- package/ralph/templates/AGENT.md +7 -7
- package/ralph/templates/PROMPT.md +13 -13
|
@@ -1,7 +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
|
+
];
|
|
1
33
|
export const PRD_SCOPE_SECTION_PATTERNS = [
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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"),
|
|
6
55
|
];
|
|
56
|
+
export function matchesAnyPattern(content, patterns) {
|
|
57
|
+
return patterns.some((pattern) => pattern.test(content));
|
|
58
|
+
}
|
|
7
59
|
//# sourceMappingURL=section-patterns.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-patterns.js","sourceRoot":"","sources":["../../src/transition/section-patterns.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
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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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const RAW_STORY_ID_SOURCE = String.raw `[\d.]+`;
|
|
2
|
+
const CANONICAL_STORY_ID_PATTERN = /^(\d+)\.(\d+)$/;
|
|
3
|
+
export const STORY_HEADER_PATTERN = new RegExp(String.raw `^###\s+Story\s+(${RAW_STORY_ID_SOURCE}):\s+(.+)`);
|
|
4
|
+
export function createFixPlanStoryLinePattern() {
|
|
5
|
+
return new RegExp(String.raw `^\s*-\s*\[([ xX])\]\s*Story\s+(${RAW_STORY_ID_SOURCE}):\s*(.+?)$`, "gm");
|
|
6
|
+
}
|
|
7
|
+
export function createOpenFixPlanStoryLinePattern() {
|
|
8
|
+
return new RegExp(String.raw `^(\s*-\s*)\[ \](\s*Story\s+(${RAW_STORY_ID_SOURCE}):)`, "gm");
|
|
9
|
+
}
|
|
10
|
+
export function isCanonicalStoryId(value) {
|
|
11
|
+
return CANONICAL_STORY_ID_PATTERN.test(value);
|
|
12
|
+
}
|
|
13
|
+
export function parseCanonicalStoryId(value) {
|
|
14
|
+
const match = value.match(CANONICAL_STORY_ID_PATTERN);
|
|
15
|
+
if (!match) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
epic: Number(match[1]),
|
|
20
|
+
story: Number(match[2]),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function compareStoryIds(left, right) {
|
|
24
|
+
const leftParts = parseCanonicalStoryId(left);
|
|
25
|
+
const rightParts = parseCanonicalStoryId(right);
|
|
26
|
+
if (leftParts && rightParts) {
|
|
27
|
+
if (leftParts.epic !== rightParts.epic) {
|
|
28
|
+
return leftParts.epic - rightParts.epic;
|
|
29
|
+
}
|
|
30
|
+
return leftParts.story - rightParts.story;
|
|
31
|
+
}
|
|
32
|
+
if (leftParts) {
|
|
33
|
+
return -1;
|
|
34
|
+
}
|
|
35
|
+
if (rightParts) {
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
return left.localeCompare(right);
|
|
39
|
+
}
|
|
40
|
+
export function formatStoryAnchor(value) {
|
|
41
|
+
return value.replaceAll(".", "-");
|
|
42
|
+
}
|
|
43
|
+
export function formatMalformedStoryIdWarning(id, title) {
|
|
44
|
+
return `Malformed story ID "${id}" in "${title}" (expected format: N.M)`;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=story-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-id.js","sourceRoot":"","sources":["../../src/transition/story-id.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA,QAAQ,CAAC;AAC/C,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAOpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,MAAM,CAC5C,MAAM,CAAC,GAAG,CAAA,mBAAmB,mBAAmB,WAAW,CAC5D,CAAC;AAEF,MAAM,UAAU,6BAA6B;IAC3C,OAAO,IAAI,MAAM,CACf,MAAM,CAAC,GAAG,CAAA,kCAAkC,mBAAmB,aAAa,EAC5E,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,+BAA+B,mBAAmB,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEhD,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAAU,EAAE,KAAa;IACrE,OAAO,uBAAuB,EAAE,SAAS,KAAK,0BAA0B,CAAC;AAC3E,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { STORY_HEADER_PATTERN, formatMalformedStoryIdWarning, isCanonicalStoryId, } from "./story-id.js";
|
|
1
2
|
// Cached regex patterns for performance (compiled once at module load)
|
|
2
3
|
const GIVEN_LINE_PATTERN = /^(?:[-*]\s+)?(?:\*\*)?Given(?:\*\*)?\s/i;
|
|
3
4
|
const AC_KEYWORD_LINE_PATTERN = /^(?:[-*]\s+)?(?:\*\*)?(Given|When|Then|And)(?:\*\*)?\s/i;
|
|
4
5
|
const BOLD_PATTERN = /\*\*/g;
|
|
5
6
|
const EPIC_HEADER_PATTERN = /^##\s+Epic\s+\d+:\s+(.+)/;
|
|
6
7
|
const HEADING_PATTERN = /^#{2,3}\s/;
|
|
7
|
-
const STORY_HEADER_PATTERN = /^###\s+Story\s+([\d.]+):\s+(.+)/;
|
|
8
|
-
const STORY_ID_PATTERN = /^\d+\.\d+$/;
|
|
9
8
|
const AC_HEADING_PATTERN = /^\*?\*?Acceptance Criteria\*?\*?:?/i;
|
|
10
9
|
function isGivenLine(line) {
|
|
11
10
|
return GIVEN_LINE_PATTERN.test(line.trim());
|
|
@@ -51,10 +50,10 @@ function parseAcBlocks(lines) {
|
|
|
51
50
|
}
|
|
52
51
|
return criteria;
|
|
53
52
|
}
|
|
54
|
-
export function parseStories(content) {
|
|
55
|
-
return parseStoriesWithWarnings(content).stories;
|
|
53
|
+
export function parseStories(content, sourceFile = "stories.md") {
|
|
54
|
+
return parseStoriesWithWarnings(content, sourceFile).stories;
|
|
56
55
|
}
|
|
57
|
-
export function parseStoriesWithWarnings(content) {
|
|
56
|
+
export function parseStoriesWithWarnings(content, sourceFile = "stories.md") {
|
|
58
57
|
const stories = [];
|
|
59
58
|
const warnings = [];
|
|
60
59
|
let currentEpic = "";
|
|
@@ -84,8 +83,8 @@ export function parseStoriesWithWarnings(content) {
|
|
|
84
83
|
const id = storyMatch[1];
|
|
85
84
|
const title = storyMatch[2].trim();
|
|
86
85
|
// Validate story ID format (should be like "1.1", "2.3", etc.)
|
|
87
|
-
if (!
|
|
88
|
-
warnings.push(
|
|
86
|
+
if (!isCanonicalStoryId(id)) {
|
|
87
|
+
warnings.push(formatMalformedStoryIdWarning(id, title));
|
|
89
88
|
}
|
|
90
89
|
// Collect all body lines until next heading
|
|
91
90
|
const bodyLines = [];
|
|
@@ -129,6 +128,7 @@ export function parseStoriesWithWarnings(content) {
|
|
|
129
128
|
title,
|
|
130
129
|
description: descLines.join(" "),
|
|
131
130
|
acceptanceCriteria,
|
|
131
|
+
sourceFile,
|
|
132
132
|
});
|
|
133
133
|
}
|
|
134
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story-parsing.js","sourceRoot":"","sources":["../../src/transition/story-parsing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"story-parsing.js","sourceRoot":"","sources":["../../src/transition/story-parsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { extractFirstMatchingSection } from "./context.js";
|
|
2
|
-
|
|
3
|
-
/^##\s+Tech Stack/m,
|
|
4
|
-
/^##\s+Technology Stack/m,
|
|
5
|
-
/^##\s+Stack/m,
|
|
6
|
-
/^##\s+Core Architectural Decisions/m,
|
|
7
|
-
/^##\s+Starter Template Evaluation/m,
|
|
8
|
-
];
|
|
2
|
+
import { TECH_STACK_SOURCE_SECTION_PATTERNS } from "./section-patterns.js";
|
|
9
3
|
export function extractTechStackSource(content) {
|
|
10
4
|
return extractFirstMatchingSection(content, TECH_STACK_SOURCE_SECTION_PATTERNS, Number.POSITIVE_INFINITY).trim();
|
|
11
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/transition/tech-stack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/transition/tech-stack.ts"],"names":[],"mappings":"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"}
|