@documentation-robotics/cli 0.1.0 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +206 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +155 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +37 -13
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -1,37 +1,63 @@
1
1
  import ansis from "ansis";
2
2
  import { Model } from "../core/model.js";
3
- import { ChangesetManager } from "../core/changeset.js";
4
- import { ActiveChangesetContext } from "../core/active-changeset.js";
3
+ import { StagingAreaManager } from "../core/staging-area.js";
4
+ import { ChangesetExporter } from "../core/changeset-exporter.js";
5
+ import { StagedChangesetStorage } from "../core/staged-changeset-storage.js";
6
+ import { ValidationFormatter } from "../validators/validation-formatter.js";
5
7
  import * as prompts from "@clack/prompts";
8
+ import path from "path";
9
+ import { isTelemetryEnabled, startSpan, endSpan, startActiveSpan } from "../telemetry/index.js";
10
+ import { getErrorMessage } from "../utils/errors.js";
11
+ import { findElementLayer } from "../utils/element-utils.js";
12
+ function generateImportedChangesetId() {
13
+ return `imported-${Date.now()}`;
14
+ }
6
15
  async function changesetCreateCommand(name, options) {
16
+ const span = isTelemetryEnabled ? startSpan("changeset.create", {
17
+ "changeset.name": name,
18
+ "changeset.hasDescription": !!options.description
19
+ }) : null;
7
20
  try {
8
- const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new ChangesetManager(model.rootPath);
9
- await manager.load(name) && (console.error(ansis.red(`Error: Changeset '${name}' already exists`)), process.exit(1));
21
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model);
22
+ await manager.load(name) && (console.error(ansis.red(`Error: Changeset '${name}' already exists`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset already exists" }), endSpan(span), process.exit(1));
10
23
  let description = options.description;
11
24
  if (!description) {
12
- const result = await prompts.text({
13
- message: "Changeset description (optional)"
14
- });
15
- typeof result == "string" && (description = result);
25
+ const isInteractive = process.stdin.isTTY;
26
+ if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
27
+ const result = await prompts.text({
28
+ message: "Changeset description (optional)"
29
+ });
30
+ typeof result == "string" && (description = result);
31
+ }
32
+ }
33
+ const changeset = await manager.create(name, description || void 0), previouslyActive = await manager.getActiveId();
34
+ if (previouslyActive) {
35
+ const previous = await manager.load(previouslyActive);
36
+ console.log(ansis.yellow(` Deactivating changeset: ${ansis.bold(previous?.name ?? previouslyActive)}`));
16
37
  }
17
- const changeset = await manager.create(name, description || void 0);
18
- console.log(ansis.green(`\u2713 Created changeset: ${ansis.bold(name)}`)), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Path: .dr/changesets/${name.toLowerCase().replace(/\s+/g, "-")}.json`)), console.log();
38
+ await manager.setActive(changeset.id), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setStatus({ code: 0 })), console.log(ansis.green(`\u2713 Created and activated changeset: ${ansis.bold(name)}`)), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Path: documentation-robotics/changesets/${changeset.id}/`)), console.log();
19
39
  } catch (error) {
20
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
40
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
41
+ code: 2,
42
+ message: getErrorMessage(error)
43
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
44
+ } finally {
45
+ endSpan(span);
21
46
  }
22
47
  }
23
48
  async function changesetListCommand() {
49
+ const span = isTelemetryEnabled ? startSpan("changeset.list") : null;
24
50
  try {
25
- const model = await Model.load(process.cwd(), { lazyLoad: !0 }), changesets = await new ChangesetManager(model.rootPath).list();
26
- if (changesets.length === 0) {
27
- console.log(ansis.yellow("No changesets found")), console.log();
51
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), changesets = await new StagingAreaManager(model.rootPath, model).list();
52
+ if (isTelemetryEnabled && span && span.setAttribute("changeset.count", changesets.length), changesets.length === 0) {
53
+ console.log(ansis.yellow("No changesets found")), console.log(), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
28
54
  return;
29
55
  }
30
56
  console.log(ansis.bold(`
31
57
  Changesets (${changesets.length}):
32
58
  `));
33
59
  for (const changeset of changesets) {
34
- const statusColor = changeset.status === "applied" ? ansis.green : changeset.status === "reverted" ? ansis.gray : ansis.yellow;
60
+ const statusColor = changeset.status === "committed" ? ansis.green : changeset.status === "discarded" ? ansis.gray : ansis.yellow;
35
61
  console.log(`${statusColor(changeset.status.toUpperCase())} ${ansis.bold(changeset.name)}`), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Changes: ${changeset.getChangeCount()} | Created: ${new Date(changeset.created).toLocaleDateString()}`));
36
62
  const changesByType = {
37
63
  add: changeset.getChangesByType("add").length,
@@ -40,92 +66,498 @@ Changesets (${changesets.length}):
40
66
  }, parts = [];
41
67
  changesByType.add > 0 && parts.push(`+${changesByType.add}`), changesByType.update > 0 && parts.push(`~${changesByType.update}`), changesByType.delete > 0 && parts.push(`-${changesByType.delete}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`)), console.log();
42
68
  }
69
+ isTelemetryEnabled && span && span.setStatus({ code: 0 });
43
70
  } catch (error) {
44
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
71
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
72
+ code: 2,
73
+ message: getErrorMessage(error)
74
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
75
+ } finally {
76
+ endSpan(span);
45
77
  }
46
78
  }
47
- async function changesetApplyCommand(name) {
79
+ async function changesetApplyCommand(name, options) {
80
+ const span = isTelemetryEnabled ? startSpan("changeset.apply", {
81
+ "changeset.name": name,
82
+ "apply.validate": options?.validate !== !1,
83
+ "apply.force": options?.force === !0
84
+ }) : null;
48
85
  try {
49
- const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new ChangesetManager(model.rootPath), changeset = await manager.load(name);
50
- changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
86
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
87
+ changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setAttribute("changeset.changeCount", changeset.changes.length)), console.log(ansis.bold(`
51
88
  Applying changeset: ${ansis.cyan(name)}
52
- `)), console.log(ansis.dim(`Changes: ${changeset.getChangeCount()}`));
53
- const result = await manager.apply(model, name);
54
- if (console.log(), console.log(ansis.green(`\u2713 Applied ${result.applied} change(s) from changeset`)), result.failed > 0) {
89
+ `)), console.log(ansis.dim(`Changes: ${changeset.changes.length}`));
90
+ const preApplyStats = ValidationFormatter.calculateStats(model);
91
+ preApplyStats.orphanedElements.length > 0 && console.log(ansis.dim(`Model health before apply: ${preApplyStats.orphanedElements.length} orphaned element(s) \u2014 run 'dr validate --orphans' for details`));
92
+ const changesetId = changeset.id || name;
93
+ changesetId || (console.error(ansis.red("Error: Changeset ID could not be determined") + `
94
+ ` + ansis.dim("This indicates a corrupted changeset. The changeset exists but has no ID field.") + `
95
+ ` + ansis.dim(`Try:
96
+ `) + ansis.dim(` 1. Run 'dr changeset list' to see available changesets
97
+ `) + ansis.dim(` 2. Delete and recreate the changeset if possible
98
+ `) + ansis.dim(" 3. Contact support if this persists")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset ID missing" }), endSpan(span), process.exit(1));
99
+ const result = await manager.apply(model, changesetId, {
100
+ validate: options?.validate,
101
+ force: options?.force
102
+ });
103
+ if (console.log(), console.log(ansis.green(`\u2713 Applied ${result.committed} change(s) from changeset`)), isTelemetryEnabled && span && (span.setAttribute("apply.committed", result.committed), span.setAttribute("apply.failed", result.failed), span.setAttribute("apply.validationPassed", result.validation.passed)), result.failed > 0) {
55
104
  console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));
56
- for (const error of result.errors)
57
- console.log(ansis.dim(` - ${error.change.elementId} (${error.change.type}): ${error.error}`));
105
+ for (const error of result.validation.errors)
106
+ console.log(ansis.dim(` - ${error}`));
58
107
  }
59
108
  model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
60
109
  name,
61
- applied_at: (/* @__PURE__ */ new Date()).toISOString(),
62
- action: "applied"
63
- }), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as applied")), console.log();
110
+ committed_at: (/* @__PURE__ */ new Date()).toISOString(),
111
+ action: "committed"
112
+ }), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as committed")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
64
113
  } catch (error) {
65
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
114
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
115
+ code: 2,
116
+ message: getErrorMessage(error)
117
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
118
+ } finally {
119
+ endSpan(span);
66
120
  }
67
121
  }
68
122
  async function changesetRevertCommand(name) {
123
+ const span = isTelemetryEnabled ? startSpan("changeset.revert", {
124
+ "changeset.name": name
125
+ }) : null;
69
126
  try {
70
- const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new ChangesetManager(model.rootPath), changeset = await manager.load(name);
71
- changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
127
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
128
+ changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setAttribute("changeset.changeCount", changeset.changes.length)), console.log(ansis.bold(`
72
129
  Reverting changeset: ${ansis.cyan(name)}
73
- `)), console.log(ansis.dim(`Changes to revert: ${changeset.getChangeCount()}`));
74
- const result = await manager.revert(model, name);
75
- if (console.log(), console.log(ansis.green(`\u2713 Reverted ${result.reverted} change(s)`)), result.failed > 0) {
76
- console.log(ansis.red(`\u2717 Failed to revert ${result.failed} change(s):`));
77
- for (const error of result.errors)
78
- console.log(ansis.dim(` - ${error.change.elementId} (${error.change.type}): ${error.error}`));
79
- }
80
- model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
81
- name,
82
- applied_at: (/* @__PURE__ */ new Date()).toISOString(),
83
- action: "reverted"
84
- }), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as reverted")), console.log();
130
+ `)), console.log(ansis.dim(`Changes to discard: ${changeset.changes.length}`));
131
+ const changesetId = changeset.id || name;
132
+ changesetId || (console.error(ansis.red("Error: Changeset ID could not be determined")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset ID missing" }), endSpan(span), process.exit(1)), await manager.revert(changesetId), console.log(), console.log(ansis.green(`\u2713 Reverted changeset: ${name}`)), console.log(ansis.dim("Changeset marked as discarded")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
85
133
  } catch (error) {
86
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
134
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
135
+ code: 2,
136
+ message: getErrorMessage(error)
137
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
138
+ } finally {
139
+ endSpan(span);
87
140
  }
88
141
  }
89
142
  async function changesetActivateCommand(name) {
143
+ const span = isTelemetryEnabled ? startSpan("changeset.activate", {
144
+ "changeset.name": name
145
+ }) : null;
90
146
  try {
91
147
  const model = await Model.load(process.cwd(), { lazyLoad: !0 });
92
- await new ActiveChangesetContext(model.rootPath).setActive(name), console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`)), console.log(ansis.dim(" All model changes will now be tracked in this changeset"));
148
+ await new StagingAreaManager(model.rootPath, model).setActive(name), console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`)), console.log(ansis.dim(" All model changes will now be tracked in this changeset")), isTelemetryEnabled && span && span.setStatus({ code: 0 });
93
149
  } catch (error) {
94
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
150
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
151
+ code: 2,
152
+ message: getErrorMessage(error)
153
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
154
+ } finally {
155
+ endSpan(span);
95
156
  }
96
157
  }
97
158
  async function changesetDeactivateCommand() {
159
+ const span = isTelemetryEnabled ? startSpan("changeset.deactivate") : null;
98
160
  try {
99
- const model = await Model.load(process.cwd(), { lazyLoad: !0 }), context = new ActiveChangesetContext(model.rootPath), active = await context.getActive();
161
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), active = await manager.getActiveId();
100
162
  if (!active) {
101
- console.log(ansis.yellow("No active changeset"));
163
+ console.log(ansis.yellow("No active changeset")), isTelemetryEnabled && span && (span.setAttribute("changeset.wasActive", !1), span.setStatus({ code: 0 })), endSpan(span);
102
164
  return;
103
165
  }
104
- await context.clearActive(), console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`));
166
+ isTelemetryEnabled && span && (span.setAttribute("changeset.name", active), span.setAttribute("changeset.wasActive", !0)), await manager.clearActive(), console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
105
167
  } catch (error) {
106
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
168
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
169
+ code: 2,
170
+ message: getErrorMessage(error)
171
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
172
+ } finally {
173
+ endSpan(span);
174
+ }
175
+ }
176
+ async function changesetDeleteCommand(name, options) {
177
+ const span = isTelemetryEnabled ? startSpan("changeset.delete", {
178
+ "changeset.name": name,
179
+ "delete.force": options.force === !0
180
+ }) : null;
181
+ try {
182
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
183
+ if (changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), await manager.getActiveId() === changeset.id && (console.error(ansis.red(`Error: Cannot delete active changeset '${name}'`)), console.log(ansis.dim(" Run `dr changeset deactivate` first")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Cannot delete active changeset" }), endSpan(span), process.exit(1)), !options.force) {
184
+ const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
185
+ if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
186
+ const confirm = await prompts.confirm({
187
+ message: `Delete changeset '${name}'? This cannot be undone.`
188
+ });
189
+ if (!confirm || typeof confirm != "boolean") {
190
+ console.log(ansis.yellow("Deletion cancelled")), isTelemetryEnabled && span && (span.setAttribute("delete.cancelled", !0), span.setStatus({ code: 0 })), endSpan(span);
191
+ return;
192
+ }
193
+ } else
194
+ console.error(ansis.red("Error: Cannot confirm deletion in non-interactive environment")), console.log(ansis.dim(" Use --force flag to confirm deletion")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Interactive confirmation required" }), endSpan(span), process.exit(1);
195
+ }
196
+ await manager.delete(name), console.log(ansis.green(`\u2713 Deleted changeset: ${ansis.bold(name)}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
197
+ } catch (error) {
198
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
199
+ code: 2,
200
+ message: getErrorMessage(error)
201
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
202
+ } finally {
203
+ endSpan(span);
107
204
  }
108
205
  }
109
206
  async function changesetStatusCommand() {
207
+ const span = isTelemetryEnabled ? startSpan("changeset.status") : null;
110
208
  try {
111
- const model = await Model.load(process.cwd(), { lazyLoad: !0 }), active = await new ActiveChangesetContext(model.rootPath).getActive();
209
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), active = await manager.getActiveId();
112
210
  if (!active) {
113
- console.log(ansis.dim("No active changeset"));
211
+ console.log(ansis.dim("No active changeset")), isTelemetryEnabled && span && (span.setAttribute("changeset.hasActive", !1), span.setStatus({ code: 0 })), endSpan(span);
114
212
  return;
115
213
  }
116
- console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));
117
- const changeset = await new ChangesetManager(model.rootPath).load(active);
214
+ isTelemetryEnabled && span && (span.setAttribute("changeset.name", active), span.setAttribute("changeset.hasActive", !0)), console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));
215
+ const changeset = await manager.load(active);
118
216
  if (changeset) {
119
- console.log(ansis.dim(` Changes tracked: ${changeset.getChangeCount()}`));
120
- const changesByType = {
121
- add: changeset.getChangesByType("add").length,
122
- update: changeset.getChangesByType("update").length,
123
- delete: changeset.getChangesByType("delete").length
124
- }, parts = [];
125
- changesByType.add > 0 && parts.push(`+${changesByType.add}`), changesByType.update > 0 && parts.push(`~${changesByType.update}`), changesByType.delete > 0 && parts.push(`-${changesByType.delete}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`));
217
+ console.log(ansis.dim(` Changes tracked: ${changeset.changes.length}`));
218
+ const changesByType = changeset.stats;
219
+ isTelemetryEnabled && span && (span.setAttribute("changeset.changeCount", changeset.changes.length), span.setAttribute("changeset.adds", changesByType.additions), span.setAttribute("changeset.updates", changesByType.modifications), span.setAttribute("changeset.deletes", changesByType.deletions));
220
+ const parts = [];
221
+ changesByType.additions > 0 && parts.push(`+${changesByType.additions}`), changesByType.modifications > 0 && parts.push(`~${changesByType.modifications}`), changesByType.deletions > 0 && parts.push(`-${changesByType.deletions}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`));
222
+ }
223
+ isTelemetryEnabled && span && span.setStatus({ code: 0 });
224
+ } catch (error) {
225
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
226
+ code: 2,
227
+ message: getErrorMessage(error)
228
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
229
+ } finally {
230
+ endSpan(span);
231
+ }
232
+ }
233
+ async function changesetStagedCommand(options) {
234
+ const span = isTelemetryEnabled ? startSpan("changeset.staged", {
235
+ "staged.layer": options.layer
236
+ }) : null;
237
+ try {
238
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangeset = await manager.getActiveId();
239
+ if (!activeChangeset) {
240
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
241
+ return;
242
+ }
243
+ const changeset = await manager.load(activeChangeset);
244
+ changeset || (console.error(ansis.red(`Error: Changeset '${activeChangeset}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1));
245
+ let changes = changeset.changes;
246
+ if (options.layer && (changes = changes.filter((c) => c.layerName === options.layer)), isTelemetryEnabled && span && (span.setAttribute("staged.changeCount", changes.length), span.setAttribute("staged.totalChanges", changeset.changes.length)), changes.length === 0) {
247
+ console.log(ansis.yellow("No staged changes")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
248
+ return;
249
+ }
250
+ console.log(ansis.bold(`
251
+ Staged Changes (${changes.length}):
252
+ `));
253
+ const tableData = changes.map((c) => ({
254
+ "Element ID": c.elementId,
255
+ Layer: c.layerName,
256
+ Type: c.type,
257
+ Timestamp: new Date(c.timestamp || Date.now()).toISOString()
258
+ }));
259
+ console.table(tableData), isTelemetryEnabled && span && span.setStatus({ code: 0 });
260
+ } catch (error) {
261
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
262
+ code: 2,
263
+ message: getErrorMessage(error)
264
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
265
+ } finally {
266
+ endSpan(span);
267
+ }
268
+ }
269
+ async function changesetExplicitStageCommand(elementId) {
270
+ const span = isTelemetryEnabled ? startSpan("changeset.stage-explicit", { "stage.elementId": elementId }) : null;
271
+ try {
272
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
273
+ if (!activeChangesetId) {
274
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
275
+ return;
276
+ }
277
+ const layerName = await findElementLayer(model, elementId);
278
+ layerName || (console.error(ansis.red(`Error: Element '${elementId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Element not found" }), endSpan(span), process.exit(1));
279
+ const element = (await model.getLayer(layerName))?.getElement(elementId);
280
+ if (element || (console.error(ansis.red(`Error: Element '${elementId}' not found in layer '${layerName}'`)), endSpan(span), process.exit(1)), (await manager.load(activeChangesetId))?.changes.some((c) => c.elementId === elementId)) {
281
+ console.warn(ansis.yellow(`Warning: Element '${elementId}' is already staged in the active changeset. Skipping.`)), endSpan(span);
282
+ return;
283
+ }
284
+ await manager.stage(activeChangesetId, {
285
+ type: "add",
286
+ elementId,
287
+ layerName,
288
+ after: element.toJSON()
289
+ }), isTelemetryEnabled && span && (span.setAttribute("stage.layerName", layerName), span.setStatus({ code: 0 })), console.log(ansis.green(`\u2713 Staged element: ${ansis.bold(elementId)}`)), console.log(ansis.dim(` Layer: ${layerName} | Changeset: ${activeChangesetId}`));
290
+ } catch (error) {
291
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: getErrorMessage(error) })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
292
+ } finally {
293
+ endSpan(span);
294
+ }
295
+ }
296
+ async function changesetUnstageCommand(elementId) {
297
+ const span = isTelemetryEnabled ? startSpan("changeset.unstage", {
298
+ "unstage.elementId": elementId
299
+ }) : null;
300
+ try {
301
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
302
+ if (!activeChangesetId) {
303
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
304
+ return;
305
+ }
306
+ const changeset = await manager.load(activeChangesetId);
307
+ changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), process.exit(1));
308
+ const initialCount = changeset.changes.length;
309
+ await manager.unstage(activeChangesetId, elementId);
310
+ const updated = await manager.load(activeChangesetId);
311
+ if (updated && updated.changes.length === initialCount) {
312
+ console.error(ansis.yellow(`Warning: Element '${elementId}' not found in staged changes`)), isTelemetryEnabled && span && (span.setAttribute("unstage.found", !1), span.setStatus({ code: 0 })), endSpan(span);
313
+ return;
314
+ }
315
+ isTelemetryEnabled && span && (span.setAttribute("unstage.found", !0), span.setAttribute("unstage.remainingChanges", updated?.getChangeCount() || 0)), console.log(ansis.green(`\u2713 Unstaged element: ${ansis.bold(elementId)}`)), console.log(ansis.dim(` Remaining staged changes: ${updated?.getChangeCount() || 0}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
316
+ } catch (error) {
317
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
318
+ code: 2,
319
+ message: getErrorMessage(error)
320
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
321
+ } finally {
322
+ endSpan(span);
323
+ }
324
+ }
325
+ async function changesetDiscardCommand(elementId) {
326
+ const span = isTelemetryEnabled ? startSpan("changeset.discard", {
327
+ "discard.elementId": elementId,
328
+ "discard.all": !elementId
329
+ }) : null;
330
+ try {
331
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
332
+ if (!activeChangesetId) {
333
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
334
+ return;
335
+ }
336
+ const changeset = await manager.load(activeChangesetId);
337
+ if (changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && span.setAttribute("discard.changeCount", changeset.changes.length), elementId) {
338
+ const initialCount = changeset.changes.length;
339
+ await manager.unstage(activeChangesetId, elementId);
340
+ const updated = await manager.load(activeChangesetId);
341
+ if (updated && updated.changes.length === initialCount) {
342
+ console.error(ansis.yellow(`Warning: Element '${elementId}' not found in staged changes`)), isTelemetryEnabled && span && (span.setAttribute("discard.found", !1), span.setStatus({ code: 0 })), endSpan(span);
343
+ return;
344
+ }
345
+ isTelemetryEnabled && span && span.setAttribute("discard.found", !0), console.log(ansis.green(`\u2713 Discarded changes for element: ${ansis.bold(elementId)}`));
346
+ } else {
347
+ const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
348
+ if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
349
+ const confirmed = await prompts.confirm({
350
+ message: `Discard all ${changeset.changes.length} staged changes? This cannot be undone.`
351
+ });
352
+ if (!confirmed || typeof confirmed != "boolean") {
353
+ console.log(ansis.dim("Cancelled")), isTelemetryEnabled && span && (span.setAttribute("discard.cancelled", !0), span.setStatus({ code: 0 })), endSpan(span);
354
+ return;
355
+ }
356
+ } else
357
+ console.error(ansis.red("Error: Cannot confirm discard of all changes in non-interactive environment")), console.log(ansis.dim(" Specify an element ID to discard only that element")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Interactive confirmation required" }), endSpan(span), process.exit(1);
358
+ await manager.discard(activeChangesetId), console.log(ansis.green("\u2713 Discarded all staged changes")), console.log(ansis.dim(" Changeset status: discarded"));
359
+ }
360
+ isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
361
+ } catch (error) {
362
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
363
+ code: 2,
364
+ message: getErrorMessage(error)
365
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
366
+ } finally {
367
+ endSpan(span);
368
+ }
369
+ }
370
+ async function changesetPreviewCommand(options) {
371
+ const span = isTelemetryEnabled ? startSpan("changeset.preview", {
372
+ "preview.layer": options.layer
373
+ }) : null;
374
+ try {
375
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
376
+ if (!activeChangesetId) {
377
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
378
+ return;
379
+ }
380
+ const changeset = await manager.load(activeChangesetId);
381
+ changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), console.log(ansis.bold(`
382
+ Preview: Merged Model State (${ansis.cyan("with staged changes")})`)), console.log(ansis.dim(`Changeset: ${changeset.name}`)), console.log();
383
+ const additions = changeset.getChangesByType("add").length, modifications = changeset.getChangesByType("update").length, deletions = changeset.getChangesByType("delete").length;
384
+ if (isTelemetryEnabled && span && (span.setAttribute("preview.additions", additions), span.setAttribute("preview.modifications", modifications), span.setAttribute("preview.deletions", deletions), span.setAttribute("preview.totalChanges", changeset.changes.length)), additions > 0 && console.log(ansis.green(`+ ${additions} additions`)), modifications > 0 && console.log(ansis.yellow(`~ ${modifications} modifications`)), deletions > 0 && console.log(ansis.red(`- ${deletions} deletions`)), console.log(), options.layer) {
385
+ const layerChanges = changeset.changes.filter((c) => c.layerName === options.layer);
386
+ if (layerChanges.length === 0) {
387
+ console.log(ansis.dim(`No staged changes in layer '${options.layer}'`));
388
+ return;
389
+ }
390
+ console.log(ansis.bold(`Layer: ${options.layer}`));
391
+ const tableData = layerChanges.map((c) => ({
392
+ "Element ID": c.elementId + ansis.dim(" (staged)"),
393
+ Type: c.type,
394
+ Status: c.type === "add" ? "new" : c.type === "delete" ? "removed" : "updated"
395
+ }));
396
+ console.table(tableData);
397
+ } else {
398
+ const layerMap = /* @__PURE__ */ new Map();
399
+ changeset.changes.forEach((c) => {
400
+ const existing = layerMap.get(c.layerName) ?? [];
401
+ existing.push(c), layerMap.set(c.layerName, existing);
402
+ }), isTelemetryEnabled && span && span.setAttribute("preview.layerCount", layerMap.size);
403
+ for (const [layerName, changes] of layerMap) {
404
+ console.log(ansis.bold(`Layer: ${layerName}`));
405
+ const tableData = changes.map((c) => ({
406
+ "Element ID": c.elementId,
407
+ Type: c.type,
408
+ Status: c.type === "add" ? "new" : c.type === "delete" ? "removed" : "updated"
409
+ }));
410
+ console.table(tableData), console.log();
411
+ }
412
+ }
413
+ isTelemetryEnabled && span && span.setStatus({ code: 0 });
414
+ } catch (error) {
415
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
416
+ code: 2,
417
+ message: getErrorMessage(error)
418
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
419
+ } finally {
420
+ endSpan(span);
421
+ }
422
+ }
423
+ async function changesetDiffCommand(options) {
424
+ const span = isTelemetryEnabled ? startSpan("changeset.diff", {
425
+ "diff.layer": options.layer
426
+ }) : null;
427
+ try {
428
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
429
+ if (!activeChangesetId) {
430
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
431
+ return;
432
+ }
433
+ const changeset = await manager.load(activeChangesetId);
434
+ changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), console.log(ansis.bold(`
435
+ Diff: Base Model vs Staged Changes
436
+ `));
437
+ const layerMap = /* @__PURE__ */ new Map();
438
+ if (changeset.changes.forEach((c) => {
439
+ if (!options.layer || c.layerName === options.layer) {
440
+ const existing = layerMap.get(c.layerName) ?? [];
441
+ existing.push(c), layerMap.set(c.layerName, existing);
442
+ }
443
+ }), isTelemetryEnabled && span && (span.setAttribute("diff.layerCount", layerMap.size), span.setAttribute("diff.totalChanges", changeset.changes.length)), layerMap.size === 0) {
444
+ console.log(ansis.dim(options.layer ? `No changes in layer '${options.layer}'` : "No staged changes")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
445
+ return;
446
+ }
447
+ for (const [layerName, changes] of layerMap) {
448
+ console.log(ansis.bold(`Layer: ${layerName}`));
449
+ for (const change of changes)
450
+ change.type === "add" ? (console.log(ansis.green(`+ ${change.elementId}`)), console.log(ansis.dim(` ${JSON.stringify(change.after || {}, null, 2)}`))) : change.type === "delete" ? (console.log(ansis.red(`- ${change.elementId}`)), console.log(ansis.dim(` ${JSON.stringify(change.before || {}, null, 2)}`))) : change.type === "update" && (console.log(ansis.yellow(`~ ${change.elementId}`)), console.log(ansis.dim(` Before: ${JSON.stringify(change.before || {})}`)), console.log(ansis.dim(` After: ${JSON.stringify(change.after || {})}`)));
451
+ console.log();
452
+ }
453
+ isTelemetryEnabled && span && span.setStatus({ code: 0 });
454
+ } catch (error) {
455
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
456
+ code: 2,
457
+ message: getErrorMessage(error)
458
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
459
+ } finally {
460
+ endSpan(span);
461
+ }
462
+ }
463
+ async function changesetCommitCommand(options) {
464
+ await startActiveSpan("changeset.commit", async (span) => {
465
+ try {
466
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), stagingManager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await stagingManager.getActiveId();
467
+ if (!activeChangesetId) {
468
+ console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span.setStatus({ code: 2, message: "No active changeset" });
469
+ return;
470
+ }
471
+ const changeset = await stagingManager.load(activeChangesetId);
472
+ changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span.setStatus({ code: 2, message: "Changeset not found" }), span.end(), process.exit(1));
473
+ const changeCount = changeset.changes.length;
474
+ if (isTelemetryEnabled && (span.setAttribute("changeset.id", activeChangesetId), span.setAttribute("changeset.name", changeset.name), span.setAttribute("changeset.changeCount", changeCount)), changeCount === 0) {
475
+ console.log(ansis.yellow("No staged changes to commit")), isTelemetryEnabled && span.setStatus({ code: 0 });
476
+ return;
477
+ }
478
+ console.log(ansis.bold(`
479
+ Committing changeset: ${ansis.cyan(changeset.name)}`)), console.log(ansis.dim(`Staged changes: ${changeCount}`)), console.log();
480
+ try {
481
+ const result = await stagingManager.commit(model, activeChangesetId, {
482
+ validate: options?.validate !== !1,
483
+ force: options?.force === !0
484
+ });
485
+ if (await stagingManager.clearActive(), console.log(ansis.green(`\u2713 Committed ${result.committed} change(s)`)), (result.skipped ?? 0) > 0) {
486
+ const skipped = result.skipped, details = result.skippedDetails ?? [];
487
+ console.log(ansis.yellow(`\u26A0 Skipped ${skipped} duplicate element(s):`));
488
+ const shown = details.slice(0, 10);
489
+ for (const detail of shown)
490
+ console.log(ansis.dim(` ${detail}`));
491
+ details.length > 10 && console.log(ansis.dim(` ... and ${details.length - 10} more`));
492
+ }
493
+ isTelemetryEnabled && (span.setAttribute("commit.committed", result.committed), span.setAttribute("commit.skipped", result.skipped), span.setAttribute("commit.failed", result.failed), span.setAttribute("commit.validationPassed", result.validation.passed));
494
+ const accountedFor = result.committed + (result.skipped ?? 0) + result.failed;
495
+ if (accountedFor < changeCount) {
496
+ const unaccounted = changeCount - accountedFor;
497
+ console.log(ansis.yellow(`\u26A0 Warning: ${unaccounted} staged change(s) were not applied, skipped, or reported as failed. This is unexpected \u2014 check the changeset log for details.`));
498
+ }
499
+ result.driftWarning && (console.log(ansis.yellow("\u26A0 Warning: Model had drifted since changeset creation (--force was used)")), isTelemetryEnabled && span.setAttribute("commit.driftDetected", !0)), isTelemetryEnabled && span.setStatus({ code: 0 }), console.log();
500
+ } catch (error) {
501
+ throw console.log(ansis.red(`\u2717 Commit failed and rolled back: ${getErrorMessage(error)}`)), isTelemetryEnabled && span.setAttribute("commit.rolledBack", !0), error;
502
+ }
503
+ } catch (error) {
504
+ isTelemetryEnabled && (span.recordException(error), span.setStatus({
505
+ code: 2,
506
+ message: getErrorMessage(error)
507
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), span.end(), process.exit(1);
508
+ }
509
+ }, {
510
+ "commit.validate": options?.validate !== !1,
511
+ "commit.force": options?.force === !0
512
+ });
513
+ }
514
+ async function changesetExportCommand(changesetId, options) {
515
+ const format = options.format || "yaml", span = isTelemetryEnabled ? startSpan("changeset.export", {
516
+ "changeset.id": changesetId,
517
+ "export.format": format
518
+ }) : null;
519
+ try {
520
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), exporter = new ChangesetExporter(model.rootPath), ext = format === "patch" ? "patch" : format, outputPath = options.output || `${changesetId}.${ext}`, absolutePath = path.isAbsolute(outputPath) ? outputPath : path.join(process.cwd(), outputPath);
521
+ isTelemetryEnabled && span && span.setAttribute("export.outputPath", outputPath), await exporter.exportToFile(changesetId, absolutePath, format), console.log(ansis.green(`\u2713 Exported changeset to ${ansis.cyan(outputPath)}`)), console.log(ansis.dim(` Format: ${format}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
522
+ } catch (error) {
523
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
524
+ code: 2,
525
+ message: getErrorMessage(error)
526
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
527
+ } finally {
528
+ endSpan(span);
529
+ }
530
+ }
531
+ async function changesetImportCommand(file, options = {}) {
532
+ const span = isTelemetryEnabled ? startSpan("changeset.import", {
533
+ "import.file": file,
534
+ "import.force": options.force === !0
535
+ }) : null;
536
+ try {
537
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), exporter = new ChangesetExporter(model.rootPath), absolutePath = path.isAbsolute(file) ? file : path.join(process.cwd(), file), imported = await exporter.importFromFile(absolutePath);
538
+ isTelemetryEnabled && span && (span.setAttribute("changeset.name", imported.name), span.setAttribute("changeset.changeCount", imported.changes.length));
539
+ const compatibility = await exporter.validateCompatibility(imported, model);
540
+ if (isTelemetryEnabled && span && (span.setAttribute("import.compatible", compatibility.compatible), span.setAttribute("import.baseSnapshotMatch", compatibility.baseSnapshotMatch)), !compatibility.compatible) {
541
+ console.error(ansis.red("\u2717 Import failed: Changeset is incompatible")), console.error(ansis.dim(" Issues:"));
542
+ for (const warning of compatibility.warnings)
543
+ console.error(ansis.dim(` - ${warning}`));
544
+ isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset incompatible" }), endSpan(span), process.exit(1);
126
545
  }
546
+ compatibility.baseSnapshotMatch || (options.force || (console.error(ansis.red("Error: Imported changeset has base model drift") + `
547
+ ` + ansis.dim("The model has been modified since this changeset was created.") + `
548
+ ` + ansis.dim("This may cause conflicts or unexpected behavior when committing.") + `
549
+
550
+ ` + ansis.dim("To import anyway, use: --force")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Drift detected, force required" }), endSpan(span), process.exit(1)), console.warn(ansis.yellow("\u26A0 Warning: Base model drift detected (--force used)") + `
551
+ ` + ansis.dim("Review changes carefully before committing.")), console.log(), isTelemetryEnabled && span && span.setAttribute("import.driftOverridden", !0));
552
+ const newId = generateImportedChangesetId();
553
+ imported.id = newId, await new StagedChangesetStorage(model.rootPath).save(imported), console.log(ansis.green(`\u2713 Imported changeset: ${ansis.cyan(imported.name)}`)), console.log(ansis.dim(` ID: ${newId}`)), console.log(ansis.dim(` Changes: +${imported.stats?.additions || 0} ~${imported.stats?.modifications || 0} -${imported.stats?.deletions || 0}`)), compatibility.baseSnapshotMatch || console.log(ansis.yellow(" \u26A0 Base model drift detected - review before committing")), isTelemetryEnabled && span && (span.setAttribute("changeset.id", newId), span.setStatus({ code: 0 })), console.log();
127
554
  } catch (error) {
128
- console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
555
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
556
+ code: 2,
557
+ message: getErrorMessage(error)
558
+ })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
559
+ } finally {
560
+ endSpan(span);
129
561
  }
130
562
  }
131
563
  function changesetCommands(program) {
@@ -139,10 +571,12 @@ Examples:
139
571
  Examples:
140
572
  $ dr changeset list`).action(async () => {
141
573
  await changesetListCommand();
142
- }), changesetGroup.command("apply <name>").description("Apply a changeset to the model").addHelpText("after", `
574
+ }), changesetGroup.command("apply <name>").description("Apply a changeset to the model").option("--no-validate", "Skip validation before applying").option("--force", "Force apply even if base model has drifted").addHelpText("after", `
143
575
  Examples:
144
- $ dr changeset apply "v1.1 migration"`).action(async (name) => {
145
- await changesetApplyCommand(name);
576
+ $ dr changeset apply "v1.1 migration"
577
+ $ dr changeset apply "v1.1 migration" --no-validate
578
+ $ dr changeset apply "v1.1 migration" --force`).action(async (name, options) => {
579
+ await changesetApplyCommand(name, options);
146
580
  }), changesetGroup.command("revert <name>").description("Revert a changeset from the model").addHelpText("after", `
147
581
  Examples:
148
582
  $ dr changeset revert "v1.1 migration"`).action(async (name) => {
@@ -159,16 +593,93 @@ Examples:
159
593
  Examples:
160
594
  $ dr changeset status`).action(async () => {
161
595
  await changesetStatusCommand();
162
- });
596
+ }), changesetGroup.command("show [name]").description("Show changeset details (use: status, staged, diff, or preview)").addHelpText("after", `
597
+ To inspect a changeset, use one of:
598
+ $ dr changeset status # Show the active changeset
599
+ $ dr changeset staged # List all staged changes
600
+ $ dr changeset diff [name] # Show a diff of staged changes
601
+ $ dr changeset preview [name] # Preview what will be committed`).action(async (name) => {
602
+ const nameHint = name ? ` '${name}'` : "";
603
+ console.error(`error: 'dr changeset show${nameHint}' is not a valid subcommand.
604
+
605
+ To inspect a changeset, use one of:
606
+ dr changeset status \u2014 show the active changeset
607
+ dr changeset staged \u2014 list all staged changes
608
+ dr changeset diff \u2014 show a diff of staged changes
609
+ dr changeset preview \u2014 preview what will be committed`), process.exit(1);
610
+ }), changesetGroup.command("delete <name>").description("Delete a changeset permanently").option("-f, --force", "Skip confirmation prompt").addHelpText("after", `
611
+ Examples:
612
+ $ dr changeset delete my-feature
613
+ $ dr changeset delete my-feature --force`).action(async (name, options) => {
614
+ await changesetDeleteCommand(name, options);
615
+ }), changesetGroup.command("staged").description("List all staged changes in the active changeset").option("-l, --layer <layer>", "Filter by layer name").addHelpText("after", `
616
+ Examples:
617
+ $ dr changeset staged
618
+ $ dr changeset staged --layer api`).action(async (options) => {
619
+ await changesetStagedCommand(options);
620
+ }), changesetGroup.command("stage <element-id>").description("Stage a specific element into the active changeset").addHelpText("after", `
621
+ Examples:
622
+ $ dr changeset stage api.operation.get-users
623
+ $ dr changeset stage ux.uicomponent.login-form`).action(async (elementId) => {
624
+ await changesetExplicitStageCommand(elementId);
625
+ }), changesetGroup.command("unstage <element-id>").description("Remove specific element from staging area").addHelpText("after", `
626
+ Examples:
627
+ $ dr changeset unstage api-endpoint-create-customer`).action(async (elementId) => {
628
+ await changesetUnstageCommand(elementId);
629
+ }), changesetGroup.command("discard [element-id]").description("Discard all or single staged changes").addHelpText("after", `
630
+ Examples:
631
+ $ dr changeset discard
632
+ $ dr changeset discard api-endpoint-create-customer`).action(async (elementId) => {
633
+ await changesetDiscardCommand(elementId);
634
+ }), changesetGroup.command("preview").description("Preview the merged model state with staged changes applied").option("-l, --layer <layer>", "Preview specific layer only").addHelpText("after", `
635
+ Examples:
636
+ $ dr changeset preview
637
+ $ dr changeset preview --layer application`).action(async (options) => {
638
+ await changesetPreviewCommand(options);
639
+ }), changesetGroup.command("diff").description("Show delta between base model and staged changes").option("-l, --layer <layer>", "Show diff for specific layer only").addHelpText("after", `
640
+ Examples:
641
+ $ dr changeset diff
642
+ $ dr changeset diff --layer api`).action(async (options) => {
643
+ await changesetDiffCommand(options);
644
+ }), changesetGroup.command("commit").description("Apply staged changes to the base model").option("--validate", "Run validation before commit (default: true)", !0).option("--force", "Commit despite drift warnings", !1).addHelpText("after", `
645
+ Examples:
646
+ $ dr changeset commit
647
+ $ dr changeset commit --validate
648
+ $ dr changeset commit --force`).action(async (options) => {
649
+ await changesetCommitCommand(options);
650
+ }), changesetGroup.command("export <changeset-id>").description("Export changeset to portable file").option("-o, --output <file>", "Output file path").option("-f, --format <format>", "Export format (yaml|json|patch)", "yaml").addHelpText("after", `
651
+ Examples:
652
+ $ dr changeset export api-updates
653
+ $ dr changeset export api-updates --output changes.yaml
654
+ $ dr changeset export api-updates --format json --output changes.json
655
+ $ dr changeset export api-updates --format patch --output changes.patch`).action(async (changesetId, options) => {
656
+ await changesetExportCommand(changesetId, options);
657
+ }), changesetGroup.command("import <file>").description("Import changeset from file").option("-f, --force", "Import despite base model drift", !1).addHelpText("after", `
658
+ Examples:
659
+ $ dr changeset import changes.yaml
660
+ $ dr changeset import ../team-changes.json
661
+ $ dr changeset import changes.yaml --force`).action(async (file, options) => {
662
+ await changesetImportCommand(file, options);
663
+ }), changesetGroup.showSuggestionAfterError();
163
664
  }
164
665
  export {
165
666
  changesetActivateCommand,
166
667
  changesetApplyCommand,
167
668
  changesetCommands,
669
+ changesetCommitCommand,
168
670
  changesetCreateCommand,
169
671
  changesetDeactivateCommand,
672
+ changesetDeleteCommand,
673
+ changesetDiffCommand,
674
+ changesetDiscardCommand,
675
+ changesetExplicitStageCommand,
676
+ changesetExportCommand,
677
+ changesetImportCommand,
170
678
  changesetListCommand,
679
+ changesetPreviewCommand,
171
680
  changesetRevertCommand,
172
- changesetStatusCommand
681
+ changesetStagedCommand,
682
+ changesetStatusCommand,
683
+ changesetUnstageCommand
173
684
  };
174
685
  //# sourceMappingURL=changeset.js.map