ai-spector 0.3.6 → 0.3.8

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 (87) hide show
  1. package/dist/cli.js +3 -24
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/analyze.d.ts +1 -1
  4. package/dist/commands/analyze.js +2 -2
  5. package/dist/commands/analyze.js.map +1 -1
  6. package/dist/commands/index.d.ts +0 -3
  7. package/dist/commands/index.d.ts.map +1 -1
  8. package/dist/commands/index.js +3 -49
  9. package/dist/commands/index.js.map +1 -1
  10. package/dist/commands/init.d.ts +2 -2
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +11 -16
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/prototype.d.ts.map +1 -1
  15. package/dist/commands/prototype.js +4 -1
  16. package/dist/commands/prototype.js.map +1 -1
  17. package/dist/comments/inbox.d.ts +0 -1
  18. package/dist/comments/inbox.d.ts.map +1 -1
  19. package/dist/comments/inbox.js +1 -2
  20. package/dist/comments/inbox.js.map +1 -1
  21. package/dist/graph/InMemoryGraph.d.ts +1 -1
  22. package/dist/graph/InMemoryGraph.d.ts.map +1 -1
  23. package/dist/graph/InMemoryGraph.js +4 -16
  24. package/dist/graph/InMemoryGraph.js.map +1 -1
  25. package/dist/graph/doc-extract.d.ts.map +1 -1
  26. package/dist/graph/doc-extract.js +130 -118
  27. package/dist/graph/doc-extract.js.map +1 -1
  28. package/dist/graph/impact.d.ts +5 -1
  29. package/dist/graph/impact.d.ts.map +1 -1
  30. package/dist/graph/impact.js +24 -14
  31. package/dist/graph/impact.js.map +1 -1
  32. package/dist/graph/knowledge.js +1 -1
  33. package/dist/graph/knowledge.js.map +1 -1
  34. package/dist/graph/layer-audit.d.ts.map +1 -1
  35. package/dist/graph/layer-audit.js +7 -4
  36. package/dist/graph/layer-audit.js.map +1 -1
  37. package/dist/graph/provenance.d.ts +0 -1
  38. package/dist/graph/provenance.d.ts.map +1 -1
  39. package/dist/graph/provenance.js +12 -49
  40. package/dist/graph/provenance.js.map +1 -1
  41. package/dist/graph/query.d.ts.map +1 -1
  42. package/dist/graph/query.js +3 -1
  43. package/dist/graph/query.js.map +1 -1
  44. package/dist/index/doc-semantics.js +1 -1
  45. package/dist/index/doc-semantics.js.map +1 -1
  46. package/dist/markdown/parse.d.ts +25 -0
  47. package/dist/markdown/parse.d.ts.map +1 -0
  48. package/dist/markdown/parse.js +100 -0
  49. package/dist/markdown/parse.js.map +1 -0
  50. package/dist/prototype/config.d.ts +2 -0
  51. package/dist/prototype/config.d.ts.map +1 -1
  52. package/dist/prototype/config.js +35 -6
  53. package/dist/prototype/config.js.map +1 -1
  54. package/dist/registry/build.d.ts.map +1 -1
  55. package/dist/registry/build.js +8 -11
  56. package/dist/registry/build.js.map +1 -1
  57. package/dist/types.d.ts +1 -1
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/util/gitignore.d.ts +1 -1
  60. package/dist/util/gitignore.d.ts.map +1 -1
  61. package/dist/util/gitignore.js +0 -4
  62. package/dist/util/gitignore.js.map +1 -1
  63. package/dist/visualize/html.d.ts.map +1 -1
  64. package/dist/visualize/html.js +491 -281
  65. package/dist/visualize/html.js.map +1 -1
  66. package/package.json +7 -2
  67. package/scaffold/.ai-spector/.docflow/config/prototype.config.json +1 -2
  68. package/scaffold/cursor/WORKFLOW.md +2 -2
  69. package/scaffold/cursor/commands/_workflow.md +3 -3
  70. package/scaffold/cursor/mcp.json +1 -15
  71. package/scaffold/cursor/skills/ai-spector/references/cli-failures.md +3 -32
  72. package/scaffold/cursor/skills/ai-spector/references/generate-graph.md +49 -70
  73. package/scaffold/cursor/skills/ai-spector/references/generate-workflow.md +1 -1
  74. package/scaffold/cursor/skills/ai-spector/references/graph.md +0 -1
  75. package/scaffold/cursor/skills/ai-spector-generate-prototype/SKILL.md +6 -5
  76. package/scaffold/cursor/skills/ai-spector-generate-prototype/references/runbook.md +30 -10
  77. package/scaffold/cursor/skills/ai-spector-generate-srs/references/runbook.md +1 -1
  78. package/scaffold/cursor/skills/ai-spector-graph/SKILL.md +3 -1
  79. package/scaffold/cursor/skills/ai-spector-graph/references/analyze.md +18 -44
  80. package/scaffold/cursor/skills/ai-spector-graph/references/graph-commands.md +1 -4
  81. package/scaffold/cursor/skills/ai-spector-graph/references/index.md +6 -14
  82. package/scaffold/cursor/skills/ai-spector-graph/references/summary.md +1 -1
  83. package/scaffold/docs/data-source/README.md +20 -9
  84. package/scaffold/prototype/README.md +4 -2
  85. package/schemas/rules.impact.json +7 -4
  86. package/schemas/schema.graph.json +1 -0
  87. package/scaffold/.ai-spector/.docflow/config/analyze.graphify.json +0 -53
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryGraph.d.ts","sourceRoot":"","sources":["../../src/graph/InMemoryGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5F,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,yBAAgC;IAClD,QAAQ,CAAC,QAAQ,2BAAkC;IACnD,QAAQ,CAAC,OAAO,2BAAkC;IAElD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa;IAiBnD,MAAM,IAAI,iBAAiB;IAQ3B,uEAAuE;IACvE,mBAAmB,IAAI,iBAAiB;IAmBxC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAS9B,6EAA6E;IAC7E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS;IAelD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIhC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAYjC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAU9B,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAczC,SAAS,CACP,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,EAChC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,KAAK,SAAI,GACR,GAAG,CAAC,MAAM,CAAC;IAsCd,iBAAiB,IAAI,eAAe,EAAE;CA2EvC"}
1
+ {"version":3,"file":"InMemoryGraph.d.ts","sourceRoot":"","sources":["../../src/graph/InMemoryGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5F,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,yBAAgC;IAClD,QAAQ,CAAC,QAAQ,2BAAkC;IACnD,QAAQ,CAAC,OAAO,2BAAkC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa;IAiBnD,uEAAuE;IACvE,mBAAmB,IAAI,iBAAiB;IAmBxC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAS9B,6EAA6E;IAC7E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS;IAelD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIhC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAIjC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAW9B,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAczC,SAAS,CACP,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,EAChC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,KAAK,SAAI,GACR,GAAG,CAAC,MAAM,CAAC;IAsCd,iBAAiB,IAAI,eAAe,EAAE;CA4EvC"}
@@ -3,6 +3,7 @@ export class InMemoryGraph {
3
3
  nodesById = new Map();
4
4
  outEdges = new Map();
5
5
  inEdges = new Map();
6
+ edgeKeys = new Set();
6
7
  static from(data) {
7
8
  const g = new InMemoryGraph();
8
9
  for (const node of data.nodes) {
@@ -19,13 +20,6 @@ export class InMemoryGraph {
19
20
  }
20
21
  return g;
21
22
  }
22
- toJSON() {
23
- return {
24
- version: 1,
25
- nodes: [...this.nodesById.values()],
26
- edges: [...this.outEdges.values(), ...this.inEdges.values()].flat(),
27
- };
28
- }
29
23
  /** Dedupe edges when exporting (each edge stored once in outEdges). */
30
24
  toTraceabilityGraph() {
31
25
  const edgeSet = new Set();
@@ -70,17 +64,10 @@ export class InMemoryGraph {
70
64
  return `${edge.type}|${edge.from}|${edge.to}|${edge.role ?? ""}`;
71
65
  }
72
66
  hasEdge(edge) {
73
- const key = this.edgeKey(edge);
74
- for (const list of this.outEdges.values()) {
75
- for (const e of list) {
76
- if (this.edgeKey(e) === key) {
77
- return true;
78
- }
79
- }
80
- }
81
- return false;
67
+ return this.edgeKeys.has(this.edgeKey(edge));
82
68
  }
83
69
  addEdge(edge) {
70
+ this.edgeKeys.add(this.edgeKey(edge));
84
71
  this.outEdges.get(edge.from).push(edge);
85
72
  const inbound = this.inEdges.get(edge.to);
86
73
  if (inbound) {
@@ -147,6 +134,7 @@ export class InMemoryGraph {
147
134
  "useCase",
148
135
  "feature",
149
136
  "requirement",
137
+ "nfr",
150
138
  "dataEntity",
151
139
  ]);
152
140
  for (const node of this.nodesById.values()) {
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryGraph.js","sourceRoot":"","sources":["../../src/graph/InMemoryGraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InMemoryGraph.js","sourceRoot":"","sources":["../../src/graph/InMemoryGraph.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doc-extract.d.ts","sourceRoot":"","sources":["../../src/graph/doc-extract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doc-extract.d.ts","sourceRoot":"","sources":["../../src/graph/doc-extract.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import { basicDesignListChapterDocumentId, basicDesignListChapterFileToPatch, de
2
2
  import { BASIC_DESIGN_LIST_DOCUMENT_IDS, DEFAULT_BD_LIST_DOC, DEFAULT_LISTED_IN, PER_DOMAIN_TEMPLATE_DOC_BD, } from "./defaults.js";
3
3
  import { scanBasicDesignListDocuments } from "../registry/build.js";
4
4
  import { mergeStructurePatches, registryDocumentToStructurePatch, } from "../registry/structure-patch.js";
5
+ import { extractBlockquoteAfterBoldField, extractBoldFieldDeep, extractBoldFieldInParagraph, findHeadingText, parseMarkdown, textContent, } from "../markdown/parse.js";
6
+ import { visit } from "unist-util-visit";
5
7
  /** Registry template ids for per-domain SRS detail (see documents.json). */
6
8
  export const PER_DOMAIN_TEMPLATE_DOC = {
7
9
  useCase: "doc.srs.uc-detail",
@@ -9,16 +11,8 @@ export const PER_DOMAIN_TEMPLATE_DOC = {
9
11
  };
10
12
  const UC_ID_RE = /\b(UC-\d+)\b/gi;
11
13
  const F_ID_RE = /\b(F-\d+)\b/gi;
12
- const USE_CASE_ID_LINE = /\*\*Use Case ID:\*\*\s*(UC-\d+)/i;
13
- const USE_CASE_NAME_LINE = /\*\*Use Case Name:\*\*\s*(.+)/i;
14
- const FEATURE_ID_LINE = /\*\*Feature ID:\*\*\s*(F-\d+)/i;
15
- const FEATURE_NAME_HEADING = /^#{1,3}\s+(F-\d+)\s*[:\-–—]\s*(.+)$/im;
16
- const UC_HEADING = /^#{1,3}\s+(UC-\d+)\s*[:\-–—]\s*(.+)$/im;
17
14
  const TABLE_ROW_UC = /^\|\s*(UC-\d+)\s*\|/im;
18
15
  const TABLE_ROW_F = /^\|\s*(F-\d+)\s*\|/im;
19
- const BRIEF_DESCRIPTION_BLOCK = /\*\*Brief Description:\*\*\s*\n+>\s*([^\n]+(?:\n>[^\n]+)*)/i;
20
- const FEATURE_PURPOSE_BLOCK = /\*\*(?:Feature Purpose|Purpose):\*\*\s*\n+>\s*([^\n]+(?:\n>[^\n]+)*)/i;
21
- const PRIORITY_LINE = /\*\*Priority:\*\*\s*(High|Medium|Low)/i;
22
16
  const OVERVIEW_HEADING = /use case overview/i;
23
17
  const FEATURE_DESC_HEADING = /^1\.\s*description$/i;
24
18
  /** Normalize UC-1 → UC-01, F-2 → F-02; leaves placeholders (UC-XX) unchanged */
@@ -113,9 +107,12 @@ export function extractBasicDesignDetailMeta(content, kind, relativePath) {
113
107
  featureIds.add(id);
114
108
  }
115
109
  }
116
- const idLine = content.match(FEATURE_ID_LINE);
117
- if (idLine?.[1] && isRealDomainId(idLine[1])) {
118
- featureIds.add(normalizeDomainId(idLine[1]));
110
+ const root = parseMarkdown(content);
111
+ const fIdVal = extractBoldFieldDeep(root, /^Feature ID$/i);
112
+ if (fIdVal) {
113
+ const m = fIdVal.match(/\b(F-\d+)\b/i);
114
+ if (m?.[1] && isRealDomainId(m[1]))
115
+ featureIds.add(normalizeDomainId(m[1]));
119
116
  }
120
117
  if (kind === "apiDetail") {
121
118
  const endpoint = content.match(ENDPOINT_SPEC_HEADING);
@@ -171,86 +168,83 @@ function buildBasicDesignDetailInstancePatch(opts) {
171
168
  return { version: 1, nodes, edges };
172
169
  }
173
170
  function primaryDomainIdFromDetailContent(content, kind) {
171
+ const root = parseMarkdown(content);
174
172
  if (kind === "useCaseDetail") {
175
- const idLine = content.match(USE_CASE_ID_LINE);
176
- if (idLine?.[1] && isRealDomainId(idLine[1])) {
177
- const nameLine = content.match(USE_CASE_NAME_LINE);
178
- return {
179
- id: normalizeDomainId(idLine[1]),
180
- title: nameLine?.[1]?.trim(),
181
- };
173
+ const idVal = extractBoldFieldDeep(root, /^Use Case ID$/i);
174
+ if (idVal) {
175
+ const m = idVal.match(/\b(UC-\d+)\b/i);
176
+ if (m?.[1] && isRealDomainId(m[1])) {
177
+ const nameVal = extractBoldFieldDeep(root, /^Use Case Name$/i);
178
+ return { id: normalizeDomainId(m[1]), title: nameVal?.trim() };
179
+ }
182
180
  }
183
- const heading = content.match(UC_HEADING);
184
- if (heading?.[1] && isRealDomainId(heading[1])) {
185
- return { id: normalizeDomainId(heading[1]), title: heading[2]?.trim() };
181
+ const hText = findHeadingText(root, /\bUC-\d+\b/);
182
+ if (hText) {
183
+ const hm = hText.match(/\b(UC-\d+)\b\s*[:\-–—]\s*(.+)$/i);
184
+ if (hm?.[1] && isRealDomainId(hm[1])) {
185
+ return { id: normalizeDomainId(hm[1]), title: hm[2]?.trim() };
186
+ }
186
187
  }
187
188
  return null;
188
189
  }
189
- const idLine = content.match(FEATURE_ID_LINE);
190
- if (idLine?.[1] && isRealDomainId(idLine[1])) {
191
- const heading = content.match(FEATURE_NAME_HEADING);
192
- return {
193
- id: normalizeDomainId(idLine[1]),
194
- title: heading?.[2]?.trim(),
195
- };
190
+ const idVal = extractBoldFieldDeep(root, /^Feature ID$/i);
191
+ if (idVal) {
192
+ const m = idVal.match(/\b(F-\d+)\b/i);
193
+ if (m?.[1] && isRealDomainId(m[1])) {
194
+ const hText = findHeadingText(root, /\bF-\d+\b/);
195
+ let title;
196
+ if (hText) {
197
+ const hm = hText.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
198
+ title = hm?.[2]?.trim();
199
+ }
200
+ return { id: normalizeDomainId(m[1]), title };
201
+ }
196
202
  }
197
- const heading = content.match(FEATURE_NAME_HEADING);
198
- if (heading?.[1] && isRealDomainId(heading[1])) {
199
- return { id: normalizeDomainId(heading[1]), title: heading[2]?.trim() };
203
+ const hText = findHeadingText(root, /\bF-\d+\b/);
204
+ if (hText) {
205
+ const hm = hText.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
206
+ if (hm?.[1] && isRealDomainId(hm[1])) {
207
+ return { id: normalizeDomainId(hm[1]), title: hm[2]?.trim() };
208
+ }
200
209
  }
201
210
  return null;
202
211
  }
203
- function cleanQuotedBlock(raw) {
204
- return raw
205
- .split(/\r?\n/)
206
- .map((l) => l.replace(/^\s*>\s?/, "").trim())
207
- .filter(Boolean)
208
- .join(" ")
209
- .replace(/\s+/g, " ")
210
- .trim();
211
- }
212
212
  /** Rich title/description from generated detail markdown (not list-table stubs). */
213
213
  export function extractDetailDomainMeta(content, kind) {
214
214
  const primary = primaryDomainIdFromDetailContent(content, kind);
215
- if (!primary) {
215
+ if (!primary)
216
216
  return null;
217
- }
217
+ const root = parseMarkdown(content);
218
218
  const meta = {};
219
- if (primary.title) {
219
+ if (primary.title)
220
220
  meta.title = primary.title;
221
- }
222
- const nameLine = content.match(USE_CASE_NAME_LINE);
223
- if (nameLine?.[1]?.trim()) {
224
- meta.title = nameLine[1].trim();
225
- }
221
+ const nameVal = extractBoldFieldDeep(root, /^Use Case Name$/i);
222
+ if (nameVal?.trim())
223
+ meta.title = nameVal.trim();
226
224
  if (kind === "useCaseDetail") {
227
- const brief = content.match(BRIEF_DESCRIPTION_BLOCK);
228
- if (brief?.[1]) {
229
- meta.description = cleanQuotedBlock(brief[1]);
230
- }
231
- const priority = content.match(PRIORITY_LINE);
232
- if (priority?.[1]) {
233
- meta.priority = priority[1];
225
+ const brief = extractBlockquoteAfterBoldField(root, /^Brief Description$/i);
226
+ if (brief)
227
+ meta.description = brief;
228
+ const priorityVal = extractBoldFieldDeep(root, /^Priority$/i);
229
+ if (priorityVal && /^(High|Medium|Low)$/i.test(priorityVal.trim())) {
230
+ meta.priority = priorityVal.trim();
234
231
  }
235
232
  if (!meta.description) {
236
233
  const sections = parseDetailSections(content, "doc.temp");
237
234
  const overview = sections.find((s) => OVERVIEW_HEADING.test(s.heading));
238
- if (overview) {
235
+ if (overview)
239
236
  meta.description = snippetAfterHeading(content, overview.heading);
240
- }
241
237
  }
242
238
  }
243
239
  else {
244
- const purpose = content.match(FEATURE_PURPOSE_BLOCK);
245
- if (purpose?.[1]) {
246
- meta.description = cleanQuotedBlock(purpose[1]);
247
- }
240
+ const purpose = extractBlockquoteAfterBoldField(root, /^(?:Feature Purpose|Purpose)$/i);
241
+ if (purpose)
242
+ meta.description = purpose;
248
243
  if (!meta.description) {
249
244
  const sections = parseDetailSections(content, "doc.temp");
250
245
  const descSec = sections.find((s) => FEATURE_DESC_HEADING.test(s.heading));
251
- if (descSec) {
246
+ if (descSec)
252
247
  meta.description = snippetAfterHeading(content, descSec.heading);
253
- }
254
248
  }
255
249
  }
256
250
  return meta;
@@ -333,37 +327,64 @@ function parseTableSatisfies(line, parsed) {
333
327
  }
334
328
  export function extractDomainFromMarkdown(content, relativePath) {
335
329
  const parsed = emptyParsed();
336
- const lines = content.split(/\r?\n/);
330
+ const root = parseMarkdown(content);
331
+ // --- 1. Headings: ## UC-01: Title, ## F-01: Title ---
332
+ for (const node of root.children) {
333
+ if (node.type !== "heading")
334
+ continue;
335
+ const text = textContent(node);
336
+ const ucm = text.match(/\b(UC-\d+)\b\s*[:\-–—]\s*(.+)$/i);
337
+ if (ucm?.[1] && isRealDomainId(ucm[1])) {
338
+ addUseCase(parsed, ucm[1], { title: ucm[2]?.trim() });
339
+ }
340
+ const fm = text.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
341
+ if (fm?.[1] && isRealDomainId(fm[1])) {
342
+ addFeature(parsed, fm[1], { title: fm[2]?.trim() });
343
+ }
344
+ }
345
+ // --- 2. Bold field patterns in paragraphs (AST-based) ---
337
346
  let pendingUcId;
338
- for (let i = 0; i < lines.length; i++) {
339
- const line = lines[i];
340
- const ucIdLine = line.match(USE_CASE_ID_LINE);
341
- if (ucIdLine) {
342
- pendingUcId = normalizeDomainId(ucIdLine[1]);
343
- addUseCase(parsed, pendingUcId, {});
347
+ for (const node of root.children) {
348
+ if (node.type === "heading" && pendingUcId) {
349
+ pendingUcId = undefined;
350
+ }
351
+ if (node.type !== "paragraph")
344
352
  continue;
353
+ const para = node;
354
+ const ucIdVal = extractBoldFieldInParagraph(para, /^Use Case ID$/i);
355
+ if (ucIdVal) {
356
+ const m = ucIdVal.match(/\b(UC-\d+)\b/i);
357
+ if (m?.[1] && isRealDomainId(m[1])) {
358
+ pendingUcId = normalizeDomainId(m[1]);
359
+ addUseCase(parsed, pendingUcId, {});
360
+ }
345
361
  }
346
362
  if (pendingUcId) {
347
- const nameLine = line.match(USE_CASE_NAME_LINE);
348
- if (nameLine) {
349
- addUseCase(parsed, pendingUcId, { title: nameLine[1] });
350
- pendingUcId = undefined;
351
- continue;
352
- }
353
- if (line.startsWith("### ") || line.startsWith("## ")) {
363
+ const nameVal = extractBoldFieldInParagraph(para, /^Use Case Name$/i);
364
+ if (nameVal) {
365
+ addUseCase(parsed, pendingUcId, { title: nameVal });
354
366
  pendingUcId = undefined;
355
367
  }
356
368
  }
357
- const ucHeading = line.match(UC_HEADING);
358
- if (ucHeading) {
359
- addUseCase(parsed, ucHeading[1], { title: ucHeading[2] });
369
+ const fIdVal = extractBoldFieldInParagraph(para, /^Feature ID$/i);
370
+ if (fIdVal) {
371
+ const m = fIdVal.match(/\b(F-\d+)\b/i);
372
+ if (m?.[1] && isRealDomainId(m[1]))
373
+ addFeature(parsed, m[1], {});
360
374
  }
361
- const fHeading = line.match(FEATURE_NAME_HEADING);
362
- if (fHeading) {
363
- addFeature(parsed, fHeading[1], { title: fHeading[2] });
375
+ }
376
+ // --- 3. Actor extraction from paragraphs and list items (AST-based) ---
377
+ visit(root, "paragraph", (para) => {
378
+ const actorVal = extractBoldFieldInParagraph(para, /^Primary Actor$/i);
379
+ if (actorVal && !/^tbd$/i.test(actorVal) && actorVal.length > 1) {
380
+ const id = `actor.${slugActorId(actorVal)}`;
381
+ parsed.actors.set(id, { title: actorVal });
364
382
  }
383
+ });
384
+ // --- 4. Table rows (line-based: handles GFM and non-GFM pipe tables) ---
385
+ for (const line of content.split(/\r?\n/)) {
365
386
  const ucRow = line.match(TABLE_ROW_UC);
366
- if (ucRow) {
387
+ if (ucRow?.[1]) {
367
388
  const cells = line.split("|").map((c) => c.trim());
368
389
  const title = cells[2] || cells[1];
369
390
  addUseCase(parsed, ucRow[1], {
@@ -371,7 +392,7 @@ export function extractDomainFromMarkdown(content, relativePath) {
371
392
  });
372
393
  }
373
394
  const fRow = line.match(TABLE_ROW_F);
374
- if (fRow) {
395
+ if (fRow?.[1]) {
375
396
  const cells = line.split("|").map((c) => c.trim());
376
397
  const title = cells[2] || cells[1];
377
398
  addFeature(parsed, fRow[1], {
@@ -383,16 +404,16 @@ export function extractDomainFromMarkdown(content, relativePath) {
383
404
  parseTableSatisfies(line, parsed);
384
405
  }
385
406
  }
407
+ // --- 5. Global catch-all scan (picks up any remaining UC/F references) ---
386
408
  for (const m of content.matchAll(UC_ID_RE)) {
387
- if (m[1] && isRealDomainId(m[1])) {
409
+ if (m[1] && isRealDomainId(m[1]))
388
410
  addUseCase(parsed, m[1], {});
389
- }
390
411
  }
391
412
  for (const m of content.matchAll(F_ID_RE)) {
392
- if (m[1] && isRealDomainId(m[1])) {
413
+ if (m[1] && isRealDomainId(m[1]))
393
414
  addFeature(parsed, m[1], {});
394
- }
395
415
  }
416
+ // --- 6. Rich metadata from SRS detail files ---
396
417
  const srsDetailKind = classifySrsDetailFile(relativePath);
397
418
  if (srsDetailKind) {
398
419
  const rich = extractDetailDomainMeta(content, srsDetailKind);
@@ -408,6 +429,7 @@ export function extractDomainFromMarkdown(content, relativePath) {
408
429
  }
409
430
  }
410
431
  }
432
+ // --- 7. Basic-design detail metadata ---
411
433
  const bdKind = classifyBasicDesignDetailFile(relativePath);
412
434
  if (bdKind) {
413
435
  const meta = extractBasicDesignDetailMeta(content, bdKind, relativePath);
@@ -417,26 +439,17 @@ export function extractDomainFromMarkdown(content, relativePath) {
417
439
  });
418
440
  }
419
441
  }
420
- const actorSection = /(?:\*\*Primary Actor:\*\*|Primary Actor:)\s*\*?\*?\s*([^\n*]+)/gi;
421
- for (const m of content.matchAll(actorSection)) {
422
- const name = m[1]?.trim();
423
- if (name && !/^tbd$/i.test(name) && name.length > 1) {
424
- const id = `actor.${slugActorId(name)}`;
425
- parsed.actors.set(id, { title: name });
426
- }
427
- }
428
442
  return parsed;
429
443
  }
430
- const SCREEN_PURPOSE_BLOCK = /##\s*1\.\s*Screen:[\s\S]*?\*\*Purpose:\*\*\s*\n+>\s*([^\n]+(?:\n>[^\n]+)*)/i;
431
444
  function extractBasicDesignDetailDescription(content, kind) {
432
445
  if (kind === "apiDetail") {
433
446
  const meta = extractDetailDomainMeta(content, "featureDetail");
434
447
  return meta?.description;
435
448
  }
436
- const purpose = content.match(SCREEN_PURPOSE_BLOCK);
437
- if (purpose?.[1]) {
438
- return cleanQuotedBlock(purpose[1]);
439
- }
449
+ const root = parseMarkdown(content);
450
+ const purpose = extractBlockquoteAfterBoldField(root, /^Purpose$/i);
451
+ if (purpose)
452
+ return purpose;
440
453
  const sections = parseDetailSections(content, "doc.temp");
441
454
  const screenHeading = sections.find((s) => /^##\s*1\.\s*screen/i.test(s.heading));
442
455
  if (screenHeading) {
@@ -538,13 +551,13 @@ function buildDetailInstancePatch(opts) {
538
551
  const sectionPatch = detailSectionsToPatch(opts.docId, sections, opts.content);
539
552
  nodes.push(...sectionPatch.nodes);
540
553
  edges.push(...sectionPatch.edges);
541
- for (const sec of sections) {
542
- edges.push({ type: "definedIn", from: opts.domainId, to: sec.id });
543
- edges.push({ type: "describedIn", from: opts.domainId, to: sec.id });
544
- }
545
- if (sections.length === 0) {
546
- edges.push({ type: "definedIn", from: opts.domainId, to: opts.docId });
547
- }
554
+ // Anchor to the primary (first) section only — one definedIn is enough for validation
555
+ // and avoids flooding the graph with edges to every section.
556
+ edges.push({
557
+ type: "definedIn",
558
+ from: opts.domainId,
559
+ to: sections[0]?.id ?? opts.docId,
560
+ });
548
561
  return { version: 1, nodes, edges };
549
562
  }
550
563
  function srsDetailFileToPatch(relativePath, content) {
@@ -708,7 +721,7 @@ export async function buildDocExtractPatch(entries, _projectRoot, options) {
708
721
  perFile.push(extractDomainFromMarkdown(e.content, e.relativePath));
709
722
  }
710
723
  const merged = mergeParsedDomains(perFile);
711
- const allNodes = [];
724
+ const allNodesMap = new Map();
712
725
  const allEdges = [];
713
726
  const edgeKeys = new Set();
714
727
  let detailDocuments = 0;
@@ -717,8 +730,9 @@ export async function buildDocExtractPatch(entries, _projectRoot, options) {
717
730
  let bdDetailDocuments = 0;
718
731
  const mergePatchInto = (patch) => {
719
732
  for (const n of patch.nodes) {
720
- if (!allNodes.some((x) => x.id === n.id && x.type === n.type)) {
721
- allNodes.push(n);
733
+ const existing = allNodesMap.get(n.id);
734
+ if (!existing) {
735
+ allNodesMap.set(n.id, n);
722
736
  if (n.type === "document" && n.output && !n.outputPattern) {
723
737
  const out = String(n.output).replace(/\\/g, "/");
724
738
  const isBdInstance = n.id.startsWith("doc.bd.api-") ||
@@ -742,8 +756,6 @@ export async function buildDocExtractPatch(entries, _projectRoot, options) {
742
756
  }
743
757
  }
744
758
  else {
745
- const idx = allNodes.findIndex((x) => x.id === n.id);
746
- const existing = allNodes[idx];
747
759
  const merged = { ...existing, ...n };
748
760
  if (!n.title && existing.title) {
749
761
  merged.title = existing.title;
@@ -751,10 +763,10 @@ export async function buildDocExtractPatch(entries, _projectRoot, options) {
751
763
  if (!n.description && existing.description) {
752
764
  merged.description = existing.description;
753
765
  }
754
- allNodes[idx] = merged;
755
- if (n.type === "document" && n.output && !existing.output) {
756
- allNodes[idx] = { ...allNodes[idx], output: n.output };
766
+ if (n.type === "document" && !n.output && existing.output) {
767
+ merged.output = existing.output;
757
768
  }
769
+ allNodesMap.set(n.id, merged);
758
770
  }
759
771
  }
760
772
  for (const edge of patch.edges) {
@@ -784,7 +796,7 @@ export async function buildDocExtractPatch(entries, _projectRoot, options) {
784
796
  }));
785
797
  }
786
798
  return {
787
- patch: { version: 1, nodes: allNodes, edges: allEdges },
799
+ patch: { version: 1, nodes: [...allNodesMap.values()], edges: allEdges },
788
800
  stats: {
789
801
  useCases: merged.useCases.size,
790
802
  features: merged.features.size,