@documentation-robotics/cli 0.1.13 → 0.3.0

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 (351) hide show
  1. package/README.md +74 -2
  2. package/dist/analysis/relationship-classifier.js +2 -9
  3. package/dist/analysis/relationship-classifier.js.map +2 -2
  4. package/dist/analyzers/call-graph-utils.js +2 -2
  5. package/dist/analyzers/call-graph-utils.js.map +2 -2
  6. package/dist/analyzers/cards/build.js +171 -0
  7. package/dist/analyzers/cards/build.js.map +7 -0
  8. package/dist/analyzers/cards/classify.js +42 -0
  9. package/dist/analyzers/cards/classify.js.map +7 -0
  10. package/dist/analyzers/cards/edge-index.js +44 -0
  11. package/dist/analyzers/cards/edge-index.js.map +7 -0
  12. package/dist/analyzers/cards/facts.js +46 -0
  13. package/dist/analyzers/cards/facts.js.map +7 -0
  14. package/dist/analyzers/cards/graph.js +42 -0
  15. package/dist/analyzers/cards/graph.js.map +7 -0
  16. package/dist/analyzers/cards/index.js +8 -0
  17. package/dist/analyzers/cards/index.js.map +7 -0
  18. package/dist/analyzers/cards/tier0.js +18 -0
  19. package/dist/analyzers/cards/tier0.js.map +7 -0
  20. package/dist/analyzers/cards/types.js +1 -0
  21. package/dist/analyzers/cards/types.js.map +7 -0
  22. package/dist/analyzers/cbm-analyzer.js +195 -171
  23. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  24. package/dist/analyzers/cbm-responses.js +336 -0
  25. package/dist/analyzers/cbm-responses.js.map +7 -0
  26. package/dist/analyzers/edge-relationships.js +45 -0
  27. package/dist/analyzers/edge-relationships.js.map +7 -0
  28. package/dist/analyzers/mapping-loader.js +9 -0
  29. package/dist/analyzers/mapping-loader.js.map +2 -2
  30. package/dist/analyzers/tier0-rules.js +153 -0
  31. package/dist/analyzers/tier0-rules.js.map +7 -0
  32. package/dist/analyzers/types.js.map +1 -1
  33. package/dist/analyzers/verify-engine.js +22 -19
  34. package/dist/analyzers/verify-engine.js.map +2 -2
  35. package/dist/audit/relationships/ai/prompts.js +10 -10
  36. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  37. package/dist/audit/relationships/analysis/layer-templates.js +52 -52
  38. package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
  39. package/dist/cli.js +112 -28
  40. package/dist/cli.js.map +3 -3
  41. package/dist/coding-agents/agents/claude-code.js +3 -1
  42. package/dist/coding-agents/agents/claude-code.js.map +2 -2
  43. package/dist/coding-agents/claude-code-client.js +2 -1
  44. package/dist/coding-agents/claude-code-client.js.map +2 -2
  45. package/dist/coding-agents/copilot-client.js +17 -12
  46. package/dist/coding-agents/copilot-client.js.map +2 -2
  47. package/dist/coding-agents/default-permissions.js +152 -0
  48. package/dist/coding-agents/default-permissions.js.map +7 -0
  49. package/dist/coding-agents/drbot-mcp.js +167 -0
  50. package/dist/coding-agents/drbot-mcp.js.map +7 -0
  51. package/dist/commands/add.js +12 -7
  52. package/dist/commands/add.js.map +2 -2
  53. package/dist/commands/analyzer.js +134 -23
  54. package/dist/commands/analyzer.js.map +2 -2
  55. package/dist/commands/audit.js +6 -6
  56. package/dist/commands/audit.js.map +2 -2
  57. package/dist/commands/changeset-verify.js +55 -0
  58. package/dist/commands/changeset-verify.js.map +7 -0
  59. package/dist/commands/changeset.js +261 -147
  60. package/dist/commands/changeset.js.map +2 -2
  61. package/dist/commands/delete.js +52 -19
  62. package/dist/commands/delete.js.map +3 -3
  63. package/dist/commands/element.js +3 -2
  64. package/dist/commands/element.js.map +2 -2
  65. package/dist/commands/farm.js +773 -0
  66. package/dist/commands/farm.js.map +7 -0
  67. package/dist/commands/init.js +11 -1
  68. package/dist/commands/init.js.map +2 -2
  69. package/dist/commands/mcp.js +122 -0
  70. package/dist/commands/mcp.js.map +7 -0
  71. package/dist/commands/relationship.js +251 -47
  72. package/dist/commands/relationship.js.map +2 -2
  73. package/dist/commands/reports.js +1 -1
  74. package/dist/commands/reports.js.map +2 -2
  75. package/dist/commands/update.js +56 -24
  76. package/dist/commands/update.js.map +2 -2
  77. package/dist/commands/upgrade.js +99 -11
  78. package/dist/commands/upgrade.js.map +3 -3
  79. package/dist/commands/validate.js +41 -3
  80. package/dist/commands/validate.js.map +2 -2
  81. package/dist/commands/version.js +2 -2
  82. package/dist/commands/version.js.map +2 -2
  83. package/dist/commands/visualize.js +4 -3
  84. package/dist/commands/visualize.js.map +2 -2
  85. package/dist/config.js +83 -0
  86. package/dist/config.js.map +7 -0
  87. package/dist/core/annotation-store.js +138 -0
  88. package/dist/core/annotation-store.js.map +7 -0
  89. package/dist/core/catalog-migration.js +33 -0
  90. package/dist/core/catalog-migration.js.map +7 -0
  91. package/dist/core/changeset-analysis.js +421 -0
  92. package/dist/core/changeset-analysis.js.map +7 -0
  93. package/dist/core/changeset-base-index.js +153 -0
  94. package/dist/core/changeset-base-index.js.map +7 -0
  95. package/dist/core/changeset-brief-delta.js +102 -0
  96. package/dist/core/changeset-brief-delta.js.map +7 -0
  97. package/dist/core/changeset-graph.js +281 -0
  98. package/dist/core/changeset-graph.js.map +7 -0
  99. package/dist/core/changeset-only-guard.js +32 -0
  100. package/dist/core/changeset-only-guard.js.map +7 -0
  101. package/dist/core/changeset-summary.js +68 -0
  102. package/dist/core/changeset-summary.js.map +7 -0
  103. package/dist/core/changeset-validator.js +66 -20
  104. package/dist/core/changeset-validator.js.map +2 -2
  105. package/dist/core/changeset-verify.js +518 -0
  106. package/dist/core/changeset-verify.js.map +7 -0
  107. package/dist/core/changeset.js +56 -9
  108. package/dist/core/changeset.js.map +2 -2
  109. package/dist/core/element-type-migration.js +145 -0
  110. package/dist/core/element-type-migration.js.map +7 -0
  111. package/dist/core/farm-manifest.js +140 -0
  112. package/dist/core/farm-manifest.js.map +7 -0
  113. package/dist/core/farm-sync-engine.js +346 -0
  114. package/dist/core/farm-sync-engine.js.map +7 -0
  115. package/dist/core/farm-sync-state.js +167 -0
  116. package/dist/core/farm-sync-state.js.map +7 -0
  117. package/dist/core/manifest.js +6 -3
  118. package/dist/core/manifest.js.map +2 -2
  119. package/dist/core/migration-registry.js +84 -1
  120. package/dist/core/migration-registry.js.map +2 -2
  121. package/dist/core/model-upgrade.js +102 -0
  122. package/dist/core/model-upgrade.js.map +7 -0
  123. package/dist/core/model.js +257 -44
  124. package/dist/core/model.js.map +3 -3
  125. package/dist/core/mutation-handler.js +71 -6
  126. package/dist/core/mutation-handler.js.map +2 -2
  127. package/dist/core/relationship-migration-table.js +6639 -0
  128. package/dist/core/relationship-migration-table.js.map +7 -0
  129. package/dist/core/relationship-migration.js +272 -0
  130. package/dist/core/relationship-migration.js.map +7 -0
  131. package/dist/core/relationship-prune.js +49 -0
  132. package/dist/core/relationship-prune.js.map +7 -0
  133. package/dist/core/relationship-staging.js +68 -0
  134. package/dist/core/relationship-staging.js.map +7 -0
  135. package/dist/core/relationships.js +26 -4
  136. package/dist/core/relationships.js.map +2 -2
  137. package/dist/core/report-data-model.js +7 -13
  138. package/dist/core/report-data-model.js.map +2 -2
  139. package/dist/core/staged-changeset-storage.js +64 -17
  140. package/dist/core/staged-changeset-storage.js.map +2 -2
  141. package/dist/core/staged-source-reference.js +28 -0
  142. package/dist/core/staged-source-reference.js.map +7 -0
  143. package/dist/core/staging-area.js +83 -18
  144. package/dist/core/staging-area.js.map +2 -2
  145. package/dist/core/virtual-projection.js +14 -5
  146. package/dist/core/virtual-projection.js.map +2 -2
  147. package/dist/export/archimate-exporter.js +1 -0
  148. package/dist/export/archimate-exporter.js.map +2 -2
  149. package/dist/generated/compiled-validators.js +2 -2
  150. package/dist/generated/compiled-validators.js.map +2 -2
  151. package/dist/generated/layer-registry.js +16 -16
  152. package/dist/generated/layer-registry.js.map +2 -2
  153. package/dist/generated/node-types.js +186 -168
  154. package/dist/generated/node-types.js.map +2 -2
  155. package/dist/generated/relationship-index.js +2209 -7727
  156. package/dist/generated/relationship-index.js.map +2 -2
  157. package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
  158. package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
  159. package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
  160. package/dist/integrations/claude_code/commands/dr-map.md +13 -0
  161. package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
  162. package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
  163. package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
  164. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
  165. package/dist/integrations/claude_code/docs/MCP_SERVER.md +79 -0
  166. package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
  167. package/dist/integrations/claude_code/docs/README.md +52 -1
  168. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
  169. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
  170. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
  171. package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
  172. package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
  173. package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
  174. package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
  175. package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
  176. package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
  177. package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
  178. package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
  179. package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
  180. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
  181. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
  182. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
  183. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
  184. package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
  185. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
  186. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
  187. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
  188. package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
  189. package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
  190. package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
  191. package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
  192. package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
  193. package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
  194. package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
  195. package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
  196. package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
  197. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
  198. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
  199. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
  200. package/dist/integrations/hash-utils.js.map +2 -2
  201. package/dist/mcp/api-key-manager.js +111 -0
  202. package/dist/mcp/api-key-manager.js.map +7 -0
  203. package/dist/mcp/changeset-only.js +34 -0
  204. package/dist/mcp/changeset-only.js.map +7 -0
  205. package/dist/mcp/http-transport.js +176 -0
  206. package/dist/mcp/http-transport.js.map +7 -0
  207. package/dist/mcp/resource-registry.js +97 -0
  208. package/dist/mcp/resource-registry.js.map +7 -0
  209. package/dist/mcp/tool-registry.js +60 -0
  210. package/dist/mcp/tool-registry.js.map +7 -0
  211. package/dist/mcp/tools/annotation-create.js +39 -0
  212. package/dist/mcp/tools/annotation-create.js.map +7 -0
  213. package/dist/mcp/tools/annotation-delete.js +29 -0
  214. package/dist/mcp/tools/annotation-delete.js.map +7 -0
  215. package/dist/mcp/tools/annotation-get.js +29 -0
  216. package/dist/mcp/tools/annotation-get.js.map +7 -0
  217. package/dist/mcp/tools/annotation-list.js +24 -0
  218. package/dist/mcp/tools/annotation-list.js.map +7 -0
  219. package/dist/mcp/tools/annotation-reply.js +34 -0
  220. package/dist/mcp/tools/annotation-reply.js.map +7 -0
  221. package/dist/mcp/tools/annotation-shared.js +10 -0
  222. package/dist/mcp/tools/annotation-shared.js.map +7 -0
  223. package/dist/mcp/tools/annotation-update.js +39 -0
  224. package/dist/mcp/tools/annotation-update.js.map +7 -0
  225. package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
  226. package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
  227. package/dist/mcp/tools/changeset-editing.js +184 -0
  228. package/dist/mcp/tools/changeset-editing.js.map +7 -0
  229. package/dist/mcp/tools/changeset-lifecycle.js +83 -0
  230. package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
  231. package/dist/mcp/tools/changeset-list.js +33 -0
  232. package/dist/mcp/tools/changeset-list.js.map +7 -0
  233. package/dist/mcp/tools/changeset-shared.js +31 -0
  234. package/dist/mcp/tools/changeset-shared.js.map +7 -0
  235. package/dist/mcp/tools/changeset-show.js +55 -0
  236. package/dist/mcp/tools/changeset-show.js.map +7 -0
  237. package/dist/mcp/tools/changeset-verify.js +43 -0
  238. package/dist/mcp/tools/changeset-verify.js.map +7 -0
  239. package/dist/mcp/tools/chat-launch.js +50 -0
  240. package/dist/mcp/tools/chat-launch.js.map +7 -0
  241. package/dist/mcp/tools/chat-status.js +26 -0
  242. package/dist/mcp/tools/chat-status.js.map +7 -0
  243. package/dist/mcp/tools/index.js +65 -0
  244. package/dist/mcp/tools/index.js.map +7 -0
  245. package/dist/mcp/tools/model-add.js +107 -0
  246. package/dist/mcp/tools/model-add.js.map +7 -0
  247. package/dist/mcp/tools/model-delete.js +99 -0
  248. package/dist/mcp/tools/model-delete.js.map +7 -0
  249. package/dist/mcp/tools/model-export.js +72 -0
  250. package/dist/mcp/tools/model-export.js.map +7 -0
  251. package/dist/mcp/tools/model-info.js +51 -0
  252. package/dist/mcp/tools/model-info.js.map +7 -0
  253. package/dist/mcp/tools/model-list.js +53 -0
  254. package/dist/mcp/tools/model-list.js.map +7 -0
  255. package/dist/mcp/tools/model-reload.js +34 -0
  256. package/dist/mcp/tools/model-reload.js.map +7 -0
  257. package/dist/mcp/tools/model-search.js +102 -0
  258. package/dist/mcp/tools/model-search.js.map +7 -0
  259. package/dist/mcp/tools/model-show.js +68 -0
  260. package/dist/mcp/tools/model-show.js.map +7 -0
  261. package/dist/mcp/tools/model-stats.js +22 -0
  262. package/dist/mcp/tools/model-stats.js.map +7 -0
  263. package/dist/mcp/tools/model-trace.js +118 -0
  264. package/dist/mcp/tools/model-trace.js.map +7 -0
  265. package/dist/mcp/tools/model-update.js +121 -0
  266. package/dist/mcp/tools/model-update.js.map +7 -0
  267. package/dist/mcp/tools/model-validate.js +78 -0
  268. package/dist/mcp/tools/model-validate.js.map +7 -0
  269. package/dist/mcp/tools/relationship-tools.js +98 -0
  270. package/dist/mcp/tools/relationship-tools.js.map +7 -0
  271. package/dist/mcp/tools/shared.js +126 -0
  272. package/dist/mcp/tools/shared.js.map +7 -0
  273. package/dist/mcp/tools/spec-type.js +90 -0
  274. package/dist/mcp/tools/spec-type.js.map +7 -0
  275. package/dist/reports/model-layer-report-generator.js +5 -3
  276. package/dist/reports/model-layer-report-generator.js.map +2 -2
  277. package/dist/reports/model-readme-generator.js +116 -0
  278. package/dist/reports/model-readme-generator.js.map +7 -0
  279. package/dist/reports/model-report-data.js +37 -1
  280. package/dist/reports/model-report-data.js.map +2 -2
  281. package/dist/reports/model-report-orchestrator.js +29 -6
  282. package/dist/reports/model-report-orchestrator.js.map +2 -2
  283. package/dist/reports/model-report-utils.js +9 -0
  284. package/dist/reports/model-report-utils.js.map +7 -0
  285. package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
  286. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  287. package/dist/schemas/bundled/api.json +1029 -1658
  288. package/dist/schemas/bundled/apm.json +499 -734
  289. package/dist/schemas/bundled/application.json +745 -370
  290. package/dist/schemas/bundled/base.json +3 -220
  291. package/dist/schemas/bundled/business.json +452 -366
  292. package/dist/schemas/bundled/data-model.json +403 -383
  293. package/dist/schemas/bundled/data-store.json +334 -558
  294. package/dist/schemas/bundled/manifest.json +18 -18
  295. package/dist/schemas/bundled/motivation.json +349 -368
  296. package/dist/schemas/bundled/navigation.json +415 -731
  297. package/dist/schemas/bundled/product.json +325 -159
  298. package/dist/schemas/bundled/security.json +864 -1232
  299. package/dist/schemas/bundled/technology.json +574 -703
  300. package/dist/schemas/bundled/testing.json +718 -1643
  301. package/dist/schemas/bundled/ux.json +739 -1352
  302. package/dist/server/schemas.js +8 -0
  303. package/dist/server/schemas.js.map +2 -2
  304. package/dist/server/server.js +234 -31
  305. package/dist/server/server.js.map +2 -2
  306. package/dist/server-entry.js +2 -1
  307. package/dist/server-entry.js.map +2 -2
  308. package/dist/telemetry/config.js +2 -40
  309. package/dist/telemetry/config.js.map +2 -2
  310. package/dist/telemetry/index.js +1 -1
  311. package/dist/types/index.js.map +2 -2
  312. package/dist/utils/ansi-suppressor.js +23 -0
  313. package/dist/utils/ansi-suppressor.js.map +7 -0
  314. package/dist/utils/attribute-patch.js +41 -0
  315. package/dist/utils/attribute-patch.js.map +7 -0
  316. package/dist/utils/color-utils.js +34 -0
  317. package/dist/utils/color-utils.js.map +7 -0
  318. package/dist/utils/element-reference-shape.js +15 -1
  319. package/dist/utils/element-reference-shape.js.map +3 -3
  320. package/dist/utils/error-hints.js +29 -0
  321. package/dist/utils/error-hints.js.map +7 -0
  322. package/dist/utils/errors.js +75 -10
  323. package/dist/utils/errors.js.map +2 -2
  324. package/dist/utils/globals.js +17 -1
  325. package/dist/utils/globals.js.map +2 -2
  326. package/dist/utils/project-paths.js +50 -3
  327. package/dist/utils/project-paths.js.map +2 -2
  328. package/dist/utils/reference-path-parser.js +49 -0
  329. package/dist/utils/reference-path-parser.js.map +7 -0
  330. package/dist/utils/source-reference.js +17 -10
  331. package/dist/utils/source-reference.js.map +2 -2
  332. package/dist/utils/spec-version.js +10 -2
  333. package/dist/utils/spec-version.js.map +2 -2
  334. package/dist/validators/composed-reference-validator.js +240 -0
  335. package/dist/validators/composed-reference-validator.js.map +7 -0
  336. package/dist/validators/reference-validator.js +57 -13
  337. package/dist/validators/reference-validator.js.map +3 -3
  338. package/dist/validators/relationship-schema-validator.js +33 -5
  339. package/dist/validators/relationship-schema-validator.js.map +3 -3
  340. package/dist/validators/schema-validator.js +27 -9
  341. package/dist/validators/schema-validator.js.map +2 -2
  342. package/dist/validators/types.js.map +1 -1
  343. package/dist/viewer/README.md +6 -6
  344. package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
  345. package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
  346. package/dist/viewer/index.html +2 -2
  347. package/dist/viewer/manifest.json +10 -10
  348. package/dist/viewer/version.json +1 -1
  349. package/package.json +7 -3
  350. package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
  351. package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
@@ -5,7 +5,8 @@ import { MutationHandler } from "../core/mutation-handler.js";
5
5
  import { ReferenceRegistry } from "../core/reference-registry.js";
6
6
  import { DependencyTracker, TraceDirection } from "../core/dependency-tracker.js";
7
7
  import { findElementLayer } from "../utils/element-utils.js";
8
- import { CLIError, handleError, handleSuccess, ErrorCategory, ModelNotFoundError } from "../utils/errors.js";
8
+ import { elementIdentifiers } from "../core/relationships.js";
9
+ import { CLIError, handleError, handleSuccess, handleInfo, ErrorCategory, ModelNotFoundError } from "../utils/errors.js";
9
10
  import { startSpan, endSpan } from "../telemetry/index.js";
10
11
  import { getErrorMessage } from "../utils/errors.js";
11
12
  const isTelemetryEnabled = !1;
@@ -17,9 +18,18 @@ async function deleteCommand(id, options) {
17
18
  "element.dryRun": !!options.dryRun
18
19
  }) : null;
19
20
  try {
21
+ let showDeletionSuccess2 = function() {
22
+ const details = {
23
+ elementId: id,
24
+ layer: layerName,
25
+ totalElementsDeleted: elementsToRemove.length
26
+ };
27
+ handleSuccess(`Deleted element ${ansis.bold(id)}`, details, { verbose: options.verbose }), options.cascade && dependents.length > 0 && handleInfo(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`));
28
+ };
29
+ var showDeletionSuccess = showDeletionSuccess2;
20
30
  let model;
21
31
  try {
22
- model = await Model.load();
32
+ model = await Model.load(options.model);
23
33
  } catch (error) {
24
34
  const message = getErrorMessage(error);
25
35
  throw message.includes("No DR project") || message.includes("Model not found") ? new ModelNotFoundError() : error;
@@ -41,15 +51,19 @@ async function deleteCommand(id, options) {
41
51
  for (const element2 of layer2.listElements())
42
52
  registry.registerElement(element2);
43
53
  const tracker = new DependencyTracker(registry, model), dependents = tracker.traceDependencies(id, TraceDirection.DOWN, null);
44
- if (console.log(""), console.log(ansis.bold(`Removing element: ${ansis.yellow(id)}`)), console.log(ansis.dim(` Layer: ${layerName}`)), console.log(ansis.dim(` Type: ${element.type || "unknown"}`)), element.name && console.log(ansis.dim(` Name: ${element.name}`)), dependents.length > 0) {
45
- console.log(""), console.log(ansis.yellow(`\u26A0 Warning: This element has ${dependents.length} dependent element(s):`));
54
+ if (handleInfo(""), handleInfo(ansis.bold(`Removing element: ${ansis.yellow(id)}`), {
55
+ Layer: layerName,
56
+ Type: element.type || "unknown",
57
+ ...element.name ? { Name: element.name } : {}
58
+ }), dependents.length > 0) {
59
+ handleInfo(""), handleInfo(ansis.yellow(`\u26A0 Warning: This element has ${dependents.length} dependent element(s):`));
46
60
  const directDependents = tracker.traceDependencies(id, TraceDirection.DOWN, 1);
47
61
  for (const dep of directDependents.slice(0, 5)) {
48
62
  const depLayer = model.getElementById(dep)?.layer || "unknown";
49
- console.log(ansis.dim(` - ${dep} (${depLayer})`));
63
+ handleInfo(ansis.dim(` - ${dep} (${depLayer})`));
50
64
  }
51
- if (directDependents.length > 5 && console.log(ansis.dim(` ... and ${directDependents.length - 5} more direct dependents`)), dependents.length > directDependents.length && console.log(ansis.dim(` (${dependents.length - directDependents.length} transitive dependents not shown)`)), !options.cascade && !options.force) {
52
- console.log(""), console.log(ansis.red("\u2717 Cannot remove element with dependencies.")), console.log(ansis.dim("Use --cascade to remove all dependent elements")), console.log(ansis.dim("or --force to skip dependency checks"));
65
+ if (directDependents.length > 5 && handleInfo(ansis.dim(` ... and ${directDependents.length - 5} more direct dependents`)), dependents.length > directDependents.length && handleInfo(ansis.dim(` (${dependents.length - directDependents.length} transitive dependents not shown)`)), !options.cascade && !options.force) {
66
+ handleInfo(""), handleInfo(ansis.red("\u2717 Cannot remove element with dependencies.")), handleInfo(ansis.dim("Use --cascade to remove all dependent elements")), handleInfo(ansis.dim("or --force to skip dependency checks"));
53
67
  const suggestions = [
54
68
  "Use --dry-run with --cascade to preview what would be deleted",
55
69
  'Review dependencies before deletion using "dr show <element>"',
@@ -63,26 +77,42 @@ async function deleteCommand(id, options) {
63
77
  });
64
78
  }
65
79
  }
66
- const elementsToRemove = options.cascade ? [id, ...dependents] : [id];
80
+ const elementsToRemove = options.cascade ? [id, ...dependents] : [id], relationshipIdentifiers = /* @__PURE__ */ new Set();
81
+ for (const eid of elementsToRemove) {
82
+ const target = eid === id ? element : model.getElementById(eid);
83
+ for (const identifier of elementIdentifiers(target ?? {}, eid))
84
+ relationshipIdentifiers.add(identifier);
85
+ }
67
86
  if (options.dryRun) {
68
- if (console.log(""), console.log(ansis.yellow("Dry run - not removing")), console.log(ansis.dim(`Would remove ${elementsToRemove.length} element(s)`)), options.cascade && dependents.length > 0) {
69
- console.log(""), console.log(ansis.dim("Elements that would be removed:")), console.log(ansis.dim(` - ${id} (target)`));
87
+ if (handleInfo(""), handleInfo(ansis.yellow("Dry run - not removing")), handleInfo(ansis.dim(`Would remove ${elementsToRemove.length} element(s)`)), options.cascade && dependents.length > 0) {
88
+ handleInfo(""), handleInfo(ansis.dim("Elements that would be removed:")), handleInfo(ansis.dim(` - ${id} (target)`));
70
89
  for (const dep of dependents.slice(0, 10))
71
- console.log(ansis.dim(` - ${dep} (dependent)`));
72
- dependents.length > 10 && console.log(ansis.dim(` ... and ${dependents.length - 10} more`));
90
+ handleInfo(ansis.dim(` - ${dep} (dependent)`));
91
+ dependents.length > 10 && handleInfo(ansis.dim(` ... and ${dependents.length - 10} more`));
73
92
  }
93
+ handleSuccess(`Dry run: would remove ${elementsToRemove.length} element(s)`, {
94
+ elementId: id,
95
+ layer: layerName,
96
+ dryRun: !0,
97
+ elementsToRemoveCount: 1,
98
+ dependentElementsToRemoveCount: dependents.length
99
+ }, { verbose: options.verbose });
74
100
  return;
75
101
  }
76
102
  if (!options.force)
77
103
  if (!(process.stdin.isTTY && process.stdout.isTTY))
78
- console.log(ansis.dim("Non-interactive environment detected - proceeding without confirmation"));
104
+ handleInfo(ansis.dim("Non-interactive environment detected - proceeding without confirmation"));
79
105
  else {
80
106
  const message = options.cascade && dependents.length > 0 ? `Delete ${ansis.bold(id)} and ${ansis.bold(String(dependents.length))} dependent element(s)? This cannot be undone.` : `Delete element ${ansis.bold(id)}? This cannot be undone.`;
81
107
  if (!await confirm({
82
108
  message,
83
109
  initialValue: !1
84
110
  })) {
85
- console.log(ansis.dim("Cancelled"));
111
+ handleSuccess("Deletion cancelled", {
112
+ status: "cancelled",
113
+ elementId: id,
114
+ layer: layerName
115
+ }, { verbose: options.verbose });
86
116
  return;
87
117
  }
88
118
  }
@@ -96,7 +126,7 @@ async function deleteCommand(id, options) {
96
126
  if (!depLayerName)
97
127
  continue;
98
128
  const depElement = (await model.getLayer(depLayerName)).getElement(depId);
99
- await new MutationHandler(model, depId, depLayerName).executeDelete(depElement), deletedCount++, options.verbose && console.log(ansis.dim(` Deleted dependent: ${depId}`));
129
+ await new MutationHandler(model, depId, depLayerName).executeDelete(depElement), deletedCount++, options.verbose && handleInfo(ansis.dim(` Deleted dependent: ${depId}`));
100
130
  } catch {
101
131
  const suggestions = [
102
132
  `${deletedCount} dependent element(s) were deleted before the error`,
@@ -128,11 +158,14 @@ async function deleteCommand(id, options) {
128
158
  if (await handler.executeDelete(element), isTelemetryEnabled && span && (span.setAttribute("layer.name", layerName), span.setAttribute("element.dependents", dependents.length), span.setAttribute("element.totalDeleted", elementsToRemove.length)), handler.getBeforeState()) {
129
159
  const activeChangeset = await handler.getStagingManager().getActive();
130
160
  activeChangeset && activeChangeset.status === "staged" ? handleSuccess(`Staged deletion of element ${ansis.bold(id)} to ${ansis.bold(activeChangeset.name)}`, {
131
- status: "staged",
132
- changeset: activeChangeset.name
133
- }) : (elementsToRemove.reduce((n, eid) => n + model.relationships.deleteForElement(eid), 0) > 0 && await model.saveRelationships(), console.log(""), console.log(ansis.green(`\u2713 Deleted element ${ansis.bold(id)}`)), options.cascade && dependents.length > 0 && console.log(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`)), options.verbose && (console.log(ansis.dim(` Layer: ${layerName}`)), console.log(ansis.dim(` Total elements deleted: ${elementsToRemove.length}`))));
161
+ elementId: id,
162
+ layer: layerName,
163
+ changesetStatus: "staged",
164
+ changeset: activeChangeset.name,
165
+ totalElementsDeleted: elementsToRemove.length
166
+ }, { verbose: options.verbose }) : (model.relationships.deleteForElement([...relationshipIdentifiers]) > 0 && await model.saveRelationships(), showDeletionSuccess2());
134
167
  } else
135
- elementsToRemove.reduce((n, eid) => n + model.relationships.deleteForElement(eid), 0) > 0 && await model.saveRelationships(), console.log(""), console.log(ansis.green(`\u2713 Deleted element ${ansis.bold(id)}`)), options.cascade && dependents.length > 0 && console.log(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`)), options.verbose && (console.log(ansis.dim(` Layer: ${layerName}`)), console.log(ansis.dim(` Total elements deleted: ${elementsToRemove.length}`)));
168
+ model.relationships.deleteForElement([...relationshipIdentifiers]) > 0 && await model.saveRelationships(), showDeletionSuccess2();
136
169
  } catch (error) {
137
170
  isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: error.message })), handleError(error);
138
171
  } finally {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/delete.ts"],
4
- "sourcesContent": ["/**\n * Delete an element\n */\n\nimport { confirm } from \"@clack/prompts\";\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { MutationHandler } from \"../core/mutation-handler.js\";\nimport { ReferenceRegistry } from \"../core/reference-registry.js\";\nimport { DependencyTracker, TraceDirection } from \"../core/dependency-tracker.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { CLIError, handleError, handleSuccess, ErrorCategory, ModelNotFoundError } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface DeleteOptions {\n force?: boolean;\n verbose?: boolean;\n debug?: boolean;\n cascade?: boolean;\n dryRun?: boolean;\n}\n\nexport async function deleteCommand(id: string, options: DeleteOptions): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"element.delete\", {\n \"element.id\": id,\n \"element.force\": !!options.force,\n \"element.cascade\": !!options.cascade,\n \"element.dryRun\": !!options.dryRun,\n })\n : null;\n\n try {\n // Load model (with error handling for missing models)\n let model: Model;\n try {\n model = await Model.load();\n } catch (error) {\n const message = getErrorMessage(error);\n if (message.includes(\"No DR project\") || message.includes(\"Model not found\")) {\n throw new ModelNotFoundError();\n }\n throw error;\n }\n\n // Find element\n const layerName = await findElementLayer(model, id);\n if (!layerName) {\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n const layer = (await model.getLayer(layerName))!;\n const element = layer.getElement(id);\n\n if (!element) {\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n // Build reference registry to track dependencies\n const registry = new ReferenceRegistry();\n for (const layer of model.layers.values()) {\n for (const element of layer.listElements()) {\n registry.registerElement(element);\n }\n }\n\n // Create dependency tracker\n const tracker = new DependencyTracker(registry, model);\n\n // Find all elements that depend on this element (would be orphaned)\n const dependents = tracker.traceDependencies(id, TraceDirection.DOWN, null);\n\n // Display element information\n console.log(\"\");\n console.log(ansis.bold(`Removing element: ${ansis.yellow(id)}`));\n console.log(ansis.dim(` Layer: ${layerName}`));\n console.log(ansis.dim(` Type: ${element.type || \"unknown\"}`));\n if (element.name) {\n console.log(ansis.dim(` Name: ${element.name}`));\n }\n\n // Display dependencies if any exist\n if (dependents.length > 0) {\n console.log(\"\");\n console.log(\n ansis.yellow(`\u26A0 Warning: This element has ${dependents.length} dependent element(s):`)\n );\n\n const directDependents = tracker.traceDependencies(id, TraceDirection.DOWN, 1);\n\n // Show direct dependents\n for (const dep of directDependents.slice(0, 5)) {\n const depElement = model.getElementById(dep);\n const depLayer = depElement?.layer || \"unknown\";\n console.log(ansis.dim(` - ${dep} (${depLayer})`));\n }\n\n if (directDependents.length > 5) {\n console.log(ansis.dim(` ... and ${directDependents.length - 5} more direct dependents`));\n }\n\n if (dependents.length > directDependents.length) {\n console.log(\n ansis.dim(\n ` (${dependents.length - directDependents.length} transitive dependents not shown)`\n )\n );\n }\n\n // Check if cascade or force is enabled\n if (!options.cascade && !options.force) {\n console.log(\"\");\n console.log(ansis.red(\"\u2717 Cannot remove element with dependencies.\"));\n console.log(ansis.dim(\"Use --cascade to remove all dependent elements\"));\n console.log(ansis.dim(\"or --force to skip dependency checks\"));\n const suggestions = [\n `Use --dry-run with --cascade to preview what would be deleted`,\n 'Review dependencies before deletion using \"dr show <element>\"',\n \"Use --cascade to automatically remove all dependent elements\",\n \"Or use --force to remove only this element (dependencies will reference a non-existent element)\",\n ];\n throw new CLIError(\"Element has dependencies\", ErrorCategory.USER, suggestions, {\n operation: \"delete\",\n relatedElements: directDependents.slice(0, 10),\n context: `Element ${id} has ${dependents.length} dependent elements`,\n });\n }\n }\n\n // Calculate total elements to remove\n const elementsToRemove = options.cascade ? [id, ...dependents] : [id];\n\n // Display dry-run summary\n if (options.dryRun) {\n console.log(\"\");\n console.log(ansis.yellow(`Dry run - not removing`));\n console.log(ansis.dim(`Would remove ${elementsToRemove.length} element(s)`));\n\n if (options.cascade && dependents.length > 0) {\n console.log(\"\");\n console.log(ansis.dim(\"Elements that would be removed:\"));\n console.log(ansis.dim(` - ${id} (target)`));\n for (const dep of dependents.slice(0, 10)) {\n console.log(ansis.dim(` - ${dep} (dependent)`));\n }\n if (dependents.length > 10) {\n console.log(ansis.dim(` ... and ${dependents.length - 10} more`));\n }\n }\n\n return;\n }\n\n // Confirm deletion unless --force\n if (!options.force) {\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n if (!isInteractive) {\n console.log(ansis.dim(\"Non-interactive environment detected - proceeding without confirmation\"));\n } else {\n const message =\n options.cascade && dependents.length > 0\n ? `Delete ${ansis.bold(id)} and ${ansis.bold(String(dependents.length))} dependent element(s)? This cannot be undone.`\n : `Delete element ${ansis.bold(id)}? This cannot be undone.`;\n\n const confirmed = await confirm({\n message,\n initialValue: false,\n });\n\n if (!confirmed) {\n console.log(ansis.dim(\"Cancelled\"));\n return;\n }\n }\n }\n\n // Execute deletion with error recovery guidance\n let deletedCount = 0;\n try {\n if (options.cascade && dependents.length > 0) {\n // Delete dependents first (reverse dependency order to avoid orphaned references)\n const sortedDependents = [...dependents].reverse();\n\n for (const depId of sortedDependents) {\n try {\n const depLayerName = await findElementLayer(model, depId);\n if (!depLayerName) continue;\n\n const depLayer = (await model.getLayer(depLayerName))!;\n const depElement = depLayer.getElement(depId)!;\n\n const handler = new MutationHandler(model, depId, depLayerName);\n await handler.executeDelete(depElement);\n deletedCount++;\n\n if (options.verbose) {\n console.log(ansis.dim(` Deleted dependent: ${depId}`));\n }\n } catch (depError) {\n // Track partial progress for error recovery\n const suggestions = [\n `${deletedCount} dependent element(s) were deleted before the error`,\n 'Check the model state with \"dr validate\" to identify any broken references',\n 'You may need to manually delete remaining elements or use \"dr show\" to inspect',\n ];\n throw new CLIError(\n `Failed to delete dependent element ${depId}`,\n ErrorCategory.SYSTEM,\n suggestions,\n {\n operation: \"delete (cascade)\",\n partialProgress: { completed: deletedCount, total: sortedDependents.length },\n relatedElements: [id, ...sortedDependents.slice(0, 5)],\n }\n );\n }\n }\n }\n } catch (error) {\n // If we're in the middle of cascade deletion, provide recovery info\n if (options.cascade && deletedCount > 0 && !(error instanceof CLIError)) {\n const suggestions = [\n `${deletedCount} dependent element(s) were successfully deleted`,\n 'Use \"dr validate\" to check for broken references',\n \"The target element was not deleted - you can retry the operation\",\n ];\n throw new CLIError(\n \"Cascade deletion was partially completed but encountered an error\",\n ErrorCategory.SYSTEM,\n suggestions,\n {\n operation: \"delete (cascade)\",\n partialProgress: { completed: deletedCount, total: dependents.length },\n }\n );\n }\n throw error;\n }\n\n // Delete the target element\n const handler = new MutationHandler(model, id, layerName);\n await handler.executeDelete(element);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"layer.name\", layerName);\n (span as any).setAttribute(\"element.dependents\", dependents.length);\n (span as any).setAttribute(\"element.totalDeleted\", elementsToRemove.length);\n }\n\n // Check if operation was staged or applied to base model\n const beforeState = handler.getBeforeState();\n if (beforeState) {\n // Check if we went through staging path\n const stagingManager = handler.getStagingManager();\n const activeChangeset = await stagingManager.getActive();\n if (activeChangeset && activeChangeset.status === \"staged\") {\n // Staging path\n handleSuccess(\n `Staged deletion of element ${ansis.bold(id)} to ${ansis.bold(activeChangeset.name)}`,\n {\n status: \"staged\",\n changeset: activeChangeset.name,\n }\n );\n } else {\n // Base model path: purge any stale relationships MutationHandler may have missed\n const staleBase = elementsToRemove.reduce(\n (n, eid) => n + model.relationships.deleteForElement(eid), 0\n );\n if (staleBase > 0) await model.saveRelationships();\n\n console.log(\"\");\n console.log(ansis.green(`\u2713 Deleted element ${ansis.bold(id)}`));\n\n if (options.cascade && dependents.length > 0) {\n console.log(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`));\n }\n\n if (options.verbose) {\n console.log(ansis.dim(` Layer: ${layerName}`));\n console.log(ansis.dim(` Total elements deleted: ${elementsToRemove.length}`));\n }\n }\n } else {\n // Fallback success message if before state is not available\n // This should rarely occur, but ensures user always gets feedback\n const staleFallback = elementsToRemove.reduce(\n (n, eid) => n + model.relationships.deleteForElement(eid), 0\n );\n if (staleFallback > 0) await model.saveRelationships();\n\n console.log(\"\");\n console.log(ansis.green(`\u2713 Deleted element ${ansis.bold(id)}`));\n\n if (options.cascade && dependents.length > 0) {\n console.log(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`));\n }\n\n if (options.verbose) {\n console.log(ansis.dim(` Layer: ${layerName}`));\n console.log(ansis.dim(` Total elements deleted: ${elementsToRemove.length}`));\n }\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: (error as Error).message });\n }\n handleError(error);\n } finally {\n if (isTelemetryEnabled) {\n endSpan(span);\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["layer", "element"]
4
+ "sourcesContent": ["/**\n * Delete an element\n */\n\nimport { confirm } from \"@clack/prompts\";\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { MutationHandler } from \"../core/mutation-handler.js\";\nimport { ReferenceRegistry } from \"../core/reference-registry.js\";\nimport { DependencyTracker, TraceDirection } from \"../core/dependency-tracker.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { elementIdentifiers } from \"../core/relationships.js\";\nimport { CLIError, handleError, handleSuccess, handleInfo, ErrorCategory, ModelNotFoundError } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface DeleteOptions {\n model?: string;\n force?: boolean;\n verbose?: boolean;\n debug?: boolean;\n cascade?: boolean;\n dryRun?: boolean;\n}\n\nexport async function deleteCommand(id: string, options: DeleteOptions): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"element.delete\", {\n \"element.id\": id,\n \"element.force\": !!options.force,\n \"element.cascade\": !!options.cascade,\n \"element.dryRun\": !!options.dryRun,\n })\n : null;\n\n try {\n // Load model (with error handling for missing models)\n let model: Model;\n try {\n model = await Model.load(options.model);\n } catch (error) {\n const message = getErrorMessage(error);\n if (message.includes(\"No DR project\") || message.includes(\"Model not found\")) {\n throw new ModelNotFoundError();\n }\n throw error;\n }\n\n // Find element\n const layerName = await findElementLayer(model, id);\n if (!layerName) {\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n const layer = (await model.getLayer(layerName))!;\n const element = layer.getElement(id);\n\n if (!element) {\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n // Build reference registry to track dependencies\n const registry = new ReferenceRegistry();\n for (const layer of model.layers.values()) {\n for (const element of layer.listElements()) {\n registry.registerElement(element);\n }\n }\n\n // Create dependency tracker\n const tracker = new DependencyTracker(registry, model);\n\n // Find all elements that depend on this element (would be orphaned)\n const dependents = tracker.traceDependencies(id, TraceDirection.DOWN, null);\n\n // Display element information\n handleInfo(\"\");\n handleInfo(ansis.bold(`Removing element: ${ansis.yellow(id)}`), {\n Layer: layerName,\n Type: element.type || \"unknown\",\n ...(element.name ? { Name: element.name } : {}),\n });\n\n // Display dependencies if any exist\n if (dependents.length > 0) {\n handleInfo(\"\");\n handleInfo(\n ansis.yellow(`\u26A0 Warning: This element has ${dependents.length} dependent element(s):`)\n );\n\n const directDependents = tracker.traceDependencies(id, TraceDirection.DOWN, 1);\n\n // Show direct dependents\n for (const dep of directDependents.slice(0, 5)) {\n const depElement = model.getElementById(dep);\n const depLayer = depElement?.layer || \"unknown\";\n handleInfo(ansis.dim(` - ${dep} (${depLayer})`));\n }\n\n if (directDependents.length > 5) {\n handleInfo(ansis.dim(` ... and ${directDependents.length - 5} more direct dependents`));\n }\n\n if (dependents.length > directDependents.length) {\n handleInfo(\n ansis.dim(\n ` (${dependents.length - directDependents.length} transitive dependents not shown)`\n )\n );\n }\n\n // Check if cascade or force is enabled\n if (!options.cascade && !options.force) {\n handleInfo(\"\");\n handleInfo(ansis.red(\"\u2717 Cannot remove element with dependencies.\"));\n handleInfo(ansis.dim(\"Use --cascade to remove all dependent elements\"));\n handleInfo(ansis.dim(\"or --force to skip dependency checks\"));\n const suggestions = [\n `Use --dry-run with --cascade to preview what would be deleted`,\n 'Review dependencies before deletion using \"dr show <element>\"',\n \"Use --cascade to automatically remove all dependent elements\",\n \"Or use --force to remove only this element (dependencies will reference a non-existent element)\",\n ];\n throw new CLIError(\"Element has dependencies\", ErrorCategory.USER, suggestions, {\n operation: \"delete\",\n relatedElements: directDependents.slice(0, 10),\n context: `Element ${id} has ${dependents.length} dependent elements`,\n });\n }\n }\n\n // Calculate total elements to remove\n const elementsToRemove = options.cascade ? [id, ...dependents] : [id];\n\n // Every identifier relationships.yaml may use for the elements being removed\n // (UUID id and dotted path), captured before they are deleted from the model.\n const relationshipIdentifiers = new Set<string>();\n for (const eid of elementsToRemove) {\n const target = eid === id ? element : model.getElementById(eid);\n for (const identifier of elementIdentifiers(target ?? {}, eid)) {\n relationshipIdentifiers.add(identifier);\n }\n }\n\n // Display dry-run summary\n if (options.dryRun) {\n handleInfo(\"\");\n handleInfo(ansis.yellow(`Dry run - not removing`));\n handleInfo(ansis.dim(`Would remove ${elementsToRemove.length} element(s)`));\n\n if (options.cascade && dependents.length > 0) {\n handleInfo(\"\");\n handleInfo(ansis.dim(\"Elements that would be removed:\"));\n handleInfo(ansis.dim(` - ${id} (target)`));\n for (const dep of dependents.slice(0, 10)) {\n handleInfo(ansis.dim(` - ${dep} (dependent)`));\n }\n if (dependents.length > 10) {\n handleInfo(ansis.dim(` ... and ${dependents.length - 10} more`));\n }\n }\n\n handleSuccess(\n `Dry run: would remove ${elementsToRemove.length} element(s)`,\n {\n elementId: id,\n layer: layerName!,\n dryRun: true,\n elementsToRemoveCount: 1,\n dependentElementsToRemoveCount: dependents.length,\n },\n { verbose: options.verbose }\n );\n return;\n }\n\n // Confirm deletion unless --force\n if (!options.force) {\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n if (!isInteractive) {\n handleInfo(ansis.dim(\"Non-interactive environment detected - proceeding without confirmation\"));\n } else {\n const message =\n options.cascade && dependents.length > 0\n ? `Delete ${ansis.bold(id)} and ${ansis.bold(String(dependents.length))} dependent element(s)? This cannot be undone.`\n : `Delete element ${ansis.bold(id)}? This cannot be undone.`;\n\n const confirmed = await confirm({\n message,\n initialValue: false,\n });\n\n if (!confirmed) {\n handleSuccess(\n \"Deletion cancelled\",\n {\n status: \"cancelled\",\n elementId: id,\n layer: layerName!,\n },\n { verbose: options.verbose }\n );\n return;\n }\n }\n }\n\n // Execute deletion with error recovery guidance\n let deletedCount = 0;\n try {\n if (options.cascade && dependents.length > 0) {\n // Delete dependents first (reverse dependency order to avoid orphaned references)\n const sortedDependents = [...dependents].reverse();\n\n for (const depId of sortedDependents) {\n try {\n const depLayerName = await findElementLayer(model, depId);\n if (!depLayerName) continue;\n\n const depLayer = (await model.getLayer(depLayerName))!;\n const depElement = depLayer.getElement(depId)!;\n\n const handler = new MutationHandler(model, depId, depLayerName);\n await handler.executeDelete(depElement);\n deletedCount++;\n\n if (options.verbose) {\n handleInfo(ansis.dim(` Deleted dependent: ${depId}`));\n }\n } catch (depError) {\n // Track partial progress for error recovery\n const suggestions = [\n `${deletedCount} dependent element(s) were deleted before the error`,\n 'Check the model state with \"dr validate\" to identify any broken references',\n 'You may need to manually delete remaining elements or use \"dr show\" to inspect',\n ];\n throw new CLIError(\n `Failed to delete dependent element ${depId}`,\n ErrorCategory.SYSTEM,\n suggestions,\n {\n operation: \"delete (cascade)\",\n partialProgress: { completed: deletedCount, total: sortedDependents.length },\n relatedElements: [id, ...sortedDependents.slice(0, 5)],\n }\n );\n }\n }\n }\n } catch (error) {\n // If we're in the middle of cascade deletion, provide recovery info\n if (options.cascade && deletedCount > 0 && !(error instanceof CLIError)) {\n const suggestions = [\n `${deletedCount} dependent element(s) were successfully deleted`,\n 'Use \"dr validate\" to check for broken references',\n \"The target element was not deleted - you can retry the operation\",\n ];\n throw new CLIError(\n \"Cascade deletion was partially completed but encountered an error\",\n ErrorCategory.SYSTEM,\n suggestions,\n {\n operation: \"delete (cascade)\",\n partialProgress: { completed: deletedCount, total: dependents.length },\n }\n );\n }\n throw error;\n }\n\n // Delete the target element\n const handler = new MutationHandler(model, id, layerName);\n await handler.executeDelete(element);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"layer.name\", layerName);\n (span as any).setAttribute(\"element.dependents\", dependents.length);\n (span as any).setAttribute(\"element.totalDeleted\", elementsToRemove.length);\n }\n\n // Check if operation was staged or applied to base model\n const beforeState = handler.getBeforeState();\n if (beforeState) {\n // Check if we went through staging path\n const stagingManager = handler.getStagingManager();\n const activeChangeset = await stagingManager.getActive();\n if (activeChangeset && activeChangeset.status === \"staged\") {\n // Staging path\n handleSuccess(\n `Staged deletion of element ${ansis.bold(id)} to ${ansis.bold(activeChangeset.name)}`,\n {\n elementId: id,\n layer: layerName!,\n changesetStatus: \"staged\",\n changeset: activeChangeset.name,\n totalElementsDeleted: elementsToRemove.length,\n },\n { verbose: options.verbose }\n );\n } else {\n // Base model path: purge any stale relationships MutationHandler may have missed\n const staleBase = model.relationships.deleteForElement([...relationshipIdentifiers]);\n if (staleBase > 0) await model.saveRelationships();\n\n // Report deletion with cascade confirmation\n showDeletionSuccess();\n }\n } else {\n // Fallback success message if before state is not available\n // This should rarely occur, but ensures user always gets feedback\n const staleFallback = model.relationships.deleteForElement([...relationshipIdentifiers]);\n if (staleFallback > 0) await model.saveRelationships();\n\n // Report deletion with cascade confirmation\n showDeletionSuccess();\n }\n\n function showDeletionSuccess(): void {\n const details: Record<string, unknown> = {\n elementId: id,\n layer: layerName!,\n totalElementsDeleted: elementsToRemove.length,\n };\n handleSuccess(`Deleted element ${ansis.bold(id)}`, details, { verbose: options.verbose });\n\n // Show cascade confirmation when cascade is active\n if (options.cascade && dependents.length > 0) {\n handleInfo(ansis.green(`\u2713 Deleted ${dependents.length} dependent element(s)`));\n }\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: (error as Error).message });\n }\n handleError(error);\n } finally {\n if (isTelemetryEnabled) {\n endSpan(span);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["showDeletionSuccess", "layer", "element"]
7
7
  }
@@ -3,11 +3,12 @@ import { listCommand } from "./list.js";
3
3
  import { showCommand } from "./show.js";
4
4
  import { deleteCommand } from "./delete.js";
5
5
  import { updateCommand } from "./update.js";
6
- function elementCommands(program) {
6
+ function elementCommands(program, rootProgram) {
7
7
  program.command("add <layer> <type> <name>").description("Add an element to a layer").option("--name <name>", "Element display name (optional, defaults to provided name)").option("--description <description>", "Element description").option("--attributes <json>", "Element attributes as JSON (type-specific properties)").option("--source-file <path>", "Source file path").option("--source-symbol <symbol>", "Source symbol or line number").option("--source-provenance <provenance>", "Source provenance (manual or generated)").option("--source-repo-remote <remote>", "Source repository remote").option("--source-repo-commit <commit>", "Source repository commit hash").option("--verbose", "Show detailed output").option("--debug", "Enable debug output").action(async (layer, type, name, options) => {
8
8
  await addCommand(layer, type, name, options);
9
9
  }), program.command("list <layer>").description("List elements in a layer").option("--type <type>", "Filter by element type").option("--json", "Output as JSON").option("--verbose", "Show detailed output").option("--debug", "Enable debug output").action(async (layer, options) => {
10
- await listCommand(layer, options);
10
+ const mergedOptions = { ...options, json: options.json ?? rootProgram?.opts().json };
11
+ await listCommand(layer, mergedOptions);
11
12
  }), program.command("show <id>").description("Display element details").option("--verbose", "Show detailed output").option("--debug", "Enable debug output").action(async (id, options) => {
12
13
  await showCommand(id, options);
13
14
  }), program.command("delete <id>").description("Delete an element").option("--force", "Skip confirmation prompt").option("--cascade", "Remove dependent elements automatically").option("--verbose", "Show detailed output").option("--debug", "Enable debug output").action(async (id, options) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/element.ts"],
4
- "sourcesContent": ["/**\n * Element subcommands for managing model elements\n * Provides an alternative way to access add, list, show, delete, and update commands\n * via an \"element\" subcommand group\n */\n\nimport { Command } from \"commander\";\nimport { addCommand } from \"./add.js\";\nimport { listCommand } from \"./list.js\";\nimport { showCommand } from \"./show.js\";\nimport { deleteCommand } from \"./delete.js\";\nimport { updateCommand } from \"./update.js\";\n\nexport function elementCommands(program: Command): void {\n // element add <layer> <type> <name> [options]\n program\n .command(\"add <layer> <type> <name>\")\n .description(\"Add an element to a layer\")\n .option(\"--name <name>\", \"Element display name (optional, defaults to provided name)\")\n .option(\"--description <description>\", \"Element description\")\n .option(\"--attributes <json>\", \"Element attributes as JSON (type-specific properties)\")\n .option(\"--source-file <path>\", \"Source file path\")\n .option(\"--source-symbol <symbol>\", \"Source symbol or line number\")\n .option(\"--source-provenance <provenance>\", \"Source provenance (manual or generated)\")\n .option(\"--source-repo-remote <remote>\", \"Source repository remote\")\n .option(\"--source-repo-commit <commit>\", \"Source repository commit hash\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (layer, type, name, options) => {\n await addCommand(layer, type, name, options);\n });\n\n // element list <layer> [options]\n program\n .command(\"list <layer>\")\n .description(\"List elements in a layer\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (layer, options) => {\n await listCommand(layer, options);\n });\n\n // element show <id> [options]\n program\n .command(\"show <id>\")\n .description(\"Display element details\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await showCommand(id, options);\n });\n\n // element delete <id> [options]\n program\n .command(\"delete <id>\")\n .description(\"Delete an element\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .option(\"--cascade\", \"Remove dependent elements automatically\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await deleteCommand(id, options);\n });\n\n // element update <id> [options]\n program\n .command(\"update <id>\")\n .description(\"Update an element\")\n .option(\"--name <name>\", \"New element name\")\n .option(\"--description <description>\", \"New description\")\n .option(\"--attributes <json>\", \"Element attributes as JSON (type-specific properties)\")\n .option(\"--source-file <path>\", \"Source file path\")\n .option(\"--source-symbol <symbol>\", \"Source symbol or line number\")\n .option(\"--source-provenance <provenance>\", \"Source provenance (manual or generated)\")\n .option(\"--source-repo-remote <remote>\", \"Source repository remote\")\n .option(\"--source-repo-commit <commit>\", \"Source repository commit hash\")\n .option(\"--clear-source-reference\", \"Remove source reference from element\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await updateCommand(id, options);\n });\n}\n"],
5
- "mappings": "AAOA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAExB,SAAU,gBAAgB,SAAgB;AAE9C,UACG,QAAQ,2BAA2B,EACnC,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,4DAA4D,EACpF,OAAO,+BAA+B,qBAAqB,EAC3D,OAAO,uBAAuB,uDAAuD,EACrF,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,4BAA4B,8BAA8B,EACjE,OAAO,oCAAoC,yCAAyC,EACpF,OAAO,iCAAiC,0BAA0B,EAClE,OAAO,iCAAiC,+BAA+B,EACvE,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,OAAO,MAAM,MAAM,YAAW;AAC3C,UAAM,WAAW,OAAO,MAAM,MAAM,OAAO;EAC7C,CAAC,GAGH,QACG,QAAQ,cAAc,EACtB,YAAY,0BAA0B,EACtC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,OAAO,YAAW;AAC/B,UAAM,YAAY,OAAO,OAAO;EAClC,CAAC,GAGH,QACG,QAAQ,WAAW,EACnB,YAAY,yBAAyB,EACrC,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,YAAY,IAAI,OAAO;EAC/B,CAAC,GAGH,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,WAAW,0BAA0B,EAC5C,OAAO,aAAa,yCAAyC,EAC7D,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,cAAc,IAAI,OAAO;EACjC,CAAC,GAGH,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,+BAA+B,iBAAiB,EACvD,OAAO,uBAAuB,uDAAuD,EACrF,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,4BAA4B,8BAA8B,EACjE,OAAO,oCAAoC,yCAAyC,EACpF,OAAO,iCAAiC,0BAA0B,EAClE,OAAO,iCAAiC,+BAA+B,EACvE,OAAO,4BAA4B,sCAAsC,EACzE,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,cAAc,IAAI,OAAO;EACjC,CAAC;AACL;",
4
+ "sourcesContent": ["/**\n * Element subcommands for managing model elements\n * Provides an alternative way to access add, list, show, delete, and update commands\n * via an \"element\" subcommand group\n */\n\nimport { Command } from \"commander\";\nimport { addCommand } from \"./add.js\";\nimport { listCommand } from \"./list.js\";\nimport { showCommand } from \"./show.js\";\nimport { deleteCommand } from \"./delete.js\";\nimport { updateCommand } from \"./update.js\";\n\nexport function elementCommands(program: Command, rootProgram?: Command): void {\n // element add <layer> <type> <name> [options]\n program\n .command(\"add <layer> <type> <name>\")\n .description(\"Add an element to a layer\")\n .option(\"--name <name>\", \"Element display name (optional, defaults to provided name)\")\n .option(\"--description <description>\", \"Element description\")\n .option(\"--attributes <json>\", \"Element attributes as JSON (type-specific properties)\")\n .option(\"--source-file <path>\", \"Source file path\")\n .option(\"--source-symbol <symbol>\", \"Source symbol or line number\")\n .option(\"--source-provenance <provenance>\", \"Source provenance (manual or generated)\")\n .option(\"--source-repo-remote <remote>\", \"Source repository remote\")\n .option(\"--source-repo-commit <commit>\", \"Source repository commit hash\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (layer, type, name, options) => {\n await addCommand(layer, type, name, options);\n });\n\n // element list <layer> [options]\n program\n .command(\"list <layer>\")\n .description(\"List elements in a layer\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (layer, options) => {\n const mergedOptions = { ...options, json: options.json ?? (rootProgram?.opts().json) };\n await listCommand(layer, mergedOptions);\n });\n\n // element show <id> [options]\n program\n .command(\"show <id>\")\n .description(\"Display element details\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await showCommand(id, options);\n });\n\n // element delete <id> [options]\n program\n .command(\"delete <id>\")\n .description(\"Delete an element\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .option(\"--cascade\", \"Remove dependent elements automatically\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await deleteCommand(id, options);\n });\n\n // element update <id> [options]\n program\n .command(\"update <id>\")\n .description(\"Update an element\")\n .option(\"--name <name>\", \"New element name\")\n .option(\"--description <description>\", \"New description\")\n .option(\"--attributes <json>\", \"Element attributes as JSON (type-specific properties)\")\n .option(\"--source-file <path>\", \"Source file path\")\n .option(\"--source-symbol <symbol>\", \"Source symbol or line number\")\n .option(\"--source-provenance <provenance>\", \"Source provenance (manual or generated)\")\n .option(\"--source-repo-remote <remote>\", \"Source repository remote\")\n .option(\"--source-repo-commit <commit>\", \"Source repository commit hash\")\n .option(\"--clear-source-reference\", \"Remove source reference from element\")\n .option(\"--verbose\", \"Show detailed output\")\n .option(\"--debug\", \"Enable debug output\")\n .action(async (id, options) => {\n await updateCommand(id, options);\n });\n}\n"],
5
+ "mappings": "AAOA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAExB,SAAU,gBAAgB,SAAkB,aAAqB;AAErE,UACG,QAAQ,2BAA2B,EACnC,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,4DAA4D,EACpF,OAAO,+BAA+B,qBAAqB,EAC3D,OAAO,uBAAuB,uDAAuD,EACrF,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,4BAA4B,8BAA8B,EACjE,OAAO,oCAAoC,yCAAyC,EACpF,OAAO,iCAAiC,0BAA0B,EAClE,OAAO,iCAAiC,+BAA+B,EACvE,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,OAAO,MAAM,MAAM,YAAW;AAC3C,UAAM,WAAW,OAAO,MAAM,MAAM,OAAO;EAC7C,CAAC,GAGH,QACG,QAAQ,cAAc,EACtB,YAAY,0BAA0B,EACtC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,OAAO,YAAW;AAC/B,UAAM,gBAAgB,EAAE,GAAG,SAAS,MAAM,QAAQ,QAAS,aAAa,KAAI,EAAG,KAAK;AACpF,UAAM,YAAY,OAAO,aAAa;EACxC,CAAC,GAGH,QACG,QAAQ,WAAW,EACnB,YAAY,yBAAyB,EACrC,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,YAAY,IAAI,OAAO;EAC/B,CAAC,GAGH,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,WAAW,0BAA0B,EAC5C,OAAO,aAAa,yCAAyC,EAC7D,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,cAAc,IAAI,OAAO;EACjC,CAAC,GAGH,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,+BAA+B,iBAAiB,EACvD,OAAO,uBAAuB,uDAAuD,EACrF,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,4BAA4B,8BAA8B,EACjE,OAAO,oCAAoC,yCAAyC,EACpF,OAAO,iCAAiC,0BAA0B,EAClE,OAAO,iCAAiC,+BAA+B,EACvE,OAAO,4BAA4B,sCAAsC,EACzE,OAAO,aAAa,sBAAsB,EAC1C,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,IAAI,YAAW;AAC5B,UAAM,cAAc,IAAI,OAAO;EACjC,CAAC;AACL;",
6
6
  "names": []
7
7
  }