@documentation-robotics/cli 0.1.0 → 0.1.5

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 +206 -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 +155 -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 +37 -13
  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,248 @@
1
+ import { formatLayerName } from "../utils/layer-name-formatter.js";
2
+ import { CANONICAL_LAYER_NAMES } from "../core/layers.js";
3
+ import { escapeMarkdown, valueToMarkdown, getLayerDescription } from "./markdown-utils.js";
4
+ const MAX_DETAIL_ELEMENTS = 10;
5
+ class MarkdownGenerator {
6
+ model;
7
+ options;
8
+ constructor(model, options = {}) {
9
+ this.model = model, this.options = {
10
+ includeMermaid: options.includeMermaid ?? !0,
11
+ includeTables: options.includeTables ?? !0,
12
+ maxTableRows: options.maxTableRows ?? 50,
13
+ diagramType: options.diagramType ?? "graph"
14
+ };
15
+ }
16
+ /**
17
+ * Generate complete markdown documentation with diagrams and tables
18
+ */
19
+ async generate() {
20
+ const lines = [];
21
+ lines.push(`# ${this.escapeMarkdownLocal(this.model.manifest.name)}`), lines.push(""), this.model.manifest.description && (lines.push(this.model.manifest.description), lines.push("")), lines.push("## Table of Contents"), lines.push(""), lines.push("- [Architecture Overview](#architecture-overview)"), lines.push("- [Layer Summary](#layer-summary)"), lines.push("- [Detailed Layer Documentation](#detailed-layer-documentation)"), lines.push(""), lines.push("## Architecture Overview"), lines.push(""), this.options.includeMermaid && (lines.push(this.generateArchitectureOverviewDiagram()), lines.push("")), lines.push("### Model Information"), lines.push(""), lines.push(this.generateModelMetadataTable()), lines.push(""), lines.push("## Layer Summary"), lines.push(""), lines.push(this.generateLayerSummaryTable()), lines.push(""), lines.push("## Detailed Layer Documentation"), lines.push("");
22
+ const layers = Array.from(this.model.graph.nodes.values()).reduce((acc, node) => (acc.includes(node.layer) || acc.push(node.layer), acc), []).sort();
23
+ for (const layerName of layers) {
24
+ const layerNodes = this.model.graph.getNodesByLayer(layerName);
25
+ layerNodes.length !== 0 && (lines.push(`### ${this.formatLayerName(layerName)}`), lines.push(""), lines.push(this.getLayerDescriptionText(layerName)), lines.push(""), this.options.includeMermaid && (lines.push(this.generateLayerDiagram(layerNodes)), lines.push("")), this.options.includeTables && (lines.push(this.generateLayerElementsTable(layerNodes)), lines.push("")), lines.push("#### Element Details"), lines.push(""), lines.push(this.generateElementDetailsMarkdown(layerNodes)), lines.push(""));
26
+ }
27
+ return lines.push("## Architecture Statistics"), lines.push(""), lines.push(this.generateStatisticsTable()), lines.push(""), lines.push("## Relationships Summary"), lines.push(""), lines.push(this.generateRelationshipsSummaryTable()), lines.push(""), lines.join(`
28
+ `);
29
+ }
30
+ /**
31
+ * Generate architecture overview diagram
32
+ */
33
+ generateArchitectureOverviewDiagram() {
34
+ const lines = [];
35
+ lines.push("```mermaid"), lines.push("graph TD");
36
+ const layerNodeCounts = /* @__PURE__ */ new Map();
37
+ for (const node of this.model.graph.nodes.values()) {
38
+ const count = layerNodeCounts.get(node.layer) || 0;
39
+ layerNodeCounts.set(node.layer, count + 1);
40
+ }
41
+ for (const layer of CANONICAL_LAYER_NAMES) {
42
+ const count = layerNodeCounts.get(layer) || 0;
43
+ if (count > 0) {
44
+ const displayName = `${this.formatLayerName(layer)}<br/>(${count} elements)`;
45
+ lines.push(` ${this.sanitizeId(layer)}["${displayName}"]`);
46
+ }
47
+ }
48
+ let lastLayer = null;
49
+ for (const layer of CANONICAL_LAYER_NAMES)
50
+ (layerNodeCounts.get(layer) || 0) > 0 && (lastLayer && lines.push(` ${this.sanitizeId(lastLayer)} --> ${this.sanitizeId(layer)}`), lastLayer = layer);
51
+ return lines.push("```"), lines.join(`
52
+ `);
53
+ }
54
+ /**
55
+ * Generate diagram for a specific layer
56
+ */
57
+ generateLayerDiagram(nodes) {
58
+ if (nodes.length === 0)
59
+ return "";
60
+ const lines = [];
61
+ switch (lines.push("```mermaid"), this.options.diagramType) {
62
+ case "flowchart":
63
+ lines.push(this.generateLayerFlowchart(nodes));
64
+ break;
65
+ default:
66
+ lines.push(this.generateLayerGraph(nodes));
67
+ }
68
+ return lines.push("```"), lines.join(`
69
+ `);
70
+ }
71
+ /**
72
+ * Generate layer graph diagram
73
+ */
74
+ generateLayerGraph(nodes) {
75
+ const lines = [];
76
+ lines.push("graph LR");
77
+ for (const node of nodes) {
78
+ const nodeId = this.sanitizeId(node.id), escapedName = this.escapeMarkdownLocal(node.name), escapedType = this.escapeMarkdownLocal(node.type), label = `${escapedName}<br/>(${escapedType})`;
79
+ lines.push(` ${nodeId}["${label}"]`);
80
+ }
81
+ const edges = this.model.graph.getAllEdges(), nodeIds = new Set(nodes.map((n) => n.id));
82
+ for (const edge of edges)
83
+ if (nodeIds.has(edge.source) && nodeIds.has(edge.destination)) {
84
+ const sourceId = this.sanitizeId(edge.source), destId = this.sanitizeId(edge.destination), label = edge.predicate;
85
+ lines.push(` ${sourceId} -->|"${label}"| ${destId}`);
86
+ }
87
+ return lines.join(`
88
+ `);
89
+ }
90
+ /**
91
+ * Generate flowchart for a layer
92
+ */
93
+ generateLayerFlowchart(nodes) {
94
+ const lines = [];
95
+ lines.push("flowchart TD");
96
+ for (const node of nodes) {
97
+ const nodeId = this.sanitizeId(node.id), label = `${node.name}`;
98
+ lines.push(` ${nodeId}["${this.escapeMarkdownLocal(label)}"]`);
99
+ }
100
+ const edges = this.model.graph.getAllEdges(), nodeIds = new Set(nodes.map((n) => n.id));
101
+ for (const edge of edges)
102
+ if (nodeIds.has(edge.source) && nodeIds.has(edge.destination)) {
103
+ const sourceId = this.sanitizeId(edge.source), destId = this.sanitizeId(edge.destination);
104
+ lines.push(` ${sourceId} -->|"${edge.predicate}"| ${destId}`);
105
+ }
106
+ return lines.join(`
107
+ `);
108
+ }
109
+ /**
110
+ * Generate model metadata table
111
+ */
112
+ generateModelMetadataTable() {
113
+ const rows = [];
114
+ return rows.push("| Property | Value |"), rows.push("|----------|-------|"), rows.push(`| Name | ${this.escapeMarkdownLocal(this.model.manifest.name)} |`), rows.push(`| Version | ${this.model.manifest.version || "1.0.0"} |`), this.model.manifest.author && rows.push(`| Author | ${this.escapeMarkdownLocal(this.model.manifest.author)} |`), this.model.manifest.created && rows.push(`| Created | ${this.model.manifest.created} |`), this.model.manifest.modified && rows.push(`| Modified | ${this.model.manifest.modified} |`), rows.join(`
115
+ `);
116
+ }
117
+ /**
118
+ * Generate layer summary table
119
+ */
120
+ generateLayerSummaryTable() {
121
+ const rows = [];
122
+ rows.push("| Layer | Elements | Relationships | Description |"), rows.push("|-------|----------|----------------|-------------|");
123
+ for (const layer of CANONICAL_LAYER_NAMES) {
124
+ const nodes = this.model.graph.getNodesByLayer(layer);
125
+ if (nodes.length === 0)
126
+ continue;
127
+ const edges = this.model.graph.getAllEdges(), nodeIds = new Set(nodes.map((n) => n.id)), layerRelationships = edges.filter((e) => nodeIds.has(e.source) && nodeIds.has(e.destination)).length, description = this.getLayerDescriptionText(layer).split(`
128
+ `)[0];
129
+ rows.push(`| ${this.formatLayerName(layer)} | ${nodes.length} | ${layerRelationships} | ${description} |`);
130
+ }
131
+ return rows.join(`
132
+ `);
133
+ }
134
+ /**
135
+ * Generate elements table for a layer
136
+ */
137
+ generateLayerElementsTable(nodes) {
138
+ const rows = [];
139
+ rows.push("| Element ID | Name | Type | Description |"), rows.push("|-----------|------|------|-------------|");
140
+ for (const node of nodes.slice(0, this.options.maxTableRows)) {
141
+ const id = this.escapeMarkdownLocal(node.id), name = this.escapeMarkdownLocal(node.name), type = this.escapeMarkdownLocal(node.type), desc = node.description ? this.escapeMarkdownLocal(node.description.substring(0, 100)) : "";
142
+ rows.push(`| \`${id}\` | ${name} | ${type} | ${desc} |`);
143
+ }
144
+ return nodes.length > this.options.maxTableRows && rows.push(`| ... | ... | ... | ${nodes.length - this.options.maxTableRows} more elements |`), rows.join(`
145
+ `);
146
+ }
147
+ /**
148
+ * Generate element details markdown
149
+ */
150
+ generateElementDetailsMarkdown(nodes) {
151
+ const details = [];
152
+ for (const node of nodes.slice(0, MAX_DETAIL_ELEMENTS)) {
153
+ if (details.push(`##### ${this.escapeMarkdownLocal(node.name)} (\`${node.id}\`)`), details.push(""), node.description && (details.push(`${node.description}`), details.push("")), details.push(`**Type:** \`${node.type}\``), details.push(""), node.properties && Object.keys(node.properties).length > 0) {
154
+ details.push("**Properties:**"), details.push("");
155
+ const propRows = [];
156
+ propRows.push("| Property | Value |"), propRows.push("|----------|-------|");
157
+ for (const [key, value] of Object.entries(node.properties)) {
158
+ const displayValue = this.valueToString(value);
159
+ propRows.push(`| \`${key}\` | ${displayValue} |`);
160
+ }
161
+ details.push(propRows.join(`
162
+ `)), details.push("");
163
+ }
164
+ const outgoing = this.model.graph.getEdgesFrom(node.id);
165
+ if (outgoing.length > 0) {
166
+ details.push("**Outgoing Relationships:**"), details.push("");
167
+ for (const edge of outgoing) {
168
+ const targetName = this.model.graph.getNode(edge.destination)?.name || edge.destination;
169
+ details.push(`- **${edge.predicate}**: \`${edge.destination}\` (${targetName})`);
170
+ }
171
+ details.push("");
172
+ }
173
+ const incoming = this.model.graph.getEdgesTo(node.id);
174
+ if (incoming.length > 0) {
175
+ details.push("**Incoming Relationships:**"), details.push("");
176
+ for (const edge of incoming) {
177
+ const sourceName = this.model.graph.getNode(edge.source)?.name || edge.source;
178
+ details.push(`- **${edge.predicate}** from: \`${edge.source}\` (${sourceName})`);
179
+ }
180
+ details.push("");
181
+ }
182
+ }
183
+ return nodes.length > MAX_DETAIL_ELEMENTS && (details.push(`*... and ${nodes.length - MAX_DETAIL_ELEMENTS} more elements*`), details.push("")), details.join(`
184
+ `);
185
+ }
186
+ /**
187
+ * Generate statistics table
188
+ */
189
+ generateStatisticsTable() {
190
+ let totalElements = 0, totalEdges = 0;
191
+ const layerCounts = /* @__PURE__ */ new Map(), typeCounts = /* @__PURE__ */ new Map();
192
+ for (const node of this.model.graph.nodes.values())
193
+ totalElements++, layerCounts.set(node.layer, (layerCounts.get(node.layer) || 0) + 1), typeCounts.set(node.type, (typeCounts.get(node.type) || 0) + 1);
194
+ totalEdges = this.model.graph.getAllEdges().length;
195
+ const rows = [];
196
+ return rows.push("| Metric | Value |"), rows.push("|--------|-------|"), rows.push(`| Total Elements | ${totalElements} |`), rows.push(`| Total Relationships | ${totalEdges} |`), rows.push(`| Layers with Content | ${layerCounts.size} |`), rows.push(`| Element Types | ${typeCounts.size} |`), rows.join(`
197
+ `);
198
+ }
199
+ /**
200
+ * Generate relationships summary table
201
+ */
202
+ generateRelationshipsSummaryTable() {
203
+ const predicateCounts = /* @__PURE__ */ new Map(), edges = this.model.graph.getAllEdges();
204
+ for (const edge of edges)
205
+ predicateCounts.set(edge.predicate, (predicateCounts.get(edge.predicate) || 0) + 1);
206
+ const rows = [];
207
+ rows.push("| Relationship Type | Count |"), rows.push("|-------------------|-------|");
208
+ const sorted = Array.from(predicateCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 20);
209
+ for (const [predicate, count] of sorted)
210
+ rows.push(`| \`${predicate}\` | ${count} |`);
211
+ return predicateCounts.size > 20 && rows.push(`| ... | ${predicateCounts.size - 20} more types |`), rows.join(`
212
+ `);
213
+ }
214
+ /**
215
+ * Get description for a layer
216
+ */
217
+ getLayerDescriptionText(layer) {
218
+ return getLayerDescription(layer);
219
+ }
220
+ /**
221
+ * Format layer name for display
222
+ */
223
+ formatLayerName(layer) {
224
+ return formatLayerName(layer);
225
+ }
226
+ /**
227
+ * Sanitize ID for use in Mermaid diagrams
228
+ */
229
+ sanitizeId(id) {
230
+ return id.replace(/[^a-zA-Z0-9_-]/g, "_").replace(/^[0-9]/, "_$&").substring(0, 100);
231
+ }
232
+ /**
233
+ * Escape markdown special characters
234
+ */
235
+ escapeMarkdownLocal(str) {
236
+ return escapeMarkdown(str);
237
+ }
238
+ /**
239
+ * Convert value to string for display
240
+ */
241
+ valueToString(value) {
242
+ return valueToMarkdown(value);
243
+ }
244
+ }
245
+ export {
246
+ MarkdownGenerator
247
+ };
248
+ //# sourceMappingURL=markdown-generator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/export/markdown-generator.ts"],
4
+ "sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { GraphNode } from \"../core/graph-model.js\";\nimport { formatLayerName } from \"../utils/layer-name-formatter.js\";\nimport { CANONICAL_LAYER_NAMES } from \"../core/layers.js\";\nimport {\n escapeMarkdown,\n valueToMarkdown,\n getLayerDescription,\n} from \"./markdown-utils.js\";\n\n/**\n * Maximum number of elements to show in element details section\n */\nconst MAX_DETAIL_ELEMENTS = 10;\n\n/**\n * Options for markdown generation\n */\nexport interface MarkdownGeneratorOptions {\n includeMermaid?: boolean; // Include Mermaid diagrams\n includeTables?: boolean; // Include formatted tables\n maxTableRows?: number; // Maximum rows per table before truncating with overflow message\n diagramType?: \"graph\" | \"flowchart\"; // Type of Mermaid diagram\n}\n\n/**\n * MarkdownGenerator - generates enhanced markdown with Mermaid diagrams and tables\n *\n * Features:\n * - Mermaid diagram generation for architecture layers\n * - Formatted markdown tables with improved styling\n * - Layer-specific visualizations\n * - Cross-layer relationship diagrams\n * - Table row truncation with overflow message (tables capped at maxTableRows)\n */\nexport class MarkdownGenerator {\n private model: Model;\n private options: Required<MarkdownGeneratorOptions>;\n\n constructor(model: Model, options: MarkdownGeneratorOptions = {}) {\n this.model = model;\n this.options = {\n includeMermaid: options.includeMermaid ?? true,\n includeTables: options.includeTables ?? true,\n maxTableRows: options.maxTableRows ?? 50,\n diagramType: options.diagramType ?? \"graph\",\n };\n }\n\n /**\n * Generate complete markdown documentation with diagrams and tables\n */\n async generate(): Promise<string> {\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${this.escapeMarkdownLocal(this.model.manifest.name)}`);\n lines.push(\"\");\n\n if (this.model.manifest.description) {\n lines.push(this.model.manifest.description);\n lines.push(\"\");\n }\n\n // Table of Contents\n lines.push(\"## Table of Contents\");\n lines.push(\"\");\n lines.push(\"- [Architecture Overview](#architecture-overview)\");\n lines.push(\"- [Layer Summary](#layer-summary)\");\n lines.push(\"- [Detailed Layer Documentation](#detailed-layer-documentation)\");\n lines.push(\"\");\n\n // Architecture Overview Section\n lines.push(\"## Architecture Overview\");\n lines.push(\"\");\n\n if (this.options.includeMermaid) {\n lines.push(this.generateArchitectureOverviewDiagram());\n lines.push(\"\");\n }\n\n // Model metadata\n lines.push(\"### Model Information\");\n lines.push(\"\");\n lines.push(this.generateModelMetadataTable());\n lines.push(\"\");\n\n // Layer Summary\n lines.push(\"## Layer Summary\");\n lines.push(\"\");\n lines.push(this.generateLayerSummaryTable());\n lines.push(\"\");\n\n // Detailed Layer Documentation\n lines.push(\"## Detailed Layer Documentation\");\n lines.push(\"\");\n\n const layers = Array.from(this.model.graph.nodes.values())\n .reduce((acc, node) => {\n if (!acc.includes(node.layer)) {\n acc.push(node.layer);\n }\n return acc;\n }, [] as string[])\n .sort();\n\n for (const layerName of layers) {\n const layerNodes = this.model.graph.getNodesByLayer(layerName);\n if (layerNodes.length === 0) continue;\n\n lines.push(`### ${this.formatLayerName(layerName)}`);\n lines.push(\"\");\n\n lines.push(this.getLayerDescriptionText(layerName));\n lines.push(\"\");\n\n // Layer diagram\n if (this.options.includeMermaid) {\n lines.push(this.generateLayerDiagram(layerNodes));\n lines.push(\"\");\n }\n\n // Elements table\n if (this.options.includeTables) {\n lines.push(this.generateLayerElementsTable(layerNodes));\n lines.push(\"\");\n }\n\n // Element details\n lines.push(\"#### Element Details\");\n lines.push(\"\");\n lines.push(this.generateElementDetailsMarkdown(layerNodes));\n lines.push(\"\");\n }\n\n // Architecture Statistics\n lines.push(\"## Architecture Statistics\");\n lines.push(\"\");\n lines.push(this.generateStatisticsTable());\n lines.push(\"\");\n\n // Relationships Summary\n lines.push(\"## Relationships Summary\");\n lines.push(\"\");\n lines.push(this.generateRelationshipsSummaryTable());\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate architecture overview diagram\n */\n private generateArchitectureOverviewDiagram(): string {\n const lines: string[] = [];\n lines.push(\"```mermaid\");\n lines.push(\"graph TD\");\n\n const layerNodeCounts = new Map<string, number>();\n\n // Count nodes per layer\n for (const node of this.model.graph.nodes.values()) {\n const count = layerNodeCounts.get(node.layer) || 0;\n layerNodeCounts.set(node.layer, count + 1);\n }\n\n // Create layer nodes in diagram\n for (const layer of CANONICAL_LAYER_NAMES) {\n const count = layerNodeCounts.get(layer) || 0;\n if (count > 0) {\n const displayName = `${this.formatLayerName(layer)}<br/>(${count} elements)`;\n lines.push(` ${this.sanitizeId(layer)}[\"${displayName}\"]`);\n }\n }\n\n // Add connections between consecutive non-empty layers\n let lastLayer: string | null = null;\n for (const layer of CANONICAL_LAYER_NAMES) {\n if ((layerNodeCounts.get(layer) || 0) > 0) {\n if (lastLayer) {\n lines.push(\n ` ${this.sanitizeId(lastLayer)} --> ${this.sanitizeId(layer)}`\n );\n }\n lastLayer = layer;\n }\n }\n\n lines.push(\"```\");\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate diagram for a specific layer\n */\n private generateLayerDiagram(nodes: GraphNode[]): string {\n if (nodes.length === 0) return \"\";\n\n const lines: string[] = [];\n lines.push(\"```mermaid\");\n\n switch (this.options.diagramType) {\n case \"flowchart\":\n lines.push(this.generateLayerFlowchart(nodes));\n break;\n default:\n lines.push(this.generateLayerGraph(nodes));\n }\n\n lines.push(\"```\");\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate layer graph diagram\n */\n private generateLayerGraph(nodes: GraphNode[]): string {\n const lines: string[] = [];\n lines.push(\"graph LR\");\n\n // Add nodes\n for (const node of nodes) {\n const nodeId = this.sanitizeId(node.id);\n const escapedName = this.escapeMarkdownLocal(node.name);\n const escapedType = this.escapeMarkdownLocal(node.type);\n const label = `${escapedName}<br/>(${escapedType})`;\n lines.push(` ${nodeId}[\"${label}\"]`);\n }\n\n // Add edges between nodes in the same layer\n const edges = this.model.graph.getAllEdges();\n const nodeIds = new Set(nodes.map((n) => n.id));\n\n for (const edge of edges) {\n if (nodeIds.has(edge.source) && nodeIds.has(edge.destination)) {\n const sourceId = this.sanitizeId(edge.source);\n const destId = this.sanitizeId(edge.destination);\n const label = edge.predicate;\n lines.push(` ${sourceId} -->|\"${label}\"| ${destId}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate flowchart for a layer\n */\n private generateLayerFlowchart(nodes: GraphNode[]): string {\n const lines: string[] = [];\n lines.push(\"flowchart TD\");\n\n // Add nodes\n for (const node of nodes) {\n const nodeId = this.sanitizeId(node.id);\n const label = `${node.name}`;\n lines.push(` ${nodeId}[\"${this.escapeMarkdownLocal(label)}\"]`);\n }\n\n // Add edges\n const edges = this.model.graph.getAllEdges();\n const nodeIds = new Set(nodes.map((n) => n.id));\n\n for (const edge of edges) {\n if (nodeIds.has(edge.source) && nodeIds.has(edge.destination)) {\n const sourceId = this.sanitizeId(edge.source);\n const destId = this.sanitizeId(edge.destination);\n lines.push(` ${sourceId} -->|\"${edge.predicate}\"| ${destId}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate model metadata table\n */\n private generateModelMetadataTable(): string {\n const rows: string[] = [];\n rows.push(\"| Property | Value |\");\n rows.push(\"|----------|-------|\");\n\n rows.push(`| Name | ${this.escapeMarkdownLocal(this.model.manifest.name)} |`);\n rows.push(`| Version | ${this.model.manifest.version || \"1.0.0\"} |`);\n\n if (this.model.manifest.author) {\n rows.push(`| Author | ${this.escapeMarkdownLocal(this.model.manifest.author)} |`);\n }\n\n if (this.model.manifest.created) {\n rows.push(`| Created | ${this.model.manifest.created} |`);\n }\n\n if (this.model.manifest.modified) {\n rows.push(`| Modified | ${this.model.manifest.modified} |`);\n }\n\n return rows.join(\"\\n\");\n }\n\n /**\n * Generate layer summary table\n */\n private generateLayerSummaryTable(): string {\n const rows: string[] = [];\n rows.push(\"| Layer | Elements | Relationships | Description |\");\n rows.push(\"|-------|----------|----------------|-------------|\");\n\n for (const layer of CANONICAL_LAYER_NAMES) {\n const nodes = this.model.graph.getNodesByLayer(layer);\n if (nodes.length === 0) continue;\n\n const edges = this.model.graph.getAllEdges();\n const nodeIds = new Set(nodes.map((n) => n.id));\n const layerRelationships = edges.filter(\n (e) => nodeIds.has(e.source) && nodeIds.has(e.destination)\n ).length;\n\n const description = this.getLayerDescriptionText(layer).split(\"\\n\")[0];\n\n rows.push(\n `| ${this.formatLayerName(layer)} | ${nodes.length} | ${layerRelationships} | ${description} |`\n );\n }\n\n return rows.join(\"\\n\");\n }\n\n /**\n * Generate elements table for a layer\n */\n private generateLayerElementsTable(nodes: GraphNode[]): string {\n const rows: string[] = [];\n rows.push(\"| Element ID | Name | Type | Description |\");\n rows.push(\"|-----------|------|------|-------------|\");\n\n for (const node of nodes.slice(0, this.options.maxTableRows)) {\n const id = this.escapeMarkdownLocal(node.id);\n const name = this.escapeMarkdownLocal(node.name);\n const type = this.escapeMarkdownLocal(node.type);\n // Truncate description to 100 characters and escape markdown\n const desc = node.description\n ? this.escapeMarkdownLocal(node.description.substring(0, 100))\n : \"\";\n\n rows.push(`| \\`${id}\\` | ${name} | ${type} | ${desc} |`);\n }\n\n if (nodes.length > this.options.maxTableRows) {\n rows.push(\n `| ... | ... | ... | ${nodes.length - this.options.maxTableRows} more elements |`\n );\n }\n\n return rows.join(\"\\n\");\n }\n\n /**\n * Generate element details markdown\n */\n private generateElementDetailsMarkdown(nodes: GraphNode[]): string {\n const details: string[] = [];\n\n for (const node of nodes.slice(0, MAX_DETAIL_ELEMENTS)) {\n // Limit to first MAX_DETAIL_ELEMENTS for readability\n details.push(`##### ${this.escapeMarkdownLocal(node.name)} (\\`${node.id}\\`)`);\n details.push(\"\");\n\n if (node.description) {\n details.push(`${node.description}`);\n details.push(\"\");\n }\n\n details.push(`**Type:** \\`${node.type}\\``);\n details.push(\"\");\n\n // Properties\n if (node.properties && Object.keys(node.properties).length > 0) {\n details.push(\"**Properties:**\");\n details.push(\"\");\n\n const propRows: string[] = [];\n propRows.push(\"| Property | Value |\");\n propRows.push(\"|----------|-------|\");\n\n for (const [key, value] of Object.entries(node.properties)) {\n const displayValue = this.valueToString(value);\n propRows.push(`| \\`${key}\\` | ${displayValue} |`);\n }\n\n details.push(propRows.join(\"\\n\"));\n details.push(\"\");\n }\n\n // Outgoing relationships\n const outgoing = this.model.graph.getEdgesFrom(node.id);\n if (outgoing.length > 0) {\n details.push(\"**Outgoing Relationships:**\");\n details.push(\"\");\n\n for (const edge of outgoing) {\n const targetNode = this.model.graph.getNode(edge.destination);\n const targetName = targetNode?.name || edge.destination;\n details.push(\n `- **${edge.predicate}**: \\`${edge.destination}\\` (${targetName})`\n );\n }\n details.push(\"\");\n }\n\n // Incoming relationships\n const incoming = this.model.graph.getEdgesTo(node.id);\n if (incoming.length > 0) {\n details.push(\"**Incoming Relationships:**\");\n details.push(\"\");\n\n for (const edge of incoming) {\n const sourceNode = this.model.graph.getNode(edge.source);\n const sourceName = sourceNode?.name || edge.source;\n details.push(\n `- **${edge.predicate}** from: \\`${edge.source}\\` (${sourceName})`\n );\n }\n details.push(\"\");\n }\n }\n\n if (nodes.length > MAX_DETAIL_ELEMENTS) {\n details.push(`*... and ${nodes.length - MAX_DETAIL_ELEMENTS} more elements*`);\n details.push(\"\");\n }\n\n return details.join(\"\\n\");\n }\n\n /**\n * Generate statistics table\n */\n private generateStatisticsTable(): string {\n let totalElements = 0;\n let totalEdges = 0;\n const layerCounts = new Map<string, number>();\n const typeCounts = new Map<string, number>();\n\n // Count statistics\n for (const node of this.model.graph.nodes.values()) {\n totalElements++;\n layerCounts.set(node.layer, (layerCounts.get(node.layer) || 0) + 1);\n typeCounts.set(node.type, (typeCounts.get(node.type) || 0) + 1);\n }\n\n totalEdges = this.model.graph.getAllEdges().length;\n\n const rows: string[] = [];\n rows.push(\"| Metric | Value |\");\n rows.push(\"|--------|-------|\");\n rows.push(`| Total Elements | ${totalElements} |`);\n rows.push(`| Total Relationships | ${totalEdges} |`);\n rows.push(`| Layers with Content | ${layerCounts.size} |`);\n rows.push(`| Element Types | ${typeCounts.size} |`);\n\n return rows.join(\"\\n\");\n }\n\n /**\n * Generate relationships summary table\n */\n private generateRelationshipsSummaryTable(): string {\n const predicateCounts = new Map<string, number>();\n const edges = this.model.graph.getAllEdges();\n\n for (const edge of edges) {\n predicateCounts.set(edge.predicate, (predicateCounts.get(edge.predicate) || 0) + 1);\n }\n\n const rows: string[] = [];\n rows.push(\"| Relationship Type | Count |\");\n rows.push(\"|-------------------|-------|\");\n\n // Sort by count descending\n const sorted = Array.from(predicateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20); // Top 20\n\n for (const [predicate, count] of sorted) {\n rows.push(`| \\`${predicate}\\` | ${count} |`);\n }\n\n if (predicateCounts.size > 20) {\n rows.push(`| ... | ${predicateCounts.size - 20} more types |`);\n }\n\n return rows.join(\"\\n\");\n }\n\n /**\n * Get description for a layer\n */\n private getLayerDescriptionText(layer: string): string {\n return getLayerDescription(layer);\n }\n\n /**\n * Format layer name for display\n */\n private formatLayerName(layer: string): string {\n return formatLayerName(layer);\n }\n\n /**\n * Sanitize ID for use in Mermaid diagrams\n */\n private sanitizeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .replace(/^[0-9]/, \"_$&\")\n .substring(0, 100);\n }\n\n /**\n * Escape markdown special characters\n */\n private escapeMarkdownLocal(str: string): string {\n return escapeMarkdown(str);\n }\n\n /**\n * Convert value to string for display\n */\n private valueToString(value: unknown): string {\n return valueToMarkdown(value);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ const LAYER_DESCRIPTIONS = {
2
+ motivation: "Goals, requirements, drivers, and strategic outcomes of the architecture.",
3
+ business: "Business processes, functions, roles, and services.",
4
+ security: "Authentication, authorization, security threats, and controls.",
5
+ application: "Application components, services, and interactions.",
6
+ technology: "Infrastructure, platforms, systems, and technology components.",
7
+ api: "REST APIs, operations, endpoints, and API integrations.",
8
+ "data-model": "Data entities, relationships, and data structure definitions.",
9
+ "data-store": "Databases, data stores, and persistence mechanisms.",
10
+ ux: "User interface components, screens, and user experience elements.",
11
+ navigation: "Application routing, navigation flows, and page structures.",
12
+ apm: "Observability, monitoring, metrics, logging, and tracing.",
13
+ testing: "Test strategies, test cases, test data, and test coverage."
14
+ };
15
+ function escapeMarkdown(str) {
16
+ return str.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\*/g, "\\*").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/\{/g, "\\{").replace(/\}/g, "\\}").replace(/</g, "&lt;").replace(/>/g, "&gt;");
17
+ }
18
+ function valueToMarkdown(value) {
19
+ return typeof value == "string" ? escapeMarkdown(value) : typeof value == "number" || typeof value == "boolean" ? String(value) : Array.isArray(value) ? `[${value.map((v) => valueToMarkdown(v)).join(", ")}]` : value && typeof value == "object" ? `\`${JSON.stringify(value)}\`` : String(value);
20
+ }
21
+ function getLayerDescription(layer) {
22
+ return LAYER_DESCRIPTIONS[layer] || "Architecture layer";
23
+ }
24
+ export {
25
+ LAYER_DESCRIPTIONS,
26
+ escapeMarkdown,
27
+ getLayerDescription,
28
+ valueToMarkdown
29
+ };
30
+ //# sourceMappingURL=markdown-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/export/markdown-utils.ts"],
4
+ "sourcesContent": ["/**\n * Shared markdown utilities for exporters\n */\n\n/**\n * Layer descriptions for documentation\n */\nexport const LAYER_DESCRIPTIONS = {\n motivation: \"Goals, requirements, drivers, and strategic outcomes of the architecture.\",\n business: \"Business processes, functions, roles, and services.\",\n security: \"Authentication, authorization, security threats, and controls.\",\n application: \"Application components, services, and interactions.\",\n technology: \"Infrastructure, platforms, systems, and technology components.\",\n api: \"REST APIs, operations, endpoints, and API integrations.\",\n \"data-model\": \"Data entities, relationships, and data structure definitions.\",\n \"data-store\": \"Databases, data stores, and persistence mechanisms.\",\n ux: \"User interface components, screens, and user experience elements.\",\n navigation: \"Application routing, navigation flows, and page structures.\",\n apm: \"Observability, monitoring, metrics, logging, and tracing.\",\n testing: \"Test strategies, test cases, test data, and test coverage.\",\n} as const;\n\n/**\n * Escape markdown special characters for safe display in markdown documents\n *\n * Escapes the following characters:\n * - `\\` \u2192 `\\\\` (backslash: prevents escape sequences)\n * - `|` \u2192 `\\|` (pipe: prevents table syntax interpretation)\n * - `*` \u2192 `\\*` (asterisk: prevents bold/italic formatting)\n * - `[` \u2192 `\\[` (bracket: prevents link syntax)\n * - `]` \u2192 `\\]` (bracket: prevents link syntax)\n * - `{` \u2192 `\\{` (brace: prevents code interpolation)\n * - `}` \u2192 `\\}` (brace: prevents code interpolation)\n * - `<` \u2192 `&lt;` (less-than: HTML entity for safety)\n * - `>` \u2192 `&gt;` (greater-than: HTML entity for safety)\n *\n * Note: Backticks (`) and underscores (_) are intentionally NOT escaped to allow\n * inline code and emphasis formatting in natural text output.\n */\nexport function escapeMarkdown(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\|/g, \"\\\\|\")\n .replace(/\\*/g, \"\\\\*\")\n .replace(/\\[/g, \"\\\\[\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\{/g, \"\\\\{\")\n .replace(/\\}/g, \"\\\\}\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/**\n * Convert any value to a safely escaped string representation for markdown display\n *\n * Handles different types with type-specific formatting:\n * - **Strings**: Fully escaped via escapeMarkdown() to prevent markdown interpretation\n * - **Numbers**: Rendered as plain numeric strings (no formatting needed)\n * - **Booleans**: Rendered as \"true\" or \"false\" strings\n * - **Arrays**: Rendered as `[item1, item2, ...]` with recursive escaping of elements\n * - **Objects**: Rendered as inline code block with JSON stringification: `{...}`\n * - **Null/Undefined**: Rendered as string representation\n */\nexport function valueToMarkdown(value: unknown): string {\n if (typeof value === \"string\") return escapeMarkdown(value);\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return `[${value.map((v) => valueToMarkdown(v)).join(\", \")}]`;\n }\n if (value && typeof value === \"object\") {\n return `\\`${JSON.stringify(value)}\\``;\n }\n return String(value);\n}\n\n/**\n * Get layer description by layer name\n */\nexport function getLayerDescription(layer: string): string {\n return LAYER_DESCRIPTIONS[layer as keyof typeof LAYER_DESCRIPTIONS] || \"Architecture layer\";\n}\n"],
5
+ "mappings": "AAOO,MAAM,qBAAqB;EAChC,YAAY;EACZ,UAAU;EACV,UAAU;EACV,aAAa;EACb,YAAY;EACZ,KAAK;EACL,cAAc;EACd,cAAc;EACd,IAAI;EACJ,YAAY;EACZ,KAAK;EACL,SAAS;;AAoBL,SAAU,eAAe,KAAW;AACxC,SAAO,IACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AAaM,SAAU,gBAAgB,OAAc;AAC5C,SAAI,OAAO,SAAU,WAAiB,eAAe,KAAK,IACtD,OAAO,SAAU,YACjB,OAAO,SAAU,YAAkB,OAAO,KAAK,IAC/C,MAAM,QAAQ,KAAK,IACd,IAAI,MAAM,IAAI,CAAC,MAAM,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAExD,SAAS,OAAO,SAAU,WACrB,KAAK,KAAK,UAAU,KAAK,CAAC,OAE5B,OAAO,KAAK;AACrB;AAKM,SAAU,oBAAoB,OAAa;AAC/C,SAAO,mBAAmB,KAAwC,KAAK;AACzE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,37 @@
1
+ import { ALL_LAYERS } from "./types.js";
2
+ import { MarkdownGenerator } from "./markdown-generator.js";
3
+ import { isTelemetryEnabled, startSpan, endSpan } from "../telemetry/index.js";
4
+ import { getErrorMessage } from "../utils/errors.js";
5
+ class MermaidMarkdownExporter {
6
+ name = "Mermaid Markdown";
7
+ supportedLayers = ALL_LAYERS;
8
+ async export(model, options = {}) {
9
+ const span = isTelemetryEnabled ? startSpan("export.format.mermaid-markdown", {
10
+ "export.layerCount": options.layers?.length || this.supportedLayers.length
11
+ }) : null;
12
+ try {
13
+ const generatorOptions = {
14
+ includeMermaid: !0,
15
+ includeTables: !0,
16
+ maxTableRows: 50,
17
+ diagramType: "graph"
18
+ }, markdown = await new MarkdownGenerator(model, generatorOptions).generate();
19
+ if (isTelemetryEnabled && span) {
20
+ const totalElements = model.graph.nodes.size, totalRelationships = model.graph.getAllEdges().length;
21
+ span.setAttribute("export.elementCount", totalElements), span.setAttribute("export.relationshipCount", totalRelationships), span.setAttribute("export.size", markdown.length), span.setStatus({ code: 0 });
22
+ }
23
+ return markdown;
24
+ } catch (error) {
25
+ throw isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
26
+ code: 2,
27
+ message: getErrorMessage(error)
28
+ })), error;
29
+ } finally {
30
+ endSpan(span);
31
+ }
32
+ }
33
+ }
34
+ export {
35
+ MermaidMarkdownExporter
36
+ };
37
+ //# sourceMappingURL=mermaid-markdown-exporter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/export/mermaid-markdown-exporter.ts"],
4
+ "sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\nimport { ALL_LAYERS } from \"./types.js\";\nimport { MarkdownGenerator, type MarkdownGeneratorOptions } from \"./markdown-generator.js\";\nimport { isTelemetryEnabled, startSpan, endSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\n/**\n * Mermaid Markdown Exporter - generates comprehensive markdown documentation\n * with Mermaid diagrams and formatted tables\n *\n * Supports all 12 layers and includes:\n * - Architecture overview diagrams with Mermaid\n * - Layer-specific visualizations\n * - Formatted markdown tables\n * - Cross-layer relationship diagrams\n * - Element properties and relationship details\n */\nexport class MermaidMarkdownExporter implements Exporter {\n name = \"Mermaid Markdown\";\n supportedLayers = ALL_LAYERS;\n\n async export(model: Model, options: ExportOptions = {}): Promise<string> {\n const span = isTelemetryEnabled\n ? startSpan(\"export.format.mermaid-markdown\", {\n \"export.layerCount\": options.layers?.length || this.supportedLayers.length,\n })\n : null;\n\n try {\n // Create markdown generator with appropriate options\n const generatorOptions: MarkdownGeneratorOptions = {\n includeMermaid: true,\n includeTables: true,\n maxTableRows: 50,\n diagramType: \"graph\",\n };\n\n const generator = new MarkdownGenerator(model, generatorOptions);\n const markdown = await generator.generate();\n\n if (isTelemetryEnabled && span) {\n const totalElements = model.graph.nodes.size;\n const totalRelationships = model.graph.getAllEdges().length;\n\n (span as any).setAttribute(\"export.elementCount\", totalElements);\n (span as any).setAttribute(\"export.relationshipCount\", totalRelationships);\n (span as any).setAttribute(\"export.size\", markdown.length);\n (span as any).setStatus({ code: 0 });\n }\n\n return markdown;\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n throw error;\n } finally {\n endSpan(span);\n }\n }\n}\n"],
5
+ "mappings": "AAEA,SAAS,kBAAkB;AAC3B,SAAS,yBAAwD;AACjE,SAAS,oBAAoB,WAAW,eAAe;AACvD,SAAS,uBAAuB;AAa1B,MAAO,wBAAuB;EAClC,OAAO;EACP,kBAAkB;EAElB,MAAM,OAAO,OAAc,UAAyB,CAAA,GAAE;AACpD,UAAM,OAAO,qBACT,UAAU,kCAAkC;MAC1C,qBAAqB,QAAQ,QAAQ,UAAU,KAAK,gBAAgB;KACrE,IACD;AAEJ,QAAI;AAEF,YAAM,mBAA6C;QACjD,gBAAgB;QAChB,eAAe;QACf,cAAc;QACd,aAAa;SAIT,WAAW,MADC,IAAI,kBAAkB,OAAO,gBAAgB,EAC9B,SAAQ;AAEzC,UAAI,sBAAsB,MAAM;AAC9B,cAAM,gBAAgB,MAAM,MAAM,MAAM,MAClC,qBAAqB,MAAM,MAAM,YAAW,EAAG;AAEpD,aAAa,aAAa,uBAAuB,aAAa,GAC9D,KAAa,aAAa,4BAA4B,kBAAkB,GACxE,KAAa,aAAa,eAAe,SAAS,MAAM,GACxD,KAAa,UAAU,EAAE,MAAM,EAAC,CAAE;MACrC;AAEA,aAAO;IACT,SAAS,OAAO;AACd,YAAI,sBAAsB,SACvB,KAAa,gBAAgB,KAAc,GAC3C,KAAa,UAAU;QACtB,MAAM;QACN,SAAS,gBAAgB,KAAK;OAC/B,IAEG;IACR;AACE,cAAQ,IAAI;IACd;EACF;;",
6
+ "names": []
7
+ }
@@ -1,82 +1,130 @@
1
+ import { isTelemetryEnabled, startSpan, endSpan } from "../telemetry/index.js";
2
+ import { getErrorMessage } from "../utils/errors.js";
1
3
  class OpenAPIExporter {
2
4
  name = "OpenAPI";
3
5
  supportedLayers = ["api"];
4
6
  async export(model, _options = {}) {
5
- const layer = await model.getLayer("api");
6
- if (!layer)
7
- throw new Error("No API layer found in model");
8
- const spec = {
9
- openapi: "3.0.0",
10
- info: {
11
- title: model.manifest.name,
12
- version: model.manifest.version || "1.0.0"
13
- },
14
- paths: {},
15
- components: {
16
- schemas: {},
17
- responses: {},
18
- parameters: {},
19
- requestBodies: {},
20
- headers: {},
21
- securitySchemes: {}
22
- }
23
- };
24
- model.manifest.description && (spec.info.description = model.manifest.description);
25
- const pathGroups = /* @__PURE__ */ new Map();
26
- for (const element of layer.listElements())
27
- if (element.type === "endpoint") {
28
- const path = element.getProperty("path") || "/", method = (element.getProperty("method") || "get").toLowerCase();
29
- pathGroups.has(path) || pathGroups.set(path, []), pathGroups.get(path).push({ method, element });
30
- }
31
- for (const [path, endpoints] of pathGroups) {
32
- const pathItem = {};
33
- for (const { method, element } of endpoints) {
34
- const operation = {
35
- summary: element.name,
36
- operationId: element.id,
37
- responses: element.getProperty("responses") || {
38
- 200: {
39
- description: "Successful response"
40
- }
7
+ const span = isTelemetryEnabled ? startSpan("export.format.openapi") : null;
8
+ try {
9
+ const apiLayer = await model.getLayer("api");
10
+ if (!apiLayer)
11
+ throw new Error("No API layer found in model");
12
+ const elements = apiLayer.listElements();
13
+ if (elements.length === 0)
14
+ throw new Error("No API layer found in model");
15
+ const spec = {
16
+ openapi: "3.0.0",
17
+ info: {
18
+ title: model.manifest.name,
19
+ version: model.manifest.version || "1.0.0"
20
+ },
21
+ paths: {},
22
+ components: {
23
+ schemas: {},
24
+ responses: {},
25
+ parameters: {},
26
+ requestBodies: {},
27
+ headers: {},
28
+ securitySchemes: {}
29
+ }
30
+ };
31
+ model.manifest.description && (spec.info.description = model.manifest.description);
32
+ const pathGroups = /* @__PURE__ */ new Map();
33
+ for (const element of elements)
34
+ if (element.type === "operation" || element.type === "endpoint") {
35
+ const operationId = element.attributes?.operationId || element.name;
36
+ let pathKey;
37
+ const attrPath = element.attributes?.path;
38
+ if (attrPath)
39
+ pathKey = attrPath;
40
+ else {
41
+ const slugSegment = element.path?.split(".").pop();
42
+ pathKey = slugSegment ? `/${slugSegment}` : `/${operationId}`;
41
43
  }
42
- };
43
- element.description && (operation.description = element.description);
44
- const tags = element.getProperty("tags");
45
- tags && (operation.tags = tags);
46
- const parameters = element.getProperty("parameters");
47
- parameters && (operation.parameters = parameters);
48
- const requestBody = element.getProperty("requestBody");
49
- requestBody && (operation.requestBody = requestBody);
50
- const security = element.getProperty("security");
51
- security && (operation.security = security);
52
- const deprecated = element.getProperty("deprecated");
53
- deprecated && (operation.deprecated = deprecated), pathItem[method] = operation;
54
- }
55
- spec.paths[path] = pathItem;
56
- }
57
- for (const element of layer.listElements())
58
- if (element.type === "schema") {
59
- const schemaName = element.getProperty("schemaName") || element.id, schema = element.getProperty("schema");
60
- schema && (spec.components.schemas[schemaName] = schema);
44
+ const method = (element.attributes?.method || (() => {
45
+ const opIdLower = operationId.toLowerCase();
46
+ return /^(create|post|add|insert|register|submit|send)/.test(opIdLower) ? "post" : /^(update|put|edit|modify|replace|set|save)/.test(opIdLower) ? "put" : /^(patch|partial)/.test(opIdLower) ? "patch" : /^(delete|remove|destroy|purge|clear|unregister)/.test(opIdLower) ? "delete" : "get";
47
+ })()).toLowerCase();
48
+ pathGroups.has(pathKey) || pathGroups.set(pathKey, []);
49
+ const endpointData = {
50
+ name: element.attributes?.summary || element.name,
51
+ id: element.id,
52
+ description: element.description,
53
+ getProperty: (key) => element.attributes?.[key],
54
+ getSourceReference: () => element.getSourceReference()
55
+ };
56
+ pathGroups.get(pathKey).push({ method, element: endpointData });
57
+ }
58
+ for (const [path, endpoints] of pathGroups) {
59
+ const pathItem = {};
60
+ for (const { method, element } of endpoints) {
61
+ const operation = {
62
+ summary: element.name,
63
+ operationId: element.getProperty("operationId") || element.id,
64
+ responses: element.getProperty("responses") || {
65
+ 200: {
66
+ description: "Successful response"
67
+ }
68
+ }
69
+ };
70
+ element.description && (operation.description = element.description);
71
+ const tags = element.getProperty("tags");
72
+ tags && (operation.tags = Array.isArray(tags) ? tags : [tags]);
73
+ const parameters = element.getProperty("parameters");
74
+ parameters && (operation.parameters = parameters);
75
+ const requestBody = element.getProperty("requestBody");
76
+ requestBody && (operation.requestBody = requestBody);
77
+ const security = element.getProperty("security");
78
+ security && (operation.security = security);
79
+ const deprecated = element.getProperty("deprecated");
80
+ deprecated && (operation.deprecated = deprecated);
81
+ const sourceRef = element.getSourceReference();
82
+ sourceRef && (operation["x-source-reference"] = sourceRef), pathItem[method] = operation;
83
+ }
84
+ if (endpoints.length > 0) {
85
+ const firstSourceRef = endpoints[0].element.getSourceReference();
86
+ firstSourceRef && (pathItem["x-source-reference"] = firstSourceRef);
87
+ }
88
+ spec.paths[path] = pathItem;
61
89
  }
62
- for (const element of layer.listElements())
63
- if (element.type === "security-scheme") {
64
- const schemeName = element.name, schemeType = element.getProperty("type");
65
- if (schemeType) {
66
- const scheme = {
67
- type: schemeType
68
- }, schemeProp = element.getProperty("scheme");
69
- schemeProp && (scheme.scheme = schemeProp);
70
- const bearerFormat = element.getProperty("bearerFormat");
71
- bearerFormat && (scheme.bearerFormat = bearerFormat);
72
- const flows = element.getProperty("flows");
73
- flows && (scheme.flows = flows);
74
- const openIdConnectUrl = element.getProperty("openIdConnectUrl");
75
- openIdConnectUrl && (scheme.openIdConnectUrl = openIdConnectUrl), element.description && (scheme.description = element.description), spec.components.securitySchemes[schemeName] = scheme;
90
+ for (const element of elements)
91
+ if (element.type === "schema") {
92
+ const schemaName = element.attributes?.schemaName || element.id, schema = element.attributes?.schema;
93
+ schema && (spec.components.schemas[schemaName] = schema);
76
94
  }
95
+ for (const element of elements)
96
+ if (element.type === "security-scheme") {
97
+ const schemeName = element.name, schemeType = element.attributes?.type;
98
+ if (schemeType) {
99
+ const scheme = {
100
+ type: schemeType
101
+ }, schemeProp = element.attributes?.scheme;
102
+ schemeProp && (scheme.scheme = schemeProp);
103
+ const bearerFormat = element.attributes?.bearerFormat;
104
+ bearerFormat && (scheme.bearerFormat = bearerFormat);
105
+ const flows = element.attributes?.flows;
106
+ flows && (scheme.flows = flows);
107
+ const openIdConnectUrl = element.attributes?.openIdConnectUrl;
108
+ openIdConnectUrl && (scheme.openIdConnectUrl = openIdConnectUrl), element.description && (scheme.description = element.description), spec.components.securitySchemes[schemeName] = scheme;
109
+ }
110
+ }
111
+ const components = spec.components;
112
+ components.schemas && Object.keys(components.schemas).length === 0 && delete components.schemas, components.responses && Object.keys(components.responses).length === 0 && delete components.responses, components.parameters && Object.keys(components.parameters).length === 0 && delete components.parameters, components.requestBodies && Object.keys(components.requestBodies).length === 0 && delete components.requestBodies, components.headers && Object.keys(components.headers).length === 0 && delete components.headers, components.securitySchemes && Object.keys(components.securitySchemes).length === 0 && delete components.securitySchemes, Object.keys(components).length === 0 && delete spec.components;
113
+ const result = JSON.stringify(spec, null, 2) + `
114
+ `;
115
+ if (isTelemetryEnabled && span) {
116
+ const endpointCount = Array.from(pathGroups.values()).reduce((sum, endpoints) => sum + endpoints.length, 0);
117
+ span.setAttribute("export.endpointCount", endpointCount), span.setAttribute("export.pathCount", pathGroups.size), span.setAttribute("export.schemaCount", Object.keys(spec.components?.schemas || {}).length), span.setAttribute("export.size", result.length), span.setStatus({ code: 0 });
77
118
  }
78
- const components = spec.components;
79
- return components.schemas && Object.keys(components.schemas).length === 0 && delete components.schemas, components.responses && Object.keys(components.responses).length === 0 && delete components.responses, components.parameters && Object.keys(components.parameters).length === 0 && delete components.parameters, components.requestBodies && Object.keys(components.requestBodies).length === 0 && delete components.requestBodies, components.headers && Object.keys(components.headers).length === 0 && delete components.headers, components.securitySchemes && Object.keys(components.securitySchemes).length === 0 && delete components.securitySchemes, Object.keys(components).length === 0 && delete spec.components, JSON.stringify(spec, null, 2);
119
+ return result;
120
+ } catch (error) {
121
+ throw isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
122
+ code: 2,
123
+ message: getErrorMessage(error)
124
+ })), error;
125
+ } finally {
126
+ endSpan(span);
127
+ }
80
128
  }
81
129
  }
82
130
  export {