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,766 +0,0 @@
1
- function escapeJsonForScript(data) {
2
- return JSON.stringify(data).replace(/</g, "\\u003c");
3
- }
4
- export function buildVisualizationHtml(payload) {
5
- const embedded = escapeJsonForScript(payload);
6
- return `<!DOCTYPE html>
7
- <html lang="en">
8
- <head>
9
- <meta charset="utf-8" />
10
- <meta name="viewport" content="width=device-width, initial-scale=1" />
11
- <title>AI Spector — Graph &amp; Knowledge</title>
12
- <script src="https://cdn.jsdelivr.net/npm/vis-network@9.1.9/standalone/umd/vis-network.min.js"></script>
13
- <style>
14
- :root {
15
- --bg: #0f1419;
16
- --panel: #1a2332;
17
- --border: #2d3a4d;
18
- --text: #e7ecf3;
19
- --muted: #8b9cb3;
20
- --accent: #3b82f6;
21
- --green: #22c55e;
22
- --red: #f87171;
23
- }
24
- * { box-sizing: border-box; }
25
- body {
26
- margin: 0;
27
- font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
28
- background: var(--bg);
29
- color: var(--text);
30
- min-height: 100vh;
31
- }
32
- header {
33
- padding: 0.75rem 1.25rem;
34
- border-bottom: 1px solid var(--border);
35
- display: flex;
36
- flex-wrap: wrap;
37
- gap: 0.5rem 1.5rem;
38
- align-items: baseline;
39
- }
40
- header h1 { margin: 0; font-size: 1.05rem; font-weight: 600; }
41
- header .meta { color: var(--muted); font-size: 0.8rem; }
42
- nav.tabs {
43
- display: flex;
44
- gap: 0.25rem;
45
- padding: 0.5rem 1.25rem 0;
46
- border-bottom: 1px solid var(--border);
47
- }
48
- nav.tabs button {
49
- background: transparent;
50
- border: none;
51
- color: var(--muted);
52
- padding: 0.5rem 1rem;
53
- cursor: pointer;
54
- font-size: 0.875rem;
55
- border-bottom: 2px solid transparent;
56
- margin-bottom: -1px;
57
- }
58
- nav.tabs button.active { color: var(--text); border-bottom-color: var(--accent); }
59
- .panel { display: none; padding: 1rem 1.25rem 1.5rem; }
60
- .panel.active { display: block; }
61
-
62
- /* Overview */
63
- .stats-grid {
64
- display: grid;
65
- grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
66
- gap: 0.6rem;
67
- margin-bottom: 1rem;
68
- }
69
- .stat-card {
70
- background: var(--panel);
71
- border: 1px solid var(--border);
72
- border-radius: 8px;
73
- padding: 0.65rem 0.9rem;
74
- }
75
- .stat-card .label { font-size: 0.72rem; color: var(--muted); }
76
- .stat-card .value { font-size: 1.3rem; font-weight: 600; margin-top: 0.15rem; }
77
- .section-title { font-size: 0.9rem; margin: 1.1rem 0 0.45rem; color: var(--muted); font-weight: 500; }
78
-
79
- /* Graph panel */
80
- .graph-layout {
81
- display: grid;
82
- grid-template-columns: 1fr 300px;
83
- gap: 0.75rem;
84
- align-items: start;
85
- }
86
- @media (max-width: 900px) { .graph-layout { grid-template-columns: 1fr; } }
87
- .graph-main {}
88
- .graph-toolbar {
89
- display: flex;
90
- flex-wrap: wrap;
91
- gap: 0.5rem 0.75rem;
92
- align-items: center;
93
- margin-bottom: 0.6rem;
94
- }
95
- .graph-toolbar label { font-size: 0.82rem; color: var(--muted); display: flex; align-items: center; gap: 0.35rem; }
96
- .graph-toolbar select, .graph-toolbar input[type=search], .graph-toolbar input[type=text] {
97
- background: var(--panel);
98
- border: 1px solid var(--border);
99
- color: var(--text);
100
- padding: 0.3rem 0.55rem;
101
- border-radius: 6px;
102
- font-size: 0.82rem;
103
- }
104
- .toolbar-btn {
105
- background: var(--panel);
106
- border: 1px solid var(--border);
107
- color: var(--text);
108
- padding: 0.3rem 0.65rem;
109
- border-radius: 6px;
110
- font-size: 0.82rem;
111
- cursor: pointer;
112
- }
113
- .toolbar-btn:hover { border-color: var(--accent); }
114
- .toolbar-btn.active { border-color: var(--accent); color: var(--accent); }
115
- #graph-network {
116
- width: 100%;
117
- height: min(68vh, 620px);
118
- border: 1px solid var(--border);
119
- border-radius: 8px;
120
- background: #121820;
121
- }
122
- .legend {
123
- display: flex;
124
- flex-wrap: wrap;
125
- gap: 0.4rem 0.9rem;
126
- margin-top: 0.5rem;
127
- font-size: 0.72rem;
128
- color: var(--muted);
129
- }
130
- .legend span { display: inline-flex; align-items: center; gap: 0.3rem; cursor: pointer; }
131
- .legend span:hover { color: var(--text); }
132
- .legend i { width: 9px; height: 9px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
133
-
134
- /* Side panel / node detail */
135
- .side-panel {
136
- background: var(--panel);
137
- border: 1px solid var(--border);
138
- border-radius: 8px;
139
- padding: 0.75rem;
140
- font-size: 0.82rem;
141
- min-height: 200px;
142
- max-height: min(68vh, 620px);
143
- overflow-y: auto;
144
- }
145
- .side-panel .node-id { font-size: 0.78rem; color: var(--muted); margin-bottom: 0.3rem; font-family: ui-monospace, monospace; word-break: break-all; }
146
- .side-panel .node-title { font-weight: 600; font-size: 0.95rem; margin-bottom: 0.5rem; }
147
- .side-panel .node-type { display: inline-block; padding: 0.1rem 0.4rem; border-radius: 4px; font-size: 0.7rem; margin-bottom: 0.6rem; }
148
- .side-panel .edge-section { margin-top: 0.6rem; }
149
- .side-panel .edge-section-title { font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.3rem; }
150
- .side-panel .edge-group { margin-bottom: 0.4rem; }
151
- .side-panel .edge-type-label { font-size: 0.72rem; color: var(--muted); margin-bottom: 0.15rem; }
152
- .side-panel .edge-item {
153
- display: flex;
154
- align-items: center;
155
- gap: 0.4rem;
156
- padding: 0.2rem 0;
157
- cursor: pointer;
158
- border-radius: 4px;
159
- }
160
- .side-panel .edge-item:hover { background: rgba(59,130,246,0.1); }
161
- .side-panel .edge-item .ei-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
162
- .side-panel .edge-item .ei-label { font-size: 0.78rem; color: var(--text); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
163
- .side-panel .edge-item .ei-type { font-size: 0.68rem; color: var(--muted); flex-shrink: 0; }
164
- .side-panel .props { margin-top: 0.5rem; }
165
- .side-panel .prop-row { display: flex; gap: 0.5rem; padding: 0.15rem 0; border-bottom: 1px solid var(--border); font-size: 0.78rem; }
166
- .side-panel .prop-key { color: var(--muted); flex-shrink: 0; min-width: 80px; }
167
- .side-panel .prop-val { color: var(--text); word-break: break-word; }
168
- .side-panel .hint { color: var(--muted); font-style: italic; }
169
- #focus-btn { display: none; }
170
-
171
- /* Edge filter */
172
- .edge-filter-bar {
173
- display: flex;
174
- flex-wrap: wrap;
175
- gap: 0.3rem 0.5rem;
176
- margin-bottom: 0.6rem;
177
- }
178
- .ef-chip {
179
- display: inline-flex;
180
- align-items: center;
181
- gap: 0.25rem;
182
- padding: 0.18rem 0.5rem;
183
- border-radius: 20px;
184
- font-size: 0.72rem;
185
- cursor: pointer;
186
- border: 1px solid var(--border);
187
- background: var(--bg);
188
- color: var(--muted);
189
- transition: all 0.1s;
190
- }
191
- .ef-chip.on { background: var(--panel); color: var(--text); border-color: var(--accent); }
192
- .ef-chip i { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); display: inline-block; }
193
-
194
- /* Tables */
195
- table.data { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
196
- table.data th, table.data td { text-align: left; padding: 0.45rem 0.65rem; border-bottom: 1px solid var(--border); }
197
- table.data th { color: var(--muted); font-weight: 500; }
198
- table.data tr:hover td { background: var(--panel); }
199
- .empty { color: var(--muted); font-style: italic; padding: 0.75rem 0; }
200
- .badge { display: inline-block; padding: 0.12rem 0.4rem; border-radius: 4px; font-size: 0.68rem; background: var(--border); margin-left: 0.3rem; }
201
- .status-ok { color: var(--green); }
202
- .status-miss { color: var(--red); }
203
- </style>
204
- </head>
205
- <body>
206
- <header>
207
- <h1>AI Spector — Traceability Graph</h1>
208
- <span class="meta" id="header-meta"></span>
209
- </header>
210
- <nav class="tabs" role="tablist">
211
- <button type="button" class="active" data-tab="overview">Overview</button>
212
- <button type="button" data-tab="graph">Graph</button>
213
- <button type="button" data-tab="knowledge">Knowledge</button>
214
- </nav>
215
-
216
- <section id="panel-overview" class="panel active"></section>
217
-
218
- <section id="panel-graph" class="panel">
219
- <div class="graph-toolbar">
220
- <label>View
221
- <select id="filter-view">
222
- <option value="all">Full graph</option>
223
- <option value="domain">Domain + documents</option>
224
- <option value="structure">Documents + sections</option>
225
- </select>
226
- </label>
227
- <label>Search <input type="search" id="filter-search" placeholder="id or title…" style="width:160px" /></label>
228
- <label>Layout
229
- <select id="filter-layout">
230
- <option value="physics">Force</option>
231
- <option value="hierarchical">Hierarchical</option>
232
- </select>
233
- </label>
234
- <button class="toolbar-btn" id="focus-btn" title="Show only selected node and neighbors">Focus</button>
235
- <button class="toolbar-btn" id="reset-btn">Reset view</button>
236
- </div>
237
- <div class="edge-filter-bar" id="edge-filter-bar"></div>
238
- <div class="graph-layout">
239
- <div class="graph-main">
240
- <div id="graph-network"></div>
241
- <div class="legend" id="legend"></div>
242
- </div>
243
- <div class="side-panel" id="node-detail">
244
- <div class="hint">Click a node to inspect its properties and connections.</div>
245
- </div>
246
- </div>
247
- </section>
248
-
249
- <section id="panel-knowledge" class="panel"></section>
250
-
251
- <script type="application/json" id="payload">${embedded}</script>
252
- <script>
253
- (function () {
254
- const P = JSON.parse(document.getElementById("payload").textContent);
255
-
256
- const NODE_COLORS = {
257
- document: "#3b82f6",
258
- file: "#38bdf8",
259
- source: "#14b8a6",
260
- section: "#64748b",
261
- table: "#475569",
262
- diagram: "#475569",
263
- actor: "#a855f7",
264
- useCase: "#22c55e",
265
- feature: "#f59e0b",
266
- requirement: "#ec4899",
267
- nfr: "#f97316",
268
- dataEntity: "#06b6d4",
269
- };
270
-
271
- const STRUCTURE = new Set(["document", "section", "table", "diagram"]);
272
- const DOMAIN_TYPES = new Set(["actor", "useCase", "feature", "requirement", "nfr", "dataEntity"]);
273
-
274
- // All edge types in graph
275
- const allEdgeTypes = [...new Set(P.graph.edges.map((e) => e.type))].sort();
276
- // Which edge types are shown (default: all on)
277
- const edgeTypeOn = new Set(allEdgeTypes);
278
-
279
- // ---- TABS ----
280
- document.querySelectorAll("nav.tabs button").forEach((btn) => {
281
- btn.addEventListener("click", () => {
282
- document.querySelectorAll("nav.tabs button").forEach((b) => b.classList.remove("active"));
283
- document.querySelectorAll(".panel").forEach((p) => p.classList.remove("active"));
284
- btn.classList.add("active");
285
- document.getElementById("panel-" + btn.dataset.tab).classList.add("active");
286
- // Defer initGraph so the browser can reflow the panel (display:none → block)
287
- // before vis-network measures the container dimensions.
288
- if (btn.dataset.tab === "graph" && !window.__network) {
289
- requestAnimationFrame(() => initGraph());
290
- } else if (btn.dataset.tab === "graph") {
291
- requestAnimationFrame(() => window.__network && window.__network.redraw());
292
- }
293
- });
294
- });
295
-
296
- document.getElementById("header-meta").textContent =
297
- P.projectRoot + " · " + new Date(P.generatedAt).toLocaleString();
298
-
299
- const EDGE_MEANINGS = {
300
- partOf: "section belongs to document",
301
- contains: "document/section contains another",
302
- follows: "section ordering",
303
- references: "cross-reference",
304
- listedIn: "domain node listed in section",
305
- definedIn: "domain node detailed in section",
306
- describedIn: "domain node described by section",
307
- satisfies: "feature satisfies use case",
308
- dependsOn: "document depends on another document",
309
- requires: "domain node requires another",
310
- tracesTo: "requirement traces to document",
311
- derivedFrom: "node derived from source file",
312
- rendersTo: "graph node renders to markdown path",
313
- relatesTo: "semantic link (evidence)",
314
- };
315
-
316
- // ---- OVERVIEW ----
317
- const ov = document.getElementById("panel-overview");
318
- const gs = P.graphStats;
319
- const ks = P.knowledgeStats;
320
- ov.innerHTML =
321
- '<div class="stats-grid">' +
322
- stat("Graph nodes", gs.nodes) +
323
- stat("Graph edges", gs.edges) +
324
- stat("Domain nodes", gs.domainNodes) +
325
- stat("Structure nodes", gs.structureNodes) +
326
- (ks.present ? stat("Knowledge UCs", ks.useCases) : "") +
327
- (ks.present ? stat("Knowledge features", ks.features) : stat("Knowledge", "—")) +
328
- "</div>" +
329
- '<p class="section-title">Nodes by type</p>' +
330
- typeTable(gs.byType) +
331
- '<p class="section-title">Edge types</p>' +
332
- edgeTypeTable();
333
-
334
- function stat(label, value) {
335
- return '<div class="stat-card"><div class="label">' + label + '</div><div class="value">' + value + "</div></div>";
336
- }
337
- function typeTable(byType) {
338
- return '<table class="data"><thead><tr><th>Type</th><th>Count</th></tr></thead><tbody>' +
339
- Object.entries(byType).sort((a, b) => b[1] - a[1])
340
- .map(([t, n]) => '<tr><td><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:' + (NODE_COLORS[t] || "#94a3b8") + ';margin-right:6px"></span>' + t + '</td><td>' + n + '</td></tr>').join("") +
341
- '</tbody></table>';
342
- }
343
- function edgeTypeTable() {
344
- const counts = {};
345
- for (const e of P.graph.edges) counts[e.type] = (counts[e.type] || 0) + 1;
346
- return '<table class="data"><thead><tr><th>Edge type</th><th>Count</th><th>Meaning</th></tr></thead><tbody>' +
347
- Object.entries(counts).sort((a, b) => b[1] - a[1]).map(([t, n]) => '<tr><td>' + t + '</td><td>' + n + '</td><td style="color:var(--muted);font-size:0.78rem">' + EDGE_MEANINGS[t] + "</td></tr>").join("") +
348
- '</tbody></table>';
349
- }
350
-
351
- // ---- EDGE FILTER CHIPS ----
352
- const efBar = document.getElementById("edge-filter-bar");
353
- for (const et of allEdgeTypes) {
354
- const chip = document.createElement("span");
355
- chip.className = "ef-chip on";
356
- chip.dataset.et = et;
357
- chip.innerHTML = '<i></i>' + et;
358
- chip.title = EDGE_MEANINGS[et] || et;
359
- chip.addEventListener("click", () => {
360
- if (edgeTypeOn.has(et)) { edgeTypeOn.delete(et); chip.classList.remove("on"); }
361
- else { edgeTypeOn.add(et); chip.classList.add("on"); }
362
- rebuildGraph();
363
- });
364
- efBar.appendChild(chip);
365
- }
366
-
367
- // ---- KNOWLEDGE PANEL ----
368
- const kn = document.getElementById("panel-knowledge");
369
- if (!P.knowledge || !ks.present) {
370
- kn.innerHTML = '<p class="empty">No knowledge.json loaded — run /analyze in Cursor.</p>';
371
- } else {
372
- const graphIds = new Set(P.graph.nodes.map((n) => n.id));
373
- kn.innerHTML =
374
- knowledgeTable("Actors", P.knowledge.actors, ["id", "name", "title"], graphIds) +
375
- knowledgeTable("Use cases", P.knowledge.useCases, ["id", "title", "priority"], graphIds) +
376
- knowledgeTable("Features", P.knowledge.features, ["id", "title", "satisfies"], graphIds) +
377
- knowledgeTable("Functional requirements", P.knowledge.functionalRequirements, ["id", "title", "tracesTo"], graphIds) +
378
- knowledgeTable("NFRs", P.knowledge.nfrs, ["id", "title"], graphIds) +
379
- knowledgeTable("Data entities", P.knowledge.entities, ["id", "name"], graphIds);
380
- }
381
-
382
- function knowledgeTable(title, rows, cols, graphIds) {
383
- if (!rows || !rows.length) return '<p class="section-title">' + title + ' <span class="badge">0</span></p><p class="empty">(empty)</p>';
384
- const inGraph = rows.filter((r) => graphIds.has(r.id)).length;
385
- const head = "<th>In graph</th>" + cols.map((c) => "<th>" + c + "</th>").join("");
386
- const body = rows.map((row) => {
387
- const merged = graphIds.has(row.id);
388
- const statusCell = '<td class="' + (merged ? "status-ok" : "status-miss") + '">' + (merged ? "✓" : "✗") + "</td>";
389
- const dataCells = cols.map((c) => {
390
- let v = row[c];
391
- if (Array.isArray(v)) v = v.join(", ");
392
- if (v === undefined || v === null) v = "";
393
- return "<td>" + escapeHtml(String(v)) + "</td>";
394
- }).join("");
395
- return "<tr>" + statusCell + dataCells + "</tr>";
396
- }).join("");
397
- return '<p class="section-title">' + title +
398
- ' <span class="badge">' + rows.length + "</span>" +
399
- ' <span class="badge status-ok">' + inGraph + " in graph</span>" +
400
- (inGraph < rows.length ? ' <span class="badge status-miss">' + (rows.length - inGraph) + " missing</span>" : "") +
401
- "</p>" +
402
- '<table class="data"><thead><tr>' + head + "</tr></thead><tbody>" + body + "</tbody></table>";
403
- }
404
-
405
- function escapeHtml(s) {
406
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
407
- }
408
-
409
- // ---- LEGEND ----
410
- const legend = document.getElementById("legend");
411
- legend.innerHTML = Object.entries(NODE_COLORS).map(([t, c]) =>
412
- '<span title="Click to highlight" data-ntype="' + t + '"><i style="background:' + c + '"></i>' + t + "</span>"
413
- ).join("");
414
- legend.querySelectorAll("span").forEach((span) => {
415
- span.addEventListener("click", () => {
416
- const t = span.dataset.ntype;
417
- if (window.__network) {
418
- const ids = P.graph.nodes.filter((n) => n.type === t).map((n) => n.id);
419
- window.__network.selectNodes(ids);
420
- if (ids.length) window.__network.focus(ids[0], { scale: 1.2, animation: true });
421
- }
422
- });
423
- });
424
-
425
- // ---- GRAPH ----
426
- let network = null;
427
- let focusedNodeId = null;
428
- window.__network = null;
429
-
430
- function fileNodeId(path) { return "file:" + path; }
431
- function sourceNodeId(path) { return "source:" + path; }
432
-
433
- function nodeLabel(n) {
434
- const t = n.title || n.heading || n.name || n.id;
435
- return t.length > 36 ? t.slice(0, 34) + "…" : t;
436
- }
437
-
438
- function domainLinkedStructureIds(domainIds) {
439
- const linked = new Set();
440
- for (const e of P.graph.edges) {
441
- if (!["listedIn", "definedIn", "describedIn"].includes(e.type)) continue;
442
- if (!domainIds.has(e.from)) continue;
443
- const target = P.graph.nodes.find((n) => n.id === e.to);
444
- if (target && (STRUCTURE.has(target.type) || target.type === "document")) linked.add(e.to);
445
- }
446
- return linked;
447
- }
448
-
449
- function domainLinkedSourceIds(domainIds) {
450
- const linked = new Set();
451
- for (const e of P.graph.edges) {
452
- if (e.type !== "derivedFrom" || !domainIds.has(e.from)) continue;
453
- linked.add(sourceNodeId(e.to));
454
- }
455
- return linked;
456
- }
457
-
458
- function filterNodes(viewMode, search, focusId) {
459
- const q = (search || "").trim().toLowerCase();
460
- let nodes = P.graph.nodes.filter((n) => {
461
- if (viewMode === "structure") return STRUCTURE.has(n.type);
462
- if (viewMode === "domain") return n.type !== "table" && n.type !== "diagram";
463
- return true;
464
- });
465
-
466
- if (q) {
467
- nodes = nodes.filter((n) => {
468
- const hay = (n.id + " " + (n.title || "") + " " + (n.heading || "") + " " + (n.name || "")).toLowerCase();
469
- return hay.includes(q);
470
- });
471
- return nodes;
472
- }
473
-
474
- if (focusId) {
475
- const neighbors = new Set([focusId]);
476
- for (const e of P.graph.edges) {
477
- if (!edgeTypeOn.has(e.type)) continue;
478
- if (e.from === focusId) neighbors.add(e.to);
479
- if (e.to === focusId) neighbors.add(e.from);
480
- }
481
- return nodes.filter((n) => neighbors.has(n.id));
482
- }
483
-
484
- if (viewMode === "domain") {
485
- const domainIds = new Set(nodes.filter((n) => DOMAIN_TYPES.has(n.type)).map((n) => n.id));
486
- const linked = domainLinkedStructureIds(domainIds);
487
- const srcLinked = domainLinkedSourceIds(domainIds);
488
- return nodes.filter((n) => DOMAIN_TYPES.has(n.type) || linked.has(n.id) || srcLinked.has(n.id));
489
- }
490
- return nodes;
491
- }
492
-
493
- function buildVisData(viewMode, search, focusId) {
494
- const nodes = filterNodes(viewMode, search, focusId);
495
- const ids = new Set(nodes.map((n) => n.id));
496
- const pathsWithDocument = new Set(
497
- P.graph.nodes.filter((n) => n.type === "document" && typeof n.output === "string").map((n) => n.output)
498
- );
499
- const fileNodes = new Map();
500
- const sourceNodes = new Map();
501
- for (const e of P.graph.edges) {
502
- if (!edgeTypeOn.has(e.type)) continue;
503
- if (e.type === "derivedFrom" && ids.has(e.from)) {
504
- const sid = sourceNodeId(e.to);
505
- if (!sourceNodes.has(sid)) {
506
- const base = e.to.split("/").pop() || e.to;
507
- sourceNodes.set(sid, { id: sid, type: "source", title: base, output: e.to });
508
- }
509
- continue;
510
- }
511
- if (e.type !== "rendersTo" || !ids.has(e.from) || ids.has(e.to) || pathsWithDocument.has(e.to)) continue;
512
- const fid = fileNodeId(e.to);
513
- if (!fileNodes.has(fid)) {
514
- const base = e.to.split("/").pop() || e.to;
515
- fileNodes.set(fid, { id: fid, type: "file", title: base, output: e.to });
516
- }
517
- }
518
- const pathToDocId = new Map();
519
- for (const n of P.graph.nodes) {
520
- if (n.type === "document" && typeof n.output === "string") pathToDocId.set(n.output, n.id);
521
- }
522
- const allNodes = nodes.concat([...fileNodes.values()], [...sourceNodes.values()]);
523
- const allIds = new Set(allNodes.map((n) => n.id));
524
- function resolveTarget(to) {
525
- if (allIds.has(to)) return to;
526
- const d = pathToDocId.get(to);
527
- if (d && allIds.has(d)) return d;
528
- if (fileNodes.has(fileNodeId(to))) return fileNodeId(to);
529
- if (sourceNodes.has(sourceNodeId(to))) return sourceNodeId(to);
530
- return null;
531
- }
532
- const visNodes = allNodes.map((n) => {
533
- const isFocused = n.id === focusId;
534
- const isNeighbor = focusId && n.id !== focusId;
535
- return {
536
- id: n.id,
537
- label: nodeLabel(n),
538
- title: buildTooltip(n),
539
- color: {
540
- background: isFocused ? "#facc15" : (NODE_COLORS[n.type] || "#94a3b8"),
541
- border: isFocused ? "#f59e0b" : (NODE_COLORS[n.type] || "#94a3b8"),
542
- highlight: { background: "#facc15", border: "#f59e0b" },
543
- },
544
- opacity: focusId && !isFocused ? 0.4 : 1,
545
- font: { color: "#e7ecf3", size: 11 },
546
- shape: STRUCTURE.has(n.type) || n.type === "file" || n.type === "source" ? "box" : "dot",
547
- size: n.type === "section" ? 10 : STRUCTURE.has(n.type) ? 12 : n.type === "file" || n.type === "source" ? 13 : 18,
548
- borderWidth: isFocused ? 3 : 1,
549
- };
550
- });
551
- const visEdges = P.graph.edges
552
- .filter((e) => edgeTypeOn.has(e.type))
553
- .map((e) => ({ e, to: resolveTarget(e.to) }))
554
- .filter(({ e, to }) => to !== null && allIds.has(e.from))
555
- .map(({ e, to }, i) => ({
556
- id: i,
557
- from: e.from,
558
- to,
559
- label: e.type,
560
- font: { size: 9, color: "#8b9cb3", strokeWidth: 0 },
561
- color: { color: "#3a4a5e", highlight: "#60a5fa" },
562
- arrows: "to",
563
- smooth: { type: "dynamic" },
564
- }));
565
- return { nodes: new vis.DataSet(visNodes), edges: new vis.DataSet(visEdges) };
566
- }
567
-
568
- function buildTooltip(n) {
569
- const props = Object.entries(n)
570
- .filter(([k]) => !["id", "type"].includes(k))
571
- .map(([k, v]) => k + ": " + (typeof v === "object" ? JSON.stringify(v) : v))
572
- .join("\\n");
573
- return "<pre style=\\"margin:0;font-size:11px;max-width:320px;white-space:pre-wrap\\">" + escapeHtml((n.id || "") + " [" + n.type + "]\\n" + props) + "</pre>";
574
- }
575
-
576
- function graphEmptyMsg() {
577
- const container = document.getElementById("graph-network");
578
- if (P.graph.nodes.length === 0) {
579
- container.innerHTML = '<div style="color:#8b9cb3;padding:2rem;text-align:center">Graph is empty — run <code>npx ai-spector analyze</code> then <code>npx ai-spector graph merge</code></div>';
580
- return true;
581
- }
582
- return false;
583
- }
584
-
585
- function rebuildGraph() {
586
- if (!window.__network) return;
587
- const viewMode = document.getElementById("filter-view").value;
588
- const search = document.getElementById("filter-search").value;
589
- const data = buildVisData(viewMode, search, focusedNodeId);
590
- window.__network.setData(data);
591
- applyLayout();
592
- }
593
-
594
- function applyLayout() {
595
- if (!window.__network) return;
596
- const layout = document.getElementById("filter-layout").value;
597
- if (layout === "hierarchical") {
598
- window.__network.setOptions({
599
- layout: { hierarchical: { enabled: true, direction: "UD", sortMethod: "hubsize", nodeSpacing: 120 } },
600
- physics: { enabled: false },
601
- });
602
- } else {
603
- window.__network.setOptions({
604
- layout: { hierarchical: { enabled: false } },
605
- physics: { enabled: true, stabilization: { iterations: 100 } },
606
- });
607
- }
608
- }
609
-
610
- function initGraph() {
611
- if (graphEmptyMsg()) return;
612
- const container = document.getElementById("graph-network");
613
- const viewMode = document.getElementById("filter-view").value;
614
- const search = document.getElementById("filter-search").value;
615
- const data = buildVisData(viewMode, search, null);
616
- network = new vis.Network(container, data, {
617
- physics: { enabled: true, stabilization: { iterations: 100 } },
618
- interaction: { hover: true, tooltipDelay: 100, multiselect: false },
619
- layout: { improvedLayout: true },
620
- });
621
- window.__network = network;
622
-
623
- network.on("click", (params) => {
624
- if (!params.nodes.length) {
625
- renderDetail(null);
626
- return;
627
- }
628
- const id = params.nodes[0];
629
- renderDetail(id);
630
- document.getElementById("focus-btn").style.display = "inline-block";
631
- });
632
-
633
- network.on("doubleClick", (params) => {
634
- if (!params.nodes.length) return;
635
- toggleFocus(params.nodes[0]);
636
- });
637
- }
638
-
639
- function toggleFocus(id) {
640
- if (focusedNodeId === id) {
641
- focusedNodeId = null;
642
- document.getElementById("focus-btn").classList.remove("active");
643
- } else {
644
- focusedNodeId = id;
645
- document.getElementById("focus-btn").classList.add("active");
646
- }
647
- rebuildGraph();
648
- }
649
-
650
- document.getElementById("focus-btn").addEventListener("click", () => {
651
- if (focusedNodeId) toggleFocus(focusedNodeId);
652
- });
653
-
654
- document.getElementById("reset-btn").addEventListener("click", () => {
655
- focusedNodeId = null;
656
- document.getElementById("focus-btn").classList.remove("active");
657
- document.getElementById("filter-search").value = "";
658
- rebuildGraph();
659
- if (window.__network) window.__network.fit({ animation: true });
660
- });
661
-
662
- ["filter-view", "filter-search", "filter-layout"].forEach((id) => {
663
- const el = document.getElementById(id);
664
- el.addEventListener("change", () => {
665
- focusedNodeId = null;
666
- rebuildGraph();
667
- if (id === "filter-layout") applyLayout();
668
- });
669
- el.addEventListener("input", () => rebuildGraph());
670
- });
671
-
672
- // ---- NODE DETAIL PANEL ----
673
- function renderDetail(id) {
674
- const detail = document.getElementById("node-detail");
675
- if (!id) {
676
- detail.innerHTML = '<div class="hint">Click a node to inspect. Double-click to focus its neighborhood.</div>';
677
- return;
678
- }
679
- const node = P.graph.nodes.find((n) => n.id === id);
680
- if (!node) {
681
- detail.innerHTML = '<div class="hint">Node not in base graph (file/source node).</div>';
682
- return;
683
- }
684
-
685
- // Partition edges
686
- const outEdges = P.graph.edges.filter((e) => e.from === id);
687
- const inEdges = P.graph.edges.filter((e) => e.to === id);
688
-
689
- function groupByType(edges, dir) {
690
- const groups = {};
691
- for (const e of edges) {
692
- const key = e.type;
693
- if (!groups[key]) groups[key] = [];
694
- const otherId = dir === "out" ? e.to : e.from;
695
- const otherNode = P.graph.nodes.find((n) => n.id === otherId);
696
- const label = otherNode ? (otherNode.title || otherNode.heading || otherNode.name || otherId) : otherId;
697
- const type = otherNode ? otherNode.type : "?";
698
- groups[key].push({ id: otherId, label, type });
699
- }
700
- return groups;
701
- }
702
-
703
- function renderEdgeGroups(groups, dir) {
704
- const entries = Object.entries(groups);
705
- if (!entries.length) return '<div class="hint" style="font-size:0.75rem">none</div>';
706
- return entries.map(([et, items]) =>
707
- '<div class="edge-group">' +
708
- '<div class="edge-type-label">' + et + ' (' + items.length + ')</div>' +
709
- items.slice(0, 12).map((item) =>
710
- '<div class="edge-item" data-target="' + escapeHtml(item.id) + '">' +
711
- '<span class="ei-dot" style="background:' + (NODE_COLORS[item.type] || "#94a3b8") + '"></span>' +
712
- '<span class="ei-label" title="' + escapeHtml(item.id) + '">' + escapeHtml(item.label) + '</span>' +
713
- '<span class="ei-type">' + item.type + '</span>' +
714
- '</div>'
715
- ).join("") +
716
- (items.length > 12 ? '<div style="font-size:0.72rem;color:var(--muted);padding:0.1rem 0">+' + (items.length - 12) + ' more…</div>' : "") +
717
- "</div>"
718
- ).join("");
719
- }
720
-
721
- // Render props (exclude standard fields)
722
- const skipKeys = new Set(["id", "type", "title", "heading", "name"]);
723
- const propRows = Object.entries(node)
724
- .filter(([k]) => !skipKeys.has(k))
725
- .map(([k, v]) => {
726
- const val = typeof v === "object" ? JSON.stringify(v) : String(v ?? "");
727
- return '<div class="prop-row"><span class="prop-key">' + escapeHtml(k) + '</span><span class="prop-val">' + escapeHtml(val) + '</span></div>';
728
- }).join("");
729
-
730
- const outGroups = groupByType(outEdges, "out");
731
- const inGroups = groupByType(inEdges, "in");
732
-
733
- detail.innerHTML =
734
- '<div class="node-id">' + escapeHtml(node.id) + '</div>' +
735
- '<div class="node-title">' + escapeHtml(node.title || node.heading || node.name || node.id) + '</div>' +
736
- '<div><span class="node-type" style="background:' + (NODE_COLORS[node.type] || "#64748b") + '33;color:' + (NODE_COLORS[node.type] || "#94a3b8") + '">' + node.type + '</span></div>' +
737
- (propRows ? '<div class="props">' + propRows + '</div>' : '') +
738
- '<div class="edge-section">' +
739
- '<div class="edge-section-title">Outgoing (' + outEdges.length + ')</div>' +
740
- renderEdgeGroups(outGroups, "out") +
741
- '</div>' +
742
- '<div class="edge-section">' +
743
- '<div class="edge-section-title">Incoming (' + inEdges.length + ')</div>' +
744
- renderEdgeGroups(inGroups, "in") +
745
- '</div>';
746
-
747
- // Make edge items clickable → select node in graph
748
- detail.querySelectorAll(".edge-item").forEach((item) => {
749
- item.addEventListener("click", () => {
750
- const targetId = item.dataset.target;
751
- if (!window.__network) return;
752
- renderDetail(targetId);
753
- const allVis = window.__network.body.data.nodes.getIds();
754
- if (allVis.includes(targetId)) {
755
- window.__network.selectNodes([targetId]);
756
- window.__network.focus(targetId, { scale: 1.3, animation: { duration: 300 } });
757
- }
758
- });
759
- });
760
- }
761
- })();
762
- </script>
763
- </body>
764
- </html>`;
765
- }
766
- //# sourceMappingURL=html.js.map