bmad-visio 0.1.0

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.
@@ -0,0 +1,608 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { unified } from "unified";
4
+ import remarkParse from "remark-parse";
5
+ import remarkGfm from "remark-gfm";
6
+ import { toString } from "mdast-util-to-string";
7
+ // ─── Helpers ────────────────────────────────────────────────────────
8
+ function parseMarkdown(content) {
9
+ return unified().use(remarkParse).use(remarkGfm).parse(content);
10
+ }
11
+ function findMarkdownFiles(dir) {
12
+ if (!fs.existsSync(dir))
13
+ return [];
14
+ const results = [];
15
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
16
+ const full = path.join(dir, entry.name);
17
+ if (entry.isDirectory())
18
+ results.push(...findMarkdownFiles(full));
19
+ else if (entry.name.endsWith(".md"))
20
+ results.push(full);
21
+ }
22
+ return results;
23
+ }
24
+ function normalizeContent(content) {
25
+ return content.replace(/\r\n/g, "\n");
26
+ }
27
+ function extractMetadata(nodes) {
28
+ const meta = {};
29
+ for (const node of nodes) {
30
+ if (node.type !== "paragraph")
31
+ continue;
32
+ const text = toString(node);
33
+ for (const line of text.split("\n")) {
34
+ // Match both "**Key:** Value" and "Key: Value"
35
+ const m = line.match(/^\s*\**([^*:]+?)\**:\s*(.+)/);
36
+ if (m)
37
+ meta[m[1].trim()] = m[2].trim();
38
+ }
39
+ }
40
+ return meta;
41
+ }
42
+ function splitByHeading(nodes, level) {
43
+ const sections = [];
44
+ let current = null;
45
+ for (const node of nodes) {
46
+ if (node.type === "heading" && node.depth === level) {
47
+ if (current)
48
+ sections.push(current);
49
+ current = { heading: toString(node), children: [] };
50
+ }
51
+ else if (current) {
52
+ current.children.push(node);
53
+ }
54
+ }
55
+ if (current)
56
+ sections.push(current);
57
+ return sections;
58
+ }
59
+ function extractUserStoryText(nodes) {
60
+ const lines = [];
61
+ for (const node of nodes) {
62
+ if (node.type !== "paragraph")
63
+ continue;
64
+ const text = toString(node);
65
+ if (text.includes("As a") || text.includes("I want to") || text.includes("So that")) {
66
+ lines.push(text);
67
+ }
68
+ }
69
+ return lines.join("\n").trim();
70
+ }
71
+ // ─── Status mapping ─────────────────────────────────────────────────
72
+ // BMAD: backlog, ready-for-dev → todo | in-progress → active | review → review | done → done
73
+ export const BOARD_COLUMNS = ["todo", "active", "review", "done"];
74
+ function parseStatus(raw) {
75
+ const lower = raw.toLowerCase();
76
+ if (lower.includes("done") || lower.includes("✅"))
77
+ return "done";
78
+ if (lower.includes("review"))
79
+ return "review";
80
+ if (lower.includes("in-progress") || lower.includes("in progress") || lower.includes("active") || lower.includes("🔄"))
81
+ return "active";
82
+ return "todo";
83
+ }
84
+ function statusToMarkdown(status) {
85
+ switch (status) {
86
+ case "done": return "done";
87
+ case "review": return "review";
88
+ case "active": return "in-progress";
89
+ case "todo":
90
+ default: return "ready-for-dev";
91
+ }
92
+ }
93
+ // ─── AC extraction ──────────────────────────────────────────────────
94
+ /** Extract GFM checkbox items (old BMAD format) */
95
+ function extractCheckboxes(nodes) {
96
+ const criteria = [];
97
+ let idx = 1;
98
+ for (const node of nodes) {
99
+ if (node.type === "list") {
100
+ for (const item of node.children) {
101
+ const li = item;
102
+ if (li.checked === null || li.checked === undefined)
103
+ continue;
104
+ let text = toString(li).trim().replace(/^\[[ xX]\]\s*/i, "").replace(/\s*-\s*DONE\s*$/i, "").trim();
105
+ if (!text)
106
+ continue;
107
+ criteria.push({ id: `AC-${idx++}`, description: text, done: li.checked === true });
108
+ }
109
+ }
110
+ }
111
+ return criteria;
112
+ }
113
+ /** Extract numbered paragraph-style ACs (new BMAD format: "1. **Given** ...") */
114
+ function extractNumberedAC(nodes) {
115
+ const criteria = [];
116
+ let idx = 1;
117
+ for (const node of nodes) {
118
+ if (node.type === "list" && node.ordered) {
119
+ for (const item of node.children) {
120
+ const text = toString(item).trim();
121
+ if (text) {
122
+ criteria.push({ id: `AC-${idx++}`, description: text, done: false });
123
+ }
124
+ }
125
+ }
126
+ }
127
+ return criteria;
128
+ }
129
+ /** Extract task checkboxes from ## Tasks / Subtasks */
130
+ function extractTasks(nodes) {
131
+ const tasks = [];
132
+ let idx = 1;
133
+ for (const node of nodes) {
134
+ if (node.type !== "list")
135
+ continue;
136
+ for (const item of node.children) {
137
+ const li = item;
138
+ if (li.checked === null || li.checked === undefined)
139
+ continue;
140
+ // Get only the first line of text (task description), not subtasks
141
+ const firstChild = li.children[0];
142
+ const text = firstChild ? toString(firstChild).trim().replace(/^\[[ xX]\]\s*/i, "") : "";
143
+ if (!text)
144
+ continue;
145
+ // Check for nested list (subtasks)
146
+ const subtasks = [];
147
+ let subIdx = 1;
148
+ for (const child of li.children) {
149
+ if (child.type === "list") {
150
+ for (const subItem of child.children) {
151
+ const subLi = subItem;
152
+ const subText = toString(subLi).trim().replace(/^\[[ xX]\]\s*/i, "");
153
+ if (subText) {
154
+ subtasks.push({ id: `T${idx}.${subIdx++}`, description: subText, done: subLi.checked === true });
155
+ }
156
+ }
157
+ }
158
+ }
159
+ tasks.push({ id: `T${idx++}`, description: text, done: li.checked === true, subtasks: subtasks.length > 0 ? subtasks : undefined });
160
+ }
161
+ }
162
+ return tasks;
163
+ }
164
+ function extractNodesAfterLabel(nodes, label) {
165
+ const lowerLabel = label.toLowerCase();
166
+ let capturing = false;
167
+ const result = [];
168
+ for (const node of nodes) {
169
+ if (node.type === "paragraph") {
170
+ const text = toString(node).trim();
171
+ if (text.toLowerCase().includes(lowerLabel)) {
172
+ capturing = true;
173
+ continue;
174
+ }
175
+ if (capturing && text.endsWith(":") && text.length < 80)
176
+ break;
177
+ }
178
+ if (capturing)
179
+ result.push(node);
180
+ }
181
+ return result;
182
+ }
183
+ // ─── New BMAD story parser ──────────────────────────────────────────
184
+ // Files like: 1-1-user-registration.md
185
+ // Status is plain: "Status: ready-for-dev"
186
+ // AC are numbered paragraphs, Tasks are checkboxes
187
+ function parseNewStoryFile(content, filePath) {
188
+ const tree = parseMarkdown(normalizeContent(content));
189
+ const nodes = tree.children;
190
+ const h1 = nodes.find((n) => n.type === "heading" && n.depth === 1);
191
+ if (!h1)
192
+ return null;
193
+ const titleText = toString(h1);
194
+ const titleMatch = titleText.match(/^Story\s+([\d.]+):\s*(.+)/i);
195
+ if (!titleMatch)
196
+ return null;
197
+ // Status is plain text: "Status: ready-for-dev"
198
+ let status = "todo";
199
+ for (const node of nodes) {
200
+ if (node.type !== "paragraph")
201
+ continue;
202
+ const text = toString(node);
203
+ const statusMatch = text.match(/^Status:\s*(.+)/i);
204
+ if (statusMatch) {
205
+ status = parseStatus(statusMatch[1]);
206
+ break;
207
+ }
208
+ }
209
+ const sections = splitByHeading(nodes, 2);
210
+ // User story text (## Story)
211
+ const storySection = sections.find((s) => s.heading.toLowerCase() === "story" || s.heading.toLowerCase().includes("user story"));
212
+ const description = storySection ? extractUserStoryText(storySection.children) : "";
213
+ // Acceptance criteria
214
+ const acSection = sections.find((s) => s.heading.toLowerCase().includes("acceptance criteria"));
215
+ let acceptanceCriteria = [];
216
+ if (acSection) {
217
+ // Try numbered AC first (new format), fall back to checkboxes (old format)
218
+ acceptanceCriteria = extractNumberedAC(acSection.children);
219
+ if (acceptanceCriteria.length === 0) {
220
+ const subSections = splitByHeading(acSection.children, 3);
221
+ if (subSections.length > 0) {
222
+ for (const sub of subSections)
223
+ acceptanceCriteria.push(...extractCheckboxes(sub.children));
224
+ }
225
+ else {
226
+ acceptanceCriteria = extractCheckboxes(acSection.children);
227
+ }
228
+ }
229
+ }
230
+ // Tasks
231
+ const taskSection = sections.find((s) => s.heading.toLowerCase().includes("task"));
232
+ const tasks = taskSection ? extractTasks(taskSection.children) : [];
233
+ const meta = extractMetadata(nodes);
234
+ return {
235
+ id: titleMatch[1],
236
+ title: titleMatch[2].trim(),
237
+ description,
238
+ acceptanceCriteria,
239
+ tasks,
240
+ status,
241
+ priority: meta["Priority"],
242
+ epicRef: meta["Epic"],
243
+ sourceFile: filePath,
244
+ };
245
+ }
246
+ // ─── Old BMAD story parser ──────────────────────────────────────────
247
+ // Backward compat with the Portalyr-style files
248
+ function parseOldStoryFile(content, filePath) {
249
+ const tree = parseMarkdown(normalizeContent(content));
250
+ const nodes = tree.children;
251
+ const h1 = nodes.find((n) => n.type === "heading" && n.depth === 1);
252
+ if (!h1)
253
+ return null;
254
+ const titleText = toString(h1);
255
+ const titleMatch = titleText.match(/^Story\s+([\d.]+):\s*(.+)/i);
256
+ if (!titleMatch)
257
+ return null;
258
+ const meta = extractMetadata(nodes);
259
+ const sections = splitByHeading(nodes, 2);
260
+ const userStorySection = sections.find((s) => s.heading.toLowerCase().includes("user story") || s.heading.toLowerCase() === "story");
261
+ const description = userStorySection ? extractUserStoryText(userStorySection.children) : "";
262
+ const acSection = sections.find((s) => s.heading.toLowerCase().includes("acceptance criteria"));
263
+ let acceptanceCriteria = [];
264
+ if (acSection) {
265
+ const subSections = splitByHeading(acSection.children, 3);
266
+ if (subSections.length > 0) {
267
+ for (const sub of subSections)
268
+ acceptanceCriteria.push(...extractCheckboxes(sub.children));
269
+ }
270
+ else {
271
+ acceptanceCriteria = extractCheckboxes(acSection.children);
272
+ }
273
+ }
274
+ return {
275
+ id: titleMatch[1],
276
+ title: titleMatch[2].trim(),
277
+ description,
278
+ acceptanceCriteria,
279
+ tasks: [],
280
+ status: parseStatus(meta["Status"] ?? ""),
281
+ priority: meta["Priority"],
282
+ epicRef: meta["Epic"],
283
+ sourceFile: filePath,
284
+ };
285
+ }
286
+ function parseStoryFile(content, filePath) {
287
+ // Detect format: new BMAD has plain "Status: xxx", old has "**Status:** xxx"
288
+ const hasPlainStatus = /^Status:\s/m.test(content);
289
+ if (hasPlainStatus)
290
+ return parseNewStoryFile(content, filePath);
291
+ return parseOldStoryFile(content, filePath);
292
+ }
293
+ // ─── Epic parsers ───────────────────────────────────────────────────
294
+ /** New BMAD: single epics.md with ## Epic N: and ### Story X.Y: */
295
+ function parseEpicsFile(content, filePath) {
296
+ const tree = parseMarkdown(normalizeContent(content));
297
+ const h2Sections = splitByHeading(tree.children, 2);
298
+ const epics = [];
299
+ for (const section of h2Sections) {
300
+ const epicMatch = section.heading.match(/^Epic\s+(\d+):\s*(.+)/i);
301
+ if (!epicMatch)
302
+ continue;
303
+ const epicNum = epicMatch[1];
304
+ const epicId = `EPIC-${epicNum.padStart(2, "0")}`;
305
+ const description = section.children
306
+ .filter((n) => n.type === "paragraph")
307
+ .map((n) => toString(n))
308
+ .filter((t) => !t.includes("As a") && !t.includes("I want to") && !t.includes("Acceptance Criteria"))
309
+ .slice(0, 1)
310
+ .join("\n")
311
+ .trim();
312
+ const h3Sections = splitByHeading(section.children, 3);
313
+ const stories = [];
314
+ for (const ss of h3Sections) {
315
+ const storyMatch = ss.heading.match(/^Story\s+([\d.]+):\s*(.+)/i);
316
+ if (!storyMatch)
317
+ continue;
318
+ const storyDesc = extractUserStoryText(ss.children);
319
+ const storyMeta = extractMetadata(ss.children);
320
+ const acNodes = extractNodesAfterLabel(ss.children, "acceptance criteria");
321
+ let ac = [];
322
+ if (acNodes.length > 0) {
323
+ ac = extractNumberedAC(acNodes);
324
+ if (ac.length === 0)
325
+ ac = extractCheckboxes(acNodes);
326
+ }
327
+ stories.push({
328
+ id: storyMatch[1],
329
+ title: storyMatch[2].trim(),
330
+ description: storyDesc,
331
+ acceptanceCriteria: ac,
332
+ tasks: [],
333
+ status: parseStatus(storyMeta["Status"] ?? ""),
334
+ priority: storyMeta["Priority"],
335
+ sourceFile: filePath,
336
+ });
337
+ }
338
+ epics.push({ id: epicId, title: epicMatch[2].trim(), description, stories });
339
+ }
340
+ return epics;
341
+ }
342
+ /** Old BMAD: separate epic files with # Epic N: */
343
+ function parseOldEpicFile(content, filePath) {
344
+ const tree = parseMarkdown(normalizeContent(content));
345
+ const nodes = tree.children;
346
+ const h1 = nodes.find((n) => n.type === "heading" && n.depth === 1);
347
+ if (!h1)
348
+ return null;
349
+ const titleText = toString(h1);
350
+ const epicMatch = titleText.match(/^Epic\s+(\d+):\s*(.+)/i);
351
+ if (!epicMatch)
352
+ return null;
353
+ const meta = extractMetadata(nodes);
354
+ const h2Sections = splitByHeading(nodes, 2);
355
+ const summarySection = h2Sections.find((s) => s.heading.toLowerCase().includes("epic summary"));
356
+ const description = summarySection
357
+ ? summarySection.children.filter((n) => n.type === "paragraph").map((n) => toString(n)).join("\n").trim()
358
+ : "";
359
+ const storiesSection = h2Sections.find((s) => s.heading.toLowerCase().includes("user stories"));
360
+ const inlineStories = [];
361
+ if (storiesSection) {
362
+ const h3Sections = splitByHeading(storiesSection.children, 3);
363
+ for (const ss of h3Sections) {
364
+ const storyMatch = ss.heading.match(/^Story\s+([\d.]+):\s*(.+)/i);
365
+ if (!storyMatch)
366
+ continue;
367
+ const storyMeta = extractMetadata(ss.children);
368
+ const storyDesc = extractUserStoryText(ss.children);
369
+ const acNodes = extractNodesAfterLabel(ss.children, "acceptance criteria");
370
+ const ac = extractCheckboxes(acNodes.length > 0 ? acNodes : ss.children);
371
+ inlineStories.push({
372
+ id: storyMatch[1], title: storyMatch[2].trim(), description: storyDesc,
373
+ acceptanceCriteria: ac, tasks: [], status: parseStatus(storyMeta["Status"] ?? ""),
374
+ priority: storyMeta["Priority"], sourceFile: filePath,
375
+ });
376
+ }
377
+ }
378
+ return {
379
+ id: meta["Epic ID"] ?? `EPIC-${epicMatch[1].padStart(2, "0")}`,
380
+ title: epicMatch[2].trim(), description, stories: inlineStories,
381
+ };
382
+ }
383
+ function detectStructure(dir) {
384
+ if (fs.existsSync(path.join(dir, "_bmad-output", "planning-artifacts")))
385
+ return "bmad-new";
386
+ if (fs.existsSync(path.join(dir, "docs", "sprint-artifacts")))
387
+ return "bmad-old";
388
+ return "flat";
389
+ }
390
+ export function parseBmadProject(opts) {
391
+ const { dir } = opts;
392
+ const mode = opts.mode === "auto" || !opts.mode ? detectStructure(dir) : opts.mode;
393
+ const raw = {};
394
+ const epics = [];
395
+ const standaloneStories = [];
396
+ if (mode === "bmad-new") {
397
+ const planDir = path.join(dir, "_bmad-output", "planning-artifacts");
398
+ const implDir = path.join(dir, "_bmad-output", "implementation-artifacts");
399
+ // Parse epics.md (single file with all epics)
400
+ const epicsFile = path.join(planDir, "epics.md");
401
+ if (fs.existsSync(epicsFile)) {
402
+ const content = fs.readFileSync(epicsFile, "utf-8");
403
+ raw[path.relative(dir, epicsFile)] = content;
404
+ epics.push(...parseEpicsFile(content, epicsFile));
405
+ }
406
+ // Parse standalone story files
407
+ for (const file of findMarkdownFiles(implDir)) {
408
+ const content = fs.readFileSync(file, "utf-8");
409
+ raw[path.relative(dir, file)] = content;
410
+ const story = parseStoryFile(content, file);
411
+ if (story)
412
+ standaloneStories.push(story);
413
+ }
414
+ }
415
+ else if (mode === "bmad-old") {
416
+ const sprintDir = path.join(dir, "docs", "sprint-artifacts");
417
+ for (const file of findMarkdownFiles(path.join(sprintDir, "epics"))) {
418
+ const content = fs.readFileSync(file, "utf-8");
419
+ raw[path.relative(dir, file)] = content;
420
+ const epic = parseOldEpicFile(content, file);
421
+ if (epic)
422
+ epics.push(epic);
423
+ }
424
+ for (const file of findMarkdownFiles(path.join(sprintDir, "stories"))) {
425
+ const content = fs.readFileSync(file, "utf-8");
426
+ raw[path.relative(dir, file)] = content;
427
+ const story = parseStoryFile(content, file);
428
+ if (story)
429
+ standaloneStories.push(story);
430
+ }
431
+ }
432
+ else {
433
+ for (const file of findMarkdownFiles(dir)) {
434
+ const content = fs.readFileSync(file, "utf-8");
435
+ raw[path.relative(dir, file)] = content;
436
+ // Try as epic file first
437
+ const parsedEpics = parseEpicsFile(content, file);
438
+ if (parsedEpics.length > 0) {
439
+ epics.push(...parsedEpics);
440
+ continue;
441
+ }
442
+ const epic = parseOldEpicFile(content, file);
443
+ if (epic) {
444
+ epics.push(epic);
445
+ continue;
446
+ }
447
+ const story = parseStoryFile(content, file);
448
+ if (story)
449
+ standaloneStories.push(story);
450
+ }
451
+ }
452
+ // Merge standalone stories into parent epics
453
+ for (const story of standaloneStories) {
454
+ const epicNum = story.id.split(".")[0];
455
+ const parentEpic = epics.find((e) => {
456
+ const eNum = e.id.replace(/\D/g, "").replace(/^0+/, "");
457
+ return eNum === epicNum;
458
+ });
459
+ if (parentEpic) {
460
+ const existingIdx = parentEpic.stories.findIndex((s) => s.id === story.id);
461
+ if (existingIdx >= 0) {
462
+ const existing = parentEpic.stories[existingIdx];
463
+ if (!story.status || story.status === "todo")
464
+ story.status = existing.status;
465
+ parentEpic.stories[existingIdx] = story;
466
+ }
467
+ else {
468
+ parentEpic.stories.push(story);
469
+ }
470
+ }
471
+ }
472
+ for (const epic of epics) {
473
+ epic.stories.sort((a, b) => {
474
+ const aParts = a.id.split(".").map(Number);
475
+ const bParts = b.id.split(".").map(Number);
476
+ for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
477
+ const diff = (aParts[i] ?? 0) - (bParts[i] ?? 0);
478
+ if (diff !== 0)
479
+ return diff;
480
+ }
481
+ return 0;
482
+ });
483
+ }
484
+ return { name: path.basename(path.resolve(dir)), epics, raw };
485
+ }
486
+ // ─── Write-back: status ─────────────────────────────────────────────
487
+ export function updateStoryStatus(project, epicId, storyId, newStatus) {
488
+ const epic = project.epics.find((e) => e.id === epicId);
489
+ if (!epic)
490
+ return { ok: false, error: "Epic not found" };
491
+ const story = epic.stories.find((s) => s.id === storyId);
492
+ if (!story)
493
+ return { ok: false, error: "Story not found" };
494
+ const filePath = story.sourceFile;
495
+ if (!filePath || !fs.existsSync(filePath))
496
+ return { ok: false, error: "Source file not found" };
497
+ let content = fs.readFileSync(filePath, "utf-8");
498
+ const hasWindows = content.includes("\r\n");
499
+ const norm = content.replace(/\r\n/g, "\n");
500
+ const mdStatus = statusToMarkdown(newStatus);
501
+ let updated;
502
+ // Try plain "Status: xxx" (new format)
503
+ if (/^Status:\s/m.test(norm)) {
504
+ updated = norm.replace(/^(Status:\s*)[^\n]*$/m, `$1${mdStatus}`);
505
+ }
506
+ else if (/^\*\*Status:\*\*/m.test(norm)) {
507
+ updated = norm.replace(/^(\*\*Status:\*\*\s*)[^\n]*$/m, `$1${mdStatus}`);
508
+ }
509
+ else {
510
+ // Insert status line after H1
511
+ const lines = norm.split("\n");
512
+ const h1Idx = lines.findIndex((l) => /^#\s+Story/i.test(l));
513
+ if (h1Idx >= 0) {
514
+ lines.splice(h1Idx + 1, 0, "", `Status: ${mdStatus}`);
515
+ updated = lines.join("\n");
516
+ }
517
+ else {
518
+ updated = norm;
519
+ }
520
+ }
521
+ fs.writeFileSync(filePath, hasWindows ? updated.replace(/\n/g, "\r\n") : updated, "utf-8");
522
+ story.status = newStatus;
523
+ return { ok: true };
524
+ }
525
+ // ─── Write-back: toggle AC ──────────────────────────────────────────
526
+ export function toggleAcceptanceCriteria(project, epicId, storyId, acIndex, done) {
527
+ const epic = project.epics.find((e) => e.id === epicId);
528
+ if (!epic)
529
+ return { ok: false, error: "Epic not found" };
530
+ const story = epic.stories.find((s) => s.id === storyId);
531
+ if (!story)
532
+ return { ok: false, error: "Story not found" };
533
+ const ac = story.acceptanceCriteria.find((a) => a.id === `AC-${acIndex}`);
534
+ if (!ac)
535
+ return { ok: false, error: `AC-${acIndex} not found` };
536
+ const filePath = story.sourceFile;
537
+ if (!filePath || !fs.existsSync(filePath))
538
+ return { ok: false, error: "Source file not found" };
539
+ let content = fs.readFileSync(filePath, "utf-8");
540
+ const hasWindows = content.includes("\r\n");
541
+ const norm = content.replace(/\r\n/g, "\n");
542
+ const lines = norm.split("\n");
543
+ const checkboxRe = /^(\s*-\s*)\[([ xX])\](.*)$/;
544
+ let count = 0;
545
+ for (let i = 0; i < lines.length; i++) {
546
+ const m = lines[i].match(checkboxRe);
547
+ if (m) {
548
+ count++;
549
+ if (count === acIndex) {
550
+ lines[i] = m[1] + "[" + (done ? "x" : " ") + "]" + m[3];
551
+ const updated = lines.join(hasWindows ? "\r\n" : "\n");
552
+ fs.writeFileSync(filePath, updated, "utf-8");
553
+ ac.done = done;
554
+ return { ok: true };
555
+ }
556
+ }
557
+ }
558
+ return { ok: false, error: "Checkbox not found in file" };
559
+ }
560
+ // ─── Write-back: toggle Task ────────────────────────────────────────
561
+ export function toggleTask(project, epicId, storyId, taskId, done) {
562
+ const epic = project.epics.find((e) => e.id === epicId);
563
+ if (!epic)
564
+ return { ok: false, error: "Epic not found" };
565
+ const story = epic.stories.find((s) => s.id === storyId);
566
+ if (!story)
567
+ return { ok: false, error: "Story not found" };
568
+ // Find task (might be a subtask like T1.2)
569
+ let task;
570
+ for (const t of story.tasks) {
571
+ if (t.id === taskId) {
572
+ task = t;
573
+ break;
574
+ }
575
+ if (t.subtasks) {
576
+ const sub = t.subtasks.find((s) => s.id === taskId);
577
+ if (sub) {
578
+ task = sub;
579
+ break;
580
+ }
581
+ }
582
+ }
583
+ if (!task)
584
+ return { ok: false, error: `Task ${taskId} not found` };
585
+ const filePath = story.sourceFile;
586
+ if (!filePath || !fs.existsSync(filePath))
587
+ return { ok: false, error: "Source file not found" };
588
+ // Find the Nth checkbox that matches this task's description
589
+ let content = fs.readFileSync(filePath, "utf-8");
590
+ const hasWindows = content.includes("\r\n");
591
+ const norm = content.replace(/\r\n/g, "\n");
592
+ const lines = norm.split("\n");
593
+ const checkboxRe = /^(\s*-\s*)\[([ xX])\](.*)$/;
594
+ // Match by description text since task IDs are generated
595
+ const descStart = task.description.slice(0, 40);
596
+ for (let i = 0; i < lines.length; i++) {
597
+ const m = lines[i].match(checkboxRe);
598
+ if (m && m[3].includes(descStart.slice(0, 20))) {
599
+ lines[i] = m[1] + "[" + (done ? "x" : " ") + "]" + m[3];
600
+ const updated = lines.join(hasWindows ? "\r\n" : "\n");
601
+ fs.writeFileSync(filePath, updated, "utf-8");
602
+ task.done = done;
603
+ return { ok: true };
604
+ }
605
+ }
606
+ return { ok: false, error: "Checkbox not found in file" };
607
+ }
608
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { BmadProject } from "../types/index.js";
2
+ export declare function createServer(project: BmadProject, port: number): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;