@documentation-robotics/cli 0.1.0 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +206 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +155 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +37 -13
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -0,0 +1,51 @@
1
+ import ansis from "ansis";
2
+ import { Model } from "../core/model.js";
3
+ import { ImportManager } from "../import/index.js";
4
+ import { readFile } from "../utils/file-io.js";
5
+ import * as path from "path";
6
+ import { startSpan, endSpan } from "../telemetry/index.js";
7
+ import { getErrorMessage } from "../utils/errors.js";
8
+ const isTelemetryEnabled = !1;
9
+ async function importCommand(options) {
10
+ const span = isTelemetryEnabled ? startSpan("import.execute", {
11
+ "import.format": options.format,
12
+ "import.merge_strategy": options.mergeStrategy || "add"
13
+ }) : null;
14
+ try {
15
+ options.input || (console.error(ansis.red("Error: --input path is required")), process.exit(1)), options.format || (console.error(ansis.red("Error: --format is required (archimate, openapi)")), process.exit(1));
16
+ const supportedFormats = ["archimate", "openapi"], normalizedFormat = options.format.toLowerCase();
17
+ supportedFormats.includes(normalizedFormat) || (console.error(ansis.red(`Error: Unsupported import format "${options.format}"`)), console.error(` Supported formats: ${supportedFormats.join(", ")}`), process.exit(1));
18
+ const inputPath = path.resolve(options.input);
19
+ let fileContent;
20
+ try {
21
+ fileContent = await readFile(inputPath);
22
+ } catch (error) {
23
+ console.error(ansis.red(`Error: Could not read input file: ${inputPath}`)), isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: `File read error: ${String(error)}` })), process.exit(1);
24
+ }
25
+ const model = await Model.load(options.model), manager = new ImportManager();
26
+ console.log(`Importing from ${ansis.blue(options.format)} format...`);
27
+ const result = await manager.import(normalizedFormat, fileContent, model, {
28
+ mergeStrategy: options.mergeStrategy || "add",
29
+ validateSchema: !0
30
+ });
31
+ if (!result.success) {
32
+ console.error(ansis.red(`
33
+ Import failed with ${result.errorsCount} error(s):`));
34
+ for (const error of result.errors) {
35
+ const element = error.element ? ` (${error.element})` : "";
36
+ console.error(` - ${error.message}${element}`);
37
+ }
38
+ process.exit(1);
39
+ }
40
+ console.log(ansis.green(`
41
+ \u2713 Import successful!`)), console.log(` Nodes added: ${ansis.cyan(String(result.nodesAdded))}`), console.log(` Edges added: ${ansis.cyan(String(result.edgesAdded))}`), result.errorsCount > 0 && console.log(ansis.yellow(` Warnings: ${result.errorsCount}`)), isTelemetryEnabled && span && (span.setAttribute("import.success", !0), span.setAttribute("import.nodesAdded", result.nodesAdded), span.setAttribute("import.edgesAdded", result.edgesAdded), span.setAttribute("import.errors", result.errorsCount), span.setStatus({ code: 0 }));
42
+ } catch (error) {
43
+ console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: String(error) })), process.exit(1);
44
+ } finally {
45
+ endSpan(span);
46
+ }
47
+ }
48
+ export {
49
+ importCommand
50
+ };
51
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/import.ts"],
4
+ "sourcesContent": ["/**\n * Import architecture model from various formats\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { ImportManager } from \"../import/index.js\";\nimport { readFile } from \"../utils/file-io.js\";\nimport * as path from \"path\";\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 ImportOptions {\n format: string;\n input: string;\n model?: string;\n mergeStrategy?: \"add\" | \"update\" | \"skip\";\n}\n\nexport async function importCommand(options: ImportOptions): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"import.execute\", {\n \"import.format\": options.format,\n \"import.merge_strategy\": options.mergeStrategy || \"add\",\n })\n : null;\n\n try {\n // Validate required options\n if (!options.input) {\n console.error(ansis.red(\"Error: --input path is required\"));\n process.exit(1);\n }\n\n if (!options.format) {\n console.error(ansis.red(\"Error: --format is required (archimate, openapi)\"));\n process.exit(1);\n }\n\n // Validate format BEFORE attempting any I/O operations\n const supportedFormats = [\"archimate\", \"openapi\"];\n const normalizedFormat = options.format.toLowerCase();\n if (!supportedFormats.includes(normalizedFormat)) {\n console.error(ansis.red(`Error: Unsupported import format \"${options.format}\"`));\n console.error(` Supported formats: ${supportedFormats.join(\", \")}`);\n process.exit(1);\n }\n\n // Check if input file exists\n const inputPath = path.resolve(options.input);\n let fileContent: string;\n try {\n fileContent = await readFile(inputPath);\n } catch (error) {\n console.error(ansis.red(`Error: Could not read input file: ${inputPath}`));\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: `File read error: ${String(error)}` });\n }\n process.exit(1);\n }\n\n // Load model\n const model = await Model.load(options.model);\n\n // Initialize ImportManager\n const manager = new ImportManager();\n\n // Perform import\n console.log(`Importing from ${ansis.blue(options.format)} format...`);\n\n const result = await manager.import(normalizedFormat, fileContent, model, {\n mergeStrategy: options.mergeStrategy || \"add\",\n validateSchema: true,\n });\n\n if (!result.success) {\n console.error(ansis.red(`\\nImport failed with ${result.errorsCount} error(s):`));\n for (const error of result.errors) {\n const element = error.element ? ` (${error.element})` : \"\";\n console.error(` - ${error.message}${element}`);\n }\n process.exit(1);\n }\n\n // Report success\n console.log(ansis.green(`\\n\u2713 Import successful!`));\n console.log(` Nodes added: ${ansis.cyan(String(result.nodesAdded))}`);\n console.log(` Edges added: ${ansis.cyan(String(result.edgesAdded))}`);\n\n if (result.errorsCount > 0) {\n console.log(ansis.yellow(` Warnings: ${result.errorsCount}`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"import.success\", true);\n (span as any).setAttribute(\"import.nodesAdded\", result.nodesAdded);\n (span as any).setAttribute(\"import.edgesAdded\", result.edgesAdded);\n (span as any).setAttribute(\"import.errors\", result.errorsCount);\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: String(error) });\n }\n\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n"],
5
+ "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,YAAY,UAAU;AACtB,SAAS,WAAW,eAAe;AACnC,SAAS,uBAAuB;AAGhC,MAAM,qBAAgE;AAStE,eAAsB,cAAc,SAAsB;AACxD,QAAM,OAAO,qBACT,UAAU,kBAAkB;IAC1B,iBAAiB,QAAQ;IACzB,yBAAyB,QAAQ,iBAAiB;GACnD,IACD;AAEJ,MAAI;AAEF,IAAK,QAAQ,UACX,QAAQ,MAAM,MAAM,IAAI,iCAAiC,CAAC,GAC1D,QAAQ,KAAK,CAAC,IAGX,QAAQ,WACX,QAAQ,MAAM,MAAM,IAAI,kDAAkD,CAAC,GAC3E,QAAQ,KAAK,CAAC;AAIhB,UAAM,mBAAmB,CAAC,aAAa,SAAS,GAC1C,mBAAmB,QAAQ,OAAO,YAAW;AACnD,IAAK,iBAAiB,SAAS,gBAAgB,MAC7C,QAAQ,MAAM,MAAM,IAAI,qCAAqC,QAAQ,MAAM,GAAG,CAAC,GAC/E,QAAQ,MAAM,wBAAwB,iBAAiB,KAAK,IAAI,CAAC,EAAE,GACnE,QAAQ,KAAK,CAAC;AAIhB,UAAM,YAAY,KAAK,QAAQ,QAAQ,KAAK;AAC5C,QAAI;AACJ,QAAI;AACF,oBAAc,MAAM,SAAS,SAAS;IACxC,SAAS,OAAO;AACd,cAAQ,MAAM,MAAM,IAAI,qCAAqC,SAAS,EAAE,CAAC,GACrE,sBAAsB,SACvB,KAAa,gBAAgB,KAAc,GAC3C,KAAa,UAAU,EAAE,MAAM,GAAG,SAAS,oBAAoB,OAAO,KAAK,CAAC,GAAE,CAAE,IAEnF,QAAQ,KAAK,CAAC;IAChB;AAGA,UAAM,QAAQ,MAAM,MAAM,KAAK,QAAQ,KAAK,GAGtC,UAAU,IAAI,cAAa;AAGjC,YAAQ,IAAI,kBAAkB,MAAM,KAAK,QAAQ,MAAM,CAAC,YAAY;AAEpE,UAAM,SAAS,MAAM,QAAQ,OAAO,kBAAkB,aAAa,OAAO;MACxE,eAAe,QAAQ,iBAAiB;MACxC,gBAAgB;KACjB;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,cAAQ,MAAM,MAAM,IAAI;qBAAwB,OAAO,WAAW,YAAY,CAAC;AAC/E,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,UAAU,MAAM,UAAU,KAAK,MAAM,OAAO,MAAM;AACxD,gBAAQ,MAAM,OAAO,MAAM,OAAO,GAAG,OAAO,EAAE;MAChD;AACA,cAAQ,KAAK,CAAC;IAChB;AAGA,YAAQ,IAAI,MAAM,MAAM;0BAAwB,CAAC,GACjD,QAAQ,IAAI,kBAAkB,MAAM,KAAK,OAAO,OAAO,UAAU,CAAC,CAAC,EAAE,GACrE,QAAQ,IAAI,kBAAkB,MAAM,KAAK,OAAO,OAAO,UAAU,CAAC,CAAC,EAAE,GAEjE,OAAO,cAAc,KACvB,QAAQ,IAAI,MAAM,OAAO,eAAe,OAAO,WAAW,EAAE,CAAC,GAG3D,sBAAsB,SACvB,KAAa,aAAa,kBAAkB,EAAI,GAChD,KAAa,aAAa,qBAAqB,OAAO,UAAU,GAChE,KAAa,aAAa,qBAAqB,OAAO,UAAU,GAChE,KAAa,aAAa,iBAAiB,OAAO,WAAW,GAC7D,KAAa,UAAU,EAAE,MAAM,EAAC,CAAE;EAEvC,SAAS,OAAO;AACd,YAAQ,MAAM,MAAM,IAAI,UAAU,gBAAgB,KAAK,CAAC,EAAE,CAAC,GAEvD,sBAAsB,SACvB,KAAa,gBAAgB,KAAc,GAC3C,KAAa,UAAU,EAAE,MAAM,GAAG,SAAS,OAAO,KAAK,EAAC,CAAE,IAG7D,QAAQ,KAAK,CAAC;EAChB;AACE,YAAQ,IAAI;EACd;AACF;",
6
+ "names": []
7
+ }
@@ -1,36 +1,42 @@
1
1
  import ansis from "ansis";
2
2
  import { Model } from "../core/model.js";
3
+ import { getActiveSpan } from "../telemetry/index.js";
4
+ import { getErrorMessage } from "../utils/errors.js";
5
+ import { TABLE_COLUMN_WIDTHS, TABLE_SEPARATOR } from "../utils/table-formatting.js";
3
6
  async function infoCommand(options) {
7
+ const span = getActiveSpan();
4
8
  try {
5
- const model = await Model.load(), manifest = model.manifest;
6
- console.log(""), console.log(ansis.bold(`${ansis.blue("Model:")} ${manifest.name}`)), console.log(ansis.dim("\u2500".repeat(80))), console.log(`${ansis.gray("Name:")} ${manifest.name}`), console.log(`${ansis.gray("Version:")} ${manifest.version}`), console.log(`${ansis.gray("Spec Version:")} ${manifest.specVersion}`), manifest.description && console.log(`${ansis.gray("Description:")} ${manifest.description}`), manifest.author && console.log(`${ansis.gray("Author:")} ${manifest.author}`), console.log(`${ansis.gray("Created:")} ${manifest.created}`), console.log(`${ansis.gray("Modified:")} ${manifest.modified}`);
9
+ const model = await Model.load(void 0, options.layer ? { layers: [options.layer] } : {}), manifest = model.manifest;
10
+ span && (span.setAttribute("model.name", manifest.name), span.setAttribute("model.version", manifest.version), span.setAttribute("model.specVersion", manifest.specVersion)), console.log(""), console.log(ansis.bold(`${ansis.blue("Model:")} ${manifest.name}`)), console.log(ansis.dim(TABLE_SEPARATOR)), console.log(`${ansis.gray("Name:")} ${manifest.name}`), console.log(`${ansis.gray("Version:")} ${manifest.version}`), console.log(`${ansis.gray("Spec Version:")} ${manifest.specVersion}`), manifest.description && console.log(`${ansis.gray("Description:")} ${manifest.description}`), manifest.author && console.log(`${ansis.gray("Author:")} ${manifest.author}`), console.log(`${ansis.gray("Created:")} ${manifest.created}`), console.log(`${ansis.gray("Modified:")} ${manifest.modified}`);
7
11
  const layerNames = model.getLayerNames();
8
- if (layerNames.length > 0)
9
- if (console.log(""), console.log(ansis.bold("Layers:")), console.log(ansis.dim("\u2500".repeat(80))), options.layer) {
10
- const layer = await model.getLayer(options.layer);
11
- layer || (console.error(ansis.red(`Error: Layer ${options.layer} not found`)), process.exit(1));
12
- const elements = layer.listElements();
13
- if (console.log(`${ansis.cyan(options.layer)}`), console.log(` ${ansis.gray("Elements:")} ${elements.length}`), options.verbose && elements.length > 0) {
14
- console.log(` ${ansis.gray("Details:")}`);
15
- const types = new Set(elements.map((e) => e.type));
16
- for (const type of types) {
17
- const count = elements.filter((e) => e.type === type).length;
18
- console.log(` - ${type}: ${count}`);
19
- }
12
+ if (span && span.setAttribute("info.layerCount", layerNames.length), options.layer) {
13
+ console.log(""), console.log(ansis.bold("Layers:")), console.log(ansis.dim(TABLE_SEPARATOR));
14
+ const layer = await model.getLayer(options.layer);
15
+ layer || (console.error(ansis.red(`Error: Layer ${options.layer} not found`)), process.exit(1));
16
+ const elements = layer.listElements();
17
+ if (console.log(`${ansis.cyan(options.layer)}`), console.log(` ${ansis.gray("Elements:")} ${elements.length}`), span && span.setAttribute("info.elementCount", elements.length), options.verbose && elements.length > 0) {
18
+ console.log(` ${ansis.gray("Details:")}`);
19
+ const types = new Set(elements.map((e) => e.type));
20
+ for (const type of types) {
21
+ const count = elements.filter((e) => e.type === type).length;
22
+ console.log(` - ${type}: ${count}`);
20
23
  }
21
- } else
22
- for (const layerName of layerNames) {
23
- const layer = await model.getLayer(layerName);
24
- if (!layer)
25
- continue;
26
- const count = layer.listElements().length, paddedName = layerName.padEnd(20), paddedCount = String(count).padEnd(10);
27
- console.log(`${ansis.cyan(paddedName)} ${paddedCount} elements`);
28
- }
29
- else
24
+ }
25
+ } else if (layerNames.length > 0) {
26
+ console.log(""), console.log(ansis.bold("Layers:")), console.log(ansis.dim(TABLE_SEPARATOR));
27
+ const idWidth = TABLE_COLUMN_WIDTHS.INFO_ID_WIDTH, countWidth = TABLE_COLUMN_WIDTHS.INFO_COUNT_WIDTH;
28
+ for (const layerName of layerNames) {
29
+ const layer = await model.getLayer(layerName);
30
+ if (!layer)
31
+ continue;
32
+ const count = layer.listElements().length, paddedName = layerName.padEnd(idWidth), paddedCount = String(count).padEnd(countWidth);
33
+ console.log(`${ansis.cyan(paddedName)} ${paddedCount} elements`);
34
+ }
35
+ } else
30
36
  console.log(""), console.log(ansis.yellow("No layers found"));
31
37
  console.log("");
32
38
  } catch (error) {
33
- const message = error instanceof Error ? error.message : String(error);
39
+ const message = getErrorMessage(error);
34
40
  console.error(ansis.red(`Error: ${message}`)), process.exit(1);
35
41
  }
36
42
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/info.ts"],
4
- "sourcesContent": ["/**\n * Show information about a model or layer\n */\n\nimport ansis from 'ansis';\nimport { Model } from '../core/model.js';\n\nexport interface InfoOptions {\n layer?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\nexport async function infoCommand(options: InfoOptions): Promise<void> {\n try {\n // Load model\n const model = await Model.load();\n const manifest = model.manifest;\n\n console.log('');\n console.log(ansis.bold(`${ansis.blue('Model:')} ${manifest.name}`));\n console.log(ansis.dim('\u2500'.repeat(80)));\n\n console.log(`${ansis.gray('Name:')} ${manifest.name}`);\n console.log(`${ansis.gray('Version:')} ${manifest.version}`);\n console.log(`${ansis.gray('Spec Version:')} ${manifest.specVersion}`);\n\n if (manifest.description) {\n console.log(`${ansis.gray('Description:')} ${manifest.description}`);\n }\n\n if (manifest.author) {\n console.log(`${ansis.gray('Author:')} ${manifest.author}`);\n }\n\n console.log(`${ansis.gray('Created:')} ${manifest.created}`);\n console.log(`${ansis.gray('Modified:')} ${manifest.modified}`);\n\n // Show layer information\n const layerNames = model.getLayerNames();\n if (layerNames.length > 0) {\n console.log('');\n console.log(ansis.bold('Layers:'));\n console.log(ansis.dim('\u2500'.repeat(80)));\n\n if (options.layer) {\n // Show specific layer info\n const layer = await model.getLayer(options.layer);\n if (!layer) {\n console.error(ansis.red(`Error: Layer ${options.layer} not found`));\n process.exit(1);\n }\n\n const elements = layer.listElements();\n console.log(`${ansis.cyan(options.layer)}`);\n console.log(` ${ansis.gray('Elements:')} ${elements.length}`);\n\n if (options.verbose && elements.length > 0) {\n console.log(` ${ansis.gray('Details:')}`);\n const types = new Set(elements.map((e) => e.type));\n for (const type of types) {\n const count = elements.filter((e) => e.type === type).length;\n console.log(` - ${type}: ${count}`);\n }\n }\n } else {\n // Show all layers summary\n const idWidth = 20;\n const countWidth = 10;\n\n for (const layerName of layerNames) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n const count = layer.listElements().length;\n const paddedName = layerName.padEnd(idWidth);\n const paddedCount = String(count).padEnd(countWidth);\n\n console.log(`${ansis.cyan(paddedName)} ${paddedCount} elements`);\n }\n }\n } else {\n console.log('');\n console.log(ansis.yellow('No layers found'));\n }\n\n console.log('');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n process.exit(1);\n }\n}\n"],
5
- "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,aAAa;AAQtB,eAAsB,YAAY,SAAoB;AACpD,MAAI;AAEF,UAAM,QAAQ,MAAM,MAAM,KAAI,GACxB,WAAW,MAAM;AAEvB,YAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC,GAClE,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC,GAErC,QAAQ,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,aAAa,SAAS,IAAI,EAAE,GAC9D,QAAQ,IAAI,GAAG,MAAM,KAAK,UAAU,CAAC,UAAU,SAAS,OAAO,EAAE,GACjE,QAAQ,IAAI,GAAG,MAAM,KAAK,eAAe,CAAC,KAAK,SAAS,WAAW,EAAE,GAEjE,SAAS,eACX,QAAQ,IAAI,GAAG,MAAM,KAAK,cAAc,CAAC,MAAM,SAAS,WAAW,EAAE,GAGnE,SAAS,UACX,QAAQ,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,WAAW,SAAS,MAAM,EAAE,GAGlE,QAAQ,IAAI,GAAG,MAAM,KAAK,UAAU,CAAC,UAAU,SAAS,OAAO,EAAE,GACjE,QAAQ,IAAI,GAAG,MAAM,KAAK,WAAW,CAAC,SAAS,SAAS,QAAQ,EAAE;AAGlE,UAAM,aAAa,MAAM,cAAa;AACtC,QAAI,WAAW,SAAS;AAKtB,UAJA,QAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC,GACjC,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC,GAEjC,QAAQ,OAAO;AAEjB,cAAM,QAAQ,MAAM,MAAM,SAAS,QAAQ,KAAK;AAChD,QAAK,UACH,QAAQ,MAAM,MAAM,IAAI,gBAAgB,QAAQ,KAAK,YAAY,CAAC,GAClE,QAAQ,KAAK,CAAC;AAGhB,cAAM,WAAW,MAAM,aAAY;AAInC,YAHA,QAAQ,IAAI,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,GAC1C,QAAQ,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,SAAS,MAAM,EAAE,GAEzD,QAAQ,WAAW,SAAS,SAAS,GAAG;AAC1C,kBAAQ,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,EAAE;AACzC,gBAAM,QAAQ,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,qBAAW,QAAQ,OAAO;AACxB,kBAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE;AACtD,oBAAQ,IAAI,SAAS,IAAI,KAAK,KAAK,EAAE;UACvC;QACF;MACF;AAKE,mBAAW,aAAa,YAAY;AAClC,gBAAM,QAAQ,MAAM,MAAM,SAAS,SAAS;AAC5C,cAAI,CAAC;AAAO;AAEZ,gBAAM,QAAQ,MAAM,aAAY,EAAG,QAC7B,aAAa,UAAU,OAAO,EAAO,GACrC,cAAc,OAAO,KAAK,EAAE,OAAO,EAAU;AAEnD,kBAAQ,IAAI,GAAG,MAAM,KAAK,UAAU,CAAC,IAAI,WAAW,WAAW;QACjE;;AAGF,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,OAAO,iBAAiB,CAAC;AAG7C,YAAQ,IAAI,EAAE;EAChB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GAC5C,QAAQ,KAAK,CAAC;EAChB;AACF;",
4
+ "sourcesContent": ["/**\n * Show information about a model or layer\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { getActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport {\n TABLE_COLUMN_WIDTHS,\n TABLE_SEPARATOR\n} from \"../utils/table-formatting.js\";\n\nexport interface InfoOptions {\n layer?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\nexport async function infoCommand(options: InfoOptions): Promise<void> {\n const span = getActiveSpan();\n\n try {\n // Load model (only the requested layer if --layer is specified)\n const model = await Model.load(undefined, options.layer ? { layers: [options.layer] } : {});\n const manifest = model.manifest;\n\n if (span) {\n (span as any).setAttribute(\"model.name\", manifest.name);\n (span as any).setAttribute(\"model.version\", manifest.version);\n (span as any).setAttribute(\"model.specVersion\", manifest.specVersion);\n }\n\n console.log(\"\");\n console.log(ansis.bold(`${ansis.blue(\"Model:\")} ${manifest.name}`));\n console.log(ansis.dim(TABLE_SEPARATOR));\n\n console.log(`${ansis.gray(\"Name:\")} ${manifest.name}`);\n console.log(`${ansis.gray(\"Version:\")} ${manifest.version}`);\n console.log(`${ansis.gray(\"Spec Version:\")} ${manifest.specVersion}`);\n\n if (manifest.description) {\n console.log(`${ansis.gray(\"Description:\")} ${manifest.description}`);\n }\n\n if (manifest.author) {\n console.log(`${ansis.gray(\"Author:\")} ${manifest.author}`);\n }\n\n console.log(`${ansis.gray(\"Created:\")} ${manifest.created}`);\n console.log(`${ansis.gray(\"Modified:\")} ${manifest.modified}`);\n\n // Show layer information\n const layerNames = model.getLayerNames();\n\n if (span) {\n (span as any).setAttribute(\"info.layerCount\", layerNames.length);\n }\n\n if (options.layer) {\n // Show specific layer info (model only loaded this layer for performance)\n console.log(\"\");\n console.log(ansis.bold(\"Layers:\"));\n console.log(ansis.dim(TABLE_SEPARATOR));\n\n const layer = await model.getLayer(options.layer);\n if (!layer) {\n console.error(ansis.red(`Error: Layer ${options.layer} not found`));\n process.exit(1);\n }\n\n const elements = layer.listElements();\n console.log(`${ansis.cyan(options.layer)}`);\n console.log(` ${ansis.gray(\"Elements:\")} ${elements.length}`);\n\n if (span) {\n (span as any).setAttribute(\"info.elementCount\", elements.length);\n }\n\n if (options.verbose && elements.length > 0) {\n console.log(` ${ansis.gray(\"Details:\")}`);\n const types = new Set(elements.map((e) => e.type));\n for (const type of types) {\n const count = elements.filter((e) => e.type === type).length;\n console.log(` - ${type}: ${count}`);\n }\n }\n } else if (layerNames.length > 0) {\n // Show all layers summary\n console.log(\"\");\n console.log(ansis.bold(\"Layers:\"));\n console.log(ansis.dim(TABLE_SEPARATOR));\n\n const idWidth = TABLE_COLUMN_WIDTHS.INFO_ID_WIDTH;\n const countWidth = TABLE_COLUMN_WIDTHS.INFO_COUNT_WIDTH;\n\n for (const layerName of layerNames) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n const count = layer.listElements().length;\n const paddedName = layerName.padEnd(idWidth);\n const paddedCount = String(count).padEnd(countWidth);\n\n console.log(`${ansis.cyan(paddedName)} ${paddedCount} elements`);\n }\n } else {\n console.log(\"\");\n console.log(ansis.yellow(\"No layers found\"));\n }\n\n console.log(\"\");\n\n } catch (error) {\n const message = getErrorMessage(error);\n console.error(ansis.red(`Error: ${message}`));\n process.exit(1);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,39 +4,55 @@ import { Model } from "../core/model.js";
4
4
  import { fileExists } from "../utils/file-io.js";
5
5
  import { logVerbose, logDebug } from "../utils/globals.js";
6
6
  import { installSpecReference } from "../utils/spec-installer.js";
7
+ import { getCliBundledSpecVersion } from "../utils/spec-version.js";
8
+ import { isTelemetryEnabled, startSpan, endSpan } from "../telemetry/index.js";
9
+ import { getErrorMessage } from "../utils/errors.js";
7
10
  async function initCommand(options) {
8
11
  intro(ansis.bold(ansis.blue("\u2699\uFE0F Initialize Documentation Robotics Model")));
12
+ const span = isTelemetryEnabled ? startSpan("model.init", {
13
+ "init.hasName": !!options.name,
14
+ "init.hasDescription": !!options.description,
15
+ "init.hasAuthor": !!options.author
16
+ }) : null;
9
17
  try {
10
18
  const rootPath = process.cwd(), manifestPath = `${`${rootPath}/documentation-robotics/model`}/manifest.yaml`;
11
- await fileExists(manifestPath) && (console.error(ansis.red("Error: Model already initialized in this directory")), process.exit(1));
12
- const isInteractive = process.stdin.isTTY, name = options.name || (isInteractive ? await text({
19
+ await fileExists(manifestPath) && (console.error(ansis.red("Error: Model already initialized in this directory")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Model already exists" }), endSpan(span), process.exit(1));
20
+ const isInteractive = process.stdin.isTTY;
21
+ isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive);
22
+ const skipPrompts = !!options.name, name = options.name || (isInteractive ? await text({
13
23
  message: "Model name:",
14
24
  validate: (value) => value.length === 0 ? "Name is required" : void 0
15
25
  }) : (() => {
16
- console.error(ansis.red("Error: Model name is required (use --name option)")), process.exit(1);
17
- })()), description = options.description || (isInteractive ? await text({
26
+ console.error(ansis.red("Error: Model name is required (use --name option)")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Model name required" }), endSpan(span), process.exit(1);
27
+ })()), description = options.description || (skipPrompts ? "" : isInteractive ? await text({
18
28
  message: "Description (optional):",
19
29
  defaultValue: ""
20
- }) : ""), author = options.author || (isInteractive ? await text({
30
+ }) : ""), author = options.author || (skipPrompts ? "" : isInteractive ? await text({
21
31
  message: "Author (optional):",
22
32
  defaultValue: ""
23
33
  }) : "");
24
- logDebug(`Creating model directory at ${rootPath}/documentation-robotics/model`);
34
+ isTelemetryEnabled && span && (span.setAttribute("model.name", name), span.setAttribute("model.specVersion", getCliBundledSpecVersion())), logDebug(`Creating model directory at ${rootPath}/documentation-robotics/model`);
25
35
  const model = await Model.init(rootPath, {
26
36
  name,
27
37
  version: "0.1.0",
28
38
  description: description || void 0,
29
39
  author: author || void 0,
30
- specVersion: "0.6.0",
40
+ specVersion: getCliBundledSpecVersion(),
31
41
  created: (/* @__PURE__ */ new Date()).toISOString()
32
42
  }, { lazyLoad: !1 });
33
43
  logVerbose(`Model saved with:
34
44
  - Version: 0.1.0
35
- - Spec Version: 0.6.0
36
- - Location: ${rootPath}/documentation-robotics/model`), logDebug("Installing spec reference (.dr/ folder)..."), await installSpecReference(rootPath, !1), logVerbose("Spec reference installed"), outro(ansis.green(`\u2713 Model initialized: ${ansis.bold(model.manifest.name)}`));
45
+ - Spec Version: ${getCliBundledSpecVersion()}
46
+ - Location: ${rootPath}/documentation-robotics/model`), logDebug("Installing spec reference (.dr/ folder)..."), await installSpecReference(rootPath, !1), logVerbose("Spec reference installed"), isTelemetryEnabled && span && (span.setAttribute("model.path", rootPath), span.setStatus({ code: 0 })), outro(ansis.green(`\u2713 Model initialized: ${ansis.bold(model.manifest.name)}`));
37
47
  } catch (error) {
38
- const message = error instanceof Error ? error.message : String(error);
39
- console.error(ansis.red(`Error: ${message}`)), process.exit(1);
48
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
49
+ code: 2,
50
+ message: getErrorMessage(error)
51
+ }));
52
+ const message = getErrorMessage(error);
53
+ console.error(ansis.red(`Error: ${message}`)), endSpan(span), process.exit(1);
54
+ } finally {
55
+ endSpan(span);
40
56
  }
41
57
  }
42
58
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/init.ts"],
4
- "sourcesContent": ["/**\n * Initialize a new Documentation Robotics model\n */\n\nimport { intro, text, outro } from '@clack/prompts';\nimport ansis from 'ansis';\nimport { Model } from '../core/model.js';\nimport { fileExists } from '../utils/file-io.js';\nimport { logVerbose, logDebug } from '../utils/globals.js';\nimport { installSpecReference } from '../utils/spec-installer.js';\n\nexport interface InitOptions {\n name?: string;\n author?: string;\n description?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n intro(ansis.bold(ansis.blue('\u2699\uFE0F Initialize Documentation Robotics Model')));\n\n try {\n const rootPath = process.cwd();\n // Use Python CLI structure: documentation-robotics/model/\n const modelPath = `${rootPath}/documentation-robotics/model`;\n const manifestPath = `${modelPath}/manifest.yaml`;\n\n // Check if model already exists\n if (await fileExists(manifestPath)) {\n console.error(ansis.red('Error: Model already initialized in this directory'));\n process.exit(1);\n }\n\n // Gather model metadata\n // Check if stdin is a TTY to determine if we should prompt\n const isInteractive = process.stdin.isTTY;\n\n const name =\n options.name ||\n (isInteractive\n ? await text({\n message: 'Model name:',\n validate: (value) => (value.length === 0 ? 'Name is required' : undefined),\n })\n : (() => {\n console.error(ansis.red('Error: Model name is required (use --name option)'));\n process.exit(1);\n })());\n\n const description =\n options.description ||\n (isInteractive\n ? await text({\n message: 'Description (optional):',\n defaultValue: '',\n })\n : '');\n\n const author =\n options.author ||\n (isInteractive\n ? await text({\n message: 'Author (optional):',\n defaultValue: '',\n })\n : '');\n\n // Initialize model\n logDebug(`Creating model directory at ${rootPath}/documentation-robotics/model`);\n const model = await Model.init(\n rootPath,\n {\n name: name as string,\n version: '0.1.0',\n description: (description as string) || undefined,\n author: (author as string) || undefined,\n specVersion: '0.6.0',\n created: new Date().toISOString(),\n },\n { lazyLoad: false }\n );\n\n logVerbose(`Model saved with:\n - Version: 0.1.0\n - Spec Version: 0.6.0\n - Location: ${rootPath}/documentation-robotics/model`);\n\n // Install spec reference (.dr/ folder)\n logDebug('Installing spec reference (.dr/ folder)...');\n await installSpecReference(rootPath, false);\n logVerbose('Spec reference installed');\n\n outro(ansis.green(`\u2713 Model initialized: ${ansis.bold(model.manifest.name)}`));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n process.exit(1);\n }\n}\n"],
5
- "mappings": "AAIA,SAAS,OAAO,MAAM,aAAa;AACnC,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,YAAY,gBAAgB;AACrC,SAAS,4BAA4B;AAUrC,eAAsB,YAAY,SAAoB;AACpD,QAAM,MAAM,KAAK,MAAM,KAAK,uDAA6C,CAAC,CAAC;AAE3E,MAAI;AACF,UAAM,WAAW,QAAQ,IAAG,GAGtB,eAAe,GADH,GAAG,QAAQ,+BACI;AAGjC,IAAI,MAAM,WAAW,YAAY,MAC/B,QAAQ,MAAM,MAAM,IAAI,oDAAoD,CAAC,GAC7E,QAAQ,KAAK,CAAC;AAKhB,UAAM,gBAAgB,QAAQ,MAAM,OAE9B,OACJ,QAAQ,SACP,gBACG,MAAM,KAAK;MACT,SAAS;MACT,UAAU,CAAC,UAAW,MAAM,WAAW,IAAI,qBAAqB;KACjE,KACA,MAAK;AACJ,cAAQ,MAAM,MAAM,IAAI,mDAAmD,CAAC,GAC5E,QAAQ,KAAK,CAAC;IAChB,GAAE,IAEF,cACJ,QAAQ,gBACP,gBACG,MAAM,KAAK;MACT,SAAS;MACT,cAAc;KACf,IACD,KAEA,SACJ,QAAQ,WACP,gBACG,MAAM,KAAK;MACT,SAAS;MACT,cAAc;KACf,IACD;AAGN,aAAS,+BAA+B,QAAQ,+BAA+B;AAC/E,UAAM,QAAQ,MAAM,MAAM,KACxB,UACA;MACE;MACA,SAAS;MACT,aAAc,eAA0B;MACxC,QAAS,UAAqB;MAC9B,aAAa;MACb,UAAS,oBAAI,KAAI,GAAG,YAAW;OAEjC,EAAE,UAAU,GAAK,CAAE;AAGrB,eAAW;;;gBAGC,QAAQ,+BAA+B,GAGnD,SAAS,4CAA4C,GACrD,MAAM,qBAAqB,UAAU,EAAK,GAC1C,WAAW,0BAA0B,GAErC,MAAM,MAAM,MAAM,6BAAwB,MAAM,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE,CAAC;EAC9E,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GAC5C,QAAQ,KAAK,CAAC;EAChB;AACF;",
4
+ "sourcesContent": ["/**\n * Initialize a new Documentation Robotics model\n */\n\nimport { intro, text, outro } from \"@clack/prompts\";\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { fileExists } from \"../utils/file-io.js\";\nimport { logVerbose, logDebug } from \"../utils/globals.js\";\nimport { installSpecReference } from \"../utils/spec-installer.js\";\nimport { getCliBundledSpecVersion } from \"../utils/spec-version.js\";\nimport { isTelemetryEnabled, startSpan, endSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\nexport interface InitOptions {\n name?: string;\n author?: string;\n description?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n intro(ansis.bold(ansis.blue(\"\u2699\uFE0F Initialize Documentation Robotics Model\")));\n\n const span = isTelemetryEnabled\n ? startSpan(\"model.init\", {\n \"init.hasName\": !!options.name,\n \"init.hasDescription\": !!options.description,\n \"init.hasAuthor\": !!options.author,\n })\n : null;\n\n try {\n const rootPath = process.cwd();\n const modelPath = `${rootPath}/documentation-robotics/model`;\n const manifestPath = `${modelPath}/manifest.yaml`;\n\n // Check if model already exists\n if (await fileExists(manifestPath)) {\n console.error(ansis.red(\"Error: Model already initialized in this directory\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Model already exists\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Gather model metadata\n // Check if stdin is a TTY to determine if we should prompt\n const isInteractive = process.stdin.isTTY;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n\n // If name is provided, skip all prompts\n const skipPrompts = !!options.name;\n\n const name =\n options.name ||\n (isInteractive\n ? await text({\n message: \"Model name:\",\n validate: (value) => (value.length === 0 ? \"Name is required\" : undefined),\n })\n : (() => {\n console.error(ansis.red(\"Error: Model name is required (use --name option)\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Model name required\" });\n }\n endSpan(span);\n process.exit(1);\n })());\n\n const description =\n options.description ||\n (skipPrompts\n ? \"\"\n : isInteractive\n ? await text({\n message: \"Description (optional):\",\n defaultValue: \"\",\n })\n : \"\");\n\n const author =\n options.author ||\n (skipPrompts\n ? \"\"\n : isInteractive\n ? await text({\n message: \"Author (optional):\",\n defaultValue: \"\",\n })\n : \"\");\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"model.name\", name as string);\n (span as any).setAttribute(\"model.specVersion\", getCliBundledSpecVersion());\n }\n\n // Initialize model\n logDebug(`Creating model directory at ${rootPath}/documentation-robotics/model`);\n const model = await Model.init(\n rootPath,\n {\n name: name as string,\n version: \"0.1.0\",\n description: (description as string) || undefined,\n author: (author as string) || undefined,\n specVersion: getCliBundledSpecVersion(),\n created: new Date().toISOString(),\n },\n { lazyLoad: false }\n );\n\n logVerbose(`Model saved with:\n - Version: 0.1.0\n - Spec Version: ${getCliBundledSpecVersion()}\n - Location: ${rootPath}/documentation-robotics/model`);\n\n // Install spec reference (.dr/ folder)\n logDebug(\"Installing spec reference (.dr/ folder)...\");\n await installSpecReference(rootPath, false);\n logVerbose(\"Spec reference installed\");\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"model.path\", rootPath);\n (span as any).setStatus({ code: 0 });\n }\n\n outro(ansis.green(`\u2713 Model initialized: ${ansis.bold(model.manifest.name)}`));\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n const message = getErrorMessage(error);\n console.error(ansis.red(`Error: ${message}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n"],
5
+ "mappings": "AAIA,SAAS,OAAO,MAAM,aAAa;AACnC,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,YAAY,gBAAgB;AACrC,SAAS,4BAA4B;AACrC,SAAS,gCAAgC;AACzC,SAAS,oBAAoB,WAAW,eAAe;AACvD,SAAS,uBAAuB;AAUhC,eAAsB,YAAY,SAAoB;AACpD,QAAM,MAAM,KAAK,MAAM,KAAK,uDAA6C,CAAC,CAAC;AAE3E,QAAM,OAAO,qBACT,UAAU,cAAc;IACtB,gBAAgB,CAAC,CAAC,QAAQ;IAC1B,uBAAuB,CAAC,CAAC,QAAQ;IACjC,kBAAkB,CAAC,CAAC,QAAQ;GAC7B,IACD;AAEJ,MAAI;AACF,UAAM,WAAW,QAAQ,IAAG,GAEtB,eAAe,GADH,GAAG,QAAQ,+BACI;AAGjC,IAAI,MAAM,WAAW,YAAY,MAC/B,QAAQ,MAAM,MAAM,IAAI,oDAAoD,CAAC,GACzE,sBAAsB,QACvB,KAAa,UAAU,EAAE,MAAM,GAAG,SAAS,uBAAsB,CAAE,GAEtE,QAAQ,IAAI,GACZ,QAAQ,KAAK,CAAC;AAKhB,UAAM,gBAAgB,QAAQ,MAAM;AAEpC,IAAI,sBAAsB,QACvB,KAAa,aAAa,mBAAmB,aAAa;AAI7D,UAAM,cAAc,CAAC,CAAC,QAAQ,MAExB,OACJ,QAAQ,SACP,gBACG,MAAM,KAAK;MACT,SAAS;MACT,UAAU,CAAC,UAAW,MAAM,WAAW,IAAI,qBAAqB;KACjE,KACA,MAAK;AACJ,cAAQ,MAAM,MAAM,IAAI,mDAAmD,CAAC,GACxE,sBAAsB,QACvB,KAAa,UAAU,EAAE,MAAM,GAAG,SAAS,sBAAqB,CAAE,GAErE,QAAQ,IAAI,GACZ,QAAQ,KAAK,CAAC;IAChB,GAAE,IAEF,cACJ,QAAQ,gBACP,cACG,KACA,gBACE,MAAM,KAAK;MACT,SAAS;MACT,cAAc;KACf,IACD,KAEF,SACJ,QAAQ,WACP,cACG,KACA,gBACE,MAAM,KAAK;MACT,SAAS;MACT,cAAc;KACf,IACD;AAER,IAAI,sBAAsB,SACvB,KAAa,aAAa,cAAc,IAAc,GACtD,KAAa,aAAa,qBAAqB,yBAAwB,CAAE,IAI5E,SAAS,+BAA+B,QAAQ,+BAA+B;AAC/E,UAAM,QAAQ,MAAM,MAAM,KACxB,UACA;MACE;MACA,SAAS;MACT,aAAc,eAA0B;MACxC,QAAS,UAAqB;MAC9B,aAAa,yBAAwB;MACrC,UAAS,oBAAI,KAAI,GAAG,YAAW;OAEjC,EAAE,UAAU,GAAK,CAAE;AAGrB,eAAW;;oBAEK,yBAAwB,CAAE;gBAC9B,QAAQ,+BAA+B,GAGnD,SAAS,4CAA4C,GACrD,MAAM,qBAAqB,UAAU,EAAK,GAC1C,WAAW,0BAA0B,GAEjC,sBAAsB,SACvB,KAAa,aAAa,cAAc,QAAQ,GAChD,KAAa,UAAU,EAAE,MAAM,EAAC,CAAE,IAGrC,MAAM,MAAM,MAAM,6BAAwB,MAAM,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE,CAAC;EAC9E,SAAS,OAAO;AACd,IAAI,sBAAsB,SACvB,KAAa,gBAAgB,KAAc,GAC3C,KAAa,UAAU;MACtB,MAAM;MACN,SAAS,gBAAgB,KAAK;KAC/B;AAEH,UAAM,UAAU,gBAAgB,KAAK;AACrC,YAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GAC5C,QAAQ,IAAI,GACZ,QAAQ,KAAK,CAAC;EAChB;AACE,YAAQ,IAAI;EACd;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,11 +1,69 @@
1
1
  import ansis from "ansis";
2
2
  import { Model } from "../core/model.js";
3
+ import { CLIError, ErrorCategory, ModelNotFoundError, handleError } from "../utils/errors.js";
4
+ import { getActiveSpan } from "../telemetry/index.js";
5
+ import { getErrorMessage } from "../utils/errors.js";
6
+ import { TABLE_COLUMN_WIDTHS, TABLE_SEPARATOR } from "../utils/table-formatting.js";
7
+ import { CANONICAL_LAYER_NAMES } from "../core/layers.js";
8
+ async function loadModel(modelPath) {
9
+ try {
10
+ return await Model.load(modelPath);
11
+ } catch (error) {
12
+ const message = getErrorMessage(error);
13
+ throw message.includes("No DR project") || message.includes("Model not found") || message.includes("No model found") || message.includes("Could not find documentation_robotics") ? new ModelNotFoundError() : error;
14
+ }
15
+ }
16
+ function printLayerTable(layerName, elements, options) {
17
+ const idWidth = TABLE_COLUMN_WIDTHS.LIST_ID_WIDTH, typeWidth = TABLE_COLUMN_WIDTHS.LIST_TYPE_WIDTH, nameWidth = TABLE_COLUMN_WIDTHS.LIST_NAME_WIDTH;
18
+ console.log(""), console.log(ansis.bold(`Elements in ${ansis.cyan(layerName)} layer:`)), console.log(ansis.dim(TABLE_SEPARATOR)), console.log(`${ansis.cyan("ID".padEnd(idWidth))} ${ansis.cyan("TYPE".padEnd(typeWidth))} ${ansis.cyan("NAME")}`), console.log(ansis.dim(TABLE_SEPARATOR));
19
+ for (const element of elements) {
20
+ const id = (element.path || element.id).substring(0, idWidth - 1).padEnd(idWidth), type = element.type.substring(0, typeWidth - 1).padEnd(typeWidth), name = element.name.substring(0, nameWidth);
21
+ console.log(`${id} ${type} ${name}`), options.verbose && element.description && console.log(ansis.dim(` \u2514\u2500 ${element.description}`));
22
+ }
23
+ console.log(ansis.dim("\u2500".repeat(80))), console.log(ansis.dim(`Total: ${elements.length} element(s)`));
24
+ }
3
25
  async function listCommand(layer, options) {
26
+ const span = getActiveSpan();
4
27
  try {
5
- const layerObj = await (await Model.load(options.model)).getLayer(layer);
6
- layerObj || (console.error(ansis.red(`Error: Layer ${layer} not found`)), process.exit(1));
28
+ if (!layer) {
29
+ const model2 = await loadModel(options.model), allResults = [];
30
+ for (const layerName of CANONICAL_LAYER_NAMES) {
31
+ const layerObj2 = await model2.getLayer(layerName);
32
+ if (!layerObj2)
33
+ continue;
34
+ let elements2 = layerObj2.listElements();
35
+ options.type && (elements2 = elements2.filter((e) => e.type === options.type)), elements2.length > 0 && allResults.push({ layer: layerName, elements: elements2 });
36
+ }
37
+ if (options.json) {
38
+ console.log(JSON.stringify(allResults.map(({ layer: l, elements: elements2 }) => ({
39
+ layer: l,
40
+ elements: elements2.map((e) => e.toJSON())
41
+ })), null, 2));
42
+ return;
43
+ }
44
+ if (allResults.length === 0)
45
+ console.log(ansis.yellow("No elements found"));
46
+ else
47
+ for (const { layer: layerName, elements: elements2 } of allResults)
48
+ printLayerTable(layerName, elements2, options);
49
+ console.log("");
50
+ return;
51
+ }
52
+ let model;
53
+ try {
54
+ model = await Model.load(options.model, { layers: [layer] });
55
+ } catch (error) {
56
+ const message = getErrorMessage(error);
57
+ throw message.includes("No DR project") || message.includes("Model not found") || message.includes("No model found") || message.includes("Could not find documentation_robotics") ? new ModelNotFoundError() : error;
58
+ }
59
+ const layerObj = await model.getLayer(layer);
60
+ if (!layerObj)
61
+ throw new CLIError(`Layer ${layer} not found`, ErrorCategory.NOT_FOUND, [
62
+ 'Use "dr list" to see all available layers',
63
+ 'Use "dr add <layer> <type> <name>" to add an element to a new layer'
64
+ ]);
7
65
  let elements = layerObj.listElements();
8
- if (options.type && (elements = elements.filter((e) => e.type === options.type)), options.json) {
66
+ if (options.type && (elements = elements.filter((e) => e.type === options.type)), span?.setAttribute("list.layer", layer), span?.setAttribute("list.elementCount", elements.length), options.json) {
9
67
  console.log(JSON.stringify(elements.map((e) => e.toJSON()), null, 2));
10
68
  return;
11
69
  }
@@ -13,17 +71,9 @@ async function listCommand(layer, options) {
13
71
  console.log(ansis.yellow(`No elements in ${layer} layer`));
14
72
  return;
15
73
  }
16
- console.log(""), console.log(ansis.bold(`Elements in ${ansis.cyan(layer)} layer:`)), console.log(ansis.dim("\u2500".repeat(80)));
17
- const idWidth = 30, typeWidth = 15, nameWidth = 35;
18
- console.log(`${ansis.cyan("ID".padEnd(idWidth))} ${ansis.cyan("TYPE".padEnd(typeWidth))} ${ansis.cyan("NAME")}`), console.log(ansis.dim("\u2500".repeat(80)));
19
- for (const element of elements) {
20
- const id = element.id.substring(0, idWidth - 1).padEnd(idWidth), type = element.type.substring(0, typeWidth - 1).padEnd(typeWidth), name = element.name.substring(0, nameWidth);
21
- console.log(`${id} ${type} ${name}`), options.verbose && element.description && console.log(ansis.dim(` \u2514\u2500 ${element.description}`));
22
- }
23
- console.log(ansis.dim("\u2500".repeat(80))), console.log(ansis.dim(`Total: ${elements.length} element(s)`)), console.log("");
74
+ printLayerTable(layer, elements, options), console.log("");
24
75
  } catch (error) {
25
- const message = error instanceof Error ? error.message : String(error);
26
- console.error(ansis.red(`Error: ${message}`)), process.exit(1);
76
+ handleError(error);
27
77
  }
28
78
  }
29
79
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/list.ts"],
4
- "sourcesContent": ["/**\n * List elements in a layer\n */\n\nimport ansis from 'ansis';\nimport { Model } from '../core/model.js';\n\nexport interface ListOptions {\n type?: string;\n json?: boolean;\n verbose?: boolean;\n debug?: boolean;\n model?: string;\n}\n\nexport async function listCommand(layer: string, options: ListOptions): Promise<void> {\n try {\n // Load model\n const model = await Model.load(options.model);\n\n // Get layer\n const layerObj = await model.getLayer(layer);\n if (!layerObj) {\n console.error(ansis.red(`Error: Layer ${layer} not found`));\n process.exit(1);\n }\n\n // Get elements\n let elements = layerObj.listElements();\n\n // Filter by type if specified\n if (options.type) {\n elements = elements.filter((e) => e.type === options.type);\n }\n\n // Output as JSON if requested\n if (options.json) {\n console.log(JSON.stringify(elements.map((e) => e.toJSON()), null, 2));\n return;\n }\n\n // Display as table\n if (elements.length === 0) {\n console.log(ansis.yellow(`No elements in ${layer} layer`));\n return;\n }\n\n console.log('');\n console.log(ansis.bold(`Elements in ${ansis.cyan(layer)} layer:`));\n console.log(ansis.dim('\u2500'.repeat(80)));\n\n // Print header\n const idWidth = 30;\n const typeWidth = 15;\n const nameWidth = 35;\n\n console.log(\n `${ansis.cyan('ID'.padEnd(idWidth))} ${ansis.cyan('TYPE'.padEnd(typeWidth))} ${ansis.cyan('NAME')}`\n );\n console.log(ansis.dim('\u2500'.repeat(80)));\n\n // Print rows\n for (const element of elements) {\n const id = element.id.substring(0, idWidth - 1).padEnd(idWidth);\n const type = element.type.substring(0, typeWidth - 1).padEnd(typeWidth);\n const name = element.name.substring(0, nameWidth);\n\n console.log(`${id} ${type} ${name}`);\n\n if (options.verbose && element.description) {\n console.log(ansis.dim(` \u2514\u2500 ${element.description}`));\n }\n }\n\n console.log(ansis.dim('\u2500'.repeat(80)));\n console.log(ansis.dim(`Total: ${elements.length} element(s)`));\n console.log('');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n process.exit(1);\n }\n}\n"],
5
- "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,aAAa;AAUtB,eAAsB,YAAY,OAAe,SAAoB;AACnE,MAAI;AAKF,UAAM,WAAW,OAHH,MAAM,MAAM,KAAK,QAAQ,KAAK,GAGf,SAAS,KAAK;AAC3C,IAAK,aACH,QAAQ,MAAM,MAAM,IAAI,gBAAgB,KAAK,YAAY,CAAC,GAC1D,QAAQ,KAAK,CAAC;AAIhB,QAAI,WAAW,SAAS,aAAY;AAQpC,QALI,QAAQ,SACV,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,IAAI,IAIvD,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,OAAM,CAAE,GAAG,MAAM,CAAC,CAAC;AACpE;IACF;AAGA,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI,MAAM,OAAO,kBAAkB,KAAK,QAAQ,CAAC;AACzD;IACF;AAEA,YAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,eAAe,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,GACjE,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAGrC,UAAM,UAAU,IACV,YAAY,IACZ,YAAY;AAElB,YAAQ,IACN,GAAG,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,GAErG,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAGrC,eAAW,WAAW,UAAU;AAC9B,YAAM,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,EAAE,OAAO,OAAO,GACxD,OAAO,QAAQ,KAAK,UAAU,GAAG,YAAY,CAAC,EAAE,OAAO,SAAS,GAChE,OAAO,QAAQ,KAAK,UAAU,GAAG,SAAS;AAEhD,cAAQ,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAE/B,QAAQ,WAAW,QAAQ,eAC7B,QAAQ,IAAI,MAAM,IAAI,kBAAQ,QAAQ,WAAW,EAAE,CAAC;IAExD;AAEA,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC,GACrC,QAAQ,IAAI,MAAM,IAAI,UAAU,SAAS,MAAM,aAAa,CAAC,GAC7D,QAAQ,IAAI,EAAE;EAChB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GAC5C,QAAQ,KAAK,CAAC;EAChB;AACF;",
6
- "names": []
4
+ "sourcesContent": ["/**\n * List elements in a layer\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport {\n CLIError,\n ErrorCategory,\n ModelNotFoundError,\n handleError\n} from \"../utils/errors.js\";\nimport { getActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport {\n TABLE_COLUMN_WIDTHS,\n TABLE_SEPARATOR\n} from \"../utils/table-formatting.js\";\nimport { CANONICAL_LAYER_NAMES } from \"../core/layers.js\";\n\nexport interface ListOptions {\n type?: string;\n json?: boolean;\n verbose?: boolean;\n debug?: boolean;\n model?: string;\n}\n\nasync function loadModel(modelPath: string | undefined): Promise<Model> {\n try {\n return await Model.load(modelPath);\n } catch (error) {\n const message = getErrorMessage(error);\n if (\n message.includes(\"No DR project\") ||\n message.includes(\"Model not found\") ||\n message.includes(\"No model found\") ||\n message.includes(\"Could not find documentation_robotics\")\n ) {\n throw new ModelNotFoundError();\n }\n throw error;\n }\n}\n\ntype ElementRow = { path?: string; id: string; type: string; name: string; description?: string; toJSON(): object };\n\nfunction printLayerTable(\n layerName: string,\n elements: ElementRow[],\n options: ListOptions\n): void {\n const idWidth = TABLE_COLUMN_WIDTHS.LIST_ID_WIDTH;\n const typeWidth = TABLE_COLUMN_WIDTHS.LIST_TYPE_WIDTH;\n const nameWidth = TABLE_COLUMN_WIDTHS.LIST_NAME_WIDTH;\n\n console.log(\"\");\n console.log(ansis.bold(`Elements in ${ansis.cyan(layerName)} layer:`));\n console.log(ansis.dim(TABLE_SEPARATOR));\n console.log(\n `${ansis.cyan(\"ID\".padEnd(idWidth))} ${ansis.cyan(\"TYPE\".padEnd(typeWidth))} ${ansis.cyan(\"NAME\")}`\n );\n console.log(ansis.dim(TABLE_SEPARATOR));\n\n for (const element of elements) {\n const displayId = element.path || element.id;\n const id = displayId.substring(0, idWidth - 1).padEnd(idWidth);\n const type = element.type.substring(0, typeWidth - 1).padEnd(typeWidth);\n const name = element.name.substring(0, nameWidth);\n console.log(`${id} ${type} ${name}`);\n if (options.verbose && element.description) {\n console.log(ansis.dim(` \u2514\u2500 ${element.description}`));\n }\n }\n\n console.log(ansis.dim(\"\u2500\".repeat(80)));\n console.log(ansis.dim(`Total: ${elements.length} element(s)`));\n}\n\nexport async function listCommand(\n layer: string | undefined,\n options: ListOptions\n): Promise<void> {\n const span = getActiveSpan();\n\n try {\n // All-layers mode when layer argument is omitted\n if (!layer) {\n const model = await loadModel(options.model);\n type LayerResult = { layer: string; elements: ElementRow[] };\n const allResults: LayerResult[] = [];\n\n for (const layerName of CANONICAL_LAYER_NAMES) {\n const layerObj = await model.getLayer(layerName);\n if (!layerObj) continue;\n\n let elements = layerObj.listElements();\n if (options.type) {\n elements = elements.filter((e) => e.type === options.type);\n }\n if (elements.length > 0) {\n allResults.push({ layer: layerName, elements });\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n allResults.map(({ layer: l, elements }) => ({\n layer: l,\n elements: elements.map((e) => e.toJSON()),\n })),\n null,\n 2\n )\n );\n return;\n }\n\n if (allResults.length === 0) {\n console.log(ansis.yellow(\"No elements found\"));\n } else {\n for (const { layer: layerName, elements } of allResults) {\n printLayerTable(layerName, elements, options);\n }\n }\n console.log(\"\");\n return;\n }\n\n // Single-layer mode\n let model: Model;\n try {\n model = await Model.load(options.model, { layers: [layer] });\n } catch (error) {\n const message = getErrorMessage(error);\n if (\n message.includes(\"No DR project\") ||\n message.includes(\"Model not found\") ||\n message.includes(\"No model found\") ||\n message.includes(\"Could not find documentation_robotics\")\n ) {\n throw new ModelNotFoundError();\n }\n throw error;\n }\n\n const layerObj = await model.getLayer(layer);\n if (!layerObj) {\n throw new CLIError(`Layer ${layer} not found`, ErrorCategory.NOT_FOUND, [\n 'Use \"dr list\" to see all available layers',\n 'Use \"dr add <layer> <type> <name>\" to add an element to a new layer'\n ]);\n }\n\n let elements = layerObj.listElements();\n if (options.type) {\n elements = elements.filter((e) => e.type === options.type);\n }\n\n span?.setAttribute(\"list.layer\", layer);\n span?.setAttribute(\"list.elementCount\", elements.length);\n\n if (options.json) {\n console.log(JSON.stringify(elements.map((e) => e.toJSON()), null, 2));\n return;\n }\n\n if (elements.length === 0) {\n console.log(ansis.yellow(`No elements in ${layer} layer`));\n return;\n }\n\n printLayerTable(layer, elements, options);\n console.log(\"\");\n } catch (error) {\n handleError(error);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["model", "layerObj", "elements"]
7
7
  }