@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,187 @@
1
+ # Changeset Reviewer Skill
2
+
3
+ When the user works with changesets or asks for review:
4
+
5
+ 1. List current changeset with `dr changeset list`
6
+ 2. Show changes with `dr changeset diff`
7
+ 3. Review additions/removals for naming consistency, reference validity, and layer-appropriate properties
8
+ 4. Suggest improvements before applying
9
+
10
+ ## When to Activate
11
+
12
+ This skill should activate when:
13
+
14
+ - User mentions "changeset", "review changes", or "diff"
15
+ - User is about to apply a changeset
16
+ - User asks "what changed" or "what did I add"
17
+ - User requests review before applying changes
18
+ - After making multiple changes in a changeset
19
+
20
+ ## Tools Available
21
+
22
+ - Bash (for `dr changeset *` commands: list, diff, apply, discard)
23
+ - Read (to examine changeset files and understand context)
24
+ - Grep (to check naming patterns and find similar elements)
25
+
26
+ ## Workflow
27
+
28
+ 1. **Show current changeset:**
29
+
30
+ ```bash
31
+ dr changeset list
32
+ ```
33
+
34
+ 2. **Display diff:**
35
+
36
+ ```bash
37
+ dr changeset diff
38
+ ```
39
+
40
+ 3. **Review each change:**
41
+ - **Additions:** Check naming, required properties, valid references
42
+ - **Modifications:** Ensure changes make sense, don't break links
43
+ - **Deletions:** Verify no dangling references remain
44
+
45
+ 4. **Check for issues:**
46
+ - Naming consistency (follows existing patterns?)
47
+ - Reference validity (all referenced elements exist?)
48
+ - Layer-appropriate properties (right properties for the layer?)
49
+ - Relationship validation (cross-layer references valid in layer schemas?)
50
+
51
+ 5. **Suggest improvements:**
52
+ - Better naming conventions
53
+ - Missing properties that should be added
54
+ - Potential relationships that should be validated
55
+ - Elements that might need to be added to support the change
56
+
57
+ 6. **Recommend action:**
58
+ - Apply if everything looks good
59
+ - Fix issues first if problems found
60
+ - Discard if changes are no longer needed
61
+
62
+ ## Example Interaction
63
+
64
+ **User:** "Can you review my changeset before I apply it?"
65
+
66
+ **Assistant:** [Skill activates] Let me check what's in your current changeset...
67
+
68
+ ```bash
69
+ dr changeset list
70
+ dr changeset diff
71
+ ```
72
+
73
+ **Changeset:** explore-caching (active)
74
+
75
+ **Changes:**
76
+
77
+ **Additions (3):**
78
+
79
+ 1. ✅ `application/cache-service`
80
+ - Type: service
81
+ - Description: "Caching layer for API responses"
82
+ - Status: proposed
83
+ - **Good:** Clear description, appropriate status
84
+
85
+ 2. ⚠️ `technology/redis`
86
+ - Type: technology
87
+ - Description: "Redis cache"
88
+ - **Issue:** Missing version property (recommended for technology layer)
89
+ - **Suggestion:** Add `"version": "7.0"` or latest
90
+
91
+ 3. ❌ `api/cache-endpoint`
92
+ - References: `application/cache-service`, `data/cache-store`
93
+ - **Issue:** References `data/cache-store` but this element doesn't exist
94
+ - **Fix:** Either create `data/cache-store` or remove the reference
95
+
96
+ **Modifications (1):**
97
+
98
+ 1. ✅ `api/user-profile-endpoint`
99
+ - Added reference to `application/cache-service`
100
+ - **Good:** Makes sense to integrate caching
101
+
102
+ **Deletions (0):**
103
+ None
104
+
105
+ **Missing Elements:**
106
+
107
+ - `data/cache-store` - Referenced by api/cache-endpoint but not created
108
+
109
+ **Cross-Layer Relationships:**
110
+
111
+ - ⚠️ New cross-layer relationships need validation:
112
+ - application/cache-service → technology/redis
113
+ - api/cache-endpoint → application/cache-service
114
+
115
+ **Recommendations:**
116
+
117
+ 1. Add version to technology/redis
118
+ 2. Create data/cache-store element
119
+ 3. Validate cross-layer relationships
120
+ 4. Consider adding motivation/improve-performance to justify caching
121
+
122
+ Would you like me to:
123
+
124
+ - Help you fix these issues before applying?
125
+ - Apply anyway (some issues are warnings, not blockers)?
126
+ - Show you how to add the missing elements?
127
+
128
+ ## Review Checklist
129
+
130
+ For each addition, check:
131
+
132
+ - [ ] Naming follows conventions (kebab-case, descriptive)
133
+ - [ ] Required properties present (id, type, description, status)
134
+ - [ ] Layer-appropriate properties used
135
+ - [ ] References point to existing elements
136
+ - [ ] Status is valid for the element type
137
+
138
+ For each modification, check:
139
+
140
+ - [ ] Changes make logical sense
141
+ - [ ] Don't break existing links
142
+ - [ ] Updated properties are valid
143
+ - [ ] Description updated if behavior changed
144
+
145
+ For each deletion, check:
146
+
147
+ - [ ] No elements reference this one
148
+ - [ ] Links are updated/removed
149
+ - [ ] Deletion is intentional (not accidental)
150
+
151
+ For the changeset overall:
152
+
153
+ - [ ] Changes are cohesive (related to single feature/idea)
154
+ - [ ] Naming is consistent across new elements
155
+ - [ ] Cross-layer links are registered
156
+ - [ ] No orphaned references
157
+
158
+ ## Common Issues
159
+
160
+ **Issue 1: Broken references**
161
+
162
+ - New element references non-existent element
163
+ - **Fix:** Create the referenced element or remove reference
164
+
165
+ **Issue 2: Missing link registration**
166
+
167
+ - Cross-layer references not in link registry
168
+ - **Fix:** Register links with `dr update ...`
169
+
170
+ **Issue 3: Inconsistent naming**
171
+
172
+ - New elements don't follow existing patterns
173
+ - **Fix:** Rename to match conventions
174
+
175
+ **Issue 4: Incomplete feature**
176
+
177
+ - Elements added across some layers but not others
178
+ - **Fix:** Complete the traceability chain (e.g., add business justification)
179
+
180
+ ## Best Practices
181
+
182
+ - Review changesets before applying, not after
183
+ - Check that the changeset is focused (single feature/experiment)
184
+ - Verify all cross-layer references are valid
185
+ - Suggest improvements, but don't be overly strict
186
+ - Explain WHY something might be an issue
187
+ - After applying, always validate the full model
@@ -0,0 +1,51 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { readdir } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { existsSync } from "node:fs";
6
+ async function computeFileHash(filePath) {
7
+ return new Promise((resolve, reject) => {
8
+ const hash = createHash("sha256"), stream = createReadStream(filePath);
9
+ stream.on("data", (data) => {
10
+ hash.update(data);
11
+ }), stream.on("end", () => {
12
+ const fullHash = hash.digest("hex");
13
+ resolve(fullHash.substring(0, 8));
14
+ }), stream.on("error", (error) => {
15
+ reject(error);
16
+ });
17
+ });
18
+ }
19
+ async function computeDirectoryHashes(baseDir, prefix) {
20
+ const hashes = /* @__PURE__ */ new Map();
21
+ if (!existsSync(baseDir))
22
+ return hashes;
23
+ async function scanDir(dir, relativePrefix = "") {
24
+ try {
25
+ const entries = await readdir(dir, { withFileTypes: !0 });
26
+ for (const entry of entries) {
27
+ const fullPath = join(dir, entry.name), relativePath = relativePrefix ? join(relativePrefix, entry.name) : entry.name;
28
+ if (entry.isDirectory())
29
+ await scanDir(fullPath, relativePath);
30
+ else if (entry.isFile()) {
31
+ if (prefix && !entry.name.startsWith(prefix))
32
+ continue;
33
+ try {
34
+ const hash = await computeFileHash(fullPath);
35
+ hashes.set(relativePath, hash);
36
+ } catch (error) {
37
+ console.error(`Failed to hash file ${fullPath}:`, error);
38
+ }
39
+ }
40
+ }
41
+ } catch (error) {
42
+ throw error;
43
+ }
44
+ }
45
+ return await scanDir(baseDir), hashes;
46
+ }
47
+ export {
48
+ computeDirectoryHashes,
49
+ computeFileHash
50
+ };
51
+ //# sourceMappingURL=hash-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/integrations/hash-utils.ts"],
4
+ "sourcesContent": ["/**\n * File Hashing Utilities\n *\n * Provides SHA256-based file hashing for change detection in integration files.\n * Uses streaming for memory efficiency when handling large files.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Compute SHA256 hash of a file, truncated to 8 characters\n *\n * Uses streaming to efficiently handle files of any size without loading\n * them entirely into memory. Matches Python implementation using the same\n * truncation length (8 characters) for consistency.\n *\n * @param filePath - Absolute path to file to hash\n * @returns Promise resolving to 8-character hex hash\n * @throws Error if file cannot be read\n *\n * @example\n * const hash = await computeFileHash('/path/to/file.ts');\n * // Returns: 'a1b2c3d4'\n */\nexport async function computeFileHash(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = createReadStream(filePath);\n\n stream.on(\"data\", (data: Buffer) => {\n hash.update(data);\n });\n\n stream.on(\"end\", () => {\n const fullHash = hash.digest(\"hex\");\n resolve(fullHash.substring(0, 8));\n });\n\n stream.on(\"error\", (error: Error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Compute hashes for all files in a directory recursively\n *\n * Scans the directory tree and computes hashes for all files, optionally\n * filtering by a filename prefix. Returns a map of relative paths to hashes,\n * enabling efficient comparison of installed vs. source files.\n *\n * @param baseDir - Base directory to scan\n * @param prefix - Optional prefix filter (only include files matching prefix)\n * @returns Promise resolving to Map of relative paths to 8-character hashes\n * @throws Error if directory cannot be read\n *\n * @example\n * const hashes = await computeDirectoryHashes('/path/to/dir', 'dr-');\n * // Returns: Map { 'dr-file1.md' => 'a1b2c3d4', 'subdir/dr-file2.md' => 'e5f6g7h8' }\n */\nexport async function computeDirectoryHashes(\n baseDir: string,\n prefix?: string\n): Promise<Map<string, string>> {\n const hashes = new Map<string, string>();\n\n // Return empty map if directory doesn't exist\n if (!existsSync(baseDir)) {\n return hashes;\n }\n\n async function scanDir(dir: string, relativePrefix: string = \"\"): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relativePrefix ? join(relativePrefix, entry.name) : entry.name;\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n await scanDir(fullPath, relativePath);\n } else if (entry.isFile()) {\n // Check prefix filter\n if (prefix && !entry.name.startsWith(prefix)) {\n continue;\n }\n\n // Compute hash for file\n try {\n const hash = await computeFileHash(fullPath);\n hashes.set(relativePath, hash);\n } catch (error) {\n // Log error but continue processing other files\n console.error(`Failed to hash file ${fullPath}:`, error);\n }\n }\n }\n } catch (error) {\n // Re-throw directory read errors\n throw error;\n }\n }\n\n await scanDir(baseDir);\n return hashes;\n}\n"],
5
+ "mappings": "AAOA,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAiB3B,eAAsB,gBAAgB,UAAgB;AACpD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACrC,UAAM,OAAO,WAAW,QAAQ,GAC1B,SAAS,iBAAiB,QAAQ;AAExC,WAAO,GAAG,QAAQ,CAAC,SAAgB;AACjC,WAAK,OAAO,IAAI;IAClB,CAAC,GAED,OAAO,GAAG,OAAO,MAAK;AACpB,YAAM,WAAW,KAAK,OAAO,KAAK;AAClC,cAAQ,SAAS,UAAU,GAAG,CAAC,CAAC;IAClC,CAAC,GAED,OAAO,GAAG,SAAS,CAAC,UAAgB;AAClC,aAAO,KAAK;IACd,CAAC;EACH,CAAC;AACH;AAkBA,eAAsB,uBACpB,SACA,QAAe;AAEf,QAAM,SAAS,oBAAI,IAAG;AAGtB,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAGT,iBAAe,QAAQ,KAAa,iBAAyB,IAAE;AAC7D,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,GAAI,CAAE;AAE1D,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,KAAK,KAAK,MAAM,IAAI,GAC/B,eAAe,iBAAiB,KAAK,gBAAgB,MAAM,IAAI,IAAI,MAAM;AAE/E,YAAI,MAAM,YAAW;AAEnB,gBAAM,QAAQ,UAAU,YAAY;iBAC3B,MAAM,OAAM,GAAI;AAEzB,cAAI,UAAU,CAAC,MAAM,KAAK,WAAW,MAAM;AACzC;AAIF,cAAI;AACF,kBAAM,OAAO,MAAM,gBAAgB,QAAQ;AAC3C,mBAAO,IAAI,cAAc,IAAI;UAC/B,SAAS,OAAO;AAEd,oBAAQ,MAAM,uBAAuB,QAAQ,KAAK,KAAK;UACzD;QACF;MACF;IACF,SAAS,OAAO;AAEd,YAAM;IACR;EACF;AAEA,eAAM,QAAQ,OAAO,GACd;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ function validateVersionData(data) {
2
+ if (typeof data != "object" || data === null)
3
+ throw new Error("Version data must be an object");
4
+ const obj = data;
5
+ if (typeof obj.version != "string")
6
+ throw new Error('Missing or invalid "version" field in version file');
7
+ if (typeof obj.installed_at != "string")
8
+ throw new Error('Missing or invalid "installed_at" field in version file');
9
+ if (typeof obj.components != "object" || obj.components === null)
10
+ throw new Error('Missing or invalid "components" field in version file');
11
+ return obj;
12
+ }
13
+ export {
14
+ validateVersionData
15
+ };
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/integrations/types.ts"],
4
+ "sourcesContent": ["/**\n * Integration Management Types\n *\n * Defines the core data structures for managing Claude Code and GitHub Copilot\n * integrations, matching the Python CLI's integration manager patterns.\n */\n\n/**\n * Component configuration matching Python COMPONENTS dict structure\n * Describes how a component should be copied from source to target\n */\nexport interface ComponentConfig {\n /** Source directory name in integrations/{integration}/ */\n source: string;\n\n /** Target directory in project (.claude/ or .github/) */\n target: string;\n\n /** Human-readable description of this component */\n description: string;\n\n /** Optional file prefix filter (e.g., \"dr-\" to only copy dr-*.md) */\n prefix?: string;\n\n /** Whether component contains individual files or subdirectories */\n type: \"files\" | \"dirs\";\n\n /**\n * Whether this component is DR-owned (tracked in version file for updates)\n * Set to false for user-customizable components like templates\n * Defaults to true if not specified\n */\n tracked?: boolean;\n}\n\n/**\n * Version file YAML schema (.dr-version, .dr-copilot-version)\n * Tracks installation metadata and file hashes for change detection\n */\nexport interface VersionData {\n /** CLI version that installed this integration */\n version: string;\n\n /** ISO 8601 timestamp when integration was installed/updated */\n installed_at: string;\n\n /** Mapping of component names to their installed file hashes */\n components: {\n [componentName: string]: {\n [fileName: string]: {\n /** SHA256 hash truncated to 8 characters */\n hash: string;\n\n /** True if installed file differs from the source (user-modified or hash unreadable) */\n modified: boolean;\n };\n };\n };\n}\n\n/**\n * Validate VersionData deserialization result\n *\n * Ensures that the YAML-deserialized object has the required structure\n * and types. Catches corrupted version files early.\n *\n * @param data Deserialized object from YAML\n * @returns VersionData if valid\n * @throws Error if validation fails\n */\nexport function validateVersionData(data: unknown): VersionData {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Version data must be an object\");\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.version !== \"string\") {\n throw new Error('Missing or invalid \"version\" field in version file');\n }\n\n if (typeof obj.installed_at !== \"string\") {\n throw new Error('Missing or invalid \"installed_at\" field in version file');\n }\n\n if (typeof obj.components !== \"object\" || obj.components === null) {\n throw new Error('Missing or invalid \"components\" field in version file');\n }\n\n // Basic structure validation - deeper structure verified on access\n return obj as unknown as VersionData;\n}\n\n/**\n * File change detected during update operation\n * Used to categorize and report changes between installed and source versions\n */\nexport interface FileChange {\n /** Relative path to file within target directory */\n path: string;\n\n /** Component name this file belongs to */\n component: string;\n\n /** Type of change detected */\n changeType: \"added\" | \"modified\" | \"deleted\" | \"user-modified\" | \"conflict\";\n\n /** Hash of source file (if it exists in source) */\n sourceHash?: string;\n\n /** Hash of installed file (if it exists in target) */\n installedHash?: string;\n}\n\n/**\n * Obsolete file detected during cleanup\n * Represents a file in the installed integration that no longer exists in source\n */\nexport interface ObsoleteFile {\n /** Relative path to file within target directory */\n path: string;\n\n /** Component name this file belonged to */\n component: string;\n}\n"],
5
+ "mappings": "AAsEM,SAAU,oBAAoB,MAAa;AAC/C,MAAI,OAAO,QAAS,YAAY,SAAS;AACvC,UAAM,IAAI,MAAM,gCAAgC;AAGlD,QAAM,MAAM;AAEZ,MAAI,OAAO,IAAI,WAAY;AACzB,UAAM,IAAI,MAAM,oDAAoD;AAGtE,MAAI,OAAO,IAAI,gBAAiB;AAC9B,UAAM,IAAI,MAAM,yDAAyD;AAG3E,MAAI,OAAO,IAAI,cAAe,YAAY,IAAI,eAAe;AAC3D,UAAM,IAAI,MAAM,uDAAuD;AAIzE,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,278 @@
1
+ import { formatLayerName } from "../utils/layer-name-formatter.js";
2
+ import { formatMarkdownTable } from "../utils/markdown-table.js";
3
+ import { sanitizeMermaidId, escapeMermaidLabel } from "../utils/mermaid-utils.js";
4
+ import { createAnchor } from "../utils/markdown-anchor.js";
5
+ import { escapeMarkdown, getLayerDescription, valueToMarkdown } from "../export/markdown-utils.js";
6
+ import { getLayerOrder, CANONICAL_LAYER_NAMES } from "../core/layers.js";
7
+ import { getValidRelationships } from "../generated/relationship-index.js";
8
+ class ModelLayerReportGenerator {
9
+ modelVersion;
10
+ generatedAt;
11
+ constructor(modelVersion, generatedAt) {
12
+ this.modelVersion = modelVersion, this.generatedAt = generatedAt;
13
+ }
14
+ /**
15
+ * Generate complete layer report markdown
16
+ */
17
+ generate(data) {
18
+ const lines = [];
19
+ return lines.push(this.generateHeader(data)), lines.push(this.generateTableOfContents(data)), lines.push(this.generateLayerIntroduction(data)), lines.push(this.generateIntraLayerDiagram(data)), lines.push(this.generateInterLayerDiagram(data)), lines.push(this.generateInterLayerTable(data)), lines.push(this.generateElementReference(data)), lines.push(this.generateFooter()), lines.join("");
20
+ }
21
+ generateHeader(data) {
22
+ const lines = [];
23
+ return lines.push(`# ${formatLayerName(data.layerName)}
24
+ `), lines.push(`
25
+ `), lines.push(`${getLayerDescription(data.layerName)}
26
+ `), lines.push(`
27
+ `), lines.join("");
28
+ }
29
+ generateTableOfContents(data) {
30
+ const lines = [];
31
+ return lines.push(`## Report Index
32
+ `), lines.push(`
33
+ `), lines.push(`- [Layer Introduction](#layer-introduction)
34
+ `), lines.push(`- [Intra-Layer Relationships](#intra-layer-relationships)
35
+ `), lines.push(`- [Inter-Layer Dependencies](#inter-layer-dependencies)
36
+ `), data.interRelationships.length > 0 && lines.push(`- [Inter-Layer Relationships Table](#inter-layer-relationships-table)
37
+ `), data.elements.length > 0 && lines.push(`- [Element Reference](#element-reference)
38
+ `), lines.push(`
39
+ `), lines.join("");
40
+ }
41
+ generateLayerIntroduction(data) {
42
+ const lines = [];
43
+ lines.push(`## Layer Introduction
44
+ `), lines.push(`
45
+ `);
46
+ const headers = ["Metric", "Count"], rows = [
47
+ ["Elements", String(data.statistics.elementCount)],
48
+ ["Intra-Layer Relationships", String(data.statistics.intraRelationshipCount)],
49
+ ["Inter-Layer Relationships", String(data.statistics.interRelationshipCount)],
50
+ ["Inbound Relationships", String(data.statistics.inboundRelationshipCount)],
51
+ ["Outbound Relationships", String(data.statistics.outboundRelationshipCount)]
52
+ ], table = formatMarkdownTable(headers, rows);
53
+ if (lines.push(table), lines.push(`
54
+ `), data.upstreamLayers.length > 0 || data.downstreamLayers.length > 0) {
55
+ if (lines.push(`**Cross-Layer References**:
56
+ `), lines.push(`
57
+ `), data.upstreamLayers.length > 0) {
58
+ const upstreamLinks = data.upstreamLayers.map((layerName) => this.createLayerLink(layerName)).join(", ");
59
+ lines.push(`- **Upstream layers**: ${upstreamLinks}
60
+ `);
61
+ }
62
+ if (data.downstreamLayers.length > 0) {
63
+ const downstreamLinks = data.downstreamLayers.map((layerName) => this.createLayerLink(layerName)).join(", ");
64
+ lines.push(`- **Downstream layers**: ${downstreamLinks}
65
+ `);
66
+ }
67
+ lines.push(`
68
+ `);
69
+ }
70
+ return lines.join("");
71
+ }
72
+ generateIntraLayerDiagram(data) {
73
+ const lines = [];
74
+ if (lines.push(`## Intra-Layer Relationships
75
+ `), lines.push(`
76
+ `), data.elements.length === 0)
77
+ return lines.push(`No elements in this layer.
78
+ `), lines.push(`
79
+ `), lines.join("");
80
+ if (data.elements.length > 30) {
81
+ lines.push(`*This layer has >30 elements. Summary table shown instead of diagram.*
82
+ `), lines.push(`
83
+ `);
84
+ const headers = ["Element", "Type", "Relationships"], rows = [];
85
+ for (const element of data.elements) {
86
+ const relCount = data.intraRelationships.filter((rel) => rel.source === element.path || rel.target === element.path).length;
87
+ rows.push([
88
+ `\`${escapeMarkdown(element.path)}\``,
89
+ `\`${escapeMarkdown(element.type)}\``,
90
+ String(relCount)
91
+ ]);
92
+ }
93
+ const table = formatMarkdownTable(headers, rows);
94
+ return lines.push(table), lines.push(`
95
+ `), lines.join("");
96
+ }
97
+ lines.push("```mermaid\n"), lines.push(`flowchart LR
98
+ `), lines.push(` subgraph ${sanitizeMermaidId(data.layerName)}
99
+ `);
100
+ for (const element of data.elements) {
101
+ const nodeId = sanitizeMermaidId(element.path), label = escapeMermaidLabel(element.name);
102
+ lines.push(` ${nodeId}["${label}"]
103
+ `);
104
+ }
105
+ const sortedRelationships = [...data.intraRelationships].sort((a, b) => {
106
+ const aKey = `${a.source}-${a.predicate}-${a.target}`, bKey = `${b.source}-${b.predicate}-${b.target}`;
107
+ return aKey.localeCompare(bKey);
108
+ });
109
+ for (const rel of sortedRelationships) {
110
+ const sourceId = sanitizeMermaidId(rel.source), targetId = sanitizeMermaidId(rel.target), predicate = escapeMermaidLabel(rel.predicate);
111
+ lines.push(` ${sourceId} -->|${predicate}| ${targetId}
112
+ `);
113
+ }
114
+ return lines.push(` end
115
+ `), lines.push("```\n"), lines.push(`
116
+ `), lines.join("");
117
+ }
118
+ generateInterLayerDiagram(data) {
119
+ const lines = [];
120
+ if (lines.push(`## Inter-Layer Dependencies
121
+ `), lines.push(`
122
+ `), data.elements.length === 0)
123
+ return lines.push(`No elements in this layer.
124
+ `), lines.push(`
125
+ `), lines.join("");
126
+ lines.push("```mermaid\n"), lines.push(`flowchart TB
127
+ `), lines.push(` classDef current fill:#f9f,stroke:#333,stroke-width:2px
128
+ `);
129
+ for (const layerName of CANONICAL_LAYER_NAMES) {
130
+ const layerId = sanitizeMermaidId(layerName), label = formatLayerName(layerName);
131
+ lines.push(` ${layerId}["${label}"]
132
+ `);
133
+ }
134
+ const addedRelationships = /* @__PURE__ */ new Set(), layerRelationships = [];
135
+ for (const rel of data.interRelationships)
136
+ if (rel.layer !== rel.targetLayer && rel.targetLayer) {
137
+ const key = `${rel.layer}-${rel.targetLayer}`;
138
+ if (!addedRelationships.has(key)) {
139
+ const sourceId = sanitizeMermaidId(rel.layer), destId = sanitizeMermaidId(rel.targetLayer);
140
+ layerRelationships.push({ sourceId, destId }), addedRelationships.add(key);
141
+ }
142
+ }
143
+ const sortedLayerRels = layerRelationships.sort((a, b) => {
144
+ const aKey = `${a.sourceId}-${a.destId}`, bKey = `${b.sourceId}-${b.destId}`;
145
+ return aKey.localeCompare(bKey);
146
+ });
147
+ for (const { sourceId, destId } of sortedLayerRels)
148
+ lines.push(` ${sourceId} --> ${destId}
149
+ `);
150
+ const currentLayerId = sanitizeMermaidId(data.layerName);
151
+ return lines.push(` class ${currentLayerId} current
152
+ `), lines.push("```\n"), lines.push(`
153
+ `), lines.join("");
154
+ }
155
+ generateInterLayerTable(data) {
156
+ const lines = [];
157
+ if (data.interRelationships.length === 0)
158
+ return "";
159
+ lines.push(`## Inter-Layer Relationships Table
160
+ `), lines.push(`
161
+ `);
162
+ const sortedRels = [...data.interRelationships].sort((a, b) => {
163
+ const aKey = `${a.source}-${a.predicate}-${a.target}`, bKey = `${b.source}-${b.predicate}-${b.target}`;
164
+ return aKey.localeCompare(bKey);
165
+ }), headers = ["Relationship ID", "Source Node", "Dest Node", "Dest Layer", "Predicate", "Cardinality", "Strength"], rows = [];
166
+ for (const rel of sortedRels) {
167
+ const sourceType = this.extractElementType(rel.source), targetType = this.extractElementType(rel.target), specs = getValidRelationships(sourceType, rel.predicate, targetType), cardinality = specs.length > 0 ? specs[0].cardinality : "unknown", strength = specs.length > 0 ? specs[0].strength : "unknown", relationshipId = specs.length > 0 ? specs[0].id : `${rel.source}-${rel.predicate}-${rel.target}`;
168
+ rows.push([
169
+ `\`${escapeMarkdown(relationshipId)}\``,
170
+ `\`${escapeMarkdown(rel.source)}\``,
171
+ `\`${escapeMarkdown(rel.target)}\``,
172
+ rel.targetLayer ? `\`${escapeMarkdown(rel.targetLayer)}\`` : "\u2014",
173
+ `\`${escapeMarkdown(rel.predicate)}\``,
174
+ cardinality,
175
+ strength
176
+ ]);
177
+ }
178
+ const table = formatMarkdownTable(headers, rows);
179
+ return lines.push(table), lines.push(`
180
+ `), lines.join("");
181
+ }
182
+ generateElementReference(data) {
183
+ const lines = [];
184
+ if (data.elements.length === 0)
185
+ return "";
186
+ lines.push(`## Element Reference
187
+ `), lines.push(`
188
+ `);
189
+ for (const element of data.elements) {
190
+ const anchor = createAnchor(element.name);
191
+ if (lines.push(`### ${escapeMarkdown(element.name)} {#${anchor}}
192
+ `), lines.push(`
193
+ `), lines.push(`**ID**: \`${escapeMarkdown(element.path)}\`
194
+
195
+ `), lines.push(`**Type**: \`${escapeMarkdown(element.type)}\`
196
+
197
+ `), element.description && lines.push(`${escapeMarkdown(element.description)}
198
+
199
+ `), Object.keys(element.attributes).length > 0) {
200
+ lines.push(`#### Attributes
201
+
202
+ `);
203
+ const attrHeaders = ["Name", "Value"], attrRows = [], sortedAttrs = Object.entries(element.attributes).sort((a, b) => a[0].localeCompare(b[0]));
204
+ for (const [name, value] of sortedAttrs) {
205
+ const valueStr = valueToMarkdown(value);
206
+ attrRows.push([name, valueStr]);
207
+ }
208
+ const attrTable = formatMarkdownTable(attrHeaders, attrRows);
209
+ lines.push(attrTable), lines.push(`
210
+ `);
211
+ }
212
+ const elementRels = this.getElementRelationships(data, element.path);
213
+ if (elementRels.length > 0) {
214
+ lines.push(`#### Relationships
215
+
216
+ `);
217
+ const relHeaders = ["Type", "Related Element", "Predicate", "Direction"], relRows = [], sortedElementRels = [...elementRels].sort((a, b) => {
218
+ const aKey = `${a.relType}-${a.rel.source}-${a.rel.predicate}-${a.rel.target}`, bKey = `${b.relType}-${b.rel.source}-${b.rel.predicate}-${b.rel.target}`;
219
+ return aKey.localeCompare(bKey);
220
+ });
221
+ for (const { rel, relType } of sortedElementRels) {
222
+ const relatedElement = rel.source === element.path ? rel.target : rel.source, direction = rel.source === element.path ? "outbound" : "inbound";
223
+ relRows.push([
224
+ relType,
225
+ `\`${escapeMarkdown(relatedElement)}\``,
226
+ `\`${escapeMarkdown(rel.predicate)}\``,
227
+ direction
228
+ ]);
229
+ }
230
+ const relTable = formatMarkdownTable(relHeaders, relRows);
231
+ lines.push(relTable), lines.push(`
232
+ `);
233
+ }
234
+ }
235
+ return lines.join("");
236
+ }
237
+ generateFooter() {
238
+ const lines = [];
239
+ return lines.push(`---
240
+ `), lines.push(`
241
+ `), lines.push(`Generated: ${this.generatedAt} | Model Version: ${this.modelVersion}
242
+ `), lines.join("");
243
+ }
244
+ /**
245
+ * Create a markdown link to a layer report
246
+ */
247
+ createLayerLink(layerName) {
248
+ const layerNumber = getLayerOrder(layerName);
249
+ if (layerNumber === -1)
250
+ return layerName;
251
+ const filename = `./${String(layerNumber).padStart(2, "0")}-${layerName}-layer-report.md`;
252
+ return `[${formatLayerName(layerName)}](${filename})`;
253
+ }
254
+ /**
255
+ * Get relationships involving a specific element
256
+ */
257
+ getElementRelationships(data, elementPath) {
258
+ const rels = [];
259
+ for (const rel of data.intraRelationships)
260
+ (rel.source === elementPath || rel.target === elementPath) && rels.push({ rel, relType: "intra-layer" });
261
+ for (const rel of data.interRelationships)
262
+ (rel.source === elementPath || rel.target === elementPath) && rels.push({ rel, relType: "inter-layer" });
263
+ return rels;
264
+ }
265
+ /**
266
+ * Extract element type from element path in layer.type format
267
+ * Example: "motivation.goal.customer-satisfaction" -> "motivation.goal"
268
+ * This format matches the keys in RELATIONSHIPS_BY_SOURCE map.
269
+ */
270
+ extractElementType(elementPath) {
271
+ const parts = elementPath.split(".");
272
+ return parts.length >= 2 ? parts.slice(0, 2).join(".") : elementPath;
273
+ }
274
+ }
275
+ export {
276
+ ModelLayerReportGenerator
277
+ };
278
+ //# sourceMappingURL=model-layer-report-generator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reports/model-layer-report-generator.ts"],
4
+ "sourcesContent": ["/**\n * Model Layer Report Generator\n *\n * Generates markdown documentation for a single architecture layer with:\n * - Mermaid intra-layer and inter-layer diagrams\n * - Relationship tables\n * - Element reference documentation\n * - Navigation and metadata\n *\n * Mirrors LayerReportGenerator from spec script but renders element instances\n * instead of type schemas.\n */\n\nimport type { ModelLayerReportData } from './model-report-data.js';\nimport type { Relationship } from '../core/relationships.js';\nimport { formatLayerName } from '../utils/layer-name-formatter.js';\nimport { formatMarkdownTable } from '../utils/markdown-table.js';\nimport { sanitizeMermaidId, escapeMermaidLabel } from '../utils/mermaid-utils.js';\nimport { createAnchor } from '../utils/markdown-anchor.js';\nimport { escapeMarkdown, getLayerDescription, valueToMarkdown } from '../export/markdown-utils.js';\nimport { getLayerOrder, CANONICAL_LAYER_NAMES } from '../core/layers.js';\nimport { getValidRelationships } from '../generated/relationship-index.js';\n\nexport class ModelLayerReportGenerator {\n constructor(private modelVersion: string, private generatedAt: string) {}\n\n /**\n * Generate complete layer report markdown\n */\n generate(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n // Document header\n lines.push(this.generateHeader(data));\n\n // Report Index (table of contents)\n lines.push(this.generateTableOfContents(data));\n\n // Layer Introduction + Statistics\n lines.push(this.generateLayerIntroduction(data));\n\n // Intra-Layer Relationships diagram\n lines.push(this.generateIntraLayerDiagram(data));\n\n // Inter-Layer Dependencies diagram\n lines.push(this.generateInterLayerDiagram(data));\n\n // Inter-Layer Relationships Table\n lines.push(this.generateInterLayerTable(data));\n\n // Element Reference section\n lines.push(this.generateElementReference(data));\n\n // Footer\n lines.push(this.generateFooter());\n\n return lines.join('');\n }\n\n private generateHeader(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push(`# ${formatLayerName(data.layerName)}\\n`);\n lines.push('\\n');\n lines.push(`${getLayerDescription(data.layerName)}\\n`);\n lines.push('\\n');\n return lines.join('');\n }\n\n private generateTableOfContents(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Report Index\\n');\n lines.push('\\n');\n\n lines.push('- [Layer Introduction](#layer-introduction)\\n');\n lines.push('- [Intra-Layer Relationships](#intra-layer-relationships)\\n');\n lines.push('- [Inter-Layer Dependencies](#inter-layer-dependencies)\\n');\n\n if (data.interRelationships.length > 0) {\n lines.push('- [Inter-Layer Relationships Table](#inter-layer-relationships-table)\\n');\n }\n\n if (data.elements.length > 0) {\n lines.push('- [Element Reference](#element-reference)\\n');\n }\n\n lines.push('\\n');\n return lines.join('');\n }\n\n private generateLayerIntroduction(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Layer Introduction\\n');\n lines.push('\\n');\n\n // Statistics table\n const headers = ['Metric', 'Count'];\n const rows = [\n ['Elements', String(data.statistics.elementCount)],\n ['Intra-Layer Relationships', String(data.statistics.intraRelationshipCount)],\n ['Inter-Layer Relationships', String(data.statistics.interRelationshipCount)],\n ['Inbound Relationships', String(data.statistics.inboundRelationshipCount)],\n ['Outbound Relationships', String(data.statistics.outboundRelationshipCount)],\n ];\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n // Upstream and downstream layers\n if (data.upstreamLayers.length > 0 || data.downstreamLayers.length > 0) {\n lines.push('**Cross-Layer References**:\\n');\n lines.push('\\n');\n\n if (data.upstreamLayers.length > 0) {\n const upstreamLinks = data.upstreamLayers\n .map((layerName) => this.createLayerLink(layerName))\n .join(', ');\n lines.push(`- **Upstream layers**: ${upstreamLinks}\\n`);\n }\n\n if (data.downstreamLayers.length > 0) {\n const downstreamLinks = data.downstreamLayers\n .map((layerName) => this.createLayerLink(layerName))\n .join(', ');\n lines.push(`- **Downstream layers**: ${downstreamLinks}\\n`);\n }\n\n lines.push('\\n');\n }\n\n return lines.join('');\n }\n\n private generateIntraLayerDiagram(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Intra-Layer Relationships\\n');\n lines.push('\\n');\n\n // Empty layer handling\n if (data.elements.length === 0) {\n lines.push('No elements in this layer.\\n');\n lines.push('\\n');\n return lines.join('');\n }\n\n // Large layer fallback: For >30 elements, use summary table instead of Mermaid\n // to prevent rendering failures\n if (data.elements.length > 30) {\n lines.push('*This layer has >30 elements. Summary table shown instead of diagram.*\\n');\n lines.push('\\n');\n\n const headers = ['Element', 'Type', 'Relationships'];\n const rows: string[][] = [];\n\n for (const element of data.elements) {\n const relCount = data.intraRelationships.filter(\n (rel) => rel.source === element.path || rel.target === element.path\n ).length;\n\n rows.push([\n `\\`${escapeMarkdown(element.path)}\\``,\n `\\`${escapeMarkdown(element.type)}\\``,\n String(relCount),\n ]);\n }\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n return lines.join('');\n }\n\n // Generate mermaid diagram for layers with \u226430 elements\n lines.push('```mermaid\\n');\n lines.push('flowchart LR\\n');\n lines.push(` subgraph ${sanitizeMermaidId(data.layerName)}\\n`);\n\n // Add all elements as nodes (use escapeMermaidLabel for correct Mermaid escaping)\n for (const element of data.elements) {\n const nodeId = sanitizeMermaidId(element.path);\n const label = escapeMermaidLabel(element.name);\n lines.push(` ${nodeId}[\"${label}\"]\\n`);\n }\n\n // Add intra-layer relationships (sorted for deterministic output)\n const sortedRelationships = [...data.intraRelationships].sort((a, b) => {\n const aKey = `${a.source}-${a.predicate}-${a.target}`;\n const bKey = `${b.source}-${b.predicate}-${b.target}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const rel of sortedRelationships) {\n const sourceId = sanitizeMermaidId(rel.source);\n const targetId = sanitizeMermaidId(rel.target);\n const predicate = escapeMermaidLabel(rel.predicate);\n lines.push(` ${sourceId} -->|${predicate}| ${targetId}\\n`);\n }\n\n lines.push(' end\\n');\n lines.push('```\\n');\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateInterLayerDiagram(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Inter-Layer Dependencies\\n');\n lines.push('\\n');\n\n // Empty layer handling\n if (data.elements.length === 0) {\n lines.push('No elements in this layer.\\n');\n lines.push('\\n');\n return lines.join('');\n }\n\n lines.push('```mermaid\\n');\n lines.push('flowchart TB\\n');\n lines.push(' classDef current fill:#f9f,stroke:#333,stroke-width:2px\\n');\n\n // Add all layers as nodes\n for (const layerName of CANONICAL_LAYER_NAMES) {\n const layerId = sanitizeMermaidId(layerName);\n const label = formatLayerName(layerName);\n lines.push(` ${layerId}[\"${label}\"]\\n`);\n }\n\n // Add layer-to-layer relationships for inter-layer dependencies\n const addedRelationships = new Set<string>();\n const layerRelationships: Array<{ sourceId: string; destId: string }> = [];\n\n for (const rel of data.interRelationships) {\n // Only include inter-layer relationships\n if (rel.layer !== rel.targetLayer && rel.targetLayer) {\n const key = `${rel.layer}-${rel.targetLayer}`;\n if (!addedRelationships.has(key)) {\n const sourceId = sanitizeMermaidId(rel.layer);\n const destId = sanitizeMermaidId(rel.targetLayer);\n layerRelationships.push({ sourceId, destId });\n addedRelationships.add(key);\n }\n }\n }\n\n // Sort and output relationships for deterministic ordering\n const sortedLayerRels = layerRelationships.sort((a, b) => {\n const aKey = `${a.sourceId}-${a.destId}`;\n const bKey = `${b.sourceId}-${b.destId}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const { sourceId, destId } of sortedLayerRels) {\n lines.push(` ${sourceId} --> ${destId}\\n`);\n }\n\n // Highlight current layer\n const currentLayerId = sanitizeMermaidId(data.layerName);\n lines.push(` class ${currentLayerId} current\\n`);\n\n lines.push('```\\n');\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateInterLayerTable(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n if (data.interRelationships.length === 0) {\n return '';\n }\n\n lines.push('## Inter-Layer Relationships Table\\n');\n lines.push('\\n');\n\n // Sort relationships for deterministic output\n const sortedRels = [...data.interRelationships].sort((a, b) => {\n const aKey = `${a.source}-${a.predicate}-${a.target}`;\n const bKey = `${b.source}-${b.predicate}-${b.target}`;\n return aKey.localeCompare(bKey);\n });\n\n const headers = ['Relationship ID', 'Source Node', 'Dest Node', 'Dest Layer', 'Predicate', 'Cardinality', 'Strength'];\n const rows: string[][] = [];\n\n for (const rel of sortedRels) {\n // Extract element types from paths (e.g., \"motivation.goal.customer-satisfaction\" -> \"motivation.goal\")\n const sourceType = this.extractElementType(rel.source);\n const targetType = this.extractElementType(rel.target);\n\n // Look up spec-level relationship properties\n const specs = getValidRelationships(sourceType, rel.predicate, targetType);\n const cardinality = specs.length > 0 ? specs[0].cardinality : 'unknown';\n const strength = specs.length > 0 ? specs[0].strength : 'unknown';\n\n // Use spec relationship ID when available, fall back to concatenated form\n const relationshipId = specs.length > 0 ? specs[0].id : `${rel.source}-${rel.predicate}-${rel.target}`;\n\n rows.push([\n `\\`${escapeMarkdown(relationshipId)}\\``,\n `\\`${escapeMarkdown(rel.source)}\\``,\n `\\`${escapeMarkdown(rel.target)}\\``,\n rel.targetLayer ? `\\`${escapeMarkdown(rel.targetLayer)}\\`` : '\u2014',\n `\\`${escapeMarkdown(rel.predicate)}\\``,\n cardinality,\n strength,\n ]);\n }\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateElementReference(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n if (data.elements.length === 0) {\n return '';\n }\n\n lines.push('## Element Reference\\n');\n lines.push('\\n');\n\n for (const element of data.elements) {\n const anchor = createAnchor(element.name);\n lines.push(`### ${escapeMarkdown(element.name)} {#${anchor}}\\n`);\n lines.push('\\n');\n\n // ID and type\n lines.push(`**ID**: \\`${escapeMarkdown(element.path)}\\`\\n\\n`);\n lines.push(`**Type**: \\`${escapeMarkdown(element.type)}\\`\\n\\n`);\n\n // Description if available\n if (element.description) {\n lines.push(`${escapeMarkdown(element.description)}\\n\\n`);\n }\n\n // Attributes if available\n if (Object.keys(element.attributes).length > 0) {\n lines.push('#### Attributes\\n\\n');\n const attrHeaders = ['Name', 'Value'];\n const attrRows: string[][] = [];\n\n // Sort attributes for deterministic output\n const sortedAttrs = Object.entries(element.attributes).sort((a, b) =>\n a[0].localeCompare(b[0])\n );\n\n for (const [name, value] of sortedAttrs) {\n const valueStr = valueToMarkdown(value);\n attrRows.push([name, valueStr]);\n }\n\n const attrTable = formatMarkdownTable(attrHeaders, attrRows);\n lines.push(attrTable);\n lines.push('\\n');\n }\n\n // Relationships involving this element\n const elementRels = this.getElementRelationships(data, element.path);\n if (elementRels.length > 0) {\n lines.push('#### Relationships\\n\\n');\n const relHeaders = ['Type', 'Related Element', 'Predicate', 'Direction'];\n const relRows: string[][] = [];\n\n // Sort for deterministic output\n const sortedElementRels = [...elementRels].sort((a, b) => {\n const aKey = `${a.relType}-${a.rel.source}-${a.rel.predicate}-${a.rel.target}`;\n const bKey = `${b.relType}-${b.rel.source}-${b.rel.predicate}-${b.rel.target}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const { rel, relType } of sortedElementRels) {\n const relatedElement = rel.source === element.path ? rel.target : rel.source;\n const direction = rel.source === element.path ? 'outbound' : 'inbound';\n\n relRows.push([\n relType,\n `\\`${escapeMarkdown(relatedElement)}\\``,\n `\\`${escapeMarkdown(rel.predicate)}\\``,\n direction,\n ]);\n }\n\n const relTable = formatMarkdownTable(relHeaders, relRows);\n lines.push(relTable);\n lines.push('\\n');\n }\n }\n\n return lines.join('');\n }\n\n private generateFooter(): string {\n const lines: string[] = [];\n lines.push('---\\n');\n lines.push('\\n');\n lines.push(`Generated: ${this.generatedAt} | Model Version: ${this.modelVersion}\\n`);\n return lines.join('');\n }\n\n /**\n * Create a markdown link to a layer report\n */\n private createLayerLink(layerName: string): string {\n const layerNumber = getLayerOrder(layerName);\n if (layerNumber === -1) {\n return layerName;\n }\n const filename = `./${String(layerNumber).padStart(2, '0')}-${layerName}-layer-report.md`;\n return `[${formatLayerName(layerName)}](${filename})`;\n }\n\n /**\n * Get relationships involving a specific element\n */\n private getElementRelationships(\n data: ModelLayerReportData,\n elementPath: string\n ): Array<{ rel: Relationship; relType: 'intra-layer' | 'inter-layer' }> {\n const rels: Array<{ rel: Relationship; relType: 'intra-layer' | 'inter-layer' }> = [];\n\n // Intra-layer relationships\n for (const rel of data.intraRelationships) {\n if (rel.source === elementPath || rel.target === elementPath) {\n rels.push({ rel, relType: 'intra-layer' });\n }\n }\n\n // Inter-layer relationships\n for (const rel of data.interRelationships) {\n if (rel.source === elementPath || rel.target === elementPath) {\n rels.push({ rel, relType: 'inter-layer' });\n }\n }\n\n return rels;\n }\n\n /**\n * Extract element type from element path in layer.type format\n * Example: \"motivation.goal.customer-satisfaction\" -> \"motivation.goal\"\n * This format matches the keys in RELATIONSHIPS_BY_SOURCE map.\n */\n private extractElementType(elementPath: string): string {\n const parts = elementPath.split('.');\n if (parts.length >= 2) {\n return parts.slice(0, 2).join('.');\n }\n return elementPath;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }