@documentation-robotics/cli 0.1.0 → 0.1.7

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 (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +208 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +162 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +42 -16
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/report-data-model.ts"],
4
+ "sourcesContent": ["/**\n * ReportDataModel - Unified reporting interface for architecture models\n *\n * Combines statistics collection, relationship classification, and data model analysis\n * to provide comprehensive insights into architecture model structure, quality, and completeness.\n */\n\nimport { Model } from \"./model.js\";\nimport { StatsCollector, ModelStats } from \"./stats-collector.js\";\nimport { RelationshipCatalog, RelationshipType, type Directionality } from \"./relationship-catalog.js\";\nimport { getLayerOrder } from \"./layers.js\";\nimport type { Relationship } from \"../types/index.js\";\n\n/**\n * Relationship with semantic classification metadata\n */\nexport interface ClassifiedRelationship {\n id: string;\n source: string; // Element ID\n target: string; // Element ID\n predicate: string;\n\n // Classification\n category: string; // e.g., \"structural\", \"behavioral\", \"dependency\"\n archimateAlignment: string | null;\n\n // Semantic properties\n directionality: Directionality;\n transitivity: boolean;\n symmetry: boolean;\n reflexivity?: boolean;\n\n // Analysis\n sourceLayer: string;\n targetLayer: string;\n isCrossLayer: boolean;\n isSpecCompliant: boolean;\n}\n\n/**\n * Data model entity (Layer 7 specific)\n */\nexport interface DataModelEntity {\n id: string;\n name: string;\n layer: string;\n attributes: string[];\n relatedEntities: string[];\n isReferenced: boolean; // Referenced from other layers\n}\n\n/**\n * Data model layer specific insights\n *\n * Coverage metrics are percentages (0-100) representing data model completeness:\n * - entityCoverage: Percentage of entities referenced from higher layers\n * - attributeCoverage: Percentage of attributes populated across entities\n */\nexport interface DataModelInsights {\n entityCount: number;\n attributeCount: number;\n relationshipCount: number;\n entities: DataModelEntity[];\n\n // Coverage metrics\n entityCoverage: number;\n attributeCoverage: number;\n\n // Complexity\n avgAttributesPerEntity: number;\n maxAttributesPerEntity: number;\n avgRelationshipsPerEntity: number;\n\n // Quality\n referencedEntities: number; // Entities referenced from higher layers\n orphanedEntities: string[];\n}\n\n/**\n * Relationship analysis results\n */\nexport interface RelationshipAnalysis {\n totalRelationships: number;\n classified: ClassifiedRelationship[];\n byCategory: Record<string, number>;\n byPredicate: Record<string, number>;\n crossLayerCount: number;\n intraLayerCount: number;\n circularDependencies: CircularPath[];\n}\n\n/**\n * Circular dependency detection result\n */\nexport interface CircularPath {\n elements: string[];\n predicates: string[];\n pathLength: number;\n}\n\n/**\n * Quality metrics for the model\n *\n * Percentages (0-100) represent quality metrics:\n * - Coverage metrics (elementCoverage, relationshipCoverage, documentationCoverage, archimateCompliance, specCompliance, semanticConsistency):\n * Express completeness or compliance as percentages\n * - Composition metrics (crossLayerReferenceHealth):\n * Descriptive ratio of cross-layer to total relationships (not a quality indicator)\n * - Structural metrics (orphanedElements, circularDependencies):\n * Count of problematic elements\n * - Compliance metrics (layerComplianceScore):\n * Percentage of relationships following higher\u2192lower layer rule\n */\nexport interface QualityMetrics {\n // Coverage\n elementCoverage: number;\n relationshipCoverage: number;\n documentationCoverage: number;\n layerCoverage: number;\n\n // Structural quality\n orphanedElements: number;\n circularDependencies: number;\n\n // Semantic quality\n archimateCompliance: number;\n specCompliance: number;\n semanticConsistency: number;\n\n // Layering quality\n crossLayerReferenceHealth: number;\n layerComplianceScore: number;\n}\n\n/**\n * Complete report containing statistics, relationships, data model insights, and quality metrics\n */\nexport interface ReportData {\n timestamp: string;\n statistics: ModelStats;\n relationships: RelationshipAnalysis;\n dataModel: DataModelInsights;\n quality: QualityMetrics;\n}\n\n/**\n * Factory function to create a ClassifiedRelationship with enforced invariants\n *\n * Ensures that `isCrossLayer` correctly reflects whether sourceLayer !== targetLayer.\n * This prevents accidental bugs where the invariant could be violated.\n */\nexport function createClassifiedRelationship(\n rel: Omit<ClassifiedRelationship, \"isCrossLayer\" | \"sourceLayer\" | \"targetLayer\">,\n sourceLayer: string,\n targetLayer: string\n): ClassifiedRelationship {\n return {\n ...rel,\n sourceLayer,\n targetLayer,\n isCrossLayer: sourceLayer !== targetLayer,\n };\n}\n\n/**\n * ReportDataModel class - Unified reporting interface\n */\nexport class ReportDataModel {\n private model: Model;\n private statsCollector: StatsCollector;\n private relationshipCatalog: RelationshipCatalog;\n\n private cachedStats: ModelStats | null = null;\n private cachedRelationships: RelationshipAnalysis | null = null;\n private cachedDataModel: DataModelInsights | null = null;\n private cachedQuality: QualityMetrics | null = null;\n private cachedReport: ReportData | null = null;\n\n private relationshipTypeMap: Map<string, RelationshipType> = new Map();\n private catalogLoaded = false;\n\n constructor(model: Model) {\n this.model = model;\n this.statsCollector = new StatsCollector(model);\n this.relationshipCatalog = new RelationshipCatalog();\n }\n\n /**\n * Load the relationship catalog and build relationship type map\n */\n async loadCatalog(): Promise<void> {\n if (this.catalogLoaded) return;\n\n await this.relationshipCatalog.load();\n const types = this.relationshipCatalog.getAllTypes();\n\n for (const type of types) {\n this.relationshipTypeMap.set(type.predicate, type);\n }\n\n this.catalogLoaded = true;\n }\n\n /**\n * Collect all report data (statistics, relationships, data model, quality metrics)\n */\n async collect(): Promise<ReportData> {\n if (this.cachedReport) {\n return this.cachedReport;\n }\n\n try {\n await this.loadCatalog();\n\n const statistics = await this.getStatistics();\n const relationships = await this.getRelationshipAnalysis();\n const dataModel = await this.getDataModelInsights();\n const quality = await this.getQualityMetrics();\n\n this.cachedReport = {\n timestamp: new Date().toISOString(),\n statistics,\n relationships,\n dataModel,\n quality,\n };\n\n return this.cachedReport;\n } catch (error) {\n throw new Error(\n `Failed to collect report data: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error }\n );\n }\n }\n\n /**\n * Get model statistics\n */\n async getStatistics(): Promise<ModelStats> {\n if (this.cachedStats) {\n return this.cachedStats;\n }\n\n this.cachedStats = await this.statsCollector.collect();\n return this.cachedStats;\n }\n\n /**\n * Get relationship analysis with classification\n */\n async getRelationshipAnalysis(): Promise<RelationshipAnalysis> {\n if (this.cachedRelationships) {\n return this.cachedRelationships;\n }\n\n await this.loadCatalog();\n\n const allRelationships = this.model.relationships.getAll();\n const classified: ClassifiedRelationship[] = [];\n const byCategory: Record<string, number> = {};\n const byPredicate: Record<string, number> = {};\n\n let crossLayerCount = 0;\n let intraLayerCount = 0;\n\n for (let i = 0; i < allRelationships.length; i++) {\n const rel = allRelationships[i];\n const relationshipId = `${rel.source}\u2192${rel.predicate}\u2192${rel.target}`;\n const classifiedRel = this.classifyRelationship(rel, relationshipId);\n classified.push(classifiedRel);\n\n // Count by category\n if (!byCategory[classifiedRel.category]) {\n byCategory[classifiedRel.category] = 0;\n }\n byCategory[classifiedRel.category]++;\n\n // Count by predicate\n if (!byPredicate[rel.predicate]) {\n byPredicate[rel.predicate] = 0;\n }\n byPredicate[rel.predicate]++;\n\n // Count cross vs intra-layer\n if (classifiedRel.isCrossLayer) {\n crossLayerCount++;\n } else {\n intraLayerCount++;\n }\n }\n\n const circularDependencies = this.detectCircularDependencies(classified);\n\n this.cachedRelationships = {\n totalRelationships: allRelationships.length,\n classified,\n byCategory,\n byPredicate,\n crossLayerCount,\n intraLayerCount,\n circularDependencies,\n };\n\n return this.cachedRelationships;\n }\n\n /**\n * Get relationships filtered by category\n */\n async getRelationshipsByCategory(category: string): Promise<ClassifiedRelationship[]> {\n const analysis = await this.getRelationshipAnalysis();\n return analysis.classified.filter((rel) => rel.category === category);\n }\n\n /**\n * Get data model layer (Layer 7) specific insights\n */\n async getDataModelInsights(): Promise<DataModelInsights> {\n if (this.cachedDataModel) {\n return this.cachedDataModel;\n }\n\n const dataModelLayer = await this.model.getLayer(\"data-model\");\n const entities: DataModelEntity[] = [];\n let attributeCount = 0;\n\n if (dataModelLayer) {\n const elements = dataModelLayer.listElements();\n\n // Get all references to data model entities from other layers\n const referencesFrom = new Set<string>();\n for (const layerName of this.model.getLayerNames()) {\n if (layerName === \"data-model\") continue;\n const layer = await this.model.getLayer(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n if (element.references) {\n for (const ref of element.references) {\n if (ref.target.startsWith(\"data-model.\")) {\n referencesFrom.add(ref.target);\n }\n }\n }\n }\n }\n\n for (const element of elements) {\n const attributes = element.attributes ? Object.keys(element.attributes) : [];\n attributeCount += attributes.length;\n\n entities.push({\n id: element.path || element.id || \"\",\n name: element.name,\n layer: \"data-model\",\n attributes,\n relatedEntities: element.relationships ? element.relationships.map((r) => r.target) : [],\n isReferenced: referencesFrom.has(element.path || element.id || \"\"),\n });\n }\n }\n\n const entityCount = entities.length;\n const referencedCount = entities.filter((e) => e.isReferenced).length;\n const orphaned = entities.filter((e) => !e.isReferenced && e.relatedEntities.length === 0);\n\n // Calculate actual attribute coverage: percentage of entities that have at least one attribute\n const entitiesWithAttributes = entities.filter((e) => e.attributes.length > 0).length;\n const attributeCoverage =\n entityCount > 0 ? (entitiesWithAttributes / entityCount) * 100 : 0;\n\n const avgAttrs = entityCount > 0 ? attributeCount / entityCount : 0;\n const maxAttrs = Math.max(0, ...entities.map((e) => e.attributes.length));\n const avgRels =\n entityCount > 0 ? entities.reduce((sum, e) => sum + e.relatedEntities.length, 0) / entityCount : 0;\n\n this.cachedDataModel = {\n entityCount,\n attributeCount,\n relationshipCount: entities.reduce((sum, e) => sum + e.relatedEntities.length, 0),\n entities,\n entityCoverage: entityCount > 0 ? (referencedCount / entityCount) * 100 : 0,\n attributeCoverage,\n avgAttributesPerEntity: Math.round(avgAttrs * 10) / 10,\n maxAttributesPerEntity: maxAttrs,\n avgRelationshipsPerEntity: Math.round(avgRels * 10) / 10,\n referencedEntities: referencedCount,\n orphanedEntities: orphaned.map((e) => e.id),\n };\n\n return this.cachedDataModel;\n }\n\n /**\n * Get quality metrics for the model\n */\n async getQualityMetrics(): Promise<QualityMetrics> {\n if (this.cachedQuality) {\n return this.cachedQuality;\n }\n\n const stats = await this.getStatistics();\n const relationships = await this.getRelationshipAnalysis();\n\n // Coverage metrics\n const elementCoverage = stats.statistics.totalElements > 0 ? 100 : 0;\n const relationshipCoverage =\n stats.statistics.totalElements > 0\n ? (stats.statistics.totalRelationships / stats.statistics.totalElements) * 100\n : 0;\n const documentationCoverage = this.calculateDocumentationCoverage(stats);\n const layerCoverage =\n stats.statistics.totalLayers > 0\n ? (stats.statistics.populatedLayers / stats.statistics.totalLayers) * 100\n : 0;\n\n // Structural quality\n const orphanedElements = stats.orphanedElements.length;\n const circularDependencies = relationships.circularDependencies.length;\n\n // Semantic quality - simplified calculation\n const archimateCompliance = this.calculateArchimateCompliance(relationships);\n const specCompliance = this.calculateSpecCompliance(relationships);\n const semanticConsistency = (archimateCompliance + specCompliance) / 2;\n\n // Layering quality\n const crossLayerReferenceHealth =\n relationships.totalRelationships > 0\n ? (relationships.crossLayerCount / relationships.totalRelationships) * 100\n : 0;\n\n // Layer compliance score: proportion of relationships going higher -> lower\n const layerComplianceScore = this.calculateLayerComplianceScore(relationships);\n\n this.cachedQuality = {\n elementCoverage,\n relationshipCoverage: Math.min(100, relationshipCoverage),\n documentationCoverage: Math.min(100, documentationCoverage),\n layerCoverage: Math.min(100, layerCoverage),\n orphanedElements,\n circularDependencies,\n archimateCompliance,\n specCompliance,\n semanticConsistency,\n crossLayerReferenceHealth: Math.min(100, crossLayerReferenceHealth),\n layerComplianceScore,\n };\n\n return this.cachedQuality;\n }\n\n /**\n * Classify a single relationship with semantic metadata\n */\n private classifyRelationship(rel: Relationship, id: string): ClassifiedRelationship {\n // Extract layer name from element ID (format: layer.type.name)\n const sourceParts = rel.source.split(\".\");\n const targetParts = rel.target.split(\".\");\n\n // Validate element ID format: must have at least layer (part 0)\n const sourceLayer = sourceParts[0];\n const targetLayer = targetParts[0];\n\n if (!sourceLayer || !targetLayer) {\n // Log warning for malformed element IDs but continue with available data\n // This allows partial analysis without breaking the entire report\n console.warn(\n `[REPORT_001] Malformed element ID format in relationship: ` +\n `source=\"${rel.source}\" (${sourceParts.length} parts), ` +\n `target=\"${rel.target}\" (${targetParts.length} parts). ` +\n `Expected format: layer.type.name`\n );\n }\n\n const relationshipType = this.relationshipTypeMap.get(rel.predicate);\n\n // Determine spec compliance: unknown predicates are not compliant\n const isSpecCompliant = relationshipType !== undefined;\n\n return createClassifiedRelationship(\n {\n id,\n source: rel.source,\n target: rel.target,\n predicate: rel.predicate,\n category: relationshipType?.category || \"unknown\",\n archimateAlignment: relationshipType?.archimateAlignment || null,\n directionality: relationshipType?.semantics?.directionality || \"unidirectional\",\n transitivity: relationshipType?.semantics?.transitivity || false,\n symmetry: relationshipType?.semantics?.symmetry || false,\n reflexivity: relationshipType?.semantics?.reflexivity,\n isSpecCompliant,\n },\n sourceLayer,\n targetLayer\n );\n }\n\n /**\n * Detect circular dependencies in relationships\n * Max depth limit prevents stack overflow on complex graphs\n */\n private detectCircularDependencies(relationships: ClassifiedRelationship[]): CircularPath[] {\n const MAX_SEARCH_DEPTH = 100;\n const circularPaths: CircularPath[] = [];\n const visited = new Set<string>();\n const path: string[] = [];\n const predicatePath: string[] = [];\n\n for (const rel of relationships) {\n if (!visited.has(rel.source)) {\n this.findCircles(rel.source, relationships, visited, path, predicatePath, circularPaths, 0, MAX_SEARCH_DEPTH);\n }\n }\n\n return circularPaths;\n }\n\n /**\n * Helper to find circular paths using DFS with depth limit\n */\n private findCircles(\n node: string,\n relationships: ClassifiedRelationship[],\n visited: Set<string>,\n path: string[],\n predicatePath: string[],\n circularPaths: CircularPath[],\n depth: number,\n maxDepth: number\n ): void {\n // Prevent stack overflow on complex graphs\n if (depth > maxDepth) {\n return;\n }\n if (path.includes(node)) {\n const circleStart = path.indexOf(node);\n const circlePath = path.slice(circleStart);\n const circlePredicates = predicatePath.slice(circleStart);\n\n // Only add if not already found (use immutable sort for comparison)\n const circleKey = [...circlePath].sort().join(\"\u2192\");\n const isDuplicate = circularPaths.some(\n (c) => [...c.elements].sort().join(\"\u2192\") === circleKey\n );\n\n if (!isDuplicate && circlePath.length > 1) {\n circularPaths.push({\n elements: circlePath,\n predicates: circlePredicates,\n pathLength: circlePath.length,\n });\n }\n return;\n }\n\n if (visited.has(node)) {\n return;\n }\n\n path.push(node);\n visited.add(node);\n\n // Find all outgoing edges from this node\n for (const rel of relationships) {\n if (rel.source === node) {\n predicatePath.push(rel.predicate);\n this.findCircles(rel.target, relationships, visited, path, predicatePath, circularPaths, depth + 1, maxDepth);\n predicatePath.pop();\n }\n }\n\n path.pop();\n visited.delete(node); // Remove from visited during backtrack to detect cycles from alternate paths\n }\n\n /**\n * Calculate documentation coverage percentage\n * Checks what proportion of elements have meaningful descriptions\n */\n private calculateDocumentationCoverage(stats: ModelStats): number {\n if (stats.statistics.totalElements === 0) return 0;\n\n // Count elements with descriptions across all layers\n let documentedCount = 0;\n for (const layerName of this.model.getLayerNames()) {\n const layer = this.model.layers.get(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n if (element.description && element.description.trim().length > 0) {\n documentedCount++;\n }\n }\n }\n\n return Math.round((documentedCount / stats.statistics.totalElements) * 100);\n }\n\n /**\n * Calculate ArchiMate alignment percentage\n */\n private calculateArchimateCompliance(analysis: RelationshipAnalysis): number {\n if (analysis.totalRelationships === 0) return 100;\n\n const archimateAligned = analysis.classified.filter((r) => r.archimateAlignment).length;\n return Math.round((archimateAligned / analysis.totalRelationships) * 100);\n }\n\n /**\n * Calculate spec compliance percentage\n */\n private calculateSpecCompliance(analysis: RelationshipAnalysis): number {\n if (analysis.totalRelationships === 0) return 100;\n\n const specCompliant = analysis.classified.filter((r) => r.isSpecCompliant).length;\n return Math.round((specCompliant / analysis.totalRelationships) * 100);\n }\n\n /**\n * Calculate layer compliance score (directional compliance)\n * Measures adherence to the higher -> lower layer reference rule\n */\n private calculateLayerComplianceScore(analysis: RelationshipAnalysis): number {\n // Only count relationships with known (valid) layer names\n const validRelationships = analysis.classified.filter((rel) => {\n const sourceOrder = getLayerOrder(rel.sourceLayer);\n const targetOrder = getLayerOrder(rel.targetLayer);\n return sourceOrder > 0 && targetOrder > 0;\n });\n\n if (validRelationships.length === 0) return 100;\n\n let compliantCount = 0;\n\n for (const rel of validRelationships) {\n const sourceOrder = getLayerOrder(rel.sourceLayer);\n const targetOrder = getLayerOrder(rel.targetLayer);\n\n // Compliant if source >= target (higher layer -> lower/same layer)\n if (sourceOrder >= targetOrder) {\n compliantCount++;\n }\n }\n\n return Math.round((compliantCount / validRelationships.length) * 100);\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.cachedStats = null;\n this.cachedRelationships = null;\n this.cachedDataModel = null;\n this.cachedQuality = null;\n this.cachedReport = null;\n }\n\n /**\n * Get the relationship catalog\n */\n getCatalog(): RelationshipCatalog {\n return this.relationshipCatalog;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,185 @@
1
+ import { SpecDataLoader } from "./spec-loader.js";
2
+ class SpecDataService {
3
+ loader;
4
+ nodeTypeMetadataCache = /* @__PURE__ */ new Map();
5
+ constructor(options = {}) {
6
+ this.loader = new SpecDataLoader(options);
7
+ }
8
+ /**
9
+ * Load specification data
10
+ */
11
+ async initialize() {
12
+ await this.loader.load();
13
+ }
14
+ /**
15
+ * Check if service is initialized
16
+ */
17
+ isInitialized() {
18
+ return this.loader.isLoaded();
19
+ }
20
+ /**
21
+ * Get raw specification data
22
+ */
23
+ getSpecData() {
24
+ return this.loader.getSpecData();
25
+ }
26
+ /**
27
+ * Get specification statistics
28
+ */
29
+ getStatistics() {
30
+ return this.loader.getStatistics();
31
+ }
32
+ /**
33
+ * Find node types by filter
34
+ */
35
+ findNodeTypes(filter = {}) {
36
+ return this.loader.findNodeTypes(filter);
37
+ }
38
+ /**
39
+ * Find relationship types by filter
40
+ */
41
+ findRelationshipTypes(filter = {}) {
42
+ return this.loader.findRelationshipTypes(filter);
43
+ }
44
+ /**
45
+ * Get all layers
46
+ */
47
+ getAllLayers() {
48
+ return this.loader.getAllLayers();
49
+ }
50
+ /**
51
+ * Get layer by ID
52
+ */
53
+ getLayer(layerId) {
54
+ return this.loader.getLayer(layerId);
55
+ }
56
+ /**
57
+ * Get node type by spec_node_id
58
+ */
59
+ getNodeType(specNodeId) {
60
+ return this.loader.getNodeType(specNodeId);
61
+ }
62
+ /**
63
+ * Get node types for a specific layer
64
+ */
65
+ getNodeTypesForLayer(layerId) {
66
+ return this.loader.getNodeTypesForLayer(layerId);
67
+ }
68
+ /**
69
+ * Get enriched metadata for a node type (including relationships and layers)
70
+ */
71
+ getNodeTypeMetadata(specNodeId) {
72
+ if (this.nodeTypeMetadataCache.has(specNodeId))
73
+ return this.nodeTypeMetadataCache.get(specNodeId);
74
+ const nodeType = this.loader.getNodeType(specNodeId);
75
+ if (!nodeType)
76
+ return;
77
+ const layer = this.loader.getLayer(nodeType.layer_id), incomingRelationships = this.getRelationshipMetadata(this.loader.getNodeTypesReferencingType(specNodeId)), outgoingRelationships = this.getRelationshipMetadata(this.loader.getNodeTypesReferencedByType(specNodeId)), metadata = {
78
+ nodeType,
79
+ layer,
80
+ incomingRelationships,
81
+ outgoingRelationships
82
+ };
83
+ return this.nodeTypeMetadataCache.set(specNodeId, metadata), metadata;
84
+ }
85
+ /**
86
+ * Get enriched metadata for relationship types
87
+ */
88
+ getRelationshipMetadata(relationshipTypes) {
89
+ return relationshipTypes.map((rt) => ({
90
+ relationshipType: rt,
91
+ predicate: this.loader.getPredicate(rt.predicate),
92
+ sourceNodeType: this.loader.getNodeType(rt.source_spec_node_id),
93
+ destinationNodeType: this.loader.getNodeType(rt.destination_spec_node_id),
94
+ sourceLayer: this.loader.getLayer(rt.source_layer),
95
+ destinationLayer: this.loader.getLayer(rt.destination_layer)
96
+ }));
97
+ }
98
+ /**
99
+ * Validate if a relationship is valid between two node types
100
+ */
101
+ isValidRelationship(sourceSpecNodeId, destSpecNodeId, predicate) {
102
+ return this.loader.findRelationshipTypes({
103
+ sourceSpecNodeId,
104
+ destinationSpecNodeId: destSpecNodeId,
105
+ predicate
106
+ }).length > 0;
107
+ }
108
+ /**
109
+ * Get valid relationship predicates between two node types
110
+ */
111
+ getValidPredicates(sourceSpecNodeId, destSpecNodeId) {
112
+ const relationships = this.loader.findRelationshipTypes({
113
+ sourceSpecNodeId,
114
+ destinationSpecNodeId: destSpecNodeId
115
+ }), predicateSet = /* @__PURE__ */ new Set();
116
+ for (const rel of relationships)
117
+ predicateSet.add(rel.predicate);
118
+ return Array.from(predicateSet).map((p) => this.loader.getPredicate(p)).filter((p) => p !== void 0);
119
+ }
120
+ /**
121
+ * Find all node types that can be a source for a given destination node type with a predicate
122
+ */
123
+ getSourceNodeTypesForDestination(destSpecNodeId, predicate) {
124
+ const relationships = this.loader.findRelationshipTypes({
125
+ destinationSpecNodeId: destSpecNodeId,
126
+ predicate
127
+ }), sourceSpecNodeIds = new Set(relationships.map((r) => r.source_spec_node_id)), sources = [];
128
+ for (const id of sourceSpecNodeIds) {
129
+ const nodeType = this.loader.getNodeType(id);
130
+ nodeType && sources.push(nodeType);
131
+ }
132
+ return sources;
133
+ }
134
+ /**
135
+ * Find all node types that can be a destination for a given source node type with a predicate
136
+ */
137
+ getDestinationNodeTypesForSource(sourceSpecNodeId, predicate) {
138
+ const relationships = this.loader.findRelationshipTypes({
139
+ sourceSpecNodeId,
140
+ predicate
141
+ }), destSpecNodeIds = new Set(relationships.map((r) => r.destination_spec_node_id)), destinations = [];
142
+ for (const id of destSpecNodeIds) {
143
+ const nodeType = this.loader.getNodeType(id);
144
+ nodeType && destinations.push(nodeType);
145
+ }
146
+ return destinations;
147
+ }
148
+ /**
149
+ * Get relationship types between two layers
150
+ */
151
+ getRelationshipsBetweenLayers(sourceLayerId, destLayerId) {
152
+ return this.loader.getRelationshipTypesForLayerPair(sourceLayerId, destLayerId);
153
+ }
154
+ /**
155
+ * Validate spec data integrity
156
+ * Returns array of issues found, empty if valid
157
+ */
158
+ validateIntegrity() {
159
+ const issues = [], specData = this.loader.getSpecData();
160
+ for (const relType of specData.relationshipTypes)
161
+ specData.nodeTypes.find((nt) => nt.spec_node_id === relType.source_spec_node_id) || issues.push(`Relationship ${relType.id} references non-existent source node type: ${relType.source_spec_node_id}`), relType.destination_spec_node_id && !specData.nodeTypes.find((nt) => nt.spec_node_id === relType.destination_spec_node_id) && issues.push(`Relationship ${relType.id} references non-existent destination node type: ${relType.destination_spec_node_id}`), relType.predicate && !specData.predicates.has(relType.predicate) && issues.push(`Relationship ${relType.id} references non-existent predicate: ${relType.predicate}`);
162
+ for (const nodeType of specData.nodeTypes)
163
+ specData.layers.find((l) => l.id === nodeType.layer_id) || issues.push(`Node type ${nodeType.spec_node_id} references non-existent layer: ${nodeType.layer_id}`);
164
+ return issues;
165
+ }
166
+ /**
167
+ * Clear all caches
168
+ */
169
+ clear() {
170
+ this.loader.clear(), this.nodeTypeMetadataCache.clear();
171
+ }
172
+ }
173
+ let globalSpecDataService = null;
174
+ function getGlobalSpecDataService(options = {}) {
175
+ return globalSpecDataService || (globalSpecDataService = new SpecDataService(options)), globalSpecDataService;
176
+ }
177
+ function resetGlobalSpecDataService() {
178
+ globalSpecDataService = null;
179
+ }
180
+ export {
181
+ SpecDataService,
182
+ getGlobalSpecDataService,
183
+ resetGlobalSpecDataService
184
+ };
185
+ //# sourceMappingURL=spec-data-service.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/spec-data-service.ts"],
4
+ "sourcesContent": ["/**\n * SpecDataService - High-level service for specification data operations\n *\n * Provides a convenient API for querying and analyzing specification metadata.\n * Manages the lifecycle of SpecDataLoader and provides caching and performance optimizations.\n */\n\nimport { SpecDataLoader } from \"./spec-loader.js\";\nimport {\n LayerSpec,\n NodeTypeSpec,\n RelationshipTypeSpec,\n PredicateSpec,\n SpecData,\n SpecStatistics,\n SpecLoaderOptions,\n NodeTypeQueryFilter,\n RelationshipTypeQueryFilter,\n} from \"./spec-loader-types.js\";\n\n/**\n * Relationship metadata computed from spec data\n */\nexport interface RelationshipMetadata {\n relationshipType: RelationshipTypeSpec;\n predicate: PredicateSpec | undefined;\n sourceNodeType: NodeTypeSpec | undefined;\n destinationNodeType: NodeTypeSpec | undefined;\n sourceLayer: LayerSpec | undefined;\n destinationLayer: LayerSpec | undefined;\n}\n\n/**\n * Node type metadata with computed relationships\n */\nexport interface NodeTypeMetadata {\n nodeType: NodeTypeSpec;\n layer: LayerSpec | undefined;\n incomingRelationships: RelationshipMetadata[];\n outgoingRelationships: RelationshipMetadata[];\n}\n\n/**\n * SpecDataService provides a high-level API for specification operations\n */\nexport class SpecDataService {\n private loader: SpecDataLoader;\n private nodeTypeMetadataCache: Map<string, NodeTypeMetadata> = new Map();\n\n constructor(options: SpecLoaderOptions = {}) {\n this.loader = new SpecDataLoader(options);\n }\n\n /**\n * Load specification data\n */\n async initialize(): Promise<void> {\n await this.loader.load();\n }\n\n /**\n * Check if service is initialized\n */\n isInitialized(): boolean {\n return this.loader.isLoaded();\n }\n\n /**\n * Get raw specification data\n */\n getSpecData(): SpecData {\n return this.loader.getSpecData();\n }\n\n /**\n * Get specification statistics\n */\n getStatistics(): SpecStatistics {\n return this.loader.getStatistics();\n }\n\n /**\n * Find node types by filter\n */\n findNodeTypes(filter: NodeTypeQueryFilter = {}): NodeTypeSpec[] {\n return this.loader.findNodeTypes(filter);\n }\n\n /**\n * Find relationship types by filter\n */\n findRelationshipTypes(filter: RelationshipTypeQueryFilter = {}): RelationshipTypeSpec[] {\n return this.loader.findRelationshipTypes(filter);\n }\n\n /**\n * Get all layers\n */\n getAllLayers(): LayerSpec[] {\n return this.loader.getAllLayers();\n }\n\n /**\n * Get layer by ID\n */\n getLayer(layerId: string): LayerSpec | undefined {\n return this.loader.getLayer(layerId);\n }\n\n /**\n * Get node type by spec_node_id\n */\n getNodeType(specNodeId: string): NodeTypeSpec | undefined {\n return this.loader.getNodeType(specNodeId);\n }\n\n /**\n * Get node types for a specific layer\n */\n getNodeTypesForLayer(layerId: string): NodeTypeSpec[] {\n return this.loader.getNodeTypesForLayer(layerId);\n }\n\n /**\n * Get enriched metadata for a node type (including relationships and layers)\n */\n getNodeTypeMetadata(specNodeId: string): NodeTypeMetadata | undefined {\n // Check cache first\n if (this.nodeTypeMetadataCache.has(specNodeId)) {\n return this.nodeTypeMetadataCache.get(specNodeId);\n }\n\n const nodeType = this.loader.getNodeType(specNodeId);\n if (!nodeType) {\n return undefined;\n }\n\n const layer = this.loader.getLayer(nodeType.layer_id);\n const incomingRelationships = this.getRelationshipMetadata(\n this.loader.getNodeTypesReferencingType(specNodeId)\n );\n const outgoingRelationships = this.getRelationshipMetadata(\n this.loader.getNodeTypesReferencedByType(specNodeId)\n );\n\n const metadata: NodeTypeMetadata = {\n nodeType,\n layer,\n incomingRelationships,\n outgoingRelationships,\n };\n\n // Cache the metadata\n this.nodeTypeMetadataCache.set(specNodeId, metadata);\n\n return metadata;\n }\n\n /**\n * Get enriched metadata for relationship types\n */\n private getRelationshipMetadata(relationshipTypes: RelationshipTypeSpec[]): RelationshipMetadata[] {\n return relationshipTypes.map((rt) => ({\n relationshipType: rt,\n predicate: this.loader.getPredicate(rt.predicate),\n sourceNodeType: this.loader.getNodeType(rt.source_spec_node_id),\n destinationNodeType: this.loader.getNodeType(rt.destination_spec_node_id),\n sourceLayer: this.loader.getLayer(rt.source_layer),\n destinationLayer: this.loader.getLayer(rt.destination_layer),\n }));\n }\n\n /**\n * Validate if a relationship is valid between two node types\n */\n isValidRelationship(\n sourceSpecNodeId: string,\n destSpecNodeId: string,\n predicate?: string\n ): boolean {\n const relationships = this.loader.findRelationshipTypes({\n sourceSpecNodeId,\n destinationSpecNodeId: destSpecNodeId,\n predicate,\n });\n\n return relationships.length > 0;\n }\n\n /**\n * Get valid relationship predicates between two node types\n */\n getValidPredicates(sourceSpecNodeId: string, destSpecNodeId: string): PredicateSpec[] {\n const relationships = this.loader.findRelationshipTypes({\n sourceSpecNodeId,\n destinationSpecNodeId: destSpecNodeId,\n });\n\n const predicateSet = new Set<string>();\n for (const rel of relationships) {\n predicateSet.add(rel.predicate);\n }\n\n return Array.from(predicateSet)\n .map((p) => this.loader.getPredicate(p))\n .filter((p): p is PredicateSpec => p !== undefined);\n }\n\n /**\n * Find all node types that can be a source for a given destination node type with a predicate\n */\n getSourceNodeTypesForDestination(\n destSpecNodeId: string,\n predicate?: string\n ): NodeTypeSpec[] {\n const relationships = this.loader.findRelationshipTypes({\n destinationSpecNodeId: destSpecNodeId,\n predicate,\n });\n\n const sourceSpecNodeIds = new Set(relationships.map((r) => r.source_spec_node_id));\n const sources: NodeTypeSpec[] = [];\n\n for (const id of sourceSpecNodeIds) {\n const nodeType = this.loader.getNodeType(id);\n if (nodeType) {\n sources.push(nodeType);\n }\n }\n\n return sources;\n }\n\n /**\n * Find all node types that can be a destination for a given source node type with a predicate\n */\n getDestinationNodeTypesForSource(\n sourceSpecNodeId: string,\n predicate?: string\n ): NodeTypeSpec[] {\n const relationships = this.loader.findRelationshipTypes({\n sourceSpecNodeId,\n predicate,\n });\n\n const destSpecNodeIds = new Set(relationships.map((r) => r.destination_spec_node_id));\n const destinations: NodeTypeSpec[] = [];\n\n for (const id of destSpecNodeIds) {\n const nodeType = this.loader.getNodeType(id);\n if (nodeType) {\n destinations.push(nodeType);\n }\n }\n\n return destinations;\n }\n\n /**\n * Get relationship types between two layers\n */\n getRelationshipsBetweenLayers(sourceLayerId: string, destLayerId?: string): RelationshipTypeSpec[] {\n return this.loader.getRelationshipTypesForLayerPair(sourceLayerId, destLayerId);\n }\n\n /**\n * Validate spec data integrity\n * Returns array of issues found, empty if valid\n */\n validateIntegrity(): string[] {\n const issues: string[] = [];\n const specData = this.loader.getSpecData();\n\n // Validate that all relationship type references exist\n for (const relType of specData.relationshipTypes) {\n if (!specData.nodeTypes.find((nt) => nt.spec_node_id === relType.source_spec_node_id)) {\n issues.push(\n `Relationship ${relType.id} references non-existent source node type: ${relType.source_spec_node_id}`\n );\n }\n\n if (\n relType.destination_spec_node_id &&\n !specData.nodeTypes.find((nt) => nt.spec_node_id === relType.destination_spec_node_id)\n ) {\n issues.push(\n `Relationship ${relType.id} references non-existent destination node type: ${relType.destination_spec_node_id}`\n );\n }\n\n if (relType.predicate && !specData.predicates.has(relType.predicate)) {\n issues.push(\n `Relationship ${relType.id} references non-existent predicate: ${relType.predicate}`\n );\n }\n }\n\n // Validate that all node types are defined in a layer\n for (const nodeType of specData.nodeTypes) {\n if (!specData.layers.find((l) => l.id === nodeType.layer_id)) {\n issues.push(\n `Node type ${nodeType.spec_node_id} references non-existent layer: ${nodeType.layer_id}`\n );\n }\n }\n\n return issues;\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.loader.clear();\n this.nodeTypeMetadataCache.clear();\n }\n}\n\n/**\n * Global singleton instance for SpecDataService\n */\nlet globalSpecDataService: SpecDataService | null = null;\n\n/**\n * Get or create global SpecDataService instance\n * WARNING: Options are only applied on first call. Subsequent calls with different\n * options will be silently ignored and the existing instance returned. Call resetGlobalSpecDataService()\n * before calling this again with different options.\n */\nexport function getGlobalSpecDataService(options: SpecLoaderOptions = {}): SpecDataService {\n if (!globalSpecDataService) {\n globalSpecDataService = new SpecDataService(options);\n }\n return globalSpecDataService;\n}\n\n/**\n * Reset global SpecDataService instance\n */\nexport function resetGlobalSpecDataService(): void {\n globalSpecDataService = null;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=spec-loader-types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,234 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "url";
3
+ import fs from "node:fs/promises";
4
+ import { existsSync } from "fs";
5
+ import { getErrorMessage } from "../utils/errors.js";
6
+ import { logDebug } from "../utils/globals.js";
7
+ class SpecDataLoader {
8
+ bundledDir;
9
+ options;
10
+ cachedData = null;
11
+ loadedAt = null;
12
+ constructor(options = {}) {
13
+ this.options = {
14
+ cache: !0,
15
+ includeSchemas: !1,
16
+ ...options
17
+ }, this.bundledDir = this.options.bundledDir || this.getDefaultBundledDir();
18
+ }
19
+ /**
20
+ * Resolve the bundled dist directory.
21
+ *
22
+ * Priority:
23
+ * 1. Explicit override via options.bundledDir
24
+ * 2. CLI installation: schemas/bundled/ next to compiled source
25
+ * 3. Development monorepo: spec/dist/
26
+ */
27
+ getDefaultBundledDir() {
28
+ const currentDir = path.dirname(fileURLToPath(import.meta.url)), installPath = path.join(currentDir, "..", "schemas", "bundled");
29
+ if (existsSync(path.join(installPath, "manifest.json")))
30
+ return logDebug(`SpecDataLoader using bundled schemas: ${installPath}`), installPath;
31
+ const devDistPath = path.join(currentDir, "../../../spec/dist");
32
+ if (existsSync(path.join(devDistPath, "manifest.json")))
33
+ return logDebug(`SpecDataLoader using bundled schemas: ${devDistPath}`), devDistPath;
34
+ throw new Error(`Cannot find compiled spec schemas. Tried:
35
+ 1. CLI installation: ${installPath}
36
+ 2. Development monorepo: ${devDistPath}
37
+
38
+ Ensure you have built the spec (npm run build:spec) or installed the CLI.`);
39
+ }
40
+ /**
41
+ * Load all specification data
42
+ */
43
+ async load() {
44
+ if (this.options.cache && this.cachedData)
45
+ return this.cachedData;
46
+ try {
47
+ const [layers, nodeTypes, relationshipTypes, predicates] = await Promise.all([
48
+ this.loadLayers(),
49
+ this.loadNodeTypes(),
50
+ this.loadRelationshipTypes(),
51
+ this.loadPredicates()
52
+ ]), data = { layers, nodeTypes, relationshipTypes, predicates };
53
+ return this.options.cache && (this.cachedData = data, this.loadedAt = /* @__PURE__ */ new Date()), data;
54
+ } catch (error) {
55
+ throw new Error(`Failed to load specification data from ${this.bundledDir}: ${getErrorMessage(error)}`);
56
+ }
57
+ }
58
+ /**
59
+ * Load layer specifications from manifest.json + per-layer files
60
+ */
61
+ async loadLayers() {
62
+ const manifest = await this.readManifest(), layers = [];
63
+ for (const entry of manifest.layers) {
64
+ const layerFile = path.join(this.bundledDir, `${entry.id}.json`), content = await fs.readFile(layerFile, "utf-8"), layer = JSON.parse(content).layer;
65
+ layers.push(layer);
66
+ }
67
+ return layers.sort((a, b) => a.number - b.number);
68
+ }
69
+ /**
70
+ * Load node type specifications from nodeSchemas in each layer file
71
+ */
72
+ async loadNodeTypes() {
73
+ const manifest = await this.readManifest(), nodeTypes = [];
74
+ for (const entry of manifest.layers) {
75
+ const layerFile = path.join(this.bundledDir, `${entry.id}.json`), content = await fs.readFile(layerFile, "utf-8"), layerData = JSON.parse(content);
76
+ for (const [, schema] of Object.entries(layerData.nodeSchemas)) {
77
+ const spec_node_id = schema.properties?.spec_node_id?.const, layer_id = schema.properties?.layer_id?.const, type = schema.properties?.type?.const;
78
+ if (!spec_node_id || !layer_id || !type)
79
+ throw new Error(`Node schema in ${entry.id}.json missing required const values: spec_node_id=${spec_node_id}, layer_id=${layer_id}, type=${type}`);
80
+ nodeTypes.push({
81
+ spec_node_id,
82
+ layer_id,
83
+ type,
84
+ title: schema.title || "",
85
+ description: schema.description || "",
86
+ attributes: this.extractAttributes(schema.properties?.attributes),
87
+ ...this.options.includeSchemas && { schema }
88
+ });
89
+ }
90
+ }
91
+ return nodeTypes;
92
+ }
93
+ /**
94
+ * Extract attribute specifications from node schema
95
+ */
96
+ extractAttributes(attributesSchema) {
97
+ if (!attributesSchema || !attributesSchema.properties)
98
+ return [];
99
+ const props = attributesSchema.properties, required = new Set(attributesSchema.required || []);
100
+ return Object.entries(props).map(([name, schema]) => ({
101
+ name,
102
+ type: schema.type || "unknown",
103
+ format: schema.format,
104
+ required: required.has(name),
105
+ description: schema.description
106
+ }));
107
+ }
108
+ /**
109
+ * Load relationship type specifications from relationshipSchemas in each layer file
110
+ *
111
+ * The bundled format stores flat data directly (not wrapped in JSON Schema),
112
+ * so we read the fields directly rather than extracting from .const values.
113
+ */
114
+ async loadRelationshipTypes() {
115
+ const manifest = await this.readManifest(), relationshipTypes = [];
116
+ for (const entry of manifest.layers) {
117
+ const layerFile = path.join(this.bundledDir, `${entry.id}.json`), content = await fs.readFile(layerFile, "utf-8"), layerData = JSON.parse(content);
118
+ for (const rel of Object.values(layerData.relationshipSchemas)) {
119
+ if (!rel.id || !rel.source_spec_node_id || !rel.source_layer)
120
+ throw new Error(`Relationship schema in ${entry.id}.json missing required fields: id=${rel.id}`);
121
+ relationshipTypes.push({
122
+ id: rel.id,
123
+ source_spec_node_id: rel.source_spec_node_id,
124
+ source_layer: rel.source_layer,
125
+ destination_spec_node_id: rel.destination_spec_node_id || "",
126
+ destination_layer: rel.destination_layer || "",
127
+ predicate: rel.predicate || "",
128
+ cardinality: rel.cardinality || "many-to-many",
129
+ strength: rel.strength || "medium",
130
+ required: rel.required
131
+ });
132
+ }
133
+ }
134
+ return relationshipTypes;
135
+ }
136
+ /**
137
+ * Load predicate definitions from base.json
138
+ */
139
+ async loadPredicates() {
140
+ const basePath = path.join(this.bundledDir, "base.json");
141
+ try {
142
+ const content = await fs.readFile(basePath, "utf-8");
143
+ let data;
144
+ try {
145
+ data = JSON.parse(content);
146
+ } catch (parseError) {
147
+ throw new Error(`Failed to parse base.json at ${basePath}: ${getErrorMessage(parseError)}`);
148
+ }
149
+ const predicates = /* @__PURE__ */ new Map();
150
+ for (const [, pred] of Object.entries(data.predicates)) {
151
+ const predSpec = pred;
152
+ predicates.set(predSpec.predicate, {
153
+ predicate: predSpec.predicate,
154
+ inverse: predSpec.inverse,
155
+ category: predSpec.category,
156
+ description: predSpec.description,
157
+ archimate_alignment: predSpec.archimate_alignment,
158
+ semantics: predSpec.semantics
159
+ });
160
+ }
161
+ return predicates;
162
+ } catch (error) {
163
+ throw new Error(`Failed to load predicates from ${basePath}: ${getErrorMessage(error)}`);
164
+ }
165
+ }
166
+ /**
167
+ * Read and parse the bundled manifest.json
168
+ */
169
+ async readManifest() {
170
+ const manifestPath = path.join(this.bundledDir, "manifest.json"), content = await fs.readFile(manifestPath, "utf-8");
171
+ return JSON.parse(content);
172
+ }
173
+ /**
174
+ * Get loaded specification data
175
+ * Throws if data hasn't been loaded yet
176
+ */
177
+ getSpecData() {
178
+ if (!this.cachedData)
179
+ throw new Error("Specification data not loaded. Call load() first.");
180
+ return this.cachedData;
181
+ }
182
+ isLoaded() {
183
+ return this.cachedData !== null;
184
+ }
185
+ getStatistics() {
186
+ const data = this.getSpecData();
187
+ return {
188
+ layerCount: data.layers.length,
189
+ nodeTypeCount: data.nodeTypes.length,
190
+ relationshipTypeCount: data.relationshipTypes.length,
191
+ predicateCount: data.predicates.size,
192
+ totalAttributes: data.nodeTypes.reduce((sum, nt) => sum + nt.attributes.length, 0),
193
+ loadedAt: this.loadedAt || /* @__PURE__ */ new Date()
194
+ };
195
+ }
196
+ clear() {
197
+ this.cachedData = null, this.loadedAt = null;
198
+ }
199
+ findNodeTypes(filter = {}) {
200
+ return this.getSpecData().nodeTypes.filter((nt) => !(filter.layer && nt.layer_id !== filter.layer || filter.type && nt.type !== filter.type || filter.specNodeId && nt.spec_node_id !== filter.specNodeId || filter.title && !nt.title.toLowerCase().includes(filter.title.toLowerCase())));
201
+ }
202
+ findRelationshipTypes(filter = {}) {
203
+ return this.getSpecData().relationshipTypes.filter((rt) => !(filter.sourceLayer && rt.source_layer !== filter.sourceLayer || filter.sourceSpecNodeId && rt.source_spec_node_id !== filter.sourceSpecNodeId || filter.destinationLayer && rt.destination_layer !== filter.destinationLayer || filter.destinationSpecNodeId && rt.destination_spec_node_id !== filter.destinationSpecNodeId || filter.predicate && rt.predicate !== filter.predicate));
204
+ }
205
+ getNodeTypesForLayer(layerId) {
206
+ return this.findNodeTypes({ layer: layerId });
207
+ }
208
+ getRelationshipTypesForLayerPair(sourceLayer, destLayer) {
209
+ const filter = { sourceLayer };
210
+ return destLayer && (filter.destinationLayer = destLayer), this.findRelationshipTypes(filter);
211
+ }
212
+ getPredicate(predicateName) {
213
+ return this.getSpecData().predicates.get(predicateName);
214
+ }
215
+ getLayer(layerId) {
216
+ return this.getSpecData().layers.find((l) => l.id === layerId);
217
+ }
218
+ getAllLayers() {
219
+ return this.getSpecData().layers;
220
+ }
221
+ getNodeType(specNodeId) {
222
+ return this.getSpecData().nodeTypes.find((nt) => nt.spec_node_id === specNodeId);
223
+ }
224
+ getNodeTypesReferencingType(specNodeId) {
225
+ return this.findRelationshipTypes({ destinationSpecNodeId: specNodeId });
226
+ }
227
+ getNodeTypesReferencedByType(specNodeId) {
228
+ return this.findRelationshipTypes({ sourceSpecNodeId: specNodeId });
229
+ }
230
+ }
231
+ export {
232
+ SpecDataLoader
233
+ };
234
+ //# sourceMappingURL=spec-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/spec-loader.ts"],
4
+ "sourcesContent": ["/**\n * SpecDataLoader - Loads specification metadata from compiled bundled dist files\n *\n * Reads directly from the 14 compiled JSON files in cli/src/schemas/bundled/:\n * manifest.json, base.json, {layer}.json (x12)\n *\n * Never reads from .dr/ or expanded individual schema files.\n */\n\nimport path from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport fs from \"node:fs/promises\";\nimport { existsSync } from \"fs\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { logDebug } from \"../utils/globals.js\";\nimport {\n LayerSpec,\n NodeTypeSpec,\n RelationshipTypeSpec,\n PredicateSpec,\n SpecData,\n SpecStatistics,\n SpecLoaderOptions,\n NodeTypeQueryFilter,\n RelationshipTypeQueryFilter,\n AttributeSpec,\n} from \"./spec-loader-types.js\";\n\n// Bundled dist format types (matches spec/dist/ output)\ninterface CompiledManifest {\n specVersion: string;\n builtAt: string;\n layers: Array<{ id: string; number: number; name: string; nodeTypeCount: number; relationshipCount: number }>;\n}\n\ninterface CompiledBase {\n specVersion: string;\n schemas: Record<string, unknown>;\n predicates: Record<string, unknown>;\n}\n\ninterface CompiledRelationshipFlat {\n id: string;\n source_spec_node_id: string;\n source_layer: string;\n destination_spec_node_id: string;\n destination_layer: string;\n predicate: string;\n cardinality?: string;\n strength?: string;\n required?: boolean;\n}\n\ninterface CompiledLayer {\n layer: Record<string, unknown>;\n nodeSchemas: Record<string, Record<string, unknown>>;\n relationshipSchemas: Record<string, CompiledRelationshipFlat>;\n}\n\n/**\n * SpecDataLoader loads specification metadata from the compiled bundled dist files\n */\nexport class SpecDataLoader {\n private bundledDir: string;\n private options: SpecLoaderOptions;\n private cachedData: SpecData | null = null;\n private loadedAt: Date | null = null;\n\n constructor(options: SpecLoaderOptions = {}) {\n this.options = {\n cache: true,\n includeSchemas: false,\n ...options,\n };\n\n this.bundledDir = this.options.bundledDir || this.getDefaultBundledDir();\n }\n\n /**\n * Resolve the bundled dist directory.\n *\n * Priority:\n * 1. Explicit override via options.bundledDir\n * 2. CLI installation: schemas/bundled/ next to compiled source\n * 3. Development monorepo: spec/dist/\n */\n private getDefaultBundledDir(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Try 1: CLI installation (dist/core \u2192 dist/schemas/bundled)\n const installPath = path.join(currentDir, \"..\", \"schemas\", \"bundled\");\n if (existsSync(path.join(installPath, \"manifest.json\"))) {\n logDebug(`SpecDataLoader using bundled schemas: ${installPath}`);\n return installPath;\n }\n\n // Try 2: Development path \u2014 spec/dist/ in monorepo\n const devDistPath = path.join(currentDir, \"../../../spec/dist\");\n if (existsSync(path.join(devDistPath, \"manifest.json\"))) {\n logDebug(`SpecDataLoader using bundled schemas: ${devDistPath}`);\n return devDistPath;\n }\n\n throw new Error(\n \"Cannot find compiled spec schemas. Tried:\\n\" +\n ` 1. CLI installation: ${installPath}\\n` +\n ` 2. Development monorepo: ${devDistPath}\\n\\n` +\n \"Ensure you have built the spec (npm run build:spec) or installed the CLI.\"\n );\n }\n\n /**\n * Load all specification data\n */\n async load(): Promise<SpecData> {\n if (this.options.cache && this.cachedData) {\n return this.cachedData;\n }\n\n try {\n const [layers, nodeTypes, relationshipTypes, predicates] = await Promise.all([\n this.loadLayers(),\n this.loadNodeTypes(),\n this.loadRelationshipTypes(),\n this.loadPredicates(),\n ]);\n\n const data: SpecData = { layers, nodeTypes, relationshipTypes, predicates };\n\n if (this.options.cache) {\n this.cachedData = data;\n this.loadedAt = new Date();\n }\n\n return data;\n } catch (error) {\n throw new Error(\n `Failed to load specification data from ${this.bundledDir}: ${getErrorMessage(error)}`\n );\n }\n }\n\n /**\n * Load layer specifications from manifest.json + per-layer files\n */\n private async loadLayers(): Promise<LayerSpec[]> {\n const manifest = await this.readManifest();\n const layers: LayerSpec[] = [];\n\n for (const entry of manifest.layers) {\n const layerFile = path.join(this.bundledDir, `${entry.id}.json`);\n const content = await fs.readFile(layerFile, \"utf-8\");\n const layerData = JSON.parse(content) as CompiledLayer;\n const layer = layerData.layer as unknown as LayerSpec;\n layers.push(layer);\n }\n\n return layers.sort((a, b) => a.number - b.number);\n }\n\n /**\n * Load node type specifications from nodeSchemas in each layer file\n */\n private async loadNodeTypes(): Promise<NodeTypeSpec[]> {\n const manifest = await this.readManifest();\n const nodeTypes: NodeTypeSpec[] = [];\n\n for (const entry of manifest.layers) {\n const layerFile = path.join(this.bundledDir, `${entry.id}.json`);\n const content = await fs.readFile(layerFile, \"utf-8\");\n const layerData = JSON.parse(content) as CompiledLayer;\n\n for (const [, schema] of Object.entries(layerData.nodeSchemas)) {\n const spec_node_id = (schema.properties as Record<string, Record<string, unknown>>)?.spec_node_id?.const as string;\n const layer_id = (schema.properties as Record<string, Record<string, unknown>>)?.layer_id?.const as string;\n const type = (schema.properties as Record<string, Record<string, unknown>>)?.type?.const as string;\n\n if (!spec_node_id || !layer_id || !type) {\n throw new Error(\n `Node schema in ${entry.id}.json missing required const values: spec_node_id=${spec_node_id}, layer_id=${layer_id}, type=${type}`\n );\n }\n\n nodeTypes.push({\n spec_node_id,\n layer_id,\n type,\n title: (schema.title as string) || \"\",\n description: (schema.description as string) || \"\",\n attributes: this.extractAttributes((schema.properties as Record<string, unknown>)?.attributes as Record<string, unknown>),\n ...(this.options.includeSchemas && { schema: schema as Record<string, unknown> }),\n });\n }\n }\n\n return nodeTypes;\n }\n\n /**\n * Extract attribute specifications from node schema\n */\n private extractAttributes(attributesSchema: Record<string, unknown>): AttributeSpec[] {\n if (!attributesSchema || !attributesSchema.properties) {\n return [];\n }\n\n const props = attributesSchema.properties as Record<string, Record<string, unknown>>;\n const required = new Set((attributesSchema.required as string[]) || []);\n\n return Object.entries(props).map(([name, schema]) => ({\n name,\n type: (schema.type as string) || \"unknown\",\n format: schema.format as string | undefined,\n required: required.has(name),\n description: schema.description as string | undefined,\n }));\n }\n\n /**\n * Load relationship type specifications from relationshipSchemas in each layer file\n *\n * The bundled format stores flat data directly (not wrapped in JSON Schema),\n * so we read the fields directly rather than extracting from .const values.\n */\n private async loadRelationshipTypes(): Promise<RelationshipTypeSpec[]> {\n const manifest = await this.readManifest();\n const relationshipTypes: RelationshipTypeSpec[] = [];\n\n for (const entry of manifest.layers) {\n const layerFile = path.join(this.bundledDir, `${entry.id}.json`);\n const content = await fs.readFile(layerFile, \"utf-8\");\n const layerData = JSON.parse(content) as CompiledLayer;\n\n for (const rel of Object.values(layerData.relationshipSchemas)) {\n if (!rel.id || !rel.source_spec_node_id || !rel.source_layer) {\n throw new Error(\n `Relationship schema in ${entry.id}.json missing required fields: id=${rel.id}`\n );\n }\n\n relationshipTypes.push({\n id: rel.id,\n source_spec_node_id: rel.source_spec_node_id,\n source_layer: rel.source_layer,\n destination_spec_node_id: rel.destination_spec_node_id || \"\",\n destination_layer: rel.destination_layer || \"\",\n predicate: rel.predicate || \"\",\n cardinality: rel.cardinality || \"many-to-many\",\n strength: rel.strength || \"medium\",\n required: rel.required,\n });\n }\n }\n\n return relationshipTypes;\n }\n\n /**\n * Load predicate definitions from base.json\n */\n private async loadPredicates(): Promise<Map<string, PredicateSpec>> {\n const basePath = path.join(this.bundledDir, \"base.json\");\n\n try {\n const content = await fs.readFile(basePath, \"utf-8\");\n let data: CompiledBase;\n try {\n data = JSON.parse(content) as CompiledBase;\n } catch (parseError) {\n throw new Error(`Failed to parse base.json at ${basePath}: ${getErrorMessage(parseError)}`);\n }\n\n const predicates = new Map<string, PredicateSpec>();\n for (const [, pred] of Object.entries(data.predicates)) {\n const predSpec = pred as unknown as PredicateSpec;\n predicates.set(predSpec.predicate, {\n predicate: predSpec.predicate,\n inverse: predSpec.inverse,\n category: predSpec.category,\n description: predSpec.description,\n archimate_alignment: predSpec.archimate_alignment,\n semantics: predSpec.semantics,\n });\n }\n\n return predicates;\n } catch (error) {\n throw new Error(\n `Failed to load predicates from ${basePath}: ${getErrorMessage(error)}`\n );\n }\n }\n\n /**\n * Read and parse the bundled manifest.json\n */\n private async readManifest(): Promise<CompiledManifest> {\n const manifestPath = path.join(this.bundledDir, \"manifest.json\");\n const content = await fs.readFile(manifestPath, \"utf-8\");\n return JSON.parse(content) as CompiledManifest;\n }\n\n /**\n * Get loaded specification data\n * Throws if data hasn't been loaded yet\n */\n getSpecData(): SpecData {\n if (!this.cachedData) {\n throw new Error(\"Specification data not loaded. Call load() first.\");\n }\n return this.cachedData;\n }\n\n isLoaded(): boolean {\n return this.cachedData !== null;\n }\n\n getStatistics(): SpecStatistics {\n const data = this.getSpecData();\n return {\n layerCount: data.layers.length,\n nodeTypeCount: data.nodeTypes.length,\n relationshipTypeCount: data.relationshipTypes.length,\n predicateCount: data.predicates.size,\n totalAttributes: data.nodeTypes.reduce((sum, nt) => sum + nt.attributes.length, 0),\n loadedAt: this.loadedAt || new Date(),\n };\n }\n\n clear(): void {\n this.cachedData = null;\n this.loadedAt = null;\n }\n\n findNodeTypes(filter: NodeTypeQueryFilter = {}): NodeTypeSpec[] {\n const data = this.getSpecData();\n\n return data.nodeTypes.filter((nt) => {\n if (filter.layer && nt.layer_id !== filter.layer) return false;\n if (filter.type && nt.type !== filter.type) return false;\n if (filter.specNodeId && nt.spec_node_id !== filter.specNodeId) return false;\n if (filter.title && !nt.title.toLowerCase().includes(filter.title.toLowerCase()))\n return false;\n return true;\n });\n }\n\n findRelationshipTypes(filter: RelationshipTypeQueryFilter = {}): RelationshipTypeSpec[] {\n const data = this.getSpecData();\n\n return data.relationshipTypes.filter((rt) => {\n if (filter.sourceLayer && rt.source_layer !== filter.sourceLayer) return false;\n if (filter.sourceSpecNodeId && rt.source_spec_node_id !== filter.sourceSpecNodeId)\n return false;\n if (filter.destinationLayer && rt.destination_layer !== filter.destinationLayer)\n return false;\n if (filter.destinationSpecNodeId && rt.destination_spec_node_id !== filter.destinationSpecNodeId)\n return false;\n if (filter.predicate && rt.predicate !== filter.predicate) return false;\n return true;\n });\n }\n\n getNodeTypesForLayer(layerId: string): NodeTypeSpec[] {\n return this.findNodeTypes({ layer: layerId });\n }\n\n getRelationshipTypesForLayerPair(sourceLayer: string, destLayer?: string): RelationshipTypeSpec[] {\n const filter: RelationshipTypeQueryFilter = { sourceLayer };\n if (destLayer) {\n filter.destinationLayer = destLayer;\n }\n return this.findRelationshipTypes(filter);\n }\n\n getPredicate(predicateName: string): PredicateSpec | undefined {\n return this.getSpecData().predicates.get(predicateName);\n }\n\n getLayer(layerId: string): LayerSpec | undefined {\n const data = this.getSpecData();\n return data.layers.find((l) => l.id === layerId);\n }\n\n getAllLayers(): LayerSpec[] {\n return this.getSpecData().layers;\n }\n\n getNodeType(specNodeId: string): NodeTypeSpec | undefined {\n const data = this.getSpecData();\n return data.nodeTypes.find((nt) => nt.spec_node_id === specNodeId);\n }\n\n getNodeTypesReferencingType(specNodeId: string): RelationshipTypeSpec[] {\n return this.findRelationshipTypes({ destinationSpecNodeId: specNodeId });\n }\n\n getNodeTypesReferencedByType(specNodeId: string): RelationshipTypeSpec[] {\n return this.findRelationshipTypes({ sourceSpecNodeId: specNodeId });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }