@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
@@ -1,288 +0,0 @@
1
- import { readFile } from "fs/promises";
2
- import { parse as parseYAML } from "yaml";
3
- import { Element } from "./element.js";
4
- class PropertyTransformer {
5
- config;
6
- constructor(config) {
7
- this.config = config;
8
- }
9
- apply(value) {
10
- if (value == null)
11
- return null;
12
- const strValue = String(value);
13
- switch (this.config.type) {
14
- case "uppercase":
15
- return strValue.toUpperCase();
16
- case "lowercase":
17
- return strValue.toLowerCase();
18
- case "kebab":
19
- return toKebabCase(strValue);
20
- case "snake":
21
- return toSnakeCase(strValue);
22
- case "pascal":
23
- return toPascalCase(strValue);
24
- case "prefix":
25
- return `${this.config.value}${strValue}`;
26
- case "suffix":
27
- return `${strValue}${this.config.value}`;
28
- case "template":
29
- return this.config.value?.replace("{value}", strValue) ?? strValue;
30
- default:
31
- return value;
32
- }
33
- }
34
- }
35
- class ConditionEvaluator {
36
- config;
37
- constructor(config) {
38
- this.config = config;
39
- }
40
- evaluate(element) {
41
- const fieldValue = getNestedProperty(element, this.config.field);
42
- switch (this.config.operator) {
43
- case "exists":
44
- return fieldValue != null;
45
- case "equals":
46
- return fieldValue === this.config.value;
47
- case "not_equals":
48
- return fieldValue !== this.config.value;
49
- case "contains":
50
- return fieldValue ? String(fieldValue).includes(String(this.config.value)) : !1;
51
- case "matches":
52
- return fieldValue && this.config.pattern ? new RegExp(this.config.pattern).test(String(fieldValue)) : !1;
53
- case "gt":
54
- return fieldValue > this.config.value;
55
- case "lt":
56
- return fieldValue < this.config.value;
57
- case "in":
58
- return Array.isArray(this.config.value) ? this.config.value.includes(fieldValue) : !1;
59
- default:
60
- return !1;
61
- }
62
- }
63
- }
64
- class ProjectionEngine {
65
- model;
66
- rules = [];
67
- registry;
68
- constructor(model, rulesPath) {
69
- this.model = model, rulesPath && this.loadRulesSync(rulesPath);
70
- }
71
- /**
72
- * Set reference registry for element registration
73
- */
74
- setRegistry(registry) {
75
- this.registry = registry;
76
- }
77
- /**
78
- * Load projection rules from YAML file
79
- */
80
- async loadRules(path) {
81
- try {
82
- const content = await readFile(path, "utf-8"), data = parseYAML(content);
83
- if (!data.projections || !Array.isArray(data.projections))
84
- throw new Error("Invalid projection rules file: missing projections array");
85
- this.rules = data.projections.map((proj) => this.parseProjectionRule(proj));
86
- } catch (error) {
87
- throw new Error(`Failed to load projection rules from ${path}: ${error instanceof Error ? error.message : String(error)}`);
88
- }
89
- }
90
- /**
91
- * Synchronous version for constructor
92
- */
93
- loadRulesSync(_path) {
94
- }
95
- /**
96
- * Add a projection rule programmatically
97
- */
98
- addRule(rule) {
99
- this.rules.push(rule);
100
- }
101
- /**
102
- * Get all loaded rules
103
- */
104
- getRules() {
105
- return [...this.rules];
106
- }
107
- /**
108
- * Clear all rules
109
- */
110
- clearRules() {
111
- this.rules = [];
112
- }
113
- /**
114
- * Parse YAML projection definition into ProjectionRule
115
- */
116
- parseProjectionRule(data) {
117
- const [from_layer, from_type] = data.from.split("."), [to_layer, to_type] = data.to.split("."), ruleData = Array.isArray(data.rules) ? data.rules[0] : data.rules, conditions = (data.conditions || []).map((c) => ({
118
- field: c.field,
119
- operator: c.operator,
120
- value: c.value,
121
- pattern: c.pattern
122
- })), property_mappings = [];
123
- if (ruleData.properties) {
124
- for (const [target, mapping] of Object.entries(ruleData.properties))
125
- if (typeof mapping == "string")
126
- property_mappings.push({ source: mapping, target });
127
- else if (typeof mapping == "object") {
128
- const m = mapping;
129
- property_mappings.push({
130
- source: m.source,
131
- target,
132
- default: m.default,
133
- required: m.required ?? !1,
134
- transform: m.transform
135
- });
136
- }
137
- }
138
- return {
139
- name: data.name,
140
- from_layer,
141
- from_type,
142
- to_layer,
143
- to_type,
144
- name_template: ruleData.name_template,
145
- property_mappings,
146
- conditions,
147
- template_file: ruleData.template,
148
- create_bidirectional: ruleData.create_bidirectional ?? !0
149
- };
150
- }
151
- /**
152
- * Find rules applicable to a source element
153
- */
154
- findApplicableRules(source, targetLayer) {
155
- return this.rules.filter((rule) => {
156
- if (rule.from_layer !== source.layer || rule.from_type && rule.from_type !== source.type || targetLayer && rule.to_layer !== targetLayer)
157
- return !1;
158
- if (rule.conditions) {
159
- for (const condition of rule.conditions)
160
- if (!new ConditionEvaluator(condition).evaluate(source))
161
- return !1;
162
- }
163
- return !0;
164
- });
165
- }
166
- /**
167
- * Project a single element to target layer
168
- */
169
- async projectElement(source, targetLayer, rule, dryRun = !1) {
170
- if (!rule) {
171
- const applicableRules = this.findApplicableRules(source, targetLayer);
172
- if (applicableRules.length === 0)
173
- throw new Error(`No applicable projection rule found for element ${source.id} to layer ${targetLayer}`);
174
- rule = applicableRules[0];
175
- }
176
- const projected = this.buildProjectedElement(source, rule);
177
- if (!dryRun) {
178
- const layer = await this.model.getLayer(rule.to_layer);
179
- if (!layer)
180
- throw new Error(`Target layer ${rule.to_layer} not found`);
181
- layer.addElement(projected), this.registry && this.registry.registerElement(projected);
182
- }
183
- return projected;
184
- }
185
- /**
186
- * Build projected element from source and rule
187
- */
188
- buildProjectedElement(source, rule) {
189
- const name = this.renderTemplate(rule.name_template, source), data = {
190
- id: generateElementId(rule.to_layer, rule.to_type, name),
191
- name,
192
- type: rule.to_type,
193
- layer: rule.to_layer
194
- };
195
- for (const mapping of rule.property_mappings) {
196
- let value;
197
- if (mapping.source.includes("{") || mapping.source.includes("{{") ? value = this.renderTemplate(mapping.source, source) : value = this.getSourceValue(source, mapping.source), value == null) {
198
- if (mapping.required)
199
- throw new Error(`Required property ${mapping.target} is missing from source ${source.id}`);
200
- value = mapping.default;
201
- }
202
- mapping.transform && value !== null && value !== void 0 && (value = new PropertyTransformer(mapping.transform).apply(value)), value != null && setNestedProperty(data, mapping.target, value);
203
- }
204
- return rule.create_bidirectional !== !1 && (data.properties || (data.properties = {}), data.properties.realizes = source.id), new Element(data);
205
- }
206
- /**
207
- * Get value from source element (supports dot notation)
208
- */
209
- getSourceValue(source, path) {
210
- return path === "id" ? source.id : path === "name" ? source.name : path === "type" ? source.type : path === "layer" ? source.layer : path === "description" ? source.description : getNestedProperty(source, path);
211
- }
212
- /**
213
- * Render template string with source element data
214
- */
215
- renderTemplate(template, source) {
216
- const context = {
217
- id: source.id,
218
- name: source.name,
219
- type: source.type,
220
- layer: source.layer,
221
- description: source.description,
222
- properties: source.properties || {},
223
- name_pascal: toPascalCase(source.name),
224
- name_kebab: toKebabCase(source.name),
225
- name_snake: toSnakeCase(source.name)
226
- };
227
- let result = template;
228
- const regex = /\{source\.(\w+)\}/g;
229
- return result = result.replace(regex, (match, prop) => context[prop] !== void 0 ? String(context[prop]) : match), result;
230
- }
231
- /**
232
- * Project all elements that match rules
233
- */
234
- async projectAll(fromLayer, toLayer, dryRun = !1) {
235
- const projected = [], layers = fromLayer ? [await this.model.getLayer(fromLayer)] : Array.from(this.model.layers.values());
236
- for (const layer of layers)
237
- if (layer)
238
- for (const element of layer.listElements()) {
239
- const applicableRules = this.findApplicableRules(element, toLayer);
240
- for (const rule of applicableRules)
241
- try {
242
- const projectedElement = await this.projectElement(element, rule.to_layer, rule, dryRun);
243
- projected.push(projectedElement);
244
- } catch (error) {
245
- console.warn(`Warning: Failed to project ${element.id} with rule ${rule.name}: ${error instanceof Error ? error.message : String(error)}`);
246
- }
247
- }
248
- return projected;
249
- }
250
- }
251
- function getNestedProperty(obj, path) {
252
- const parts = path.split(".");
253
- let current = obj;
254
- for (const part of parts)
255
- if (current && typeof current == "object")
256
- current = current[part];
257
- else
258
- return;
259
- return current;
260
- }
261
- function setNestedProperty(obj, path, value) {
262
- const parts = path.split(".");
263
- let current = obj;
264
- for (let i = 0; i < parts.length - 1; i++) {
265
- const part = parts[i];
266
- (!current[part] || typeof current[part] != "object") && (current[part] = {}), current = current[part];
267
- }
268
- current[parts[parts.length - 1]] = value;
269
- }
270
- function toKebabCase(text) {
271
- return text.toLowerCase().replace(/\s+/g, "-").replace(/_/g, "-");
272
- }
273
- function toSnakeCase(text) {
274
- return text.toLowerCase().replace(/\s+/g, "_").replace(/-/g, "_");
275
- }
276
- function toPascalCase(text) {
277
- return text.replace(/-/g, " ").replace(/_/g, " ").split(/\s+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
278
- }
279
- function generateElementId(layer, type, name) {
280
- const kebabName = toKebabCase(name);
281
- return `${layer}.${type}.${kebabName}`;
282
- }
283
- export {
284
- ConditionEvaluator,
285
- ProjectionEngine,
286
- PropertyTransformer
287
- };
288
- //# sourceMappingURL=projection-engine.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/projection-engine.ts"],
4
- "sourcesContent": ["/**\n * Projection Engine - Python CLI Compatible Implementation\n *\n * Automatically creates elements across layers based on projection rules\n * with property transformations, conditional logic, and template rendering.\n *\n * Spec: cli-validation/projection-engine-spec.md\n */\n\nimport { readFile } from 'fs/promises';\nimport { parse as parseYAML } from 'yaml';\nimport { Model } from './model.js';\nimport { Element } from './element.js';\nimport { ReferenceRegistry } from './reference-registry.js';\n\n/**\n * Transform types for property mapping\n */\nexport type TransformType =\n | 'uppercase'\n | 'lowercase'\n | 'kebab'\n | 'snake'\n | 'pascal'\n | 'prefix'\n | 'suffix'\n | 'template';\n\n/**\n * Condition operators for filtering\n */\nexport type ConditionOperator =\n | 'exists'\n | 'equals'\n | 'not_equals'\n | 'contains'\n | 'matches'\n | 'gt'\n | 'lt'\n | 'in';\n\n/**\n * Property transformation configuration\n */\nexport interface PropertyTransform {\n type: TransformType;\n value?: string; // For prefix/suffix/template\n}\n\n/**\n * Condition for filtering source elements\n */\nexport interface ProjectionCondition {\n field: string;\n operator: ConditionOperator;\n value?: any;\n pattern?: string; // For regex matching\n}\n\n/**\n * Property mapping from source to target\n */\nexport interface PropertyMapping {\n source: string;\n target: string;\n default?: any;\n required?: boolean;\n transform?: PropertyTransform;\n}\n\n/**\n * Projection rule definition\n */\nexport interface ProjectionRule {\n name: string;\n from_layer: string;\n from_type: string;\n to_layer: string;\n to_type: string;\n name_template: string;\n property_mappings: PropertyMapping[];\n conditions?: ProjectionCondition[];\n template_file?: string;\n create_bidirectional?: boolean;\n}\n\n/**\n * Helper class for property transformations\n */\nexport class PropertyTransformer {\n constructor(private config: PropertyTransform) {}\n\n apply(value: any): any {\n if (value === null || value === undefined) return null;\n\n const strValue = String(value);\n\n switch (this.config.type) {\n case 'uppercase':\n return strValue.toUpperCase();\n\n case 'lowercase':\n return strValue.toLowerCase();\n\n case 'kebab':\n return toKebabCase(strValue);\n\n case 'snake':\n return toSnakeCase(strValue);\n\n case 'pascal':\n return toPascalCase(strValue);\n\n case 'prefix':\n return `${this.config.value}${strValue}`;\n\n case 'suffix':\n return `${strValue}${this.config.value}`;\n\n case 'template':\n return this.config.value?.replace('{value}', strValue) ?? strValue;\n\n default:\n return value;\n }\n }\n}\n\n/**\n * Helper class for condition evaluation\n */\nexport class ConditionEvaluator {\n constructor(private config: ProjectionCondition) {}\n\n evaluate(element: any): boolean {\n const fieldValue = getNestedProperty(element, this.config.field);\n\n switch (this.config.operator) {\n case 'exists':\n return fieldValue !== null && fieldValue !== undefined;\n\n case 'equals':\n return fieldValue === this.config.value;\n\n case 'not_equals':\n return fieldValue !== this.config.value;\n\n case 'contains':\n return fieldValue\n ? String(fieldValue).includes(String(this.config.value))\n : false;\n\n case 'matches':\n return fieldValue && this.config.pattern\n ? new RegExp(this.config.pattern).test(String(fieldValue))\n : false;\n\n case 'gt':\n return fieldValue > this.config.value;\n\n case 'lt':\n return fieldValue < this.config.value;\n\n case 'in':\n return Array.isArray(this.config.value)\n ? this.config.value.includes(fieldValue)\n : false;\n\n default:\n return false;\n }\n }\n}\n\n/**\n * Projection Engine - Creates elements across layers based on rules\n */\nexport class ProjectionEngine {\n private rules: ProjectionRule[] = [];\n private registry?: ReferenceRegistry;\n\n constructor(private model: Model, rulesPath?: string) {\n if (rulesPath) {\n this.loadRulesSync(rulesPath);\n }\n }\n\n /**\n * Set reference registry for element registration\n */\n setRegistry(registry: ReferenceRegistry): void {\n this.registry = registry;\n }\n\n /**\n * Load projection rules from YAML file\n */\n async loadRules(path: string): Promise<void> {\n try {\n const content = await readFile(path, 'utf-8');\n const data = parseYAML(content);\n\n if (!data.projections || !Array.isArray(data.projections)) {\n throw new Error('Invalid projection rules file: missing projections array');\n }\n\n this.rules = data.projections.map((proj: any) =>\n this.parseProjectionRule(proj)\n );\n } catch (error) {\n throw new Error(\n `Failed to load projection rules from ${path}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Synchronous version for constructor\n */\n private loadRulesSync(_path: string): void {\n // For now, rules must be loaded async via loadRules()\n // This is a placeholder for backward compatibility\n }\n\n /**\n * Add a projection rule programmatically\n */\n addRule(rule: ProjectionRule): void {\n this.rules.push(rule);\n }\n\n /**\n * Get all loaded rules\n */\n getRules(): ProjectionRule[] {\n return [...this.rules];\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.rules = [];\n }\n\n /**\n * Parse YAML projection definition into ProjectionRule\n */\n private parseProjectionRule(data: any): ProjectionRule {\n // Split from/to into layer.type\n const [from_layer, from_type] = data.from.split('.');\n const [to_layer, to_type] = data.to.split('.');\n\n // Get first rule definition (simplified - Python CLI could support multiple)\n const ruleData = Array.isArray(data.rules) ? data.rules[0] : data.rules;\n\n // Parse conditions\n const conditions: ProjectionCondition[] = (data.conditions || []).map(\n (c: any) => ({\n field: c.field,\n operator: c.operator,\n value: c.value,\n pattern: c.pattern,\n })\n );\n\n // Parse property mappings\n const property_mappings: PropertyMapping[] = [];\n if (ruleData.properties) {\n for (const [target, mapping] of Object.entries(ruleData.properties)) {\n if (typeof mapping === 'string') {\n // Simple format: { target: source }\n property_mappings.push({ source: mapping as string, target });\n } else if (typeof mapping === 'object') {\n // Advanced format with transform\n const m = mapping as any;\n property_mappings.push({\n source: m.source,\n target,\n default: m.default,\n required: m.required ?? false,\n transform: m.transform,\n });\n }\n }\n }\n\n return {\n name: data.name,\n from_layer,\n from_type,\n to_layer,\n to_type,\n name_template: ruleData.name_template,\n property_mappings,\n conditions,\n template_file: ruleData.template,\n create_bidirectional: ruleData.create_bidirectional ?? true,\n };\n }\n\n /**\n * Find rules applicable to a source element\n */\n findApplicableRules(\n source: Element,\n targetLayer?: string\n ): ProjectionRule[] {\n return this.rules.filter((rule) => {\n // Check layer match\n if (rule.from_layer !== source.layer) return false;\n\n // Check type match (if specified)\n if (rule.from_type && rule.from_type !== source.type) return false;\n\n // Check target layer filter (if specified)\n if (targetLayer && rule.to_layer !== targetLayer) return false;\n\n // Evaluate all conditions (ALL must be true)\n if (rule.conditions) {\n for (const condition of rule.conditions) {\n const evaluator = new ConditionEvaluator(condition);\n if (!evaluator.evaluate(source)) {\n return false;\n }\n }\n }\n\n return true;\n });\n }\n\n /**\n * Project a single element to target layer\n */\n async projectElement(\n source: Element,\n targetLayer: string,\n rule?: ProjectionRule,\n dryRun: boolean = false\n ): Promise<Element> {\n // Find rule if not provided\n if (!rule) {\n const applicableRules = this.findApplicableRules(source, targetLayer);\n if (applicableRules.length === 0) {\n throw new Error(\n `No applicable projection rule found for element ${source.id} to layer ${targetLayer}`\n );\n }\n rule = applicableRules[0];\n }\n\n // Build projected element\n const projected = this.buildProjectedElement(source, rule);\n\n // If not dry run, add to model\n if (!dryRun) {\n const layer = await this.model.getLayer(rule.to_layer);\n if (!layer) {\n throw new Error(`Target layer ${rule.to_layer} not found`);\n }\n\n // Add element to layer\n layer.addElement(projected);\n\n // Register with reference registry if available\n if (this.registry) {\n this.registry.registerElement(projected);\n }\n }\n\n return projected;\n }\n\n /**\n * Build projected element from source and rule\n */\n private buildProjectedElement(\n source: Element,\n rule: ProjectionRule\n ): Element {\n // Render element name\n const name = this.renderTemplate(rule.name_template, source);\n\n // Generate element ID\n const id = generateElementId(rule.to_layer, rule.to_type, name);\n\n // Initialize element data\n const data: any = {\n id,\n name,\n type: rule.to_type,\n layer: rule.to_layer,\n };\n\n // Map properties\n for (const mapping of rule.property_mappings) {\n let value: any;\n\n // Get source value\n if (mapping.source.includes('{') || mapping.source.includes('{{')) {\n // Template string\n value = this.renderTemplate(mapping.source, source);\n } else {\n // Direct property or nested property\n value = this.getSourceValue(source, mapping.source);\n }\n\n // Use default if null\n if (value === null || value === undefined) {\n if (mapping.required) {\n throw new Error(\n `Required property ${mapping.target} is missing from source ${source.id}`\n );\n }\n value = mapping.default;\n }\n\n // Apply transformation if specified\n if (mapping.transform && value !== null && value !== undefined) {\n const transformer = new PropertyTransformer(mapping.transform);\n value = transformer.apply(value);\n }\n\n // Set target property\n if (value !== null && value !== undefined) {\n setNestedProperty(data, mapping.target, value);\n }\n }\n\n // Add bidirectional reference if enabled\n if (rule.create_bidirectional !== false) {\n if (!data.properties) data.properties = {};\n data.properties.realizes = source.id;\n }\n\n // Create Element instance\n return new Element(data);\n }\n\n /**\n * Get value from source element (supports dot notation)\n */\n private getSourceValue(source: Element, path: string): any {\n // Check for direct element properties\n if (path === 'id') return source.id;\n if (path === 'name') return source.name;\n if (path === 'type') return source.type;\n if (path === 'layer') return source.layer;\n if (path === 'description') return source.description;\n\n // Check nested properties\n return getNestedProperty(source, path);\n }\n\n /**\n * Render template string with source element data\n */\n private renderTemplate(template: string, source: Element): string {\n // Build context\n const context: any = {\n id: source.id,\n name: source.name,\n type: source.type,\n layer: source.layer,\n description: source.description,\n properties: (source as any).properties || {},\n name_pascal: toPascalCase(source.name),\n name_kebab: toKebabCase(source.name),\n name_snake: toSnakeCase(source.name),\n };\n\n // Simple template replacement for {source.xxx}\n let result = template;\n const regex = /\\{source\\.(\\w+)\\}/g;\n result = result.replace(regex, (match, prop) => {\n return context[prop] !== undefined ? String(context[prop]) : match;\n });\n\n return result;\n }\n\n /**\n * Project all elements that match rules\n */\n async projectAll(\n fromLayer?: string,\n toLayer?: string,\n dryRun: boolean = false\n ): Promise<Element[]> {\n const projected: Element[] = [];\n\n // Get source elements\n const layers = fromLayer\n ? [await this.model.getLayer(fromLayer)]\n : Array.from(this.model.layers.values());\n\n for (const layer of layers) {\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n // Find applicable rules\n const applicableRules = this.findApplicableRules(\n element,\n toLayer\n );\n\n // Project with each applicable rule\n for (const rule of applicableRules) {\n try {\n const projectedElement = await this.projectElement(\n element,\n rule.to_layer,\n rule,\n dryRun\n );\n projected.push(projectedElement);\n } catch (error) {\n // Log warning and continue\n console.warn(\n `Warning: Failed to project ${element.id} with rule ${rule.name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n }\n\n return projected;\n }\n}\n\n/**\n * Helper: Get nested property from object\n */\nfunction getNestedProperty(obj: any, path: string): any {\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current && typeof current === 'object') {\n current = current[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Helper: Set nested property on object\n */\nfunction setNestedProperty(obj: any, path: string, value: any): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!current[part] || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part];\n }\n\n current[parts[parts.length - 1]] = value;\n}\n\n/**\n * Helper: Convert to kebab-case\n */\nfunction toKebabCase(text: string): string {\n return text\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/_/g, '-');\n}\n\n/**\n * Helper: Convert to snake_case\n */\nfunction toSnakeCase(text: string): string {\n return text\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/-/g, '_');\n}\n\n/**\n * Helper: Convert to PascalCase\n */\nfunction toPascalCase(text: string): string {\n const words = text\n .replace(/-/g, ' ')\n .replace(/_/g, ' ')\n .split(/\\s+/);\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Helper: Generate element ID\n */\nfunction generateElementId(layer: string, type: string, name: string): string {\n const kebabName = toKebabCase(name);\n return `${layer}.${type}.${kebabName}`;\n}\n"],
5
- "mappings": "AASA,SAAS,gBAAgB;AACzB,SAAS,SAAS,iBAAiB;AAEnC,SAAS,eAAe;AA6ElB,MAAO,oBAAmB;EACV;EAApB,YAAoB,QAAyB;AAAzB,SAAA,SAAA;EAA4B;EAEhD,MAAM,OAAU;AACd,QAAI,SAAU;AAA6B,aAAO;AAElD,UAAM,WAAW,OAAO,KAAK;AAE7B,YAAQ,KAAK,OAAO,MAAM;MACxB,KAAK;AACH,eAAO,SAAS,YAAW;MAE7B,KAAK;AACH,eAAO,SAAS,YAAW;MAE7B,KAAK;AACH,eAAO,YAAY,QAAQ;MAE7B,KAAK;AACH,eAAO,YAAY,QAAQ;MAE7B,KAAK;AACH,eAAO,aAAa,QAAQ;MAE9B,KAAK;AACH,eAAO,GAAG,KAAK,OAAO,KAAK,GAAG,QAAQ;MAExC,KAAK;AACH,eAAO,GAAG,QAAQ,GAAG,KAAK,OAAO,KAAK;MAExC,KAAK;AACH,eAAO,KAAK,OAAO,OAAO,QAAQ,WAAW,QAAQ,KAAK;MAE5D;AACE,eAAO;IACX;EACF;;AAMI,MAAO,mBAAkB;EACT;EAApB,YAAoB,QAA2B;AAA3B,SAAA,SAAA;EAA8B;EAElD,SAAS,SAAY;AACnB,UAAM,aAAa,kBAAkB,SAAS,KAAK,OAAO,KAAK;AAE/D,YAAQ,KAAK,OAAO,UAAU;MAC5B,KAAK;AACH,eAAO,cAAe;MAExB,KAAK;AACH,eAAO,eAAe,KAAK,OAAO;MAEpC,KAAK;AACH,eAAO,eAAe,KAAK,OAAO;MAEpC,KAAK;AACH,eAAO,aACH,OAAO,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,KAAK,CAAC,IACrD;MAEN,KAAK;AACH,eAAO,cAAc,KAAK,OAAO,UAC7B,IAAI,OAAO,KAAK,OAAO,OAAO,EAAE,KAAK,OAAO,UAAU,CAAC,IACvD;MAEN,KAAK;AACH,eAAO,aAAa,KAAK,OAAO;MAElC,KAAK;AACH,eAAO,aAAa,KAAK,OAAO;MAElC,KAAK;AACH,eAAO,MAAM,QAAQ,KAAK,OAAO,KAAK,IAClC,KAAK,OAAO,MAAM,SAAS,UAAU,IACrC;MAEN;AACE,eAAO;IACX;EACF;;AAMI,MAAO,iBAAgB;EAIP;EAHZ,QAA0B,CAAA;EAC1B;EAER,YAAoB,OAAc,WAAkB;AAAhC,SAAA,QAAA,OACd,aACF,KAAK,cAAc,SAAS;EAEhC;;;;EAKA,YAAY,UAA2B;AACrC,SAAK,WAAW;EAClB;;;;EAKA,MAAM,UAAU,MAAY;AAC1B,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,MAAM,OAAO,GACtC,OAAO,UAAU,OAAO;AAE9B,UAAI,CAAC,KAAK,eAAe,CAAC,MAAM,QAAQ,KAAK,WAAW;AACtD,cAAM,IAAI,MAAM,0DAA0D;AAG5E,WAAK,QAAQ,KAAK,YAAY,IAAI,CAAC,SACjC,KAAK,oBAAoB,IAAI,CAAC;IAElC,SAAS,OAAO;AACd,YAAM,IAAI,MACR,wCAAwC,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;IAE7G;EACF;;;;EAKQ,cAAc,OAAa;EAGnC;;;;EAKA,QAAQ,MAAoB;AAC1B,SAAK,MAAM,KAAK,IAAI;EACtB;;;;EAKA,WAAQ;AACN,WAAO,CAAC,GAAG,KAAK,KAAK;EACvB;;;;EAKA,aAAU;AACR,SAAK,QAAQ,CAAA;EACf;;;;EAKQ,oBAAoB,MAAS;AAEnC,UAAM,CAAC,YAAY,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG,GAC7C,CAAC,UAAU,OAAO,IAAI,KAAK,GAAG,MAAM,GAAG,GAGvC,WAAW,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,OAG5D,cAAqC,KAAK,cAAc,CAAA,GAAI,IAChE,CAAC,OAAY;MACX,OAAO,EAAE;MACT,UAAU,EAAE;MACZ,OAAO,EAAE;MACT,SAAS,EAAE;MACX,GAIE,oBAAuC,CAAA;AAC7C,QAAI,SAAS;AACX,iBAAW,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,SAAS,UAAU;AAChE,YAAI,OAAO,WAAY;AAErB,4BAAkB,KAAK,EAAE,QAAQ,SAAmB,OAAM,CAAE;iBACnD,OAAO,WAAY,UAAU;AAEtC,gBAAM,IAAI;AACV,4BAAkB,KAAK;YACrB,QAAQ,EAAE;YACV;YACA,SAAS,EAAE;YACX,UAAU,EAAE,YAAY;YACxB,WAAW,EAAE;WACd;QACH;;AAIJ,WAAO;MACL,MAAM,KAAK;MACX;MACA;MACA;MACA;MACA,eAAe,SAAS;MACxB;MACA;MACA,eAAe,SAAS;MACxB,sBAAsB,SAAS,wBAAwB;;EAE3D;;;;EAKA,oBACE,QACA,aAAoB;AAEpB,WAAO,KAAK,MAAM,OAAO,CAAC,SAAQ;AAQhC,UANI,KAAK,eAAe,OAAO,SAG3B,KAAK,aAAa,KAAK,cAAc,OAAO,QAG5C,eAAe,KAAK,aAAa;AAAa,eAAO;AAGzD,UAAI,KAAK;AACP,mBAAW,aAAa,KAAK;AAE3B,cAAI,CADc,IAAI,mBAAmB,SAAS,EACnC,SAAS,MAAM;AAC5B,mBAAO;;AAKb,aAAO;IACT,CAAC;EACH;;;;EAKA,MAAM,eACJ,QACA,aACA,MACA,SAAkB,IAAK;AAGvB,QAAI,CAAC,MAAM;AACT,YAAM,kBAAkB,KAAK,oBAAoB,QAAQ,WAAW;AACpE,UAAI,gBAAgB,WAAW;AAC7B,cAAM,IAAI,MACR,mDAAmD,OAAO,EAAE,aAAa,WAAW,EAAE;AAG1F,aAAO,gBAAgB,CAAC;IAC1B;AAGA,UAAM,YAAY,KAAK,sBAAsB,QAAQ,IAAI;AAGzD,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ;AACrD,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,gBAAgB,KAAK,QAAQ,YAAY;AAI3D,YAAM,WAAW,SAAS,GAGtB,KAAK,YACP,KAAK,SAAS,gBAAgB,SAAS;IAE3C;AAEA,WAAO;EACT;;;;EAKQ,sBACN,QACA,MAAoB;AAGpB,UAAM,OAAO,KAAK,eAAe,KAAK,eAAe,MAAM,GAMrD,OAAY;MAChB,IAJS,kBAAkB,KAAK,UAAU,KAAK,SAAS,IAAI;MAK5D;MACA,MAAM,KAAK;MACX,OAAO,KAAK;;AAId,eAAW,WAAW,KAAK,mBAAmB;AAC5C,UAAI;AAYJ,UATI,QAAQ,OAAO,SAAS,GAAG,KAAK,QAAQ,OAAO,SAAS,IAAI,IAE9D,QAAQ,KAAK,eAAe,QAAQ,QAAQ,MAAM,IAGlD,QAAQ,KAAK,eAAe,QAAQ,QAAQ,MAAM,GAIhD,SAAU,MAA6B;AACzC,YAAI,QAAQ;AACV,gBAAM,IAAI,MACR,qBAAqB,QAAQ,MAAM,2BAA2B,OAAO,EAAE,EAAE;AAG7E,gBAAQ,QAAQ;MAClB;AAGA,MAAI,QAAQ,aAAa,UAAU,QAAQ,UAAU,WAEnD,QADoB,IAAI,oBAAoB,QAAQ,SAAS,EACzC,MAAM,KAAK,IAI7B,SAAU,QACZ,kBAAkB,MAAM,QAAQ,QAAQ,KAAK;IAEjD;AAGA,WAAI,KAAK,yBAAyB,OAC3B,KAAK,eAAY,KAAK,aAAa,CAAA,IACxC,KAAK,WAAW,WAAW,OAAO,KAI7B,IAAI,QAAQ,IAAI;EACzB;;;;EAKQ,eAAe,QAAiB,MAAY;AAElD,WAAI,SAAS,OAAa,OAAO,KAC7B,SAAS,SAAe,OAAO,OAC/B,SAAS,SAAe,OAAO,OAC/B,SAAS,UAAgB,OAAO,QAChC,SAAS,gBAAsB,OAAO,cAGnC,kBAAkB,QAAQ,IAAI;EACvC;;;;EAKQ,eAAe,UAAkB,QAAe;AAEtD,UAAM,UAAe;MACnB,IAAI,OAAO;MACX,MAAM,OAAO;MACb,MAAM,OAAO;MACb,OAAO,OAAO;MACd,aAAa,OAAO;MACpB,YAAa,OAAe,cAAc,CAAA;MAC1C,aAAa,aAAa,OAAO,IAAI;MACrC,YAAY,YAAY,OAAO,IAAI;MACnC,YAAY,YAAY,OAAO,IAAI;;AAIrC,QAAI,SAAS;AACb,UAAM,QAAQ;AACd,oBAAS,OAAO,QAAQ,OAAO,CAAC,OAAO,SAC9B,QAAQ,IAAI,MAAM,SAAY,OAAO,QAAQ,IAAI,CAAC,IAAI,KAC9D,GAEM;EACT;;;;EAKA,MAAM,WACJ,WACA,SACA,SAAkB,IAAK;AAEvB,UAAM,YAAuB,CAAA,GAGvB,SAAS,YACX,CAAC,MAAM,KAAK,MAAM,SAAS,SAAS,CAAC,IACrC,MAAM,KAAK,KAAK,MAAM,OAAO,OAAM,CAAE;AAEzC,eAAW,SAAS;AAClB,UAAK;AAEL,mBAAW,WAAW,MAAM,aAAY,GAAI;AAE1C,gBAAM,kBAAkB,KAAK,oBAC3B,SACA,OAAO;AAIT,qBAAW,QAAQ;AACjB,gBAAI;AACF,oBAAM,mBAAmB,MAAM,KAAK,eAClC,SACA,KAAK,UACL,MACA,MAAM;AAER,wBAAU,KAAK,gBAAgB;YACjC,SAAS,OAAO;AAEd,sBAAQ,KACN,8BAA8B,QAAQ,EAAE,cAAc,KAAK,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;YAEhI;QAEJ;AAGF,WAAO;EACT;;AAMF,SAAS,kBAAkB,KAAU,MAAY;AAC/C,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAU;AAEd,aAAW,QAAQ;AACjB,QAAI,WAAW,OAAO,WAAY;AAChC,gBAAU,QAAQ,IAAI;;AAEtB;AAIJ,SAAO;AACT;AAKA,SAAS,kBAAkB,KAAU,MAAc,OAAU;AAC3D,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,OAAO,MAAM,CAAC;AACpB,KAAI,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,IAAI,KAAM,cAC7C,QAAQ,IAAI,IAAI,CAAA,IAElB,UAAU,QAAQ,IAAI;EACxB;AAEA,UAAQ,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;AACrC;AAKA,SAAS,YAAY,MAAY;AAC/B,SAAO,KACJ,YAAW,EACX,QAAQ,QAAQ,GAAG,EACnB,QAAQ,MAAM,GAAG;AACtB;AAKA,SAAS,YAAY,MAAY;AAC/B,SAAO,KACJ,YAAW,EACX,QAAQ,QAAQ,GAAG,EACnB,QAAQ,MAAM,GAAG;AACtB;AAKA,SAAS,aAAa,MAAY;AAKhC,SAJc,KACX,QAAQ,MAAM,GAAG,EACjB,QAAQ,MAAM,GAAG,EACjB,MAAM,KAAK,EAEX,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAW,IAAK,EAAE,MAAM,CAAC,EAAE,YAAW,CAAE,EAC/D,KAAK,EAAE;AACZ;AAKA,SAAS,kBAAkB,OAAe,MAAc,MAAY;AAClE,QAAM,YAAY,YAAY,IAAI;AAClC,SAAO,GAAG,KAAK,IAAI,IAAI,IAAI,SAAS;AACtC;",
6
- "names": []
7
- }