ai-spector 0.2.9 → 0.3.1

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 (38) hide show
  1. package/dist/config/load.d.ts +1 -0
  2. package/dist/config/load.d.ts.map +1 -1
  3. package/dist/config/load.js +8 -0
  4. package/dist/config/load.js.map +1 -1
  5. package/dist/graph/defaults.d.ts +2 -0
  6. package/dist/graph/defaults.d.ts.map +1 -1
  7. package/dist/graph/defaults.js +4 -0
  8. package/dist/graph/defaults.js.map +1 -1
  9. package/dist/graph/detail-sections.d.ts +10 -0
  10. package/dist/graph/detail-sections.d.ts.map +1 -1
  11. package/dist/graph/detail-sections.js +45 -1
  12. package/dist/graph/detail-sections.js.map +1 -1
  13. package/dist/graph/doc-extract.d.ts +24 -7
  14. package/dist/graph/doc-extract.d.ts.map +1 -1
  15. package/dist/graph/doc-extract.js +167 -79
  16. package/dist/graph/doc-extract.js.map +1 -1
  17. package/dist/graph/merge.js +2 -2
  18. package/dist/graph/merge.js.map +1 -1
  19. package/dist/index/doc-semantics.d.ts.map +1 -1
  20. package/dist/index/doc-semantics.js +13 -5
  21. package/dist/index/doc-semantics.js.map +1 -1
  22. package/dist/registry/build.d.ts +3 -1
  23. package/dist/registry/build.d.ts.map +1 -1
  24. package/dist/registry/build.js +31 -6
  25. package/dist/registry/build.js.map +1 -1
  26. package/dist/registry/structure-patch.d.ts +6 -0
  27. package/dist/registry/structure-patch.d.ts.map +1 -0
  28. package/dist/registry/structure-patch.js +49 -0
  29. package/dist/registry/structure-patch.js.map +1 -0
  30. package/documents-basic-design.json +22 -0
  31. package/package.json +2 -1
  32. package/scaffold/.ai-spector/.docflow/config/dag.basic-design.graph-seeds.json +11 -7
  33. package/scaffold/.ai-spector/.docflow/config/dag.basic-design.json +1 -1
  34. package/scaffold/.cursor/commands/_cli-failures.md +5 -0
  35. package/scaffold/.cursor/commands/_generate-graph.md +10 -2
  36. package/scaffold/.cursor/commands/generate-basic-design.md +27 -17
  37. package/templates/basic_design/detail-api-template.md +2 -2
  38. package/templates/basic_design/detail-screen-template.md +2 -2
@@ -20,4 +20,5 @@ export declare function loadDocumentsManifest(): Promise<{
20
20
  bundleRoot: string;
21
21
  manifest: DocumentsManifest;
22
22
  }>;
23
+ export declare function loadBasicDesignListManifest(): Promise<DocumentsManifest>;
23
24
  //# sourceMappingURL=load.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAgB,GAAG,MAAM,CAkB7D;AAgBD,wBAAsB,iBAAiB,CACrC,IAAI,SAAoB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtE;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CASD"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAgB,GAAG,MAAM,CAkB7D;AAgBD,wBAAsB,iBAAiB,CACrC,IAAI,SAAoB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtE;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CASD;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAS9E"}
@@ -80,4 +80,12 @@ export async function loadDocumentsManifest() {
80
80
  }
81
81
  return { bundleRoot, manifest };
82
82
  }
83
+ export async function loadBasicDesignListManifest() {
84
+ const bundleRoot = packageBundleRoot();
85
+ const manifest = await readJson(join(bundleRoot, "documents-basic-design.json"));
86
+ if (!manifest.templatesDir || !Array.isArray(manifest.documents)) {
87
+ throw new Error(`Invalid documents-basic-design.json in ${bundleRoot}`);
88
+ }
89
+ return manifest;
90
+ }
83
91
  //# sourceMappingURL=load.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export declare const DEFAULT_BD_LIST_DOC: {
13
13
  readonly screenList: "doc.bd.list-screen";
14
14
  readonly dbDesign: "doc.bd.db-design";
15
15
  };
16
+ export declare const BASIC_DESIGN_LIST_DOCUMENT_IDS: ReadonlySet<string>;
17
+ export declare function isBasicDesignListChapterDocumentId(id: string): boolean;
16
18
  /** Template document ids for per-domain basic-design detail (DAG / graph-seeds). */
17
19
  export declare const PER_DOMAIN_TEMPLATE_DOC_BD: {
18
20
  readonly api: "doc.bd.detail-api";
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/graph/defaults.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,iBAAiB;;;;;;;CAOpB,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,oFAAoF;AACpF,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/graph/defaults.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,iBAAiB;;;;;;;CAOpB,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAE9D,CAAC;AAEF,wBAAgB,kCAAkC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,oFAAoF;AACpF,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC"}
@@ -13,6 +13,10 @@ export const DEFAULT_BD_LIST_DOC = {
13
13
  screenList: "doc.bd.list-screen",
14
14
  dbDesign: "doc.bd.db-design",
15
15
  };
16
+ export const BASIC_DESIGN_LIST_DOCUMENT_IDS = new Set(Object.values(DEFAULT_BD_LIST_DOC));
17
+ export function isBasicDesignListChapterDocumentId(id) {
18
+ return BASIC_DESIGN_LIST_DOCUMENT_IDS.has(id);
19
+ }
16
20
  /** Template document ids for per-domain basic-design detail (DAG / graph-seeds). */
17
21
  export const PER_DOMAIN_TEMPLATE_DOC_BD = {
18
22
  api: "doc.bd.detail-api",
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/graph/defaults.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,wEAAwE;IAC/E,OAAO,EAAE,2CAA2C;IACpD,OAAO,EAAE,2DAA2D;IACpE,qBAAqB,EAAE,2DAA2D;IAClF,GAAG,EAAE,oFAAoF;IACzF,UAAU,EAAE,wDAAwD;CAC5D,CAAC;AAEX,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE,iBAAiB;IAC1B,UAAU,EAAE,oBAAoB;IAChC,QAAQ,EAAE,kBAAkB;CACpB,CAAC;AAEX,oFAAoF;AACpF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,mBAAmB;IACxB,MAAM,EAAE,sBAAsB;CACtB,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/graph/defaults.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,wEAAwE;IAC/E,OAAO,EAAE,2CAA2C;IACpD,OAAO,EAAE,2DAA2D;IACpE,qBAAqB,EAAE,2DAA2D;IAClF,GAAG,EAAE,oFAAoF;IACzF,UAAU,EAAE,wDAAwD;CAC5D,CAAC;AAEX,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE,iBAAiB;IAC1B,UAAU,EAAE,oBAAoB;IAChC,QAAQ,EAAE,kBAAkB;CACpB,CAAC;AAEX,MAAM,CAAC,MAAM,8BAA8B,GAAwB,IAAI,GAAG,CACxE,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACnC,CAAC;AAEF,MAAM,UAAU,kCAAkC,CAAC,EAAU;IAC3D,OAAO,8BAA8B,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,mBAAmB;IACxB,MAAM,EAAE,sBAAsB;CACtB,CAAC"}
@@ -1,11 +1,16 @@
1
1
  import type { GraphNode } from "../types.js";
2
2
  import type { ExtractPatch } from "./knowledge.js";
3
+ import { BASIC_DESIGN_LIST_DOCUMENT_IDS } from "./defaults.js";
3
4
  export interface ParsedDetailSection {
4
5
  id: string;
5
6
  heading: string;
6
7
  level: number;
7
8
  order: number;
8
9
  }
10
+ /** List-chapter basic-design documents (api-list, screen map, db-design). */
11
+ export declare function isBasicDesignListChapterDocument(node: GraphNode): boolean;
12
+ /** Whether doc-extract may upsert `section` nodes under this document parent. */
13
+ export declare function allowsSectionUpsertParent(parentDoc: GraphNode): boolean;
9
14
  /** Per-domain detail markdown instance (not a template document from bootstrap). */
10
15
  export declare function isPerDomainInstanceDocument(node: GraphNode): boolean;
11
16
  /** First paragraph of prose after a heading (skips fields, blockquotes, tables). */
@@ -15,4 +20,9 @@ export declare function sectionSnippetsFromContent(content: string, sections: Pa
15
20
  /** Parse `##`–`####` headings and optional `<!-- section:sec.... -->` anchors from detail markdown. */
16
21
  export declare function parseDetailSections(content: string, documentId: string): ParsedDetailSection[];
17
22
  export declare function detailSectionsToPatch(documentId: string, sections: ParsedDetailSection[], content?: string): ExtractPatch;
23
+ /** Map list-chapter markdown paths to graph document ids (includes common wrong paths). */
24
+ export declare function basicDesignListChapterDocumentId(relativePath: string): string | null;
25
+ /** Parse headings from generated list-chapter basic-design files into section nodes. */
26
+ export declare function basicDesignListChapterFileToPatch(relativePath: string, content: string): ExtractPatch;
27
+ export { BASIC_DESIGN_LIST_DOCUMENT_IDS };
18
28
  //# sourceMappingURL=detail-sections.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detail-sections.d.ts","sourceRoot":"","sources":["../../src/graph/detail-sections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AASnD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAmBpE;AAsCD,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+CxF;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CASrB;AAED,uGAAuG;AACvG,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,mBAAmB,EAAE,CA2BvB;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CAoCd"}
1
+ {"version":3,"file":"detail-sections.d.ts","sourceRoot":"","sources":["../../src/graph/detail-sections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,8BAA8B,EAG/B,MAAM,eAAe,CAAC;AASvB,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,6EAA6E;AAC7E,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAEzE;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAKvE;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAmBpE;AAsCD,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+CxF;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CASrB;AAED,uGAAuG;AACvG,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,mBAAmB,EAAE,CA2BvB;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CAoCd;AAMD,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAgBf;AAED,wFAAwF;AACxF,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,YAAY,CAUd;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -1,11 +1,23 @@
1
1
  import { sectionIdFromHeading } from "../registry/slug.js";
2
+ import { BASIC_DESIGN_LIST_DOCUMENT_IDS, DEFAULT_BD_LIST_DOC, isBasicDesignListChapterDocumentId, } from "./defaults.js";
2
3
  const HEADING_RE = /^(#{2,4})\s+(.+)$/;
3
4
  const SECTION_ANCHOR_RE = /<!--\s*section:\s*([^\s>]+)\s*-->/;
4
5
  const BLOCKQUOTE_LINE_RE = /^\s*>/;
5
6
  const FIELD_LINE_RE = /^\s*\*\*[^*]+:\*\*/;
6
7
  const TABLE_LINE_RE = /^\s*\|/;
7
8
  const HR_RE = /^---+\s*$/;
8
- const BD_INSTANCE_PATH_RE = /docs\/basic-design\/(?:api\/|screens\/(?!list-screens\.md))/i;
9
+ const BD_INSTANCE_PATH_RE = /docs\/basic-design\/(?:api\/|screens\/)/i;
10
+ /** List-chapter basic-design documents (api-list, screen map, db-design). */
11
+ export function isBasicDesignListChapterDocument(node) {
12
+ return node.type === "document" && isBasicDesignListChapterDocumentId(node.id);
13
+ }
14
+ /** Whether doc-extract may upsert `section` nodes under this document parent. */
15
+ export function allowsSectionUpsertParent(parentDoc) {
16
+ if (isPerDomainInstanceDocument(parentDoc)) {
17
+ return true;
18
+ }
19
+ return isBasicDesignListChapterDocument(parentDoc);
20
+ }
9
21
  /** Per-domain detail markdown instance (not a template document from bootstrap). */
10
22
  export function isPerDomainInstanceDocument(node) {
11
23
  if (node.type !== "document" || node.outputPattern) {
@@ -173,4 +185,36 @@ export function detailSectionsToPatch(documentId, sections, content) {
173
185
  }
174
186
  return { version: 1, nodes, edges };
175
187
  }
188
+ function normalizeDocPath(relativePath) {
189
+ return relativePath.replace(/\\/g, "/").toLowerCase();
190
+ }
191
+ /** Map list-chapter markdown paths to graph document ids (includes common wrong paths). */
192
+ export function basicDesignListChapterDocumentId(relativePath) {
193
+ const p = normalizeDocPath(relativePath);
194
+ if (p === "docs/basic-design/api-list.md" || p.endsWith("/api-list.md")) {
195
+ return DEFAULT_BD_LIST_DOC.apiList;
196
+ }
197
+ if (p === "docs/basic-design/db-design.md" || p.endsWith("/db-design.md")) {
198
+ return DEFAULT_BD_LIST_DOC.dbDesign;
199
+ }
200
+ if (p === "docs/basic-design/screens/list-screens.md" ||
201
+ p === "docs/basic-design/list-screens.md" ||
202
+ p.endsWith("/list-screens.md")) {
203
+ return DEFAULT_BD_LIST_DOC.screenList;
204
+ }
205
+ return null;
206
+ }
207
+ /** Parse headings from generated list-chapter basic-design files into section nodes. */
208
+ export function basicDesignListChapterFileToPatch(relativePath, content) {
209
+ const documentId = basicDesignListChapterDocumentId(relativePath);
210
+ if (!documentId) {
211
+ return { version: 1, nodes: [], edges: [] };
212
+ }
213
+ const sections = parseDetailSections(content, documentId);
214
+ if (sections.length === 0) {
215
+ return { version: 1, nodes: [], edges: [] };
216
+ }
217
+ return detailSectionsToPatch(documentId, sections, content);
218
+ }
219
+ export { BASIC_DESIGN_LIST_DOCUMENT_IDS };
176
220
  //# sourceMappingURL=detail-sections.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detail-sections.js","sourceRoot":"","sources":["../../src/graph/detail-sections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detail-sections.js","sourceRoot":"","sources":["../../src/graph/detail-sections.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { GraphNode } from "../types.js";
2
+ import type { InMemoryGraph } from "./InMemoryGraph.js";
2
3
  import type { ExtractPatch } from "./knowledge.js";
3
4
  export interface DocExtractEntry {
4
5
  relativePath: string;
@@ -25,10 +26,16 @@ export type DetailFileKind = "useCaseDetail" | "featureDetail";
25
26
  export type BasicDesignDetailKind = "apiDetail" | "screenDetail";
26
27
  /** Classify markdown under docs/srs as list chapter vs per-domain detail file. */
27
28
  export declare function classifySrsDetailFile(relativePath: string): DetailFileKind | null;
28
- /** Classify markdown under docs/basic-design as list chapter vs per-feature/per-screen detail. */
29
+ /** Classify markdown under docs/basic-design as list chapter vs per-endpoint/per-screen detail. */
29
30
  export declare function classifyBasicDesignDetailFile(relativePath: string): BasicDesignDetailKind | null;
30
31
  export declare function documentIdForDomainDetail(kind: DetailFileKind, domainId: string): string;
31
- export declare function documentIdForBasicDesignDetail(kind: BasicDesignDetailKind, featureId: string, relativePath: string): string;
32
+ export declare function documentIdForBasicDesignDetail(kind: BasicDesignDetailKind, relativePath: string): string;
33
+ export interface BasicDesignDetailMeta {
34
+ title: string;
35
+ featureIds: string[];
36
+ }
37
+ /** Title and optional related features from per-endpoint / per-screen detail markdown. */
38
+ export declare function extractBasicDesignDetailMeta(content: string, kind: BasicDesignDetailKind, relativePath: string): BasicDesignDetailMeta;
32
39
  export interface DetailDomainMeta {
33
40
  title?: string;
34
41
  description?: string;
@@ -56,14 +63,24 @@ interface ParsedDomain {
56
63
  }
57
64
  export declare function extractDomainFromMarkdown(content: string, relativePath: string): ParsedDomain;
58
65
  export declare function parsedDomainToPatch(parsed: ParsedDomain, relativePath: string): ExtractPatch;
59
- /** Document nodes + sections for per-UC/F SRS or per-feature API/screen basic-design files. */
60
- export declare function detailFileToPatch(relativePath: string, content: string): ExtractPatch;
66
+ /** Document nodes + sections for per-UC/F SRS or per-endpoint/per-screen basic-design files. */
67
+ export declare function detailFileToPatch(relativePath: string, content: string, options?: BuildDocExtractPatchOptions): ExtractPatch;
61
68
  export declare function mergeParsedDomains(domains: ParsedDomain[]): ParsedDomain;
62
- /** Chapter + template documents for basic-design (not in SRS bootstrap). Emitted before edges in doc-extract patch. */
69
+ /** Per-domain template shells (outputPattern no section coverage required). */
70
+ export declare function basicDesignPerDomainTemplateNodes(): GraphNode[];
71
+ /** @deprecated Prefer {@link basicDesignAnchorStructurePatch} — documents only, no sections. */
63
72
  export declare function basicDesignAnchorDocumentNodes(): GraphNode[];
64
- export declare function buildDocExtractPatch(entries: DocExtractEntry[]): {
73
+ /** True when any basic-design list chapter document has no child sections in the graph. */
74
+ export declare function basicDesignListChaptersNeedSections(graph: InMemoryGraph): boolean;
75
+ /** List chapters + section trees from templates; used when bootstrap omitted basic-design registry docs. */
76
+ export declare function basicDesignAnchorStructurePatch(projectRoot: string): Promise<ExtractPatch>;
77
+ export interface BuildDocExtractPatchOptions {
78
+ /** When false, do not re-parse api-list / list-screens / db-design bodies (avoids duplicate section trees after bootstrap). */
79
+ includeListChapterMarkdown?: boolean;
80
+ }
81
+ export declare function buildDocExtractPatch(entries: DocExtractEntry[], _projectRoot?: string, options?: BuildDocExtractPatchOptions): Promise<{
65
82
  patch: ExtractPatch;
66
83
  stats: DocExtractResult;
67
- };
84
+ }>;
68
85
  export {};
69
86
  //# sourceMappingURL=doc-extract.d.ts.map
@@ -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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"}
@@ -1,5 +1,7 @@
1
- import { detailSectionsToPatch, parseDetailSections, snippetAfterHeading, } from "./detail-sections.js";
2
- import { DEFAULT_BD_LIST_DOC, DEFAULT_LISTED_IN, PER_DOMAIN_TEMPLATE_DOC_BD, } from "./defaults.js";
1
+ import { basicDesignListChapterDocumentId, basicDesignListChapterFileToPatch, detailSectionsToPatch, parseDetailSections, snippetAfterHeading, } from "./detail-sections.js";
2
+ import { BASIC_DESIGN_LIST_DOCUMENT_IDS, DEFAULT_BD_LIST_DOC, DEFAULT_LISTED_IN, PER_DOMAIN_TEMPLATE_DOC_BD, } from "./defaults.js";
3
+ import { scanBasicDesignListDocuments } from "../registry/build.js";
4
+ import { mergeStructurePatches, registryDocumentToStructurePatch, } from "../registry/structure-patch.js";
3
5
  /** Registry template ids for per-domain SRS detail (see documents.json). */
4
6
  export const PER_DOMAIN_TEMPLATE_DOC = {
5
7
  useCase: "doc.srs.uc-detail",
@@ -58,20 +60,22 @@ export function classifySrsDetailFile(relativePath) {
58
60
  }
59
61
  return null;
60
62
  }
61
- /** Classify markdown under docs/basic-design as list chapter vs per-feature/per-screen detail. */
63
+ /** Classify markdown under docs/basic-design as list chapter vs per-endpoint/per-screen detail. */
62
64
  export function classifyBasicDesignDetailFile(relativePath) {
63
65
  const p = normalizeRelativePath(relativePath).toLowerCase();
64
66
  if (p === "docs/basic-design/api-list.md" ||
65
67
  p.endsWith("/api-list.md") ||
66
68
  p === "docs/basic-design/db-design.md" ||
67
69
  p.endsWith("/db-design.md") ||
70
+ p === "docs/basic-design/list-screens.md" ||
71
+ p.endsWith("/list-screens.md") ||
68
72
  p.includes("/screens/list-screens.md")) {
69
73
  return null;
70
74
  }
71
- if (/\/api\/f-\d+/.test(p)) {
75
+ if (/\/api\/[^/]+\.md$/.test(p)) {
72
76
  return "apiDetail";
73
77
  }
74
- if (/\/screens\/.+\.md$/.test(p)) {
78
+ if (/\/screens\/[^/]+\.md$/.test(p)) {
75
79
  return "screenDetail";
76
80
  }
77
81
  return null;
@@ -82,51 +86,89 @@ export function documentIdForDomainDetail(kind, domainId) {
82
86
  ? `doc.srs.uc-${norm}`
83
87
  : `doc.srs.f-${norm}`;
84
88
  }
85
- export function documentIdForBasicDesignDetail(kind, featureId, relativePath) {
86
- const norm = normalizeDomainId(featureId);
87
- if (kind === "apiDetail") {
88
- return `doc.bd.api-${norm}`;
89
- }
89
+ function slugFromFilename(relativePath) {
90
90
  const base = normalizeRelativePath(relativePath)
91
91
  .split("/")
92
92
  .pop()
93
- ?.replace(/\.md$/i, "") ?? "screen";
94
- const slug = base
93
+ ?.replace(/\.md$/i, "") ?? "unknown";
94
+ return base
95
95
  .toLowerCase()
96
96
  .replace(/[^a-z0-9]+/g, "-")
97
97
  .replace(/^-|-$/g, "")
98
98
  .slice(0, 64);
99
- return `doc.bd.screen-${slug}`;
100
99
  }
101
- function featureIdFromBasicDesignPath(relativePath, kind) {
102
- const p = normalizeRelativePath(relativePath);
103
- if (kind === "apiDetail") {
104
- const m = p.match(/\/api\/f-(\d+)/i);
105
- return m?.[1] ? normalizeDomainId(`F-${m[1]}`) : null;
106
- }
107
- const fromPath = p.match(/f-(\d+)/i);
108
- if (fromPath?.[1]) {
109
- return normalizeDomainId(`F-${fromPath[1]}`);
110
- }
111
- return null;
100
+ export function documentIdForBasicDesignDetail(kind, relativePath) {
101
+ const slug = slugFromFilename(relativePath);
102
+ return kind === "apiDetail" ? `doc.bd.api-${slug}` : `doc.bd.screen-${slug}`;
112
103
  }
113
- function primaryDomainIdFromBasicDesignContent(content, kind, relativePath) {
114
- const fromPath = featureIdFromBasicDesignPath(relativePath, kind);
104
+ const ENDPOINT_SPEC_HEADING = /###\s*\d+(?:\.\d+)?\s*`([A-Z]+)\s+([^`]+)`/i;
105
+ const API_DETAIL_TITLE = /^#\s*API Detail:\s*(.+)/im;
106
+ const SCREEN_SECTION_HEADING = /^##\s*\d+\.\s*Screen:\s*(.+)/im;
107
+ /** Title and optional related features from per-endpoint / per-screen detail markdown. */
108
+ export function extractBasicDesignDetailMeta(content, kind, relativePath) {
109
+ const featureIds = new Set();
110
+ for (const m of content.matchAll(/\bF-\d+\b/gi)) {
111
+ const id = normalizeDomainId(m[0]);
112
+ if (isRealDomainId(id)) {
113
+ featureIds.add(id);
114
+ }
115
+ }
115
116
  const idLine = content.match(FEATURE_ID_LINE);
116
117
  if (idLine?.[1] && isRealDomainId(idLine[1])) {
117
- return {
118
- id: normalizeDomainId(idLine[1]),
119
- title: content.match(FEATURE_NAME_HEADING)?.[2]?.trim(),
120
- };
118
+ featureIds.add(normalizeDomainId(idLine[1]));
121
119
  }
122
- const heading = content.match(FEATURE_NAME_HEADING);
123
- if (heading?.[1] && isRealDomainId(heading[1])) {
124
- return { id: normalizeDomainId(heading[1]), title: heading[2]?.trim() };
120
+ if (kind === "apiDetail") {
121
+ const endpoint = content.match(ENDPOINT_SPEC_HEADING);
122
+ if (endpoint) {
123
+ return {
124
+ title: `${endpoint[1]} ${endpoint[2]}`.trim(),
125
+ featureIds: [...featureIds],
126
+ };
127
+ }
128
+ const titleLine = content.match(API_DETAIL_TITLE);
129
+ if (titleLine?.[1]?.trim()) {
130
+ return { title: titleLine[1].trim(), featureIds: [...featureIds] };
131
+ }
132
+ return { title: slugFromFilename(relativePath), featureIds: [...featureIds] };
125
133
  }
126
- if (fromPath) {
127
- return { id: fromPath };
134
+ const screen = content.match(SCREEN_SECTION_HEADING);
135
+ if (screen?.[1]?.trim()) {
136
+ return { title: screen[1].trim(), featureIds: [...featureIds] };
128
137
  }
129
- return null;
138
+ return { title: slugFromFilename(relativePath), featureIds: [...featureIds] };
139
+ }
140
+ function buildBasicDesignDetailInstancePatch(opts) {
141
+ const path = normalizeRelativePath(opts.relativePath);
142
+ const templateDocId = opts.kind === "apiDetail"
143
+ ? PER_DOMAIN_TEMPLATE_DOC_BD.api
144
+ : PER_DOMAIN_TEMPLATE_DOC_BD.screen;
145
+ const listAnchorId = opts.kind === "apiDetail"
146
+ ? DEFAULT_BD_LIST_DOC.apiList
147
+ : DEFAULT_BD_LIST_DOC.screenList;
148
+ const nodes = [
149
+ {
150
+ id: opts.docId,
151
+ type: "document",
152
+ output: path,
153
+ perDomain: opts.kind,
154
+ title: opts.title,
155
+ ...(opts.description ? { description: opts.description } : {}),
156
+ },
157
+ ];
158
+ const edges = [
159
+ { type: "rendersTo", from: opts.docId, to: path },
160
+ { type: "rendersTo", from: templateDocId, to: path },
161
+ { type: "partOf", from: opts.docId, to: templateDocId },
162
+ { type: "contains", from: listAnchorId, to: opts.docId },
163
+ ];
164
+ for (const featureId of opts.featureIds) {
165
+ edges.push({ type: "tracesTo", from: featureId, to: opts.docId });
166
+ }
167
+ const sections = parseDetailSections(opts.content, opts.docId);
168
+ const sectionPatch = detailSectionsToPatch(opts.docId, sections, opts.content);
169
+ nodes.push(...sectionPatch.nodes);
170
+ edges.push(...sectionPatch.edges);
171
+ return { version: 1, nodes, edges };
130
172
  }
131
173
  function primaryDomainIdFromDetailContent(content, kind) {
132
174
  if (kind === "useCaseDetail") {
@@ -368,10 +410,9 @@ export function extractDomainFromMarkdown(content, relativePath) {
368
410
  }
369
411
  const bdKind = classifyBasicDesignDetailFile(relativePath);
370
412
  if (bdKind) {
371
- const primary = primaryDomainIdFromBasicDesignContent(content, bdKind, relativePath);
372
- if (primary) {
373
- addFeature(parsed, primary.id, {
374
- title: primary.title,
413
+ const meta = extractBasicDesignDetailMeta(content, bdKind, relativePath);
414
+ for (const featureId of meta.featureIds) {
415
+ addFeature(parsed, featureId, {
375
416
  description: extractBasicDesignDetailDescription(content, bdKind),
376
417
  });
377
418
  }
@@ -536,30 +577,28 @@ function basicDesignDetailFileToPatch(relativePath, content) {
536
577
  if (!kind) {
537
578
  return { version: 1, nodes: [], edges: [] };
538
579
  }
539
- const primary = primaryDomainIdFromBasicDesignContent(content, kind, relativePath);
540
- if (!primary) {
541
- return { version: 1, nodes: [], edges: [] };
542
- }
543
- const description = extractBasicDesignDetailDescription(content, kind);
544
- const listAnchorId = kind === "apiDetail" ? DEFAULT_BD_LIST_DOC.apiList : DEFAULT_BD_LIST_DOC.screenList;
545
- const templateDocId = kind === "apiDetail"
546
- ? PER_DOMAIN_TEMPLATE_DOC_BD.api
547
- : PER_DOMAIN_TEMPLATE_DOC_BD.screen;
548
- return buildDetailInstancePatch({
580
+ const meta = extractBasicDesignDetailMeta(content, kind, relativePath);
581
+ return buildBasicDesignDetailInstancePatch({
549
582
  relativePath,
550
583
  content,
551
- docId: documentIdForBasicDesignDetail(kind, primary.id, relativePath),
552
- domainId: primary.id,
553
- domainType: "feature",
554
- perDomain: kind,
555
- templateDocId,
556
- listAnchorId,
557
- title: primary.title ?? primary.id,
558
- description,
584
+ docId: documentIdForBasicDesignDetail(kind, relativePath),
585
+ kind,
586
+ title: meta.title,
587
+ description: extractBasicDesignDetailDescription(content, kind),
588
+ featureIds: meta.featureIds,
559
589
  });
560
590
  }
561
- /** Document nodes + sections for per-UC/F SRS or per-feature API/screen basic-design files. */
562
- export function detailFileToPatch(relativePath, content) {
591
+ /** Document nodes + sections for per-UC/F SRS or per-endpoint/per-screen basic-design files. */
592
+ export function detailFileToPatch(relativePath, content, options) {
593
+ if (options?.includeListChapterMarkdown !== false) {
594
+ const listChapter = basicDesignListChapterFileToPatch(relativePath, content);
595
+ if (listChapter.nodes.length > 0 || listChapter.edges.length > 0) {
596
+ return listChapter;
597
+ }
598
+ }
599
+ else if (basicDesignListChapterDocumentId(relativePath)) {
600
+ return { version: 1, nodes: [], edges: [] };
601
+ }
563
602
  const srs = srsDetailFileToPatch(relativePath, content);
564
603
  if (srs.nodes.length > 0 || srs.edges.length > 0) {
565
604
  return srs;
@@ -582,7 +621,26 @@ export function mergeParsedDomains(domains) {
582
621
  }
583
622
  return out;
584
623
  }
585
- /** Chapter + template documents for basic-design (not in SRS bootstrap). Emitted before edges in doc-extract patch. */
624
+ /** Per-domain template shells (outputPattern no section coverage required). */
625
+ export function basicDesignPerDomainTemplateNodes() {
626
+ return [
627
+ {
628
+ id: PER_DOMAIN_TEMPLATE_DOC_BD.api,
629
+ type: "document",
630
+ outputPattern: "docs/basic-design/api/",
631
+ perDomain: "apiDetail",
632
+ title: "API Detail (template)",
633
+ },
634
+ {
635
+ id: PER_DOMAIN_TEMPLATE_DOC_BD.screen,
636
+ type: "document",
637
+ outputPattern: "docs/basic-design/screens/",
638
+ perDomain: "screenDetail",
639
+ title: "Screen Detail (template)",
640
+ },
641
+ ];
642
+ }
643
+ /** @deprecated Prefer {@link basicDesignAnchorStructurePatch} — documents only, no sections. */
586
644
  export function basicDesignAnchorDocumentNodes() {
587
645
  return [
588
646
  {
@@ -594,7 +652,7 @@ export function basicDesignAnchorDocumentNodes() {
594
652
  {
595
653
  id: DEFAULT_BD_LIST_DOC.screenList,
596
654
  type: "document",
597
- output: "docs/basic-design/screens/list-screens.md",
655
+ output: "docs/basic-design/list-screens.md",
598
656
  title: "Screen Map",
599
657
  },
600
658
  {
@@ -603,23 +661,48 @@ export function basicDesignAnchorDocumentNodes() {
603
661
  output: "docs/basic-design/db-design.md",
604
662
  title: "Database Design",
605
663
  },
606
- {
607
- id: PER_DOMAIN_TEMPLATE_DOC_BD.api,
608
- type: "document",
609
- outputPattern: "docs/basic-design/api/",
610
- perDomain: "apiDetail",
611
- title: "API Detail (template)",
612
- },
613
- {
614
- id: PER_DOMAIN_TEMPLATE_DOC_BD.screen,
615
- type: "document",
616
- outputPattern: "docs/basic-design/screens/",
617
- perDomain: "screenDetail",
618
- title: "Screen Detail (template)",
619
- },
620
664
  ];
621
665
  }
622
- export function buildDocExtractPatch(entries) {
666
+ /** True when any basic-design list chapter document has no child sections in the graph. */
667
+ export function basicDesignListChaptersNeedSections(graph) {
668
+ for (const docId of BASIC_DESIGN_LIST_DOCUMENT_IDS) {
669
+ const doc = graph.nodesById.get(docId);
670
+ if (!doc || doc.type !== "document") {
671
+ continue;
672
+ }
673
+ const hasSection = (graph.outEdges.get(docId) ?? []).some((e) => e.type === "contains" &&
674
+ graph.nodesById.get(e.to)?.type === "section");
675
+ if (!hasSection) {
676
+ return true;
677
+ }
678
+ }
679
+ return false;
680
+ }
681
+ /** List chapters + section trees from templates; used when bootstrap omitted basic-design registry docs. */
682
+ export async function basicDesignAnchorStructurePatch(projectRoot) {
683
+ try {
684
+ const listDocs = await scanBasicDesignListDocuments(projectRoot);
685
+ const listPatches = listDocs.map((d) => registryDocumentToStructurePatch(d));
686
+ const templatePatch = {
687
+ version: 1,
688
+ nodes: basicDesignPerDomainTemplateNodes(),
689
+ edges: [],
690
+ };
691
+ return mergeStructurePatches([...listPatches, templatePatch]);
692
+ }
693
+ catch {
694
+ return {
695
+ version: 1,
696
+ nodes: [
697
+ ...basicDesignAnchorDocumentNodes(),
698
+ ...basicDesignPerDomainTemplateNodes(),
699
+ ],
700
+ edges: [],
701
+ };
702
+ }
703
+ }
704
+ export async function buildDocExtractPatch(entries, _projectRoot, options) {
705
+ const includeListChapterMarkdown = options?.includeListChapterMarkdown !== false;
623
706
  const perFile = [];
624
707
  for (const e of entries) {
625
708
  perFile.push(extractDomainFromMarkdown(e.content, e.relativePath));
@@ -686,14 +769,19 @@ export function buildDocExtractPatch(entries) {
686
769
  if (hasBasicDesignFiles) {
687
770
  mergePatchInto({
688
771
  version: 1,
689
- nodes: basicDesignAnchorDocumentNodes(),
772
+ nodes: [
773
+ ...basicDesignAnchorDocumentNodes(),
774
+ ...basicDesignPerDomainTemplateNodes(),
775
+ ],
690
776
  edges: [],
691
777
  });
692
778
  }
693
779
  for (const e of entries) {
694
780
  const single = extractDomainFromMarkdown(e.content, e.relativePath);
695
781
  mergePatchInto(parsedDomainToPatch(single, e.relativePath));
696
- mergePatchInto(detailFileToPatch(e.relativePath, e.content));
782
+ mergePatchInto(detailFileToPatch(e.relativePath, e.content, {
783
+ includeListChapterMarkdown,
784
+ }));
697
785
  }
698
786
  return {
699
787
  patch: { version: 1, nodes: allNodes, edges: allEdges },