ai-spector 0.9.21 → 0.9.24

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 (579) hide show
  1. package/contracts/bootstrap/config/prototype-screen-map.json +25 -0
  2. package/contracts/bootstrap/config/prototype.config.json +17 -0
  3. package/contracts/bootstrap/config/review-queue-pending.json +4 -0
  4. package/contracts/bootstrap/config/review-queue-registry.json +4 -0
  5. package/contracts/bootstrap/config/review.config.json +5 -0
  6. package/contracts/bootstrap/docs/ENTITY_REGISTRY_MIGRATION.md +192 -0
  7. package/contracts/bootstrap/docs/MIGRATION.md +463 -0
  8. package/contracts/bootstrap/docs/README.md +48 -0
  9. package/contracts/bootstrap/docs/adapters/README.md +32 -0
  10. package/contracts/bootstrap/docs/guides/COMMENTS_ENTITY_MIGRATION.md +195 -0
  11. package/contracts/bootstrap/docs/guides/DOCOPS_MANUAL_FALLBACK.md +177 -0
  12. package/contracts/bootstrap/docs/guides/PROJECT_LAYOUT.md +84 -0
  13. package/contracts/bootstrap/docs/modules/comments.md +77 -0
  14. package/contracts/bootstrap/docs/modules/generate.md +25 -0
  15. package/contracts/bootstrap/docs/modules/graph.md +31 -0
  16. package/contracts/bootstrap/docs/modules/prototype.md +26 -0
  17. package/contracts/bootstrap/docs/modules/review.md +25 -0
  18. package/contracts/bootstrap/docs/modules/translate.md +26 -0
  19. package/contracts/bootstrap/scripts/migrate-entity-registry.sh +55 -0
  20. package/contracts/bootstrap/templates/basic-design/db-design-template.md +177 -0
  21. package/contracts/bootstrap/templates/basic-design/detail-api-template.md +278 -0
  22. package/contracts/bootstrap/templates/basic-design/detail-screen-template.md +281 -0
  23. package/contracts/bootstrap/templates/basic-design/list-api-template.md +130 -0
  24. package/contracts/bootstrap/templates/basic-design/list-screen-template.md +242 -0
  25. package/contracts/bootstrap/templates/detail-design/common/architecture-overview-template.md +302 -0
  26. package/contracts/bootstrap/templates/detail-design/common/deployment-infrastructure-template.md +461 -0
  27. package/contracts/bootstrap/templates/detail-design/common/error-handling-patterns-template.md +460 -0
  28. package/contracts/bootstrap/templates/detail-design/common/integration-patterns-template.md +410 -0
  29. package/contracts/bootstrap/templates/detail-design/common/performance-standards-template.md +406 -0
  30. package/contracts/bootstrap/templates/detail-design/common/security-patterns-template.md +395 -0
  31. package/contracts/bootstrap/templates/detail-design/feature-detail-design-template.md +773 -0
  32. package/contracts/bootstrap/templates/detail-design/feature-list-template.md +39 -0
  33. package/contracts/bootstrap/templates/srs/1-introduction.md +58 -0
  34. package/contracts/bootstrap/templates/srs/2-overall-description.md +91 -0
  35. package/contracts/bootstrap/templates/srs/3-use-case-detail-template.md +142 -0
  36. package/contracts/bootstrap/templates/srs/3-use-cases.md +53 -0
  37. package/contracts/bootstrap/templates/srs/4-system-feature-detail-template.md +131 -0
  38. package/contracts/bootstrap/templates/srs/4-system-features-list-template.md +39 -0
  39. package/contracts/bootstrap/templates/srs/5-data-requirements.md +59 -0
  40. package/contracts/bootstrap/templates/srs/6-external-interfaces.md +56 -0
  41. package/contracts/bootstrap/templates/srs/7-quality-attributes.md +74 -0
  42. package/contracts/bootstrap/templates/srs/8-internationalization.md +36 -0
  43. package/contracts/bootstrap/templates/srs/9-other-requirements.md +46 -0
  44. package/contracts/examples/full-docops.config.json +54 -0
  45. package/contracts/examples/migrate-lifecycle.json +18 -0
  46. package/contracts/examples/minimal-comment-thread/comment-root.json +10 -0
  47. package/contracts/examples/minimal-comment-thread/meta_data.json +22 -0
  48. package/contracts/examples/minimal-docops.config.json +33 -0
  49. package/contracts/examples/minimal-lifecycle.json +17 -0
  50. package/contracts/examples/minimal-prototype.config.json +18 -0
  51. package/contracts/examples/minimal-screen-map.json +25 -0
  52. package/contracts/examples/registry/minimal-document.entity.json +15 -0
  53. package/contracts/examples/registry/minimal-manifest.json +7 -0
  54. package/contracts/examples/registry/minimal-screen.entity.json +11 -0
  55. package/contracts/examples/review/minimal-pending.json +14 -0
  56. package/contracts/examples/review/minimal-registry.json +31 -0
  57. package/contracts/examples/review/minimal-review.config.json +7 -0
  58. package/contracts/schemas/comments/comment_body.schema.json +19 -0
  59. package/contracts/schemas/comments/meta_data.schema.json +59 -0
  60. package/contracts/schemas/docops.config.schema.json +97 -0
  61. package/contracts/schemas/lifecycle.schema.json +43 -0
  62. package/contracts/schemas/prototype/config.schema.json +56 -0
  63. package/contracts/schemas/prototype/screen-map.schema.json +51 -0
  64. package/contracts/schemas/registry/document.entity.schema.json +38 -0
  65. package/contracts/schemas/registry/manifest.schema.json +18 -0
  66. package/contracts/schemas/registry/screen.entity.schema.json +28 -0
  67. package/contracts/schemas/review/registry.schema.json +72 -0
  68. package/contracts/schemas/review/review.config.schema.json +42 -0
  69. package/dist/cli.js +26 -1
  70. package/dist/cli.js.map +1 -1
  71. package/dist/core/docops/bootstrap.d.ts +4 -1
  72. package/dist/core/docops/bootstrap.d.ts.map +1 -1
  73. package/dist/core/docops/bootstrap.js +16 -9
  74. package/dist/core/docops/bootstrap.js.map +1 -1
  75. package/dist/core/docops/guide.d.ts +78 -0
  76. package/dist/core/docops/guide.d.ts.map +1 -0
  77. package/dist/core/docops/guide.js +554 -0
  78. package/dist/core/docops/guide.js.map +1 -0
  79. package/dist/core/docops/migrate.d.ts.map +1 -1
  80. package/dist/core/docops/migrate.js +40 -6
  81. package/dist/core/docops/migrate.js.map +1 -1
  82. package/dist/core/graph/doc-extract.d.ts.map +1 -1
  83. package/dist/core/graph/doc-extract.js +12 -0
  84. package/dist/core/graph/doc-extract.js.map +1 -1
  85. package/dist/core/graph/impact.d.ts.map +1 -1
  86. package/dist/core/graph/impact.js +2 -1
  87. package/dist/core/graph/impact.js.map +1 -1
  88. package/dist/core/graph/link-testcases.d.ts +14 -0
  89. package/dist/core/graph/link-testcases.d.ts.map +1 -0
  90. package/dist/core/graph/link-testcases.js +46 -0
  91. package/dist/core/graph/link-testcases.js.map +1 -0
  92. package/dist/core/operations/docops.d.ts +8 -0
  93. package/dist/core/operations/docops.d.ts.map +1 -1
  94. package/dist/core/operations/docops.js +40 -0
  95. package/dist/core/operations/docops.js.map +1 -1
  96. package/dist/core/operations/index.d.ts.map +1 -1
  97. package/dist/core/operations/index.js +25 -0
  98. package/dist/core/operations/index.js.map +1 -1
  99. package/dist/core/operations/task-gates.d.ts +8 -1
  100. package/dist/core/operations/task-gates.d.ts.map +1 -1
  101. package/dist/core/operations/task-gates.js +14 -0
  102. package/dist/core/operations/task-gates.js.map +1 -1
  103. package/dist/core/operations/task.d.ts +2 -0
  104. package/dist/core/operations/task.d.ts.map +1 -1
  105. package/dist/core/operations/task.js +40 -2
  106. package/dist/core/operations/task.js.map +1 -1
  107. package/dist/core/sync/audit.d.ts.map +1 -1
  108. package/dist/core/sync/audit.js +14 -6
  109. package/dist/core/sync/audit.js.map +1 -1
  110. package/dist/core/sync/baseline.d.ts.map +1 -1
  111. package/dist/core/sync/baseline.js +5 -2
  112. package/dist/core/sync/baseline.js.map +1 -1
  113. package/dist/core/sync/constants.d.ts.map +1 -1
  114. package/dist/core/sync/constants.js +2 -1
  115. package/dist/core/sync/constants.js.map +1 -1
  116. package/dist/core/sync/gaps.d.ts.map +1 -1
  117. package/dist/core/sync/gaps.js +23 -2
  118. package/dist/core/sync/gaps.js.map +1 -1
  119. package/dist/core/sync/git-diff.d.ts +1 -0
  120. package/dist/core/sync/git-diff.d.ts.map +1 -1
  121. package/dist/core/sync/git-diff.js +14 -0
  122. package/dist/core/sync/git-diff.js.map +1 -1
  123. package/dist/core/sync/repo-context.d.ts +23 -0
  124. package/dist/core/sync/repo-context.d.ts.map +1 -0
  125. package/dist/core/sync/repo-context.js +28 -0
  126. package/dist/core/sync/repo-context.js.map +1 -0
  127. package/dist/core/sync/snapshot.d.ts.map +1 -1
  128. package/dist/core/sync/snapshot.js +24 -18
  129. package/dist/core/sync/snapshot.js.map +1 -1
  130. package/dist/core/sync/types.d.ts +7 -2
  131. package/dist/core/sync/types.d.ts.map +1 -1
  132. package/dist/core/upgrade/checklist.json +2 -2
  133. package/dist/interfaces/mcp/schemas.d.ts +2 -0
  134. package/dist/interfaces/mcp/schemas.d.ts.map +1 -1
  135. package/dist/interfaces/mcp/schemas.js +4 -0
  136. package/dist/interfaces/mcp/schemas.js.map +1 -1
  137. package/dist/interfaces/mcp/server.js +0 -0
  138. package/dist/types.d.ts +2 -2
  139. package/dist/types.d.ts.map +1 -1
  140. package/package.json +2 -1
  141. package/scaffold/claude/.claude/skills/_skill-router.md +11 -8
  142. package/scaffold/claude/.claude/skills/ai-spector/references/cli-failures.md +3 -3
  143. package/scaffold/claude/.claude/skills/ai-spector/references/docops-migrate.md +112 -0
  144. package/scaffold/claude/.claude/skills/ai-spector/references/help.md +1 -1
  145. package/scaffold/claude/.claude/skills/ai-spector/references/runbook.md +49 -26
  146. package/scaffold/claude/.claude/skills/ai-spector/skill.md +3 -2
  147. package/scaffold/cursor/skills/_skill-router.md +11 -8
  148. package/scaffold/cursor/skills/ai-spector/SKILL.md +3 -2
  149. package/scaffold/cursor/skills/ai-spector/references/cli-failures.md +3 -3
  150. package/scaffold/cursor/skills/ai-spector/references/docops-migrate.md +112 -0
  151. package/scaffold/cursor/skills/ai-spector/references/help.md +1 -1
  152. package/scaffold/cursor/skills/ai-spector/references/runbook.md +49 -26
  153. package/schemas/rules.impact.json +3 -2
  154. package/schemas/schema.graph.json +4 -2
  155. package/dist/commands/analyze.d.ts +0 -12
  156. package/dist/commands/analyze.d.ts.map +0 -1
  157. package/dist/commands/analyze.js +0 -53
  158. package/dist/commands/analyze.js.map +0 -1
  159. package/dist/commands/bootstrap.d.ts +0 -4
  160. package/dist/commands/bootstrap.d.ts.map +0 -1
  161. package/dist/commands/bootstrap.js +0 -58
  162. package/dist/commands/bootstrap.js.map +0 -1
  163. package/dist/commands/comments.d.ts +0 -44
  164. package/dist/commands/comments.d.ts.map +0 -1
  165. package/dist/commands/comments.js +0 -79
  166. package/dist/commands/comments.js.map +0 -1
  167. package/dist/commands/graph-impact.d.ts +0 -28
  168. package/dist/commands/graph-impact.d.ts.map +0 -1
  169. package/dist/commands/graph-impact.js +0 -174
  170. package/dist/commands/graph-impact.js.map +0 -1
  171. package/dist/commands/graph-merge.d.ts +0 -32
  172. package/dist/commands/graph-merge.d.ts.map +0 -1
  173. package/dist/commands/graph-merge.js +0 -101
  174. package/dist/commands/graph-merge.js.map +0 -1
  175. package/dist/commands/graph-query.d.ts +0 -10
  176. package/dist/commands/graph-query.d.ts.map +0 -1
  177. package/dist/commands/graph-query.js +0 -24
  178. package/dist/commands/graph-query.js.map +0 -1
  179. package/dist/commands/graph-report.d.ts +0 -9
  180. package/dist/commands/graph-report.d.ts.map +0 -1
  181. package/dist/commands/graph-report.js +0 -10
  182. package/dist/commands/graph-report.js.map +0 -1
  183. package/dist/commands/graph-visualize.d.ts +0 -17
  184. package/dist/commands/graph-visualize.d.ts.map +0 -1
  185. package/dist/commands/graph-visualize.js +0 -44
  186. package/dist/commands/graph-visualize.js.map +0 -1
  187. package/dist/commands/hooks-constants.d.ts +0 -2
  188. package/dist/commands/hooks-constants.d.ts.map +0 -1
  189. package/dist/commands/hooks-constants.js +0 -2
  190. package/dist/commands/hooks-constants.js.map +0 -1
  191. package/dist/commands/hooks.d.ts +0 -28
  192. package/dist/commands/hooks.d.ts.map +0 -1
  193. package/dist/commands/hooks.js +0 -187
  194. package/dist/commands/hooks.js.map +0 -1
  195. package/dist/commands/index.d.ts +0 -22
  196. package/dist/commands/index.d.ts.map +0 -1
  197. package/dist/commands/index.js +0 -472
  198. package/dist/commands/index.js.map +0 -1
  199. package/dist/commands/init.d.ts +0 -19
  200. package/dist/commands/init.d.ts.map +0 -1
  201. package/dist/commands/init.js +0 -210
  202. package/dist/commands/init.js.map +0 -1
  203. package/dist/commands/lang-queue.d.ts +0 -28
  204. package/dist/commands/lang-queue.d.ts.map +0 -1
  205. package/dist/commands/lang-queue.js +0 -49
  206. package/dist/commands/lang-queue.js.map +0 -1
  207. package/dist/commands/lang.d.ts +0 -16
  208. package/dist/commands/lang.d.ts.map +0 -1
  209. package/dist/commands/lang.js +0 -69
  210. package/dist/commands/lang.js.map +0 -1
  211. package/dist/commands/prototype.d.ts +0 -66
  212. package/dist/commands/prototype.d.ts.map +0 -1
  213. package/dist/commands/prototype.js +0 -370
  214. package/dist/commands/prototype.js.map +0 -1
  215. package/dist/commands/setup.d.ts +0 -26
  216. package/dist/commands/setup.d.ts.map +0 -1
  217. package/dist/commands/setup.js +0 -259
  218. package/dist/commands/setup.js.map +0 -1
  219. package/dist/commands/sync-cursor.d.ts +0 -10
  220. package/dist/commands/sync-cursor.d.ts.map +0 -1
  221. package/dist/commands/sync-cursor.js +0 -18
  222. package/dist/commands/sync-cursor.js.map +0 -1
  223. package/dist/commands/template-regen.d.ts +0 -24
  224. package/dist/commands/template-regen.d.ts.map +0 -1
  225. package/dist/commands/template-regen.js +0 -240
  226. package/dist/commands/template-regen.js.map +0 -1
  227. package/dist/commands/template.d.ts +0 -3
  228. package/dist/commands/template.d.ts.map +0 -1
  229. package/dist/commands/template.js +0 -1285
  230. package/dist/commands/template.js.map +0 -1
  231. package/dist/commands/validate.d.ts +0 -10
  232. package/dist/commands/validate.d.ts.map +0 -1
  233. package/dist/commands/validate.js +0 -89
  234. package/dist/commands/validate.js.map +0 -1
  235. package/dist/comments/anchor.d.ts +0 -16
  236. package/dist/comments/anchor.d.ts.map +0 -1
  237. package/dist/comments/anchor.js +0 -59
  238. package/dist/comments/anchor.js.map +0 -1
  239. package/dist/comments/inbox.d.ts +0 -82
  240. package/dist/comments/inbox.d.ts.map +0 -1
  241. package/dist/comments/inbox.js +0 -179
  242. package/dist/comments/inbox.js.map +0 -1
  243. package/dist/comments/paths.d.ts +0 -12
  244. package/dist/comments/paths.d.ts.map +0 -1
  245. package/dist/comments/paths.js +0 -54
  246. package/dist/comments/paths.js.map +0 -1
  247. package/dist/comments/plan.d.ts +0 -20
  248. package/dist/comments/plan.d.ts.map +0 -1
  249. package/dist/comments/plan.js +0 -62
  250. package/dist/comments/plan.js.map +0 -1
  251. package/dist/comments/storage.d.ts +0 -30
  252. package/dist/comments/storage.d.ts.map +0 -1
  253. package/dist/comments/storage.js +0 -272
  254. package/dist/comments/storage.js.map +0 -1
  255. package/dist/comments/types.d.ts +0 -54
  256. package/dist/comments/types.d.ts.map +0 -1
  257. package/dist/comments/types.js +0 -2
  258. package/dist/comments/types.js.map +0 -1
  259. package/dist/config/load.d.ts +0 -47
  260. package/dist/config/load.d.ts.map +0 -1
  261. package/dist/config/load.js +0 -148
  262. package/dist/config/load.js.map +0 -1
  263. package/dist/config/types.d.ts +0 -56
  264. package/dist/config/types.d.ts.map +0 -1
  265. package/dist/config/types.js +0 -2
  266. package/dist/config/types.js.map +0 -1
  267. package/dist/core/adopt/apply.d.ts +0 -15
  268. package/dist/core/adopt/apply.d.ts.map +0 -1
  269. package/dist/core/adopt/apply.js +0 -127
  270. package/dist/core/adopt/apply.js.map +0 -1
  271. package/dist/core/adopt/bootstrap.d.ts +0 -16
  272. package/dist/core/adopt/bootstrap.d.ts.map +0 -1
  273. package/dist/core/adopt/bootstrap.js +0 -195
  274. package/dist/core/adopt/bootstrap.js.map +0 -1
  275. package/dist/core/adopt/classify.d.ts +0 -22
  276. package/dist/core/adopt/classify.d.ts.map +0 -1
  277. package/dist/core/adopt/classify.js +0 -295
  278. package/dist/core/adopt/classify.js.map +0 -1
  279. package/dist/core/adopt/paths.d.ts +0 -10
  280. package/dist/core/adopt/paths.d.ts.map +0 -1
  281. package/dist/core/adopt/paths.js +0 -16
  282. package/dist/core/adopt/paths.js.map +0 -1
  283. package/dist/core/adopt/plan.d.ts +0 -10
  284. package/dist/core/adopt/plan.d.ts.map +0 -1
  285. package/dist/core/adopt/plan.js +0 -269
  286. package/dist/core/adopt/plan.js.map +0 -1
  287. package/dist/core/adopt/scan.d.ts +0 -5
  288. package/dist/core/adopt/scan.d.ts.map +0 -1
  289. package/dist/core/adopt/scan.js +0 -169
  290. package/dist/core/adopt/scan.js.map +0 -1
  291. package/dist/core/adopt/setup.d.ts +0 -7
  292. package/dist/core/adopt/setup.d.ts.map +0 -1
  293. package/dist/core/adopt/setup.js +0 -64
  294. package/dist/core/adopt/setup.js.map +0 -1
  295. package/dist/core/adopt/tasks.d.ts +0 -9
  296. package/dist/core/adopt/tasks.d.ts.map +0 -1
  297. package/dist/core/adopt/tasks.js +0 -153
  298. package/dist/core/adopt/tasks.js.map +0 -1
  299. package/dist/core/adopt/types.d.ts +0 -75
  300. package/dist/core/adopt/types.d.ts.map +0 -1
  301. package/dist/core/adopt/types.js +0 -2
  302. package/dist/core/adopt/types.js.map +0 -1
  303. package/dist/core/adopt/validate.d.ts +0 -20
  304. package/dist/core/adopt/validate.d.ts.map +0 -1
  305. package/dist/core/adopt/validate.js +0 -129
  306. package/dist/core/adopt/validate.js.map +0 -1
  307. package/dist/core/docops/dual-write.d.ts +0 -12
  308. package/dist/core/docops/dual-write.d.ts.map +0 -1
  309. package/dist/core/docops/dual-write.js +0 -44
  310. package/dist/core/docops/dual-write.js.map +0 -1
  311. package/dist/core/engine/local-adapter.d.ts +0 -3
  312. package/dist/core/engine/local-adapter.d.ts.map +0 -1
  313. package/dist/core/engine/local-adapter.js +0 -18
  314. package/dist/core/engine/local-adapter.js.map +0 -1
  315. package/dist/core/graph/rules/default-impact.json +0 -24
  316. package/dist/core/operations/adopt-gates.d.ts +0 -19
  317. package/dist/core/operations/adopt-gates.d.ts.map +0 -1
  318. package/dist/core/operations/adopt-gates.js +0 -71
  319. package/dist/core/operations/adopt-gates.js.map +0 -1
  320. package/dist/core/operations/adopt-plan.d.ts +0 -15
  321. package/dist/core/operations/adopt-plan.d.ts.map +0 -1
  322. package/dist/core/operations/adopt-plan.js +0 -24
  323. package/dist/core/operations/adopt-plan.js.map +0 -1
  324. package/dist/core/operations/adopt.d.ts +0 -11
  325. package/dist/core/operations/adopt.d.ts.map +0 -1
  326. package/dist/core/operations/adopt.js +0 -150
  327. package/dist/core/operations/adopt.js.map +0 -1
  328. package/dist/core/operations/analyze.d.ts +0 -12
  329. package/dist/core/operations/analyze.d.ts.map +0 -1
  330. package/dist/core/operations/analyze.js +0 -53
  331. package/dist/core/operations/analyze.js.map +0 -1
  332. package/dist/core/prototype/spa-route-fallbacks.d.ts +0 -21
  333. package/dist/core/prototype/spa-route-fallbacks.d.ts.map +0 -1
  334. package/dist/core/prototype/spa-route-fallbacks.js +0 -93
  335. package/dist/core/prototype/spa-route-fallbacks.js.map +0 -1
  336. package/dist/graph/InMemoryGraph.d.ts +0 -2
  337. package/dist/graph/InMemoryGraph.d.ts.map +0 -1
  338. package/dist/graph/InMemoryGraph.js +0 -2
  339. package/dist/graph/InMemoryGraph.js.map +0 -1
  340. package/dist/graph/bundles.d.ts +0 -32
  341. package/dist/graph/bundles.d.ts.map +0 -1
  342. package/dist/graph/bundles.js +0 -109
  343. package/dist/graph/bundles.js.map +0 -1
  344. package/dist/graph/defaults.d.ts +0 -23
  345. package/dist/graph/defaults.d.ts.map +0 -1
  346. package/dist/graph/defaults.js +0 -25
  347. package/dist/graph/defaults.js.map +0 -1
  348. package/dist/graph/detail-sections.d.ts +0 -28
  349. package/dist/graph/detail-sections.d.ts.map +0 -1
  350. package/dist/graph/detail-sections.js +0 -220
  351. package/dist/graph/detail-sections.js.map +0 -1
  352. package/dist/graph/doc-extract.d.ts +0 -84
  353. package/dist/graph/doc-extract.d.ts.map +0 -1
  354. package/dist/graph/doc-extract.js +0 -821
  355. package/dist/graph/doc-extract.js.map +0 -1
  356. package/dist/graph/impact.d.ts +0 -5
  357. package/dist/graph/impact.d.ts.map +0 -1
  358. package/dist/graph/impact.js +0 -7
  359. package/dist/graph/impact.js.map +0 -1
  360. package/dist/graph/knowledge.d.ts +0 -11
  361. package/dist/graph/knowledge.d.ts.map +0 -1
  362. package/dist/graph/knowledge.js +0 -62
  363. package/dist/graph/knowledge.js.map +0 -1
  364. package/dist/graph/layer-audit.d.ts +0 -5
  365. package/dist/graph/layer-audit.d.ts.map +0 -1
  366. package/dist/graph/layer-audit.js +0 -29
  367. package/dist/graph/layer-audit.js.map +0 -1
  368. package/dist/graph/load.d.ts +0 -4
  369. package/dist/graph/load.d.ts.map +0 -1
  370. package/dist/graph/load.js +0 -12
  371. package/dist/graph/load.js.map +0 -1
  372. package/dist/graph/loadGraph.d.ts +0 -3
  373. package/dist/graph/loadGraph.d.ts.map +0 -1
  374. package/dist/graph/loadGraph.js +0 -7
  375. package/dist/graph/loadGraph.js.map +0 -1
  376. package/dist/graph/merge.d.ts +0 -27
  377. package/dist/graph/merge.d.ts.map +0 -1
  378. package/dist/graph/merge.js +0 -239
  379. package/dist/graph/merge.js.map +0 -1
  380. package/dist/graph/path-target-edges.d.ts +0 -2
  381. package/dist/graph/path-target-edges.d.ts.map +0 -1
  382. package/dist/graph/path-target-edges.js +0 -2
  383. package/dist/graph/path-target-edges.js.map +0 -1
  384. package/dist/graph/provenance.d.ts +0 -19
  385. package/dist/graph/provenance.d.ts.map +0 -1
  386. package/dist/graph/provenance.js +0 -199
  387. package/dist/graph/provenance.js.map +0 -1
  388. package/dist/graph/query.d.ts +0 -3
  389. package/dist/graph/query.d.ts.map +0 -1
  390. package/dist/graph/query.js +0 -2
  391. package/dist/graph/query.js.map +0 -1
  392. package/dist/graph/resolve.d.ts +0 -15
  393. package/dist/graph/resolve.d.ts.map +0 -1
  394. package/dist/graph/resolve.js +0 -117
  395. package/dist/graph/resolve.js.map +0 -1
  396. package/dist/graph/source-refs.d.ts +0 -2
  397. package/dist/graph/source-refs.d.ts.map +0 -1
  398. package/dist/graph/source-refs.js +0 -30
  399. package/dist/graph/source-refs.js.map +0 -1
  400. package/dist/graph/translation.d.ts +0 -14
  401. package/dist/graph/translation.d.ts.map +0 -1
  402. package/dist/graph/translation.js +0 -65
  403. package/dist/graph/translation.js.map +0 -1
  404. package/dist/index/doc-semantics.d.ts +0 -14
  405. package/dist/index/doc-semantics.d.ts.map +0 -1
  406. package/dist/index/doc-semantics.js +0 -101
  407. package/dist/index/doc-semantics.js.map +0 -1
  408. package/dist/index/docs-build.d.ts +0 -40
  409. package/dist/index/docs-build.d.ts.map +0 -1
  410. package/dist/index/docs-build.js +0 -136
  411. package/dist/index/docs-build.js.map +0 -1
  412. package/dist/index/docs-config.d.ts +0 -19
  413. package/dist/index/docs-config.d.ts.map +0 -1
  414. package/dist/index/docs-config.js +0 -5
  415. package/dist/index/docs-config.js.map +0 -1
  416. package/dist/interfaces/cli/format/adopt.d.ts +0 -23
  417. package/dist/interfaces/cli/format/adopt.d.ts.map +0 -1
  418. package/dist/interfaces/cli/format/adopt.js +0 -89
  419. package/dist/interfaces/cli/format/adopt.js.map +0 -1
  420. package/dist/interfaces/mcp/tools/adopt.d.ts +0 -22
  421. package/dist/interfaces/mcp/tools/adopt.d.ts.map +0 -1
  422. package/dist/interfaces/mcp/tools/adopt.js +0 -55
  423. package/dist/interfaces/mcp/tools/adopt.js.map +0 -1
  424. package/dist/lang/diff.d.ts +0 -12
  425. package/dist/lang/diff.d.ts.map +0 -1
  426. package/dist/lang/diff.js +0 -71
  427. package/dist/lang/diff.js.map +0 -1
  428. package/dist/lang/paths.d.ts +0 -16
  429. package/dist/lang/paths.d.ts.map +0 -1
  430. package/dist/lang/paths.js +0 -32
  431. package/dist/lang/paths.js.map +0 -1
  432. package/dist/lang/queue-layout.d.ts +0 -11
  433. package/dist/lang/queue-layout.d.ts.map +0 -1
  434. package/dist/lang/queue-layout.js +0 -56
  435. package/dist/lang/queue-layout.js.map +0 -1
  436. package/dist/lang/queue-store.d.ts +0 -23
  437. package/dist/lang/queue-store.d.ts.map +0 -1
  438. package/dist/lang/queue-store.js +0 -285
  439. package/dist/lang/queue-store.js.map +0 -1
  440. package/dist/lang/queue-types.d.ts +0 -122
  441. package/dist/lang/queue-types.d.ts.map +0 -1
  442. package/dist/lang/queue-types.js +0 -2
  443. package/dist/lang/queue-types.js.map +0 -1
  444. package/dist/lang/queue.d.ts +0 -17
  445. package/dist/lang/queue.d.ts.map +0 -1
  446. package/dist/lang/queue.js +0 -362
  447. package/dist/lang/queue.js.map +0 -1
  448. package/dist/lang/sections.d.ts +0 -26
  449. package/dist/lang/sections.d.ts.map +0 -1
  450. package/dist/lang/sections.js +0 -85
  451. package/dist/lang/sections.js.map +0 -1
  452. package/dist/markdown/parse.d.ts +0 -25
  453. package/dist/markdown/parse.d.ts.map +0 -1
  454. package/dist/markdown/parse.js +0 -100
  455. package/dist/markdown/parse.js.map +0 -1
  456. package/dist/prototype/build-base-path.d.ts +0 -11
  457. package/dist/prototype/build-base-path.d.ts.map +0 -1
  458. package/dist/prototype/build-base-path.js +0 -84
  459. package/dist/prototype/build-base-path.js.map +0 -1
  460. package/dist/prototype/build-manifest.d.ts +0 -21
  461. package/dist/prototype/build-manifest.d.ts.map +0 -1
  462. package/dist/prototype/build-manifest.js +0 -171
  463. package/dist/prototype/build-manifest.js.map +0 -1
  464. package/dist/prototype/config.d.ts +0 -21
  465. package/dist/prototype/config.d.ts.map +0 -1
  466. package/dist/prototype/config.js +0 -131
  467. package/dist/prototype/config.js.map +0 -1
  468. package/dist/prototype/deploy-path.d.ts +0 -9
  469. package/dist/prototype/deploy-path.d.ts.map +0 -1
  470. package/dist/prototype/deploy-path.js +0 -21
  471. package/dist/prototype/deploy-path.js.map +0 -1
  472. package/dist/prototype/htpasswd.d.ts +0 -8
  473. package/dist/prototype/htpasswd.d.ts.map +0 -1
  474. package/dist/prototype/htpasswd.js +0 -36
  475. package/dist/prototype/htpasswd.js.map +0 -1
  476. package/dist/prototype/nginx-config.d.ts +0 -16
  477. package/dist/prototype/nginx-config.d.ts.map +0 -1
  478. package/dist/prototype/nginx-config.js +0 -39
  479. package/dist/prototype/nginx-config.js.map +0 -1
  480. package/dist/prototype/parse-screen-index.d.ts +0 -10
  481. package/dist/prototype/parse-screen-index.d.ts.map +0 -1
  482. package/dist/prototype/parse-screen-index.js +0 -109
  483. package/dist/prototype/parse-screen-index.js.map +0 -1
  484. package/dist/prototype/preview-uri.d.ts +0 -8
  485. package/dist/prototype/preview-uri.d.ts.map +0 -1
  486. package/dist/prototype/preview-uri.js +0 -35
  487. package/dist/prototype/preview-uri.js.map +0 -1
  488. package/dist/prototype/relative-assets.d.ts +0 -9
  489. package/dist/prototype/relative-assets.d.ts.map +0 -1
  490. package/dist/prototype/relative-assets.js +0 -23
  491. package/dist/prototype/relative-assets.js.map +0 -1
  492. package/dist/prototype/resolve-default-screen.d.ts +0 -17
  493. package/dist/prototype/resolve-default-screen.d.ts.map +0 -1
  494. package/dist/prototype/resolve-default-screen.js +0 -31
  495. package/dist/prototype/resolve-default-screen.js.map +0 -1
  496. package/dist/prototype/rewrite-build-assets.d.ts +0 -8
  497. package/dist/prototype/rewrite-build-assets.d.ts.map +0 -1
  498. package/dist/prototype/rewrite-build-assets.js +0 -40
  499. package/dist/prototype/rewrite-build-assets.js.map +0 -1
  500. package/dist/prototype/route-defaults.d.ts +0 -43
  501. package/dist/prototype/route-defaults.d.ts.map +0 -1
  502. package/dist/prototype/route-defaults.js +0 -50
  503. package/dist/prototype/route-defaults.js.map +0 -1
  504. package/dist/prototype/screen-doc-paths.d.ts +0 -15
  505. package/dist/prototype/screen-doc-paths.d.ts.map +0 -1
  506. package/dist/prototype/screen-doc-paths.js +0 -38
  507. package/dist/prototype/screen-doc-paths.js.map +0 -1
  508. package/dist/prototype/spa-route-fallbacks.d.ts +0 -21
  509. package/dist/prototype/spa-route-fallbacks.d.ts.map +0 -1
  510. package/dist/prototype/spa-route-fallbacks.js +0 -93
  511. package/dist/prototype/spa-route-fallbacks.js.map +0 -1
  512. package/dist/prototype/theme-preview.d.ts +0 -17
  513. package/dist/prototype/theme-preview.d.ts.map +0 -1
  514. package/dist/prototype/theme-preview.js +0 -73
  515. package/dist/prototype/theme-preview.js.map +0 -1
  516. package/dist/prototype/themes.d.ts +0 -6
  517. package/dist/prototype/themes.d.ts.map +0 -1
  518. package/dist/prototype/themes.js +0 -55
  519. package/dist/prototype/themes.js.map +0 -1
  520. package/dist/prototype/types.d.ts +0 -160
  521. package/dist/prototype/types.d.ts.map +0 -1
  522. package/dist/prototype/types.js +0 -2
  523. package/dist/prototype/types.js.map +0 -1
  524. package/dist/prototype/validate.d.ts +0 -16
  525. package/dist/prototype/validate.d.ts.map +0 -1
  526. package/dist/prototype/validate.js +0 -149
  527. package/dist/prototype/validate.js.map +0 -1
  528. package/dist/registry/build.d.ts +0 -5
  529. package/dist/registry/build.d.ts.map +0 -1
  530. package/dist/registry/build.js +0 -71
  531. package/dist/registry/build.js.map +0 -1
  532. package/dist/registry/slug.d.ts +0 -4
  533. package/dist/registry/slug.d.ts.map +0 -1
  534. package/dist/registry/slug.js +0 -16
  535. package/dist/registry/slug.js.map +0 -1
  536. package/dist/registry/structure-patch.d.ts +0 -6
  537. package/dist/registry/structure-patch.d.ts.map +0 -1
  538. package/dist/registry/structure-patch.js +0 -49
  539. package/dist/registry/structure-patch.js.map +0 -1
  540. package/dist/template/scan.d.ts +0 -21
  541. package/dist/template/scan.d.ts.map +0 -1
  542. package/dist/template/scan.js +0 -84
  543. package/dist/template/scan.js.map +0 -1
  544. package/dist/template/validate.d.ts +0 -10
  545. package/dist/template/validate.d.ts.map +0 -1
  546. package/dist/template/validate.js +0 -64
  547. package/dist/template/validate.js.map +0 -1
  548. package/dist/util/fs.d.ts +0 -6
  549. package/dist/util/fs.d.ts.map +0 -1
  550. package/dist/util/fs.js +0 -24
  551. package/dist/util/fs.js.map +0 -1
  552. package/dist/util/git-diff.d.ts +0 -16
  553. package/dist/util/git-diff.d.ts.map +0 -1
  554. package/dist/util/git-diff.js +0 -93
  555. package/dist/util/git-diff.js.map +0 -1
  556. package/dist/util/gitignore.d.ts +0 -9
  557. package/dist/util/gitignore.d.ts.map +0 -1
  558. package/dist/util/gitignore.js +0 -44
  559. package/dist/util/gitignore.js.map +0 -1
  560. package/dist/util/open-browser.d.ts +0 -3
  561. package/dist/util/open-browser.d.ts.map +0 -1
  562. package/dist/util/open-browser.js +0 -24
  563. package/dist/util/open-browser.js.map +0 -1
  564. package/dist/util/paths.d.ts +0 -16
  565. package/dist/util/paths.d.ts.map +0 -1
  566. package/dist/util/paths.js +0 -19
  567. package/dist/util/paths.js.map +0 -1
  568. package/dist/util/prompt.d.ts +0 -14
  569. package/dist/util/prompt.d.ts.map +0 -1
  570. package/dist/util/prompt.js +0 -65
  571. package/dist/util/prompt.js.map +0 -1
  572. package/dist/visualize/html.d.ts +0 -13
  573. package/dist/visualize/html.d.ts.map +0 -1
  574. package/dist/visualize/html.js +0 -766
  575. package/dist/visualize/html.js.map +0 -1
  576. package/dist/visualize/stats.d.ts +0 -8
  577. package/dist/visualize/stats.d.ts.map +0 -1
  578. package/dist/visualize/stats.js +0 -9
  579. package/dist/visualize/stats.js.map +0 -1
@@ -1,821 +0,0 @@
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";
5
- import { extractBlockquoteAfterBoldField, extractBoldFieldDeep, extractBoldFieldInParagraph, findHeadingText, parseMarkdown, textContent, } from "../markdown/parse.js";
6
- import { visit } from "unist-util-visit";
7
- /**
8
- * Builtin fallback for per-domain template doc IDs.
9
- * Prefer PackManifest.perDomainTemplates when a pack config is available.
10
- * @deprecated Use packConfig?.perDomainTemplates instead.
11
- */
12
- const BUILTIN_PER_DOMAIN_TEMPLATE_DOC = {
13
- useCase: "doc.srs.uc-detail",
14
- feature: "doc.srs.feature-detail",
15
- };
16
- const UC_ID_RE = /\b(UC-\d+)\b/gi;
17
- const F_ID_RE = /\b(F-\d+)\b/gi;
18
- const TABLE_ROW_UC = /^\|\s*(UC-\d+)\s*\|/im;
19
- const TABLE_ROW_F = /^\|\s*(F-\d+)\s*\|/im;
20
- const OVERVIEW_HEADING = /use case overview/i;
21
- const FEATURE_DESC_HEADING = /^1\.\s*description$/i;
22
- /** Normalize UC-1 → UC-01, F-2 → F-02; leaves placeholders (UC-XX) unchanged */
23
- export function normalizeDomainId(raw) {
24
- const t = raw.trim();
25
- if (/XX$/i.test(t)) {
26
- return t;
27
- }
28
- const uc = t.match(/^UC-(\d+)$/i);
29
- if (uc) {
30
- return `UC-${uc[1].padStart(2, "0")}`;
31
- }
32
- const f = t.match(/^F-(\d+)$/i);
33
- if (f) {
34
- return `F-${f[1].padStart(2, "0")}`;
35
- }
36
- return t;
37
- }
38
- function isRealDomainId(id) {
39
- return /^(UC|F)-\d+$/i.test(id) && !/XX$/i.test(id);
40
- }
41
- function normalizeRelativePath(relativePath) {
42
- return relativePath.replace(/\\/g, "/").replace(/^\.\//, "");
43
- }
44
- /** Classify markdown under docs/srs as list chapter vs per-domain detail file. */
45
- export function classifySrsDetailFile(relativePath) {
46
- const p = normalizeRelativePath(relativePath).toLowerCase();
47
- if (p.endsWith("/3-use-cases.md") || p === "docs/srs/3-use-cases.md") {
48
- return null;
49
- }
50
- if (p.endsWith("/4-system-features.md") || p === "docs/srs/4-system-features.md") {
51
- return null;
52
- }
53
- if (/\/03-use-cases\//.test(p) || /\/uc-\d+/.test(p)) {
54
- return "useCaseDetail";
55
- }
56
- if (/\/04-system-features\/f-\d+/.test(p)) {
57
- return "featureDetail";
58
- }
59
- return null;
60
- }
61
- /** Classify markdown under docs/basic-design as list chapter vs per-endpoint/per-screen detail. */
62
- export function classifyBasicDesignDetailFile(relativePath) {
63
- const p = normalizeRelativePath(relativePath).toLowerCase();
64
- if (p === "docs/basic-design/api-list.md" ||
65
- p.endsWith("/api-list.md") ||
66
- p === "docs/basic-design/db-design.md" ||
67
- p.endsWith("/db-design.md") ||
68
- p === "docs/basic-design/list-screens.md" ||
69
- p.endsWith("/list-screens.md") ||
70
- p.includes("/screens/list-screens.md")) {
71
- return null;
72
- }
73
- if (/\/api\/[^/]+\.md$/.test(p)) {
74
- return "apiDetail";
75
- }
76
- if (/\/screens\/[^/]+\.md$/.test(p)) {
77
- return "screenDetail";
78
- }
79
- return null;
80
- }
81
- export function documentIdForDomainDetail(kind, domainId, nodePrefix) {
82
- const prefix = nodePrefix ?? "doc.srs";
83
- const norm = normalizeDomainId(domainId);
84
- return kind === "useCaseDetail"
85
- ? `${prefix}.uc-${norm}`
86
- : `${prefix}.f-${norm}`;
87
- }
88
- function slugFromFilename(relativePath) {
89
- const base = normalizeRelativePath(relativePath)
90
- .split("/")
91
- .pop()
92
- ?.replace(/\.md$/i, "") ?? "unknown";
93
- return base
94
- .toLowerCase()
95
- .replace(/[^a-z0-9]+/g, "-")
96
- .replace(/^-|-$/g, "")
97
- .slice(0, 64);
98
- }
99
- export function documentIdForBasicDesignDetail(kind, relativePath) {
100
- const slug = slugFromFilename(relativePath);
101
- return kind === "apiDetail" ? `doc.bd.api-${slug}` : `doc.bd.screen-${slug}`;
102
- }
103
- const ENDPOINT_SPEC_HEADING = /###\s*\d+(?:\.\d+)?\s*`([A-Z]+)\s+([^`]+)`/i;
104
- const API_DETAIL_TITLE = /^#\s*API Detail:\s*(.+)/im;
105
- const SCREEN_SECTION_HEADING = /^##\s*\d+\.\s*Screen:\s*(.+)/im;
106
- /** Title and optional related features from per-endpoint / per-screen detail markdown. */
107
- export function extractBasicDesignDetailMeta(content, kind, relativePath) {
108
- const featureIds = new Set();
109
- for (const m of content.matchAll(/\bF-\d+\b/gi)) {
110
- const id = normalizeDomainId(m[0]);
111
- if (isRealDomainId(id)) {
112
- featureIds.add(id);
113
- }
114
- }
115
- const root = parseMarkdown(content);
116
- const fIdVal = extractBoldFieldDeep(root, /^Feature ID$/i);
117
- if (fIdVal) {
118
- const m = fIdVal.match(/\b(F-\d+)\b/i);
119
- if (m?.[1] && isRealDomainId(m[1]))
120
- featureIds.add(normalizeDomainId(m[1]));
121
- }
122
- if (kind === "apiDetail") {
123
- const endpoint = content.match(ENDPOINT_SPEC_HEADING);
124
- if (endpoint) {
125
- return {
126
- title: `${endpoint[1]} ${endpoint[2]}`.trim(),
127
- featureIds: [...featureIds],
128
- };
129
- }
130
- const titleLine = content.match(API_DETAIL_TITLE);
131
- if (titleLine?.[1]?.trim()) {
132
- return { title: titleLine[1].trim(), featureIds: [...featureIds] };
133
- }
134
- return { title: slugFromFilename(relativePath), featureIds: [...featureIds] };
135
- }
136
- const screen = content.match(SCREEN_SECTION_HEADING);
137
- if (screen?.[1]?.trim()) {
138
- return { title: screen[1].trim(), featureIds: [...featureIds] };
139
- }
140
- return { title: slugFromFilename(relativePath), featureIds: [...featureIds] };
141
- }
142
- function buildBasicDesignDetailInstancePatch(opts) {
143
- const path = normalizeRelativePath(opts.relativePath);
144
- const templateDocId = opts.kind === "apiDetail"
145
- ? PER_DOMAIN_TEMPLATE_DOC_BD.api
146
- : PER_DOMAIN_TEMPLATE_DOC_BD.screen;
147
- const listAnchorId = opts.kind === "apiDetail"
148
- ? DEFAULT_BD_LIST_DOC.apiList
149
- : DEFAULT_BD_LIST_DOC.screenList;
150
- const nodes = [
151
- {
152
- id: opts.docId,
153
- type: "document",
154
- output: path,
155
- perDomain: opts.kind,
156
- title: opts.title,
157
- ...(opts.description ? { description: opts.description } : {}),
158
- },
159
- ];
160
- const edges = [
161
- { type: "rendersTo", from: opts.docId, to: path },
162
- { type: "rendersTo", from: templateDocId, to: path },
163
- { type: "partOf", from: opts.docId, to: templateDocId },
164
- { type: "contains", from: listAnchorId, to: opts.docId },
165
- ];
166
- for (const featureId of opts.featureIds) {
167
- edges.push({ type: "tracesTo", from: featureId, to: opts.docId });
168
- }
169
- const sections = parseDetailSections(opts.content, opts.docId);
170
- const sectionPatch = detailSectionsToPatch(opts.docId, sections, opts.content);
171
- nodes.push(...sectionPatch.nodes);
172
- edges.push(...sectionPatch.edges);
173
- return { version: 1, nodes, edges };
174
- }
175
- function primaryDomainIdFromDetailContent(content, kind) {
176
- const root = parseMarkdown(content);
177
- if (kind === "useCaseDetail") {
178
- const idVal = extractBoldFieldDeep(root, /^Use Case ID$/i);
179
- if (idVal) {
180
- const m = idVal.match(/\b(UC-\d+)\b/i);
181
- if (m?.[1] && isRealDomainId(m[1])) {
182
- const nameVal = extractBoldFieldDeep(root, /^Use Case Name$/i);
183
- return { id: normalizeDomainId(m[1]), title: nameVal?.trim() };
184
- }
185
- }
186
- const hText = findHeadingText(root, /\bUC-\d+\b/);
187
- if (hText) {
188
- const hm = hText.match(/\b(UC-\d+)\b\s*[:\-–—]\s*(.+)$/i);
189
- if (hm?.[1] && isRealDomainId(hm[1])) {
190
- return { id: normalizeDomainId(hm[1]), title: hm[2]?.trim() };
191
- }
192
- }
193
- return null;
194
- }
195
- const idVal = extractBoldFieldDeep(root, /^Feature ID$/i);
196
- if (idVal) {
197
- const m = idVal.match(/\b(F-\d+)\b/i);
198
- if (m?.[1] && isRealDomainId(m[1])) {
199
- const hText = findHeadingText(root, /\bF-\d+\b/);
200
- let title;
201
- if (hText) {
202
- const hm = hText.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
203
- title = hm?.[2]?.trim();
204
- }
205
- return { id: normalizeDomainId(m[1]), title };
206
- }
207
- }
208
- const hText = findHeadingText(root, /\bF-\d+\b/);
209
- if (hText) {
210
- const hm = hText.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
211
- if (hm?.[1] && isRealDomainId(hm[1])) {
212
- return { id: normalizeDomainId(hm[1]), title: hm[2]?.trim() };
213
- }
214
- }
215
- return null;
216
- }
217
- /** Rich title/description from generated detail markdown (not list-table stubs). */
218
- export function extractDetailDomainMeta(content, kind) {
219
- const primary = primaryDomainIdFromDetailContent(content, kind);
220
- if (!primary)
221
- return null;
222
- const root = parseMarkdown(content);
223
- const meta = {};
224
- if (primary.title)
225
- meta.title = primary.title;
226
- const nameVal = extractBoldFieldDeep(root, /^Use Case Name$/i);
227
- if (nameVal?.trim())
228
- meta.title = nameVal.trim();
229
- if (kind === "useCaseDetail") {
230
- const brief = extractBlockquoteAfterBoldField(root, /^Brief Description$/i);
231
- if (brief)
232
- meta.description = brief;
233
- const priorityVal = extractBoldFieldDeep(root, /^Priority$/i);
234
- if (priorityVal && /^(High|Medium|Low)$/i.test(priorityVal.trim())) {
235
- meta.priority = priorityVal.trim();
236
- }
237
- if (!meta.description) {
238
- const sections = parseDetailSections(content, "doc.temp");
239
- const overview = sections.find((s) => OVERVIEW_HEADING.test(s.heading));
240
- if (overview)
241
- meta.description = snippetAfterHeading(content, overview.heading);
242
- }
243
- }
244
- else {
245
- const purpose = extractBlockquoteAfterBoldField(root, /^(?:Feature Purpose|Purpose)$/i);
246
- if (purpose)
247
- meta.description = purpose;
248
- if (!meta.description) {
249
- const sections = parseDetailSections(content, "doc.temp");
250
- const descSec = sections.find((s) => FEATURE_DESC_HEADING.test(s.heading));
251
- if (descSec)
252
- meta.description = snippetAfterHeading(content, descSec.heading);
253
- }
254
- }
255
- return meta;
256
- }
257
- function listedInForPath(relativePath, kind) {
258
- const p = relativePath.replace(/\\/g, "/").toLowerCase();
259
- if (kind === "useCase") {
260
- if (p.includes("use-case") || p.includes("use-cases") || /\/3-/.test(p)) {
261
- return DEFAULT_LISTED_IN.useCase;
262
- }
263
- }
264
- if (kind === "feature") {
265
- if (p.includes("basic-design") ||
266
- p.includes("system-features") ||
267
- p.includes("04-system-features") ||
268
- /\/4-/.test(p)) {
269
- return DEFAULT_LISTED_IN.feature;
270
- }
271
- }
272
- if (kind === "actor") {
273
- if (p.includes("overall-description") || /\/2-/.test(p)) {
274
- return DEFAULT_LISTED_IN.actor;
275
- }
276
- }
277
- return DEFAULT_LISTED_IN[kind];
278
- }
279
- function emptyParsed() {
280
- return {
281
- useCases: new Map(),
282
- features: new Map(),
283
- actors: new Map(),
284
- satisfies: [],
285
- };
286
- }
287
- function addUseCase(parsed, id, fields) {
288
- const norm = normalizeDomainId(id);
289
- const prev = parsed.useCases.get(norm) ?? {};
290
- const next = { ...prev };
291
- if (fields?.title?.trim() && !prev.title) {
292
- next.title = fields.title.trim();
293
- }
294
- if (fields?.description?.trim() && !prev.description) {
295
- next.description = fields.description.trim();
296
- }
297
- if (fields?.priority?.trim() && !prev.priority) {
298
- next.priority = fields.priority.trim();
299
- }
300
- parsed.useCases.set(norm, next);
301
- }
302
- function addFeature(parsed, id, fields) {
303
- const norm = normalizeDomainId(id);
304
- const prev = parsed.features.get(norm) ?? {};
305
- const next = { ...prev };
306
- if (fields?.title?.trim() && !prev.title) {
307
- next.title = fields.title.trim();
308
- }
309
- if (fields?.description?.trim() && !prev.description) {
310
- next.description = fields.description.trim();
311
- }
312
- parsed.features.set(norm, next);
313
- }
314
- function parseTableSatisfies(line, parsed) {
315
- const cells = line
316
- .split("|")
317
- .map((c) => c.trim())
318
- .filter(Boolean);
319
- if (cells.length < 2) {
320
- return;
321
- }
322
- const fMatch = cells[0]?.match(/^F-(\d+)$/i);
323
- if (!fMatch) {
324
- return;
325
- }
326
- const from = normalizeDomainId(cells[0]);
327
- for (const cell of cells.slice(1)) {
328
- for (const m of cell.matchAll(UC_ID_RE)) {
329
- parsed.satisfies.push({ from, to: normalizeDomainId(m[1]) });
330
- }
331
- }
332
- }
333
- export function extractDomainFromMarkdown(content, relativePath) {
334
- const parsed = emptyParsed();
335
- const root = parseMarkdown(content);
336
- // --- 1. Headings: ## UC-01: Title, ## F-01: Title ---
337
- for (const node of root.children) {
338
- if (node.type !== "heading")
339
- continue;
340
- const text = textContent(node);
341
- const ucm = text.match(/\b(UC-\d+)\b\s*[:\-–—]\s*(.+)$/i);
342
- if (ucm?.[1] && isRealDomainId(ucm[1])) {
343
- addUseCase(parsed, ucm[1], { title: ucm[2]?.trim() });
344
- }
345
- const fm = text.match(/\b(F-\d+)\b\s*[:\-–—]\s*(.+)$/i);
346
- if (fm?.[1] && isRealDomainId(fm[1])) {
347
- addFeature(parsed, fm[1], { title: fm[2]?.trim() });
348
- }
349
- }
350
- // --- 2. Bold field patterns in paragraphs (AST-based) ---
351
- let pendingUcId;
352
- for (const node of root.children) {
353
- if (node.type === "heading" && pendingUcId) {
354
- pendingUcId = undefined;
355
- }
356
- if (node.type !== "paragraph")
357
- continue;
358
- const para = node;
359
- const ucIdVal = extractBoldFieldInParagraph(para, /^Use Case ID$/i);
360
- if (ucIdVal) {
361
- const m = ucIdVal.match(/\b(UC-\d+)\b/i);
362
- if (m?.[1] && isRealDomainId(m[1])) {
363
- pendingUcId = normalizeDomainId(m[1]);
364
- addUseCase(parsed, pendingUcId, {});
365
- }
366
- }
367
- if (pendingUcId) {
368
- const nameVal = extractBoldFieldInParagraph(para, /^Use Case Name$/i);
369
- if (nameVal) {
370
- addUseCase(parsed, pendingUcId, { title: nameVal });
371
- pendingUcId = undefined;
372
- }
373
- }
374
- const fIdVal = extractBoldFieldInParagraph(para, /^Feature ID$/i);
375
- if (fIdVal) {
376
- const m = fIdVal.match(/\b(F-\d+)\b/i);
377
- if (m?.[1] && isRealDomainId(m[1]))
378
- addFeature(parsed, m[1], {});
379
- }
380
- }
381
- // --- 3. Actor extraction from paragraphs and list items (AST-based) ---
382
- visit(root, "paragraph", (para) => {
383
- const actorVal = extractBoldFieldInParagraph(para, /^Primary Actor$/i);
384
- if (actorVal && !/^tbd$/i.test(actorVal) && actorVal.length > 1) {
385
- const id = `actor.${slugActorId(actorVal)}`;
386
- parsed.actors.set(id, { title: actorVal });
387
- }
388
- });
389
- // --- 4. Table rows (line-based: handles GFM and non-GFM pipe tables) ---
390
- for (const line of content.split(/\r?\n/)) {
391
- const ucRow = line.match(TABLE_ROW_UC);
392
- if (ucRow?.[1]) {
393
- const cells = line.split("|").map((c) => c.trim());
394
- const title = cells[2] || cells[1];
395
- addUseCase(parsed, ucRow[1], {
396
- title: title && !/^UC-/i.test(title) ? title : undefined,
397
- });
398
- }
399
- const fRow = line.match(TABLE_ROW_F);
400
- if (fRow?.[1]) {
401
- const cells = line.split("|").map((c) => c.trim());
402
- const title = cells[2] || cells[1];
403
- addFeature(parsed, fRow[1], {
404
- title: title && !/^F-/i.test(title) ? title : undefined,
405
- });
406
- parseTableSatisfies(line, parsed);
407
- }
408
- else if (/^\|.*F-\d+/i.test(line) && /UC-/i.test(line)) {
409
- parseTableSatisfies(line, parsed);
410
- }
411
- }
412
- // --- 5. Global catch-all scan (picks up any remaining UC/F references) ---
413
- for (const m of content.matchAll(UC_ID_RE)) {
414
- if (m[1] && isRealDomainId(m[1]))
415
- addUseCase(parsed, m[1], {});
416
- }
417
- for (const m of content.matchAll(F_ID_RE)) {
418
- if (m[1] && isRealDomainId(m[1]))
419
- addFeature(parsed, m[1], {});
420
- }
421
- // --- 6. Rich metadata from SRS detail files ---
422
- const srsDetailKind = classifySrsDetailFile(relativePath);
423
- if (srsDetailKind) {
424
- const rich = extractDetailDomainMeta(content, srsDetailKind);
425
- if (rich) {
426
- const primary = primaryDomainIdFromDetailContent(content, srsDetailKind);
427
- if (primary) {
428
- if (srsDetailKind === "useCaseDetail") {
429
- addUseCase(parsed, primary.id, rich);
430
- }
431
- else {
432
- addFeature(parsed, primary.id, rich);
433
- }
434
- }
435
- }
436
- }
437
- // --- 7. Basic-design detail metadata ---
438
- const bdKind = classifyBasicDesignDetailFile(relativePath);
439
- if (bdKind) {
440
- const meta = extractBasicDesignDetailMeta(content, bdKind, relativePath);
441
- for (const featureId of meta.featureIds) {
442
- addFeature(parsed, featureId, {
443
- description: extractBasicDesignDetailDescription(content, bdKind),
444
- });
445
- }
446
- }
447
- return parsed;
448
- }
449
- function extractBasicDesignDetailDescription(content, kind) {
450
- if (kind === "apiDetail") {
451
- const meta = extractDetailDomainMeta(content, "featureDetail");
452
- return meta?.description;
453
- }
454
- const root = parseMarkdown(content);
455
- const purpose = extractBlockquoteAfterBoldField(root, /^Purpose$/i);
456
- if (purpose)
457
- return purpose;
458
- const sections = parseDetailSections(content, "doc.temp");
459
- const screenHeading = sections.find((s) => /^##\s*1\.\s*screen/i.test(s.heading));
460
- if (screenHeading) {
461
- return snippetAfterHeading(content, screenHeading.heading);
462
- }
463
- return undefined;
464
- }
465
- function slugActorId(name) {
466
- return name
467
- .toLowerCase()
468
- .replace(/[^a-z0-9]+/g, "-")
469
- .replace(/^-|-$/g, "")
470
- .slice(0, 48) || "unknown";
471
- }
472
- export function parsedDomainToPatch(parsed, relativePath) {
473
- const nodes = [];
474
- const edges = [];
475
- for (const [id, meta] of parsed.useCases) {
476
- const node = { id, type: "useCase", title: meta.title ?? id };
477
- if (meta.description) {
478
- node.description = meta.description;
479
- }
480
- if (meta.priority) {
481
- node.priority = meta.priority;
482
- }
483
- nodes.push(node);
484
- edges.push({
485
- type: "listedIn",
486
- from: id,
487
- to: listedInForPath(relativePath, "useCase"),
488
- });
489
- }
490
- for (const [id, meta] of parsed.features) {
491
- const node = { id, type: "feature", title: meta.title ?? id };
492
- if (meta.description) {
493
- node.description = meta.description;
494
- }
495
- nodes.push(node);
496
- edges.push({
497
- type: "listedIn",
498
- from: id,
499
- to: listedInForPath(relativePath, "feature"),
500
- });
501
- }
502
- for (const [id, meta] of parsed.actors) {
503
- nodes.push({
504
- id,
505
- type: "actor",
506
- title: meta.title ?? id,
507
- name: meta.title,
508
- });
509
- edges.push({
510
- type: "describedIn",
511
- from: id,
512
- to: listedInForPath(relativePath, "actor"),
513
- });
514
- }
515
- const seenSatisfies = new Set();
516
- for (const { from, to } of parsed.satisfies) {
517
- const key = `${from}->${to}`;
518
- if (seenSatisfies.has(key)) {
519
- continue;
520
- }
521
- seenSatisfies.add(key);
522
- if (parsed.features.has(from) && parsed.useCases.has(to)) {
523
- edges.push({ type: "satisfies", from, to });
524
- }
525
- }
526
- return { version: 1, nodes, edges };
527
- }
528
- function buildDetailInstancePatch(opts) {
529
- const path = normalizeRelativePath(opts.relativePath);
530
- const nodes = [
531
- {
532
- id: opts.docId,
533
- type: "document",
534
- output: path,
535
- perDomain: opts.perDomain,
536
- title: opts.title ?? opts.domainId,
537
- ...(opts.description ? { description: opts.description } : {}),
538
- },
539
- {
540
- id: opts.domainId,
541
- type: opts.domainType,
542
- title: opts.title ?? opts.domainId,
543
- ...(opts.description ? { description: opts.description } : {}),
544
- ...(opts.priority ? { priority: opts.priority } : {}),
545
- },
546
- ];
547
- const edges = [
548
- { type: "rendersTo", from: opts.domainId, to: path },
549
- { type: "rendersTo", from: opts.templateDocId, to: path },
550
- { type: "partOf", from: opts.docId, to: opts.templateDocId },
551
- { type: "describedIn", from: opts.domainId, to: opts.docId },
552
- { type: "contains", from: opts.listAnchorId, to: opts.docId },
553
- { type: "tracesTo", from: opts.domainId, to: opts.docId },
554
- ];
555
- const sections = parseDetailSections(opts.content, opts.docId);
556
- const sectionPatch = detailSectionsToPatch(opts.docId, sections, opts.content);
557
- nodes.push(...sectionPatch.nodes);
558
- edges.push(...sectionPatch.edges);
559
- // Anchor to the primary (first) section only — one definedIn is enough for validation
560
- // and avoids flooding the graph with edges to every section.
561
- edges.push({
562
- type: "definedIn",
563
- from: opts.domainId,
564
- to: sections[0]?.id ?? opts.docId,
565
- });
566
- return { version: 1, nodes, edges };
567
- }
568
- function srsDetailFileToPatch(relativePath, content, packConfig) {
569
- const kind = classifySrsDetailFile(relativePath);
570
- if (!kind) {
571
- return { version: 1, nodes: [], edges: [] };
572
- }
573
- const primary = primaryDomainIdFromDetailContent(content, kind);
574
- if (!primary) {
575
- return { version: 1, nodes: [], edges: [] };
576
- }
577
- const perDomain = kind === "useCaseDetail" ? "useCase" : "feature";
578
- const rich = extractDetailDomainMeta(content, kind);
579
- const nodePrefix = packConfig?.nodePrefix;
580
- const templateDocId = packConfig?.perDomainTemplates?.[perDomain] ??
581
- BUILTIN_PER_DOMAIN_TEMPLATE_DOC[perDomain] ??
582
- `doc.srs.${perDomain === "useCase" ? "uc-detail" : "feature-detail"}`;
583
- const listAnchorId = packConfig?.defaultListedIn?.[perDomain] ??
584
- (perDomain === "useCase" ? DEFAULT_LISTED_IN.useCase : DEFAULT_LISTED_IN.feature);
585
- return buildDetailInstancePatch({
586
- relativePath,
587
- content,
588
- docId: documentIdForDomainDetail(kind, primary.id, nodePrefix),
589
- domainId: primary.id,
590
- domainType: perDomain === "useCase" ? "useCase" : "feature",
591
- perDomain,
592
- templateDocId,
593
- listAnchorId,
594
- title: rich?.title ?? primary.title,
595
- description: rich?.description,
596
- priority: rich?.priority,
597
- });
598
- }
599
- function basicDesignDetailFileToPatch(relativePath, content) {
600
- const kind = classifyBasicDesignDetailFile(relativePath);
601
- if (!kind) {
602
- return { version: 1, nodes: [], edges: [] };
603
- }
604
- const meta = extractBasicDesignDetailMeta(content, kind, relativePath);
605
- return buildBasicDesignDetailInstancePatch({
606
- relativePath,
607
- content,
608
- docId: documentIdForBasicDesignDetail(kind, relativePath),
609
- kind,
610
- title: meta.title,
611
- description: extractBasicDesignDetailDescription(content, kind),
612
- featureIds: meta.featureIds,
613
- });
614
- }
615
- /** Document nodes + sections for per-UC/F SRS or per-endpoint/per-screen basic-design files. */
616
- export function detailFileToPatch(relativePath, content, options) {
617
- if (options?.includeListChapterMarkdown !== false) {
618
- const listChapter = basicDesignListChapterFileToPatch(relativePath, content);
619
- if (listChapter.nodes.length > 0 || listChapter.edges.length > 0) {
620
- return listChapter;
621
- }
622
- }
623
- else if (basicDesignListChapterDocumentId(relativePath)) {
624
- return { version: 1, nodes: [], edges: [] };
625
- }
626
- const srs = srsDetailFileToPatch(relativePath, content, options?.packConfig);
627
- if (srs.nodes.length > 0 || srs.edges.length > 0) {
628
- return srs;
629
- }
630
- return basicDesignDetailFileToPatch(relativePath, content);
631
- }
632
- export function mergeParsedDomains(domains) {
633
- const out = emptyParsed();
634
- for (const d of domains) {
635
- for (const [id, meta] of d.useCases) {
636
- addUseCase(out, id, meta);
637
- }
638
- for (const [id, meta] of d.features) {
639
- addFeature(out, id, meta);
640
- }
641
- for (const [id, meta] of d.actors) {
642
- out.actors.set(id, meta);
643
- }
644
- out.satisfies.push(...d.satisfies);
645
- }
646
- return out;
647
- }
648
- /** Per-domain template shells (outputPattern — no section coverage required). */
649
- export function basicDesignPerDomainTemplateNodes() {
650
- return [
651
- {
652
- id: PER_DOMAIN_TEMPLATE_DOC_BD.api,
653
- type: "document",
654
- outputPattern: "docs/basic-design/api/",
655
- perDomain: "apiDetail",
656
- title: "API Detail (template)",
657
- },
658
- {
659
- id: PER_DOMAIN_TEMPLATE_DOC_BD.screen,
660
- type: "document",
661
- outputPattern: "docs/basic-design/screens/",
662
- perDomain: "screenDetail",
663
- title: "Screen Detail (template)",
664
- },
665
- ];
666
- }
667
- /** @deprecated Prefer {@link basicDesignAnchorStructurePatch} — documents only, no sections. */
668
- export function basicDesignAnchorDocumentNodes() {
669
- return [
670
- {
671
- id: DEFAULT_BD_LIST_DOC.apiList,
672
- type: "document",
673
- output: "docs/basic-design/api-list.md",
674
- title: "API List",
675
- },
676
- {
677
- id: DEFAULT_BD_LIST_DOC.screenList,
678
- type: "document",
679
- output: "docs/basic-design/list-screens.md",
680
- title: "Screen Map",
681
- },
682
- {
683
- id: DEFAULT_BD_LIST_DOC.dbDesign,
684
- type: "document",
685
- output: "docs/basic-design/db-design.md",
686
- title: "Database Design",
687
- },
688
- ];
689
- }
690
- /** True when any basic-design list chapter document has no child sections in the graph. */
691
- export function basicDesignListChaptersNeedSections(graph) {
692
- for (const docId of BASIC_DESIGN_LIST_DOCUMENT_IDS) {
693
- const doc = graph.nodesById.get(docId);
694
- if (!doc || doc.type !== "document") {
695
- continue;
696
- }
697
- const hasSection = (graph.outEdges.get(docId) ?? []).some((e) => e.type === "contains" &&
698
- graph.nodesById.get(e.to)?.type === "section");
699
- if (!hasSection) {
700
- return true;
701
- }
702
- }
703
- return false;
704
- }
705
- /** List chapters + section trees from templates; used when bootstrap omitted basic-design registry docs. */
706
- export async function basicDesignAnchorStructurePatch(projectRoot) {
707
- try {
708
- const listDocs = await scanBasicDesignListDocuments(projectRoot);
709
- const listPatches = listDocs.map((d) => registryDocumentToStructurePatch(d));
710
- const templatePatch = {
711
- version: 1,
712
- nodes: basicDesignPerDomainTemplateNodes(),
713
- edges: [],
714
- };
715
- return mergeStructurePatches([...listPatches, templatePatch]);
716
- }
717
- catch {
718
- return {
719
- version: 1,
720
- nodes: [
721
- ...basicDesignAnchorDocumentNodes(),
722
- ...basicDesignPerDomainTemplateNodes(),
723
- ],
724
- edges: [],
725
- };
726
- }
727
- }
728
- export async function buildDocExtractPatch(entries, _projectRoot, options) {
729
- const includeListChapterMarkdown = options?.includeListChapterMarkdown !== false;
730
- const perFile = [];
731
- for (const e of entries) {
732
- perFile.push(extractDomainFromMarkdown(e.content, e.relativePath));
733
- }
734
- const merged = mergeParsedDomains(perFile);
735
- const allNodesMap = new Map();
736
- const allEdges = [];
737
- const edgeKeys = new Set();
738
- let detailDocuments = 0;
739
- let detailSections = 0;
740
- let srsDetailDocuments = 0;
741
- let bdDetailDocuments = 0;
742
- const mergePatchInto = (patch) => {
743
- for (const n of patch.nodes) {
744
- const existing = allNodesMap.get(n.id);
745
- if (!existing) {
746
- allNodesMap.set(n.id, n);
747
- if (n.type === "document" && n.output && !n.outputPattern) {
748
- const isBdInstance = n.perDomain === "apiDetail" || n.perDomain === "screenDetail";
749
- const isSrsInstance = n.perDomain === "useCase" || n.perDomain === "feature";
750
- if (isBdInstance) {
751
- detailDocuments++;
752
- bdDetailDocuments++;
753
- }
754
- else if (isSrsInstance) {
755
- detailDocuments++;
756
- srsDetailDocuments++;
757
- }
758
- }
759
- if (n.type === "section" &&
760
- typeof n.documentId === "string" &&
761
- (n.documentId.startsWith("doc.srs.") ||
762
- n.documentId.startsWith("doc.bd.") ||
763
- allNodesMap.get(n.documentId)?.perDomain != null)) {
764
- detailSections++;
765
- }
766
- }
767
- else {
768
- const merged = { ...existing, ...n };
769
- if (!n.title && existing.title) {
770
- merged.title = existing.title;
771
- }
772
- if (!n.description && existing.description) {
773
- merged.description = existing.description;
774
- }
775
- if (n.type === "document" && !n.output && existing.output) {
776
- merged.output = existing.output;
777
- }
778
- allNodesMap.set(n.id, merged);
779
- }
780
- }
781
- for (const edge of patch.edges) {
782
- const key = `${edge.type}:${edge.from}:${edge.to}`;
783
- if (!edgeKeys.has(key)) {
784
- edgeKeys.add(key);
785
- allEdges.push(edge);
786
- }
787
- }
788
- };
789
- const hasBasicDesignFiles = entries.some((e) => normalizeRelativePath(e.relativePath).toLowerCase().startsWith("docs/basic-design/"));
790
- if (hasBasicDesignFiles) {
791
- mergePatchInto({
792
- version: 1,
793
- nodes: [
794
- ...basicDesignAnchorDocumentNodes(),
795
- ...basicDesignPerDomainTemplateNodes(),
796
- ],
797
- edges: [],
798
- });
799
- }
800
- for (const e of entries) {
801
- const single = extractDomainFromMarkdown(e.content, e.relativePath);
802
- mergePatchInto(parsedDomainToPatch(single, e.relativePath));
803
- mergePatchInto(detailFileToPatch(e.relativePath, e.content, {
804
- includeListChapterMarkdown,
805
- }));
806
- }
807
- return {
808
- patch: { version: 1, nodes: [...allNodesMap.values()], edges: allEdges },
809
- stats: {
810
- useCases: merged.useCases.size,
811
- features: merged.features.size,
812
- actors: merged.actors.size,
813
- detailDocuments,
814
- detailSections,
815
- srsDetailDocuments,
816
- bdDetailDocuments,
817
- filesScanned: entries.length,
818
- },
819
- };
820
- }
821
- //# sourceMappingURL=doc-extract.js.map