@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/analyzer.ts"],
4
+ "sourcesContent": ["/**\n * Analyzer Commands - CLI surface for analyzer discovery, status, indexing, and querying\n *\n * Implements ten subcommands:\n * - discover: Scan for installed analyzers and select active analyzer\n * - status: Report analyzer detection and project index state\n * - index: Index the current project with the active analyzer\n * - endpoints: List discovered API endpoints from indexed project\n * - services: Query for services/components in the indexed project\n * - datastores: Query for datastores/databases inferred from code analysis\n * - callers: Query for callers of a specific function or symbol\n * - callees: Query for callees of a specific function or symbol\n * - query: Execute a raw query against the analyzer's graph\n * - verify: Verify that graph-discovered routes align with model endpoints\n */\n\nimport { Command } from \"commander\";\nimport { intro, outro, select, isCancel } from \"@clack/prompts\";\nimport ansis from \"ansis\";\nimport { promises as fs } from \"fs\";\nimport * as path from \"path\";\nimport { AnalyzerRegistry } from \"../analyzers/registry.js\";\nimport { MappingLoader } from \"../analyzers/mapping-loader.js\";\nimport { readSession, writeSession, writeStatus, readIndexMeta } from \"../analyzers/session-state.js\";\nimport { CLIError, ModelNotFoundError, ErrorCategory, categorizeError } from \"../utils/errors.js\";\nimport { findProjectRoot } from \"../utils/project-paths.js\";\nimport { performDiscover } from \"./discover-logic.js\";\nimport { formatVerifyReport } from \"../export/verify-formatters.js\";\nimport type { SessionState, AnalyzerStatus } from \"../analyzers/types.js\";\n\n/**\n * Register all analyzer subcommands\n */\nexport function analyzerCommands(program: Command): void {\n const analyzer = program.command(\"analyzer\").description(\"Manage analyzer discovery and indexing\");\n\n /**\n * Discover subcommand - scan for installed analyzers\n *\n * Iterates through all registered analyzers, detects which are installed,\n * and prompts for selection if needed. Persists selection to session.json.\n */\n analyzer\n .command(\"discover\")\n .description(\"Discover and select an analyzer\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--reselect\", \"Force re-selection even if analyzer already selected\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer discover # Scan and select analyzer\n $ dr analyzer discover --reselect # Force re-selection\n $ dr analyzer discover --json # Output discovery results as JSON`\n )\n .action(async (options) => {\n try {\n // Resolve project root for consistent session state path\n const projectRoot = (await findProjectRoot()) || process.cwd();\n\n // Initialize registry\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n\n // Check if session already exists and not reselecting\n if (!options.reselect) {\n const session = await readSession(projectRoot);\n if (session) {\n if (options.json) {\n // JSON mode: return discovery results with existing session as selected\n const analyzerNames = await registry.getAnalyzerNames();\n const analyzerOptions: any[] = [];\n\n for (const name of analyzerNames) {\n try {\n const backend = await registry.getAnalyzer(name);\n if (!backend) continue;\n const detection = await backend.detect();\n const mapper = await MappingLoader.load(name);\n const metadata = mapper.getAnalyzerMetadata();\n analyzerOptions.push({ backend, detection, metadata });\n } catch (error) {\n // Log error but continue discovering other analyzers\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error(`Failed to discover analyzer \"${name}\": ${errorMsg}`);\n }\n }\n\n const installed = analyzerOptions.filter((a) => a.detection.installed);\n const discoveryResult: any = {\n found: analyzerOptions.map((a) => ({\n name: a.backend.name,\n display_name: a.backend.displayName,\n description: a.metadata?.description || \"\",\n homepage: a.metadata?.homepage || \"\",\n installed: a.detection.installed,\n })),\n installed_count: installed.length,\n selected: session.active_analyzer,\n };\n\n console.log(JSON.stringify(discoveryResult, null, 2));\n return;\n } else {\n // Text mode: show message and return\n console.log(\n ansis.green(`\u2713 Using analyzer: ${session.active_analyzer} (use --reselect to change)`)\n );\n return;\n }\n }\n }\n\n // Run core discover logic\n const discoverResult = await performDiscover(registry, {\n json: options.json,\n reselect: options.reselect,\n isTTY: process.stdin.isTTY,\n });\n\n const { discoveryResult, installed, analyzerOptions, selectedAnalyzer, shouldWriteSession } = discoverResult;\n\n // JSON output mode\n if (options.json) {\n // Only write session if an analyzer was actually selected\n // (selectedAnalyzer is only set if analyzers are installed)\n if (selectedAnalyzer && shouldWriteSession) {\n const state: SessionState = {\n active_analyzer: selectedAnalyzer,\n selected_at: new Date().toISOString(),\n };\n await writeSession(state, projectRoot);\n discoveryResult.selected = selectedAnalyzer;\n }\n\n console.log(JSON.stringify(discoveryResult, null, 2));\n return;\n }\n\n // Text output mode - show all analyzers with install status\n if (installed.length === 0) {\n intro(ansis.blue(\"\uD83D\uDCCA Analyzer Discovery\"));\n console.log(\"\");\n console.log(ansis.yellow(\"No analyzers installed. Install one of the following:\"));\n console.log(\"\");\n\n for (const opt of analyzerOptions) {\n const name = ansis.bold(opt.backend.displayName);\n const homepage = opt.metadata?.homepage || \"(homepage not available)\";\n console.log(` ${name} ${ansis.dim(`(${homepage})`)}`);\n }\n\n console.log(\"\");\n outro(ansis.dim(\"To install: follow the links above or use your package manager\"));\n\n return;\n }\n\n // Prompt for selection\n intro(ansis.blue(\"\uD83D\uDCCA Analyzer Selection\"));\n\n if (process.stdin.isTTY) {\n const selectedName = await select({\n message: \"Select an analyzer\",\n options: installed.map((a) => ({\n value: a.backend.name,\n label: a.backend.displayName,\n hint: a.metadata?.description || \"\",\n })),\n });\n\n if (isCancel(selectedName)) {\n outro(ansis.dim(\"Cancelled\"));\n return;\n }\n\n // Write session\n const state: SessionState = {\n active_analyzer: selectedName as string,\n selected_at: new Date().toISOString(),\n };\n await writeSession(state, projectRoot);\n\n outro(\n ansis.green(\n `\u2713 Selected analyzer: ${selectedName} (saved to .dr/analyzers/session.json)`\n )\n );\n } else {\n // Non-TTY: auto-select first installed analyzer\n if (selectedAnalyzer) {\n const state: SessionState = {\n active_analyzer: selectedAnalyzer,\n selected_at: new Date().toISOString(),\n };\n await writeSession(state, projectRoot);\n\n console.log(\n ansis.green(`\u2713 Selected analyzer: ${selectedAnalyzer} (non-interactive mode)`)\n );\n outro(ansis.dim(\"Saved to .dr/analyzers/session.json\"));\n }\n }\n } catch (error) {\n if (error instanceof CLIError) throw error;\n\n const category = categorizeError(error);\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n category\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Status subcommand - report analyzer detection and project index state\n */\n analyzer\n .command(\"status\")\n .description(\"Check analyzer detection and project index status\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer status # Show status of active analyzer\n $ dr analyzer status --name cbm # Show status of specific analyzer\n $ dr analyzer status --json # Output as JSON`\n )\n .action(async (options) => {\n try {\n // Resolve project root for consistent session state path\n const projectRoot = (await findProjectRoot()) || process.cwd();\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND,\n [\"Check the analyzer name with `dr analyzer discover`\"]\n );\n }\n\n // Get status (use project root from findProjectRoot for backend operations)\n const actualProjectRoot = await findProjectRoot();\n let status: AnalyzerStatus;\n if (actualProjectRoot) {\n status = await backend.status(actualProjectRoot);\n } else {\n const detected = await backend.detect();\n status = {\n detected,\n indexed: false,\n fresh: false,\n } as AnalyzerStatus;\n }\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(status, null, 2));\n if (actualProjectRoot) {\n await writeStatus(status, actualProjectRoot, analyzerName);\n }\n return;\n }\n\n // Text output\n console.log(\"\");\n console.log(ansis.bold(\"Analyzer Status\"));\n console.log(ansis.dim(\"\u2500\".repeat(40)));\n\n console.log(\n `Installed: ${status.detected.installed ? ansis.green(\"\u2713 Yes\") : ansis.red(\"\u2717 No\")}`\n );\n\n if (status.detected.binary_path) {\n console.log(`Binary: ${ansis.dim(status.detected.binary_path)}`);\n }\n\n if (status.detected.version) {\n console.log(`Version: ${ansis.dim(status.detected.version)}`);\n }\n\n // Only show MCP and contract info if analyzer is installed\n if (status.detected.installed) {\n console.log(\n `MCP Registered: ${status.detected.mcp_registered ? ansis.green(\"\u2713 Yes\") : ansis.yellow(\"\u2717 No\")}`\n );\n\n console.log(\n `Contract Valid: ${status.detected.contract_ok ? ansis.green(\"\u2713 Yes\") : ansis.yellow(\"\u2717 No\")}`\n );\n }\n\n if (actualProjectRoot) {\n console.log(\n `Indexed: ${status.indexed ? ansis.green(\"\u2713 Yes\") : ansis.yellow(\"\u2717 No\")}`\n );\n\n if (status.indexed) {\n console.log(\n `Fresh: ${status.fresh ? ansis.green(\"\u2713 Yes\") : ansis.yellow(\"\u2717 No (use --force to reindex)\")}`\n );\n\n if (status.last_indexed) {\n console.log(`Last indexed: ${ansis.dim(status.last_indexed)}`);\n }\n } else {\n console.log(ansis.dim(\"Run `dr analyzer index` to index the project\"));\n }\n }\n\n console.log(\"\");\n\n // Write status file\n if (actualProjectRoot) {\n await writeStatus(status, actualProjectRoot, analyzerName);\n }\n } catch (error) {\n if (error instanceof CLIError) throw error;\n\n const category = categorizeError(error);\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n category\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Index subcommand - index the current project\n */\n analyzer\n .command(\"index\")\n .description(\"Index the current project with the analyzer\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--force\", \"Force re-indexing even if index is fresh\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer index # Index with active analyzer\n $ dr analyzer index --force # Force re-index\n $ dr analyzer index --name cbm # Index with specific analyzer`\n )\n .action(async (options) => {\n try {\n // Find project root - required for indexing\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND,\n [\"Check the analyzer name with `dr analyzer discover`\"]\n );\n }\n\n // Check if installed\n const detection = await backend.detect();\n if (!detection.installed) {\n // Get analyzer metadata for suggestions\n const mapper = await MappingLoader.load(analyzerName);\n const metadata = mapper.getAnalyzerMetadata();\n const homepageUrl = metadata?.homepage || \"https://github.com/search?q=codebase-memory\";\n\n throw new CLIError(\n `Analyzer not installed: ${analyzerName}`,\n ErrorCategory.USER,\n [\n \"Run `dr analyzer discover` to find available analyzers and installation instructions\",\n `Visit: ${homepageUrl}`,\n ]\n );\n }\n\n // Index the project\n console.log(`Indexing project with ${analyzerName}...`);\n const result = await backend.index(projectRoot, { force: options.force });\n\n console.log(ansis.green(`\u2713 Indexing complete`));\n console.log(` Nodes: ${result.node_count}`);\n console.log(` Edges: ${result.edge_count}`);\n console.log(` Git HEAD: ${result.git_head}`);\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n ErrorCategory.SYSTEM\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Endpoints subcommand - list API endpoints from indexed project\n */\n analyzer\n .command(\"endpoints\")\n .description(\"List discovered API endpoints from indexed project\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer endpoints # List endpoints from active analyzer\n $ dr analyzer endpoints --json # Output as JSON\n $ dr analyzer endpoints --name cbm # List endpoints from specific analyzer`\n )\n .action(async (options) => {\n try {\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const status = await backend.status(projectRoot);\n if (!status.indexed) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` to index the project first\"]\n );\n }\n\n // Query for endpoints\n const endpoints = await backend.endpoints(projectRoot);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(endpoints, null, 2));\n return;\n }\n\n // Table output\n if (endpoints.length === 0) {\n console.log(ansis.yellow(\"No endpoints found\"));\n return;\n }\n\n console.log(\"\");\n console.log(ansis.bold(`API Endpoints (${endpoints.length} found):`));\n console.log(ansis.dim(\"\u2500\".repeat(135)));\n\n // Print header\n const methodWidth = 8;\n const pathWidth = 20;\n const nameWidth = 18;\n const idFragmentWidth = 18;\n const symbolWidth = 18;\n const confidenceWidth = 12;\n const fileWidth = 25;\n\n console.log(\n ansis.cyan(\n `${\"Method\".padEnd(methodWidth)} ${\"Path\".padEnd(pathWidth)} ${\"Name\".padEnd(nameWidth)} ${\"ID Fragment\".padEnd(idFragmentWidth)} ${\"Symbol\".padEnd(symbolWidth)} ${\"Confidence\".padEnd(confidenceWidth)} File`\n )\n );\n console.log(ansis.dim(\"\u2500\".repeat(135)));\n\n // Print each endpoint\n for (const endpoint of endpoints) {\n const method = endpoint.http_method.padEnd(methodWidth);\n const path = endpoint.http_path.substring(0, pathWidth).padEnd(pathWidth);\n const name = endpoint.suggested_name.substring(0, nameWidth).padEnd(nameWidth);\n const idFragment = endpoint.suggested_id_fragment.substring(0, idFragmentWidth).padEnd(idFragmentWidth);\n const symbol = endpoint.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth);\n const confidence = endpoint.confidence.toUpperCase().padEnd(confidenceWidth);\n const file = endpoint.source_file.substring(0, fileWidth);\n\n console.log(`${method} ${path} ${name} ${idFragment} ${symbol} ${confidence} ${ansis.dim(file)}`);\n }\n\n console.log(ansis.dim(\"\u2500\".repeat(135)));\n console.log(ansis.dim(`Total: ${endpoints.length} endpoint(s)`));\n console.log(\"\");\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Services subcommand - query for services/components in indexed project\n */\n analyzer\n .command(\"services\")\n .description(\"Query for services/components in the indexed project\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--layer <layer>\", \"Filter by layer (e.g., 'application')\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer services # List all services\n $ dr analyzer services --layer application\n $ dr analyzer services --json # Output as JSON`\n )\n .action(async (options) => {\n try {\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Query for services\n let services = await backend.services(projectRoot);\n\n // Filter by layer if specified\n if (options.layer) {\n services = services.filter(s => s.suggested_layer === options.layer);\n }\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(services, null, 2));\n return;\n }\n\n // Table output\n if (services.length === 0) {\n console.log(ansis.yellow(\"No services found\"));\n return;\n }\n\n console.log(\"\");\n console.log(ansis.bold(`Services (${services.length} found):`));\n console.log(ansis.dim(\"\u2500\".repeat(120)));\n\n // Print header\n const nameWidth = 20;\n const layerWidth = 15;\n const typeWidth = 18;\n const symbolWidth = 20;\n const confidenceWidth = 12;\n const fileWidth = 25;\n\n console.log(\n ansis.cyan(\n `${\"Name\".padEnd(nameWidth)} ${\"Layer\".padEnd(layerWidth)} ${\"Type\".padEnd(typeWidth)} ${\"Symbol\".padEnd(symbolWidth)} ${\"Confidence\".padEnd(confidenceWidth)} File`\n )\n );\n console.log(ansis.dim(\"\u2500\".repeat(120)));\n\n // Print each service\n for (const service of services) {\n const name = service.suggested_name.substring(0, nameWidth).padEnd(nameWidth);\n const layer = service.suggested_layer.substring(0, layerWidth).padEnd(layerWidth);\n const type = service.suggested_element_type.substring(0, typeWidth).padEnd(typeWidth);\n const symbol = service.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth);\n const confidence = service.confidence.toUpperCase().padEnd(confidenceWidth);\n const file = service.source_file.substring(0, fileWidth);\n\n console.log(`${name} ${layer} ${type} ${symbol} ${confidence} ${ansis.dim(file)}`);\n }\n\n console.log(ansis.dim(\"\u2500\".repeat(120)));\n console.log(ansis.dim(`Total: ${services.length} service(s)`));\n console.log(\"\");\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Datastores subcommand - query for datastores/databases inferred from code\n */\n analyzer\n .command(\"datastores\")\n .description(\"Query for datastores/databases inferred from code analysis\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer datastores # List all inferred datastores\n $ dr analyzer datastores --json # Output as JSON`\n )\n .action(async (options) => {\n try {\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Query for datastores\n const datastores = await backend.datastores(projectRoot);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(datastores, null, 2));\n return;\n }\n\n // Table output\n if (datastores.length === 0) {\n console.log(ansis.yellow(\"No datastores found\"));\n return;\n }\n\n console.log(\"\");\n console.log(ansis.bold(`Datastores (${datastores.length} found):`));\n console.log(ansis.dim(\"\u2500\".repeat(100)));\n\n // Print each datastore\n for (const ds of datastores) {\n console.log(` ${ansis.cyan(ds.suggested_name)}`);\n console.log(` Inferred from:`);\n for (const evidence of ds.inferred_from) {\n console.log(` - ${evidence.source_file}: ${evidence.import_pattern}`);\n }\n if (ds.notes) {\n console.log(` Notes: ${ds.notes}`);\n }\n console.log(\"\");\n }\n\n console.log(ansis.dim(`Total: ${datastores.length} datastore(s)`));\n console.log(\"\");\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Callers subcommand - query for callers of a specific symbol\n */\n analyzer\n .command(\"callers <qualified-name>\")\n .description(\"Query for callers of a specific function or symbol\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--depth <n>\", \"Maximum depth for call graph traversal (default: 3, max: 10)\", \"3\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer callers com.example.Service.handleRequest\n $ dr analyzer callers com.example.Service.handleRequest --depth 5\n $ dr analyzer callers com.example.Service.handleRequest --json`\n )\n .action(async (qualifiedName, options) => {\n try {\n // Validate depth\n const depth = parseInt(options.depth, 10);\n if (isNaN(depth) || depth < 1) {\n throw new CLIError(\n \"Invalid --depth value: must be a positive integer\",\n ErrorCategory.USER\n );\n }\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Query for callers\n const callers = await backend.callers(projectRoot, qualifiedName, depth);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(callers, null, 2));\n return;\n }\n\n // Table output\n if (callers.length === 0) {\n console.log(ansis.yellow(`No callers found for ${qualifiedName}`));\n return;\n }\n\n console.log(\"\");\n console.log(ansis.bold(`Callers of ${ansis.cyan(qualifiedName)} (${callers.length} found):`));\n console.log(ansis.dim(\"\u2500\".repeat(100)));\n\n // Print each caller\n for (const caller of callers) {\n console.log(` ${ansis.bold(caller.qualified_name)}`);\n console.log(` File: ${caller.source_file}`);\n console.log(` Symbol: ${caller.source_symbol}`);\n console.log(` Depth: ${caller.depth}`);\n console.log(` Edge: ${caller.edge_type}`);\n console.log(\"\");\n }\n\n console.log(ansis.dim(`Total: ${callers.length} caller(s)`));\n console.log(\"\");\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Callees subcommand - query for callees of a specific symbol\n */\n analyzer\n .command(\"callees <qualified-name>\")\n .description(\"Query for callees of a specific function or symbol\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--depth <n>\", \"Maximum depth for call graph traversal (default: 3, max: 10)\", \"3\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer callees com.example.Service.handleRequest\n $ dr analyzer callees com.example.Service.handleRequest --depth 5\n $ dr analyzer callees com.example.Service.handleRequest --json`\n )\n .action(async (qualifiedName, options) => {\n try {\n // Validate depth\n const depth = parseInt(options.depth, 10);\n if (isNaN(depth) || depth < 1) {\n throw new CLIError(\n \"Invalid --depth value: must be a positive integer\",\n ErrorCategory.USER\n );\n }\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Query for callees\n const callees = await backend.callees(projectRoot, qualifiedName, depth);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(callees, null, 2));\n return;\n }\n\n // Table output\n if (callees.length === 0) {\n console.log(ansis.yellow(`No callees found for ${qualifiedName}`));\n return;\n }\n\n console.log(\"\");\n console.log(ansis.bold(`Callees of ${ansis.cyan(qualifiedName)} (${callees.length} found):`));\n console.log(ansis.dim(\"\u2500\".repeat(100)));\n\n // Print each callee\n for (const callee of callees) {\n console.log(` ${ansis.bold(callee.qualified_name)}`);\n console.log(` File: ${callee.source_file}`);\n console.log(` Symbol: ${callee.source_symbol}`);\n console.log(` Depth: ${callee.depth}`);\n console.log(` Edge: ${callee.edge_type}`);\n console.log(\"\");\n }\n\n console.log(ansis.dim(`Total: ${callees.length} callee(s)`));\n console.log(\"\");\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Query subcommand - execute a raw query against the analyzer's graph\n * Documented as an advanced escape hatch for graph queries (not recommended for scripting)\n */\n analyzer\n .command(\"query <cypher>\")\n .description(\"Execute a raw Cypher query against the analyzer graph (advanced escape hatch)\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--json\", \"Output as JSON (default format for query results)\")\n .addHelpText(\n \"before\",\n `Advanced Escape Hatch: This command directly executes graph queries without validation or wrapping.\nUse for advanced analysis when standard commands don't meet your needs.\\n`\n )\n .addHelpText(\n \"after\",\n `\nQuery syntax depends on the analyzer backend (e.g., Cypher for graph analyzers).\nResults are always output as JSON.\n\nExamples:\n $ dr analyzer query \"MATCH (n) RETURN n LIMIT 10\"\n $ dr analyzer query \"MATCH (n:Service) RETURN n.name\"\n $ dr analyzer query \"MATCH (n) RETURN n LIMIT 10\" --json`\n )\n .action(async (cypher, options) => {\n try {\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Execute query\n const result = await backend.query(projectRoot, cypher);\n\n // Output format: JSON is the only reasonable format for arbitrary query results\n // The --json flag is accepted for consistency, but JSON is always the output format\n // (the flag currently has no effect as all query output is JSON)\n if (options.json === false) {\n // Explicit no-op: --json flag or its absence doesn't change behavior\n // Query results are always output as JSON regardless of flag\n }\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n\n /**\n * Verify subcommand - verify that graph-discovered routes align with model endpoints\n */\n analyzer\n .command(\"verify\")\n .description(\"Verify that graph-discovered routes align with model endpoints\")\n .option(\"--name <n>\", \"Analyzer name (defaults to active from session.json)\")\n .option(\"--layer <layer>\", \"Layer(s) to verify (can be used multiple times)\", (value, previous: string[] | undefined) => {\n return previous ? [...previous, value] : [value];\n })\n .option(\"--json\", \"Output as JSON\")\n .option(\"--format <format>\", \"Output format: text, json, markdown (default: text)\")\n .option(\"--output <path>\", \"Write report to file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr analyzer verify # Verify api layer (default)\n $ dr analyzer verify --layer api # Explicitly specify api layer\n $ dr analyzer verify --json # Output as JSON to stdout\n $ dr analyzer verify --format markdown # Output as Markdown to stdout\n $ dr analyzer verify --output report.json # Save report to file (format inferred as JSON)\n $ dr analyzer verify --output report.md # Save report as Markdown`\n )\n .action(async (options) => {\n try {\n // Determine output format from --json flag, --format flag, or --output file extension\n let format: \"text\" | \"json\" | \"markdown\" = \"text\";\n if (options.json) {\n // Warn if both --json and --format are provided\n if (options.format) {\n console.warn(ansis.yellow(`\u26A0 Both --json and --format \"${options.format}\" were provided. Using --json format (--format is ignored).`));\n }\n format = \"json\";\n } else if (options.format) {\n const validFormats = [\"text\", \"json\", \"markdown\"];\n if (!validFormats.includes(options.format)) {\n throw new CLIError(\n `Invalid format: \"${options.format}\". Valid values are: ${validFormats.join(\", \")}.`,\n ErrorCategory.USER\n );\n }\n format = options.format as \"text\" | \"json\" | \"markdown\";\n } else if (options.output) {\n const ext = path.extname(options.output).toLowerCase();\n if (ext === \".json\") {\n format = \"json\";\n } else if (ext === \".md\") {\n format = \"markdown\";\n } else if (ext) {\n // Warn if file has unrecognized extension\n console.warn(ansis.yellow(`\u26A0 Unrecognized file extension \"${ext}\" in --output. Using text format by default.`));\n }\n }\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new ModelNotFoundError();\n }\n\n // Validate layers - only api is supported in v1\n const requestedLayers = options.layer || [\"api\"];\n const apiLayers = requestedLayers.filter((layer: string) => layer === \"api\");\n const nonApiLayers = requestedLayers.filter((layer: string) => layer !== \"api\");\n\n // Report non-api layers as not available\n for (const layer of nonApiLayers) {\n console.log(ansis.dim(`No verification available for layer '${layer}'`));\n }\n\n // If no api layers to verify, exit cleanly\n if (apiLayers.length === 0) {\n return;\n }\n\n // Resolve analyzer name\n let analyzerName = options.name;\n if (!analyzerName) {\n const session = await readSession(projectRoot);\n if (!session) {\n throw new CLIError(\n \"No analyzer selected. Run `dr analyzer discover` first.\",\n ErrorCategory.USER\n );\n }\n analyzerName = session.active_analyzer;\n }\n\n // Get analyzer\n const registry = AnalyzerRegistry.getInstance();\n await registry.initialize();\n const backend = await registry.getAnalyzer(analyzerName);\n\n if (!backend) {\n throw new CLIError(\n `Analyzer not found: ${analyzerName}`,\n ErrorCategory.NOT_FOUND\n );\n }\n\n // Check if project is indexed\n const indexMeta = await readIndexMeta(projectRoot, analyzerName);\n if (!indexMeta) {\n throw new CLIError(\n \"Project not indexed\",\n ErrorCategory.USER,\n [\"Run `dr analyzer index` first\"]\n );\n }\n\n // Execute verification with changeset awareness enabled by default\n const report = await backend.verify(projectRoot, {\n layers: apiLayers,\n changesetAware: true,\n });\n\n const formatted = formatVerifyReport(report, { format });\n\n // Write to file if --output specified\n if (options.output) {\n const outputPath = path.resolve(options.output);\n await fs.writeFile(outputPath, formatted, \"utf-8\");\n console.log(ansis.green(`\u2713 Report written to ${outputPath}`));\n return;\n }\n\n // Print to stdout\n console.log(formatted);\n } catch (error) {\n if (error instanceof CLIError || error instanceof ModelNotFoundError) throw error;\n const cliError = new CLIError(\n error instanceof Error ? error.message : String(error),\n categorizeError(error)\n );\n if (error instanceof Error) {\n cliError.cause = error;\n }\n throw cliError;\n }\n });\n}\n"],
5
+ "mappings": "AAiBA,SAAS,OAAO,OAAO,QAAQ,gBAAgB;AAC/C,OAAO,WAAW;AAClB,SAAS,YAAY,UAAU;AAC/B,YAAY,UAAU;AACtB,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,aAAa,cAAc,aAAa,qBAAqB;AACtE,SAAS,UAAU,oBAAoB,eAAe,uBAAuB;AAC7E,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAM7B,SAAU,iBAAiB,SAAgB;AAC/C,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,wCAAwC;AAQjG,WACG,QAAQ,UAAU,EAClB,YAAY,iCAAiC,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,cAAc,sDAAsD,EAC3E,YACC,SACA;;;;+EAIyE,EAE1E,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAe,MAAM,gBAAe,KAAO,QAAQ,IAAG,GAGtD,WAAW,iBAAiB,YAAW;AAI7C,UAHA,MAAM,SAAS,WAAU,GAGrB,CAAC,QAAQ,UAAU;AACrB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI;AACF,cAAI,QAAQ,MAAM;AAEhB,kBAAM,gBAAgB,MAAM,SAAS,iBAAgB,GAC/CA,mBAAyB,CAAA;AAE/B,uBAAW,QAAQ;AACjB,kBAAI;AACF,sBAAM,UAAU,MAAM,SAAS,YAAY,IAAI;AAC/C,oBAAI,CAAC;AAAS;AACd,sBAAM,YAAY,MAAM,QAAQ,OAAM,GAEhC,YADS,MAAM,cAAc,KAAK,IAAI,GACpB,oBAAmB;AAC3C,gBAAAA,iBAAgB,KAAK,EAAE,SAAS,WAAW,SAAQ,CAAE;cACvD,SAAS,OAAO;AAEd,sBAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACtE,wBAAQ,MAAM,gCAAgC,IAAI,MAAM,QAAQ,EAAE;cACpE;AAGF,kBAAMC,aAAYD,iBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,GAC/DE,mBAAuB;cAC3B,OAAOF,iBAAgB,IAAI,CAAC,OAAO;gBACjC,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,QAAQ;gBACxB,aAAa,EAAE,UAAU,eAAe;gBACxC,UAAU,EAAE,UAAU,YAAY;gBAClC,WAAW,EAAE,UAAU;gBACvB;cACF,iBAAiBC,WAAU;cAC3B,UAAU,QAAQ;;AAGpB,oBAAQ,IAAI,KAAK,UAAUC,kBAAiB,MAAM,CAAC,CAAC;AACpD;UACF,OAAO;AAEL,oBAAQ,IACN,MAAM,MAAM,0BAAqB,QAAQ,eAAe,6BAA6B,CAAC;AAExF;UACF;MAEJ;AAGA,YAAM,iBAAiB,MAAM,gBAAgB,UAAU;QACrD,MAAM,QAAQ;QACd,UAAU,QAAQ;QAClB,OAAO,QAAQ,MAAM;OACtB,GAEK,EAAE,iBAAiB,WAAW,iBAAiB,kBAAkB,mBAAkB,IAAK;AAG9F,UAAI,QAAQ,MAAM;AAGhB,YAAI,oBAAoB,oBAAoB;AAC1C,gBAAM,QAAsB;YAC1B,iBAAiB;YACjB,cAAa,oBAAI,KAAI,GAAG,YAAW;;AAErC,gBAAM,aAAa,OAAO,WAAW,GACrC,gBAAgB,WAAW;QAC7B;AAEA,gBAAQ,IAAI,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AACpD;MACF;AAGA,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,MAAM,KAAK,8BAAuB,CAAC,GACzC,QAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,OAAO,uDAAuD,CAAC,GACjF,QAAQ,IAAI,EAAE;AAEd,mBAAW,OAAO,iBAAiB;AACjC,gBAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,WAAW,GACzC,WAAW,IAAI,UAAU,YAAY;AAC3C,kBAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE;QACvD;AAEA,gBAAQ,IAAI,EAAE,GACd,MAAM,MAAM,IAAI,gEAAgE,CAAC;AAEjF;MACF;AAKA,UAFA,MAAM,MAAM,KAAK,8BAAuB,CAAC,GAErC,QAAQ,MAAM,OAAO;AACvB,cAAM,eAAe,MAAM,OAAO;UAChC,SAAS;UACT,SAAS,UAAU,IAAI,CAAC,OAAO;YAC7B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,UAAU,eAAe;YACjC;SACH;AAED,YAAI,SAAS,YAAY,GAAG;AAC1B,gBAAM,MAAM,IAAI,WAAW,CAAC;AAC5B;QACF;AAGA,cAAM,QAAsB;UAC1B,iBAAiB;UACjB,cAAa,oBAAI,KAAI,GAAG,YAAW;;AAErC,cAAM,aAAa,OAAO,WAAW,GAErC,MACE,MAAM,MACJ,6BAAwB,YAAY,wCAAwC,CAC7E;MAEL,WAEM,kBAAkB;AACpB,cAAM,QAAsB;UAC1B,iBAAiB;UACjB,cAAa,oBAAI,KAAI,GAAG,YAAW;;AAErC,cAAM,aAAa,OAAO,WAAW,GAErC,QAAQ,IACN,MAAM,MAAM,6BAAwB,gBAAgB,yBAAyB,CAAC,GAEhF,MAAM,MAAM,IAAI,qCAAqC,CAAC;MACxD;IAEJ,SAAS,OAAO;AACd,UAAI,iBAAiB;AAAU,cAAM;AAErC,YAAM,WAAW,gBAAgB,KAAK,GAChC,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,QAAQ;AAEV,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,OAAO,cAAc,sDAAsD,EAC3E,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;qDAI+C,EAEhD,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAe,MAAM,gBAAe,KAAO,QAAQ,IAAG;AAG5D,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,WACd,CAAC,qDAAqD,CAAC;AAK3D,YAAM,oBAAoB,MAAM,gBAAe;AAC/C,UAAI;AAaJ,UAZI,oBACF,SAAS,MAAM,QAAQ,OAAO,iBAAiB,IAG/C,SAAS;QACP,UAFe,MAAM,QAAQ,OAAM;QAGnC,SAAS;QACT,OAAO;SAKP,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC,GACvC,qBACF,MAAM,YAAY,QAAQ,mBAAmB,YAAY;AAE3D;MACF;AAGA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,iBAAiB,CAAC,GACzC,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC,GAErC,QAAQ,IACN,cAAc,OAAO,SAAS,YAAY,MAAM,MAAM,YAAO,IAAI,MAAM,IAAI,WAAM,CAAC,EAAE,GAGlF,OAAO,SAAS,eAClB,QAAQ,IAAI,WAAW,MAAM,IAAI,OAAO,SAAS,WAAW,CAAC,EAAE,GAG7D,OAAO,SAAS,WAClB,QAAQ,IAAI,YAAY,MAAM,IAAI,OAAO,SAAS,OAAO,CAAC,EAAE,GAI1D,OAAO,SAAS,cAClB,QAAQ,IACN,mBAAmB,OAAO,SAAS,iBAAiB,MAAM,MAAM,YAAO,IAAI,MAAM,OAAO,WAAM,CAAC,EAAE,GAGnG,QAAQ,IACN,mBAAmB,OAAO,SAAS,cAAc,MAAM,MAAM,YAAO,IAAI,MAAM,OAAO,WAAM,CAAC,EAAE,IAI9F,sBACF,QAAQ,IACN,YAAY,OAAO,UAAU,MAAM,MAAM,YAAO,IAAI,MAAM,OAAO,WAAM,CAAC,EAAE,GAGxE,OAAO,WACT,QAAQ,IACN,UAAU,OAAO,QAAQ,MAAM,MAAM,YAAO,IAAI,MAAM,OAAO,oCAA+B,CAAC,EAAE,GAG7F,OAAO,gBACT,QAAQ,IAAI,iBAAiB,MAAM,IAAI,OAAO,YAAY,CAAC,EAAE,KAG/D,QAAQ,IAAI,MAAM,IAAI,8CAA8C,CAAC,IAIzE,QAAQ,IAAI,EAAE,GAGV,qBACF,MAAM,YAAY,QAAQ,mBAAmB,YAAY;IAE7D,SAAS,OAAO;AACd,UAAI,iBAAiB;AAAU,cAAM;AAErC,YAAM,WAAW,gBAAgB,KAAK,GAChC,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,QAAQ;AAEV,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,OAAO,cAAc,sDAAsD,EAC3E,OAAO,WAAW,0CAA0C,EAC5D,YACC,SACA;;;;kEAI4D,EAE7D,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,WACd,CAAC,qDAAqD,CAAC;AAM3D,UAAI,EADc,MAAM,QAAQ,OAAM,GACvB,WAAW;AAIxB,cAAM,eAFS,MAAM,cAAc,KAAK,YAAY,GAC5B,oBAAmB,GACb,YAAY;AAE1C,cAAM,IAAI,SACR,2BAA2B,YAAY,IACvC,cAAc,MACd;UACE;UACA,UAAU,WAAW;SACtB;MAEL;AAGA,cAAQ,IAAI,yBAAyB,YAAY,KAAK;AACtD,YAAM,SAAS,MAAM,QAAQ,MAAM,aAAa,EAAE,OAAO,QAAQ,MAAK,CAAE;AAExE,cAAQ,IAAI,MAAM,MAAM,0BAAqB,CAAC,GAC9C,QAAQ,IAAI,YAAY,OAAO,UAAU,EAAE,GAC3C,QAAQ,IAAI,YAAY,OAAO,UAAU,EAAE,GAC3C,QAAQ,IAAI,eAAe,OAAO,QAAQ,EAAE;IAC9C,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,cAAc,MAAM;AAEtB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,WAAW,EACnB,YAAY,oDAAoD,EAChE,OAAO,cAAc,sDAAsD,EAC3E,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;+EAIyE,EAE1E,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,EADW,MAAM,QAAQ,OAAO,WAAW,GACnC;AACV,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,oDAAoD,CAAC;AAK1D,YAAM,YAAY,MAAM,QAAQ,UAAU,WAAW;AAGrD,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC9C;MACF;AAGA,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,IAAI,MAAM,OAAO,oBAAoB,CAAC;AAC9C;MACF;AAEA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,kBAAkB,UAAU,MAAM,UAAU,CAAC,GACpE,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,YAAM,cAAc,GACd,YAAY,IACZ,YAAY,IACZ,kBAAkB,IAClB,cAAc,IACd,kBAAkB,IAClB,YAAY;AAElB,cAAQ,IACN,MAAM,KACJ,GAAG,SAAS,OAAO,WAAW,CAAC,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI,cAAc,OAAO,eAAe,CAAC,IAAI,SAAS,OAAO,WAAW,CAAC,IAAI,aAAa,OAAO,eAAe,CAAC,OAAO,CAChN,GAEH,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,iBAAW,YAAY,WAAW;AAChC,cAAM,SAAS,SAAS,YAAY,OAAO,WAAW,GAChDC,QAAO,SAAS,UAAU,UAAU,GAAG,SAAS,EAAE,OAAO,SAAS,GAClE,OAAO,SAAS,eAAe,UAAU,GAAG,SAAS,EAAE,OAAO,SAAS,GACvE,aAAa,SAAS,sBAAsB,UAAU,GAAG,eAAe,EAAE,OAAO,eAAe,GAChG,SAAS,SAAS,cAAc,UAAU,GAAG,WAAW,EAAE,OAAO,WAAW,GAC5E,aAAa,SAAS,WAAW,YAAW,EAAG,OAAO,eAAe,GACrE,OAAO,SAAS,YAAY,UAAU,GAAG,SAAS;AAExD,gBAAQ,IAAI,GAAG,MAAM,IAAIA,KAAI,IAAI,IAAI,IAAI,UAAU,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE;MAClG;AAEA,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC,GACtC,QAAQ,IAAI,MAAM,IAAI,UAAU,UAAU,MAAM,cAAc,CAAC,GAC/D,QAAQ,IAAI,EAAE;IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,UAAU,EAClB,YAAY,sDAAsD,EAClE,OAAO,cAAc,sDAAsD,EAC3E,OAAO,mBAAmB,uCAAuC,EACjE,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;uDAIiD,EAElD,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,UAAI,WAAW,MAAM,QAAQ,SAAS,WAAW;AAQjD,UALI,QAAQ,UACV,WAAW,SAAS,OAAO,OAAK,EAAE,oBAAoB,QAAQ,KAAK,IAIjE,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;MACF;AAGA,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,MAAM,OAAO,mBAAmB,CAAC;AAC7C;MACF;AAEA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,aAAa,SAAS,MAAM,UAAU,CAAC,GAC9D,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,YAAM,YAAY,IACZ,aAAa,IACb,YAAY,IACZ,cAAc,IACd,kBAAkB,IAClB,YAAY;AAElB,cAAQ,IACN,MAAM,KACJ,GAAG,OAAO,OAAO,SAAS,CAAC,IAAI,QAAQ,OAAO,UAAU,CAAC,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI,SAAS,OAAO,WAAW,CAAC,IAAI,aAAa,OAAO,eAAe,CAAC,OAAO,CACrK,GAEH,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,iBAAW,WAAW,UAAU;AAC9B,cAAM,OAAO,QAAQ,eAAe,UAAU,GAAG,SAAS,EAAE,OAAO,SAAS,GACtE,QAAQ,QAAQ,gBAAgB,UAAU,GAAG,UAAU,EAAE,OAAO,UAAU,GAC1E,OAAO,QAAQ,uBAAuB,UAAU,GAAG,SAAS,EAAE,OAAO,SAAS,GAC9E,SAAS,QAAQ,cAAc,UAAU,GAAG,WAAW,EAAE,OAAO,WAAW,GAC3E,aAAa,QAAQ,WAAW,YAAW,EAAG,OAAO,eAAe,GACpE,OAAO,QAAQ,YAAY,UAAU,GAAG,SAAS;AAEvD,gBAAQ,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE;MACnF;AAEA,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC,GACtC,QAAQ,IAAI,MAAM,IAAI,UAAU,SAAS,MAAM,aAAa,CAAC,GAC7D,QAAQ,IAAI,EAAE;IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,YAAY,EACpB,YAAY,4DAA4D,EACxE,OAAO,cAAc,sDAAsD,EAC3E,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;mDAG6C,EAE9C,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,YAAM,aAAa,MAAM,QAAQ,WAAW,WAAW;AAGvD,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;MACF;AAGA,UAAI,WAAW,WAAW,GAAG;AAC3B,gBAAQ,IAAI,MAAM,OAAO,qBAAqB,CAAC;AAC/C;MACF;AAEA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,eAAe,WAAW,MAAM,UAAU,CAAC,GAClE,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,iBAAW,MAAM,YAAY;AAC3B,gBAAQ,IAAI,KAAK,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,GAChD,QAAQ,IAAI,oBAAoB;AAChC,mBAAW,YAAY,GAAG;AACxB,kBAAQ,IAAI,WAAW,SAAS,WAAW,KAAK,SAAS,cAAc,EAAE;AAE3E,QAAI,GAAG,SACL,QAAQ,IAAI,cAAc,GAAG,KAAK,EAAE,GAEtC,QAAQ,IAAI,EAAE;MAChB;AAEA,cAAQ,IAAI,MAAM,IAAI,UAAU,WAAW,MAAM,eAAe,CAAC,GACjE,QAAQ,IAAI,EAAE;IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,0BAA0B,EAClC,YAAY,oDAAoD,EAChE,OAAO,cAAc,sDAAsD,EAC3E,OAAO,eAAe,gEAAgE,GAAG,EACzF,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;iEAI2D,EAE5D,OAAO,OAAO,eAAe,YAAW;AACvC,QAAI;AAEF,YAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE;AACxC,UAAI,MAAM,KAAK,KAAK,QAAQ;AAC1B,cAAM,IAAI,SACR,qDACA,cAAc,IAAI;AAKtB,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,YAAM,UAAU,MAAM,QAAQ,QAAQ,aAAa,eAAe,KAAK;AAGvE,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;MACF;AAGA,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,IAAI,MAAM,OAAO,wBAAwB,aAAa,EAAE,CAAC;AACjE;MACF;AAEA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,cAAc,MAAM,KAAK,aAAa,CAAC,KAAK,QAAQ,MAAM,UAAU,CAAC,GAC5F,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,iBAAW,UAAU;AACnB,gBAAQ,IAAI,KAAK,MAAM,KAAK,OAAO,cAAc,CAAC,EAAE,GACpD,QAAQ,IAAI,aAAa,OAAO,WAAW,EAAE,GAC7C,QAAQ,IAAI,eAAe,OAAO,aAAa,EAAE,GACjD,QAAQ,IAAI,cAAc,OAAO,KAAK,EAAE,GACxC,QAAQ,IAAI,aAAa,OAAO,SAAS,EAAE,GAC3C,QAAQ,IAAI,EAAE;AAGhB,cAAQ,IAAI,MAAM,IAAI,UAAU,QAAQ,MAAM,YAAY,CAAC,GAC3D,QAAQ,IAAI,EAAE;IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,0BAA0B,EAClC,YAAY,oDAAoD,EAChE,OAAO,cAAc,sDAAsD,EAC3E,OAAO,eAAe,gEAAgE,GAAG,EACzF,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;iEAI2D,EAE5D,OAAO,OAAO,eAAe,YAAW;AACvC,QAAI;AAEF,YAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE;AACxC,UAAI,MAAM,KAAK,KAAK,QAAQ;AAC1B,cAAM,IAAI,SACR,qDACA,cAAc,IAAI;AAKtB,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,YAAM,UAAU,MAAM,QAAQ,QAAQ,aAAa,eAAe,KAAK;AAGvE,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;MACF;AAGA,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,IAAI,MAAM,OAAO,wBAAwB,aAAa,EAAE,CAAC;AACjE;MACF;AAEA,cAAQ,IAAI,EAAE,GACd,QAAQ,IAAI,MAAM,KAAK,cAAc,MAAM,KAAK,aAAa,CAAC,KAAK,QAAQ,MAAM,UAAU,CAAC,GAC5F,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,GAAG,CAAC,CAAC;AAGtC,iBAAW,UAAU;AACnB,gBAAQ,IAAI,KAAK,MAAM,KAAK,OAAO,cAAc,CAAC,EAAE,GACpD,QAAQ,IAAI,aAAa,OAAO,WAAW,EAAE,GAC7C,QAAQ,IAAI,eAAe,OAAO,aAAa,EAAE,GACjD,QAAQ,IAAI,cAAc,OAAO,KAAK,EAAE,GACxC,QAAQ,IAAI,aAAa,OAAO,SAAS,EAAE,GAC3C,QAAQ,IAAI,EAAE;AAGhB,cAAQ,IAAI,MAAM,IAAI,UAAU,QAAQ,MAAM,YAAY,CAAC,GAC3D,QAAQ,IAAI,EAAE;IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAMH,SACG,QAAQ,gBAAgB,EACxB,YAAY,+EAA+E,EAC3F,OAAO,cAAc,sDAAsD,EAC3E,OAAO,UAAU,mDAAmD,EACpE,YACC,UACA;;CACoE,EAErE,YACC,SACA;;;;;;;2DAOqD,EAEtD,OAAO,OAAO,QAAQ,YAAW;AAChC,QAAI;AAEF,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,YAAM,SAAS,MAAM,QAAQ,MAAM,aAAa,MAAM;AAKtD,MAAI,QAAQ,MAIZ,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;IAC7C,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC,GAKH,SACG,QAAQ,QAAQ,EAChB,YAAY,gEAAgE,EAC5E,OAAO,cAAc,sDAAsD,EAC3E,OAAO,mBAAmB,mDAAmD,CAAC,OAAO,aAC7E,WAAW,CAAC,GAAG,UAAU,KAAK,IAAI,CAAC,KAAK,CAChD,EACA,OAAO,UAAU,gBAAgB,EACjC,OAAO,qBAAqB,qDAAqD,EACjF,OAAO,mBAAmB,sBAAsB,EAChD,YACC,SACA;;;;;;;uEAOiE,EAElE,OAAO,OAAO,YAAW;AACxB,QAAI;AAEF,UAAI,SAAuC;AAC3C,UAAI,QAAQ;AAEV,QAAI,QAAQ,UACV,QAAQ,KAAK,MAAM,OAAO,oCAA+B,QAAQ,MAAM,6DAA6D,CAAC,GAEvI,SAAS;eACA,QAAQ,QAAQ;AACzB,cAAM,eAAe,CAAC,QAAQ,QAAQ,UAAU;AAChD,YAAI,CAAC,aAAa,SAAS,QAAQ,MAAM;AACvC,gBAAM,IAAI,SACR,oBAAoB,QAAQ,MAAM,wBAAwB,aAAa,KAAK,IAAI,CAAC,KACjF,cAAc,IAAI;AAGtB,iBAAS,QAAQ;MACnB,WAAW,QAAQ,QAAQ;AACzB,cAAM,MAAM,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAW;AACpD,QAAI,QAAQ,UACV,SAAS,SACA,QAAQ,QACjB,SAAS,aACA,OAET,QAAQ,KAAK,MAAM,OAAO,uCAAkC,GAAG,8CAA8C,CAAC;MAElH;AAGA,YAAM,cAAc,MAAM,gBAAe;AACzC,UAAI,CAAC;AACH,cAAM,IAAI,mBAAkB;AAI9B,YAAM,kBAAkB,QAAQ,SAAS,CAAC,KAAK,GACzC,YAAY,gBAAgB,OAAO,CAAC,UAAkB,UAAU,KAAK,GACrE,eAAe,gBAAgB,OAAO,CAAC,UAAkB,UAAU,KAAK;AAG9E,iBAAW,SAAS;AAClB,gBAAQ,IAAI,MAAM,IAAI,wCAAwC,KAAK,GAAG,CAAC;AAIzE,UAAI,UAAU,WAAW;AACvB;AAIF,UAAI,eAAe,QAAQ;AAC3B,UAAI,CAAC,cAAc;AACjB,cAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,YAAI,CAAC;AACH,gBAAM,IAAI,SACR,2DACA,cAAc,IAAI;AAGtB,uBAAe,QAAQ;MACzB;AAGA,YAAM,WAAW,iBAAiB,YAAW;AAC7C,YAAM,SAAS,WAAU;AACzB,YAAM,UAAU,MAAM,SAAS,YAAY,YAAY;AAEvD,UAAI,CAAC;AACH,cAAM,IAAI,SACR,uBAAuB,YAAY,IACnC,cAAc,SAAS;AAM3B,UAAI,CADc,MAAM,cAAc,aAAa,YAAY;AAE7D,cAAM,IAAI,SACR,uBACA,cAAc,MACd,CAAC,+BAA+B,CAAC;AAKrC,YAAM,SAAS,MAAM,QAAQ,OAAO,aAAa;QAC/C,QAAQ;QACR,gBAAgB;OACjB,GAEK,YAAY,mBAAmB,QAAQ,EAAE,OAAM,CAAE;AAGvD,UAAI,QAAQ,QAAQ;AAClB,cAAM,aAAa,KAAK,QAAQ,QAAQ,MAAM;AAC9C,cAAM,GAAG,UAAU,YAAY,WAAW,OAAO,GACjD,QAAQ,IAAI,MAAM,MAAM,4BAAuB,UAAU,EAAE,CAAC;AAC5D;MACF;AAGA,cAAQ,IAAI,SAAS;IACvB,SAAS,OAAO;AACd,UAAI,iBAAiB,YAAY,iBAAiB;AAAoB,cAAM;AAC5E,YAAM,WAAW,IAAI,SACnB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,gBAAgB,KAAK,CAAC;AAExB,YAAI,iBAAiB,UACnB,SAAS,QAAQ,QAEb;IACR;EACF,CAAC;AACL;",
6
+ "names": ["analyzerOptions", "installed", "discoveryResult", "path"]
7
+ }
@@ -0,0 +1,49 @@
1
+ import ansis from "ansis";
2
+ import { CLIError, getErrorMessage } from "../utils/errors.js";
3
+ import { SnapshotStorage } from "../audit/snapshot-storage.js";
4
+ import { DifferentialAnalyzer } from "../audit/differential-analyzer.js";
5
+ import { formatDifferentialAnalysis } from "../export/diff-formatters.js";
6
+ import { writeFile, ensureDir } from "../utils/file-io.js";
7
+ import path from "path";
8
+ async function auditDiffCommand(options) {
9
+ try {
10
+ const storage = new SnapshotStorage(), analyzer = new DifferentialAnalyzer();
11
+ let beforeReport, afterReport;
12
+ if (options.before && options.after)
13
+ options.debug && console.log(ansis.dim(`Loading before snapshot: ${options.before}...`)), beforeReport = await storage.load(options.before), options.debug && console.log(ansis.dim(`Loading after snapshot: ${options.after}...`)), afterReport = await storage.load(options.after);
14
+ else {
15
+ options.debug && console.log(ansis.dim("Loading latest two snapshots..."));
16
+ const [before, after] = await storage.getLatestPair();
17
+ if (!before || !after)
18
+ throw new CLIError("Not enough snapshots available for comparison. Run 'dr audit --save-snapshot' to create snapshots.");
19
+ beforeReport = before, afterReport = after;
20
+ }
21
+ options.debug && console.log(ansis.dim("Performing differential analysis..."));
22
+ const analysis = analyzer.analyze(beforeReport, afterReport);
23
+ let format = "text";
24
+ if (options.format)
25
+ format = options.format;
26
+ else if (options.output) {
27
+ const ext = path.extname(options.output).toLowerCase();
28
+ ext === ".json" ? format = "json" : ext === ".md" && (format = "markdown");
29
+ }
30
+ const output = formatDifferentialAnalysis(analysis, {
31
+ format,
32
+ verbose: options.verbose || !1,
33
+ beforeTimestamp: beforeReport.timestamp,
34
+ afterTimestamp: afterReport.timestamp
35
+ });
36
+ if (options.output) {
37
+ const outputPath = path.resolve(process.cwd(), options.output), outputDir = path.dirname(outputPath);
38
+ await ensureDir(outputDir), await writeFile(outputPath, output), console.log(ansis.green(`\u2713 Differential analysis written to ${options.output}`));
39
+ } else
40
+ console.log(output);
41
+ } catch (error) {
42
+ const message = getErrorMessage(error);
43
+ throw options.debug && console.error(error), new CLIError(`Audit diff failed: ${message}`);
44
+ }
45
+ }
46
+ export {
47
+ auditDiffCommand
48
+ };
49
+ //# sourceMappingURL=audit-diff.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/audit-diff.ts"],
4
+ "sourcesContent": ["/**\n * Audit diff command - Compare before/after audit snapshots\n */\n\nimport ansis from \"ansis\";\nimport { CLIError, getErrorMessage } from \"../utils/errors.js\";\nimport { SnapshotStorage } from \"../audit/snapshot-storage.js\";\nimport { DifferentialAnalyzer } from \"../audit/differential-analyzer.js\";\nimport { formatDifferentialAnalysis } from \"../export/diff-formatters.js\";\nimport { writeFile, ensureDir } from \"../utils/file-io.js\";\nimport path from \"path\";\n\nexport interface AuditDiffOptions {\n before?: string; // Snapshot ID or timestamp\n after?: string; // Snapshot ID or timestamp\n format?: \"text\" | \"json\" | \"markdown\";\n output?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\n/**\n * Run the audit diff command\n */\nexport async function auditDiffCommand(\n options: AuditDiffOptions,\n): Promise<void> {\n try {\n const storage = new SnapshotStorage();\n const analyzer = new DifferentialAnalyzer();\n\n // Load snapshots\n let beforeReport;\n let afterReport;\n\n if (options.before && options.after) {\n // Explicit snapshot IDs/timestamps provided\n if (options.debug) {\n console.log(\n ansis.dim(`Loading before snapshot: ${options.before}...`),\n );\n }\n beforeReport = await storage.load(options.before);\n\n if (options.debug) {\n console.log(ansis.dim(`Loading after snapshot: ${options.after}...`));\n }\n afterReport = await storage.load(options.after);\n } else {\n // Auto-detect: compare latest two snapshots\n if (options.debug) {\n console.log(ansis.dim(\"Loading latest two snapshots...\"));\n }\n\n const [before, after] = await storage.getLatestPair();\n\n if (!before || !after) {\n throw new CLIError(\n \"Not enough snapshots available for comparison. Run 'dr audit --save-snapshot' to create snapshots.\",\n );\n }\n\n beforeReport = before;\n afterReport = after;\n }\n\n if (options.debug) {\n console.log(ansis.dim(\"Performing differential analysis...\"));\n }\n\n // Perform differential analysis\n const analysis = analyzer.analyze(beforeReport, afterReport);\n\n // Determine output format\n // Explicit format flag takes precedence over auto-detection\n let format: \"text\" | \"json\" | \"markdown\" = \"text\";\n\n if (options.format) {\n // User explicitly specified format - use it\n format = options.format;\n } else if (options.output) {\n // No explicit format - auto-detect from file extension\n const ext = path.extname(options.output).toLowerCase();\n if (ext === \".json\") {\n format = \"json\";\n } else if (ext === \".md\") {\n format = \"markdown\";\n }\n }\n\n // Format output\n const output = formatDifferentialAnalysis(analysis, {\n format,\n verbose: options.verbose || false,\n beforeTimestamp: beforeReport.timestamp,\n afterTimestamp: afterReport.timestamp,\n });\n\n // Write to file or stdout\n if (options.output) {\n const outputPath = path.resolve(process.cwd(), options.output);\n const outputDir = path.dirname(outputPath);\n\n await ensureDir(outputDir);\n await writeFile(outputPath, output);\n\n console.log(\n ansis.green(`\u2713 Differential analysis written to ${options.output}`),\n );\n } else {\n console.log(output);\n }\n } catch (error) {\n const message = getErrorMessage(error);\n if (options.debug) {\n console.error(error);\n }\n throw new CLIError(`Audit diff failed: ${message}`);\n }\n}\n"],
5
+ "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,UAAU,uBAAuB;AAC1C,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AACrC,SAAS,kCAAkC;AAC3C,SAAS,WAAW,iBAAiB;AACrC,OAAO,UAAU;AAcjB,eAAsB,iBACpB,SAAyB;AAEzB,MAAI;AACF,UAAM,UAAU,IAAI,gBAAe,GAC7B,WAAW,IAAI,qBAAoB;AAGzC,QAAI,cACA;AAEJ,QAAI,QAAQ,UAAU,QAAQ;AAE5B,MAAI,QAAQ,SACV,QAAQ,IACN,MAAM,IAAI,4BAA4B,QAAQ,MAAM,KAAK,CAAC,GAG9D,eAAe,MAAM,QAAQ,KAAK,QAAQ,MAAM,GAE5C,QAAQ,SACV,QAAQ,IAAI,MAAM,IAAI,2BAA2B,QAAQ,KAAK,KAAK,CAAC,GAEtE,cAAc,MAAM,QAAQ,KAAK,QAAQ,KAAK;SACzC;AAEL,MAAI,QAAQ,SACV,QAAQ,IAAI,MAAM,IAAI,iCAAiC,CAAC;AAG1D,YAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,cAAa;AAEnD,UAAI,CAAC,UAAU,CAAC;AACd,cAAM,IAAI,SACR,oGAAoG;AAIxG,qBAAe,QACf,cAAc;IAChB;AAEA,IAAI,QAAQ,SACV,QAAQ,IAAI,MAAM,IAAI,qCAAqC,CAAC;AAI9D,UAAM,WAAW,SAAS,QAAQ,cAAc,WAAW;AAI3D,QAAI,SAAuC;AAE3C,QAAI,QAAQ;AAEV,eAAS,QAAQ;aACR,QAAQ,QAAQ;AAEzB,YAAM,MAAM,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAW;AACpD,MAAI,QAAQ,UACV,SAAS,SACA,QAAQ,UACjB,SAAS;IAEb;AAGA,UAAM,SAAS,2BAA2B,UAAU;MAClD;MACA,SAAS,QAAQ,WAAW;MAC5B,iBAAiB,aAAa;MAC9B,gBAAgB,YAAY;KAC7B;AAGD,QAAI,QAAQ,QAAQ;AAClB,YAAM,aAAa,KAAK,QAAQ,QAAQ,IAAG,GAAI,QAAQ,MAAM,GACvD,YAAY,KAAK,QAAQ,UAAU;AAEzC,YAAM,UAAU,SAAS,GACzB,MAAM,UAAU,YAAY,MAAM,GAElC,QAAQ,IACN,MAAM,MAAM,2CAAsC,QAAQ,MAAM,EAAE,CAAC;IAEvE;AACE,cAAQ,IAAI,MAAM;EAEtB,SAAS,OAAO;AACd,UAAM,UAAU,gBAAgB,KAAK;AACrC,UAAI,QAAQ,SACV,QAAQ,MAAM,KAAK,GAEf,IAAI,SAAS,sBAAsB,OAAO,EAAE;EACpD;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,62 @@
1
+ import ansis from "ansis";
2
+ import { CLIError, getErrorMessage } from "../utils/errors.js";
3
+ import { SnapshotStorage } from "../audit/snapshot-storage.js";
4
+ import { formatDate } from "../utils/date-utils.js";
5
+ async function auditSnapshotsCommand(options) {
6
+ try {
7
+ const storage = new SnapshotStorage();
8
+ switch (options.action) {
9
+ case "list":
10
+ await listSnapshots(storage);
11
+ break;
12
+ case "delete":
13
+ if (!options.id)
14
+ throw new CLIError("Snapshot ID required for delete action. Use --id <snapshot-id>");
15
+ await deleteSnapshot(storage, options.id);
16
+ break;
17
+ case "clear":
18
+ await clearSnapshots(storage);
19
+ break;
20
+ default:
21
+ throw new CLIError(`Unknown action: ${options.action}. Use 'list', 'delete', or 'clear'.`);
22
+ }
23
+ } catch (error) {
24
+ const message = getErrorMessage(error);
25
+ throw options.debug && console.error(error), new CLIError(`Snapshot management failed: ${message}`);
26
+ }
27
+ }
28
+ async function listSnapshots(storage) {
29
+ const snapshots = await storage.list();
30
+ if (snapshots.length === 0) {
31
+ console.log(ansis.dim("No snapshots available.")), console.log(ansis.dim(`
32
+ Run 'dr audit --save-snapshot' to create a snapshot.`));
33
+ return;
34
+ }
35
+ console.log(ansis.bold(`
36
+ Audit Snapshots:`)), console.log(ansis.dim("\u2500".repeat(80)));
37
+ for (const snapshot of snapshots) {
38
+ const timestamp = formatDate(snapshot.timestamp);
39
+ console.log(ansis.bold(`
40
+ ${ansis.cyan(snapshot.id)}`)), console.log(` Timestamp: ${timestamp}`), console.log(` Model: ${snapshot.modelName} v${snapshot.modelVersion}`), console.log(` Layers: ${snapshot.layers.join(", ")}`);
41
+ }
42
+ console.log(ansis.dim(`
43
+ ` + "\u2500".repeat(80))), console.log(ansis.dim(`
44
+ Total: ${snapshots.length} snapshot${snapshots.length === 1 ? "" : "s"}`));
45
+ }
46
+ async function deleteSnapshot(storage, id) {
47
+ if (!(await storage.list()).some((s) => s.id === id))
48
+ throw new CLIError(`Snapshot not found: ${id}`);
49
+ await storage.delete(id), console.log(ansis.green(`\u2713 Snapshot deleted: ${id}`));
50
+ }
51
+ async function clearSnapshots(storage) {
52
+ const count = (await storage.list()).length;
53
+ if (count === 0) {
54
+ console.log(ansis.dim("No snapshots to clear."));
55
+ return;
56
+ }
57
+ await storage.clear(), console.log(ansis.green(`\u2713 Cleared ${count} snapshot${count === 1 ? "" : "s"}`));
58
+ }
59
+ export {
60
+ auditSnapshotsCommand
61
+ };
62
+ //# sourceMappingURL=audit-snapshots.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/audit-snapshots.ts"],
4
+ "sourcesContent": ["/**\n * Audit snapshots command - Manage audit snapshots\n */\n\nimport ansis from \"ansis\";\nimport { CLIError, getErrorMessage } from \"../utils/errors.js\";\nimport { SnapshotStorage } from \"../audit/snapshot-storage.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\n\nexport interface AuditSnapshotsOptions {\n action: \"list\" | \"delete\" | \"clear\";\n id?: string; // For delete action\n debug?: boolean;\n}\n\n/**\n * Run the audit snapshots command\n */\nexport async function auditSnapshotsCommand(\n options: AuditSnapshotsOptions,\n): Promise<void> {\n try {\n const storage = new SnapshotStorage();\n\n switch (options.action) {\n case \"list\":\n await listSnapshots(storage);\n break;\n\n case \"delete\":\n if (!options.id) {\n throw new CLIError(\n \"Snapshot ID required for delete action. Use --id <snapshot-id>\",\n );\n }\n await deleteSnapshot(storage, options.id);\n break;\n\n case \"clear\":\n await clearSnapshots(storage);\n break;\n\n default:\n throw new CLIError(\n `Unknown action: ${options.action}. Use 'list', 'delete', or 'clear'.`,\n );\n }\n } catch (error) {\n const message = getErrorMessage(error);\n if (options.debug) {\n console.error(error);\n }\n throw new CLIError(`Snapshot management failed: ${message}`);\n }\n}\n\n/**\n * List all snapshots\n */\nasync function listSnapshots(storage: SnapshotStorage): Promise<void> {\n const snapshots = await storage.list();\n\n if (snapshots.length === 0) {\n console.log(ansis.dim(\"No snapshots available.\"));\n console.log(\n ansis.dim(\"\\nRun 'dr audit --save-snapshot' to create a snapshot.\"),\n );\n return;\n }\n\n console.log(ansis.bold(\"\\nAudit Snapshots:\"));\n console.log(ansis.dim(\"\u2500\".repeat(80)));\n\n for (const snapshot of snapshots) {\n const timestamp = formatDate(snapshot.timestamp);\n console.log(\n ansis.bold(`\\n${ansis.cyan(snapshot.id)}`),\n );\n console.log(` Timestamp: ${timestamp}`);\n console.log(` Model: ${snapshot.modelName} v${snapshot.modelVersion}`);\n console.log(` Layers: ${snapshot.layers.join(\", \")}`);\n }\n\n console.log(ansis.dim(\"\\n\" + \"\u2500\".repeat(80)));\n console.log(\n ansis.dim(\n `\\nTotal: ${snapshots.length} snapshot${snapshots.length === 1 ? \"\" : \"s\"}`,\n ),\n );\n}\n\n/**\n * Delete a specific snapshot\n */\nasync function deleteSnapshot(\n storage: SnapshotStorage,\n id: string,\n): Promise<void> {\n // Verify snapshot exists before deletion\n const snapshots = await storage.list();\n if (!snapshots.some((s) => s.id === id)) {\n throw new CLIError(`Snapshot not found: ${id}`);\n }\n\n await storage.delete(id);\n console.log(ansis.green(`\u2713 Snapshot deleted: ${id}`));\n}\n\n/**\n * Clear all snapshots\n */\nasync function clearSnapshots(storage: SnapshotStorage): Promise<void> {\n const snapshots = await storage.list();\n const count = snapshots.length;\n\n if (count === 0) {\n console.log(ansis.dim(\"No snapshots to clear.\"));\n return;\n }\n\n await storage.clear();\n console.log(\n ansis.green(\n `\u2713 Cleared ${count} snapshot${count === 1 ? \"\" : \"s\"}`,\n ),\n );\n}\n"],
5
+ "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,UAAU,uBAAuB;AAC1C,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAW3B,eAAsB,sBACpB,SAA8B;AAE9B,MAAI;AACF,UAAM,UAAU,IAAI,gBAAe;AAEnC,YAAQ,QAAQ,QAAQ;MACtB,KAAK;AACH,cAAM,cAAc,OAAO;AAC3B;MAEF,KAAK;AACH,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,SACR,gEAAgE;AAGpE,cAAM,eAAe,SAAS,QAAQ,EAAE;AACxC;MAEF,KAAK;AACH,cAAM,eAAe,OAAO;AAC5B;MAEF;AACE,cAAM,IAAI,SACR,mBAAmB,QAAQ,MAAM,qCAAqC;IAE5E;EACF,SAAS,OAAO;AACd,UAAM,UAAU,gBAAgB,KAAK;AACrC,UAAI,QAAQ,SACV,QAAQ,MAAM,KAAK,GAEf,IAAI,SAAS,+BAA+B,OAAO,EAAE;EAC7D;AACF;AAKA,eAAe,cAAc,SAAwB;AACnD,QAAM,YAAY,MAAM,QAAQ,KAAI;AAEpC,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,MAAM,IAAI,yBAAyB,CAAC,GAChD,QAAQ,IACN,MAAM,IAAI;qDAAwD,CAAC;AAErE;EACF;AAEA,UAAQ,IAAI,MAAM,KAAK;iBAAoB,CAAC,GAC5C,QAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,WAAW,SAAS,SAAS;AAC/C,YAAQ,IACN,MAAM,KAAK;EAAK,MAAM,KAAK,SAAS,EAAE,CAAC,EAAE,CAAC,GAE5C,QAAQ,IAAI,gBAAgB,SAAS,EAAE,GACvC,QAAQ,IAAI,gBAAgB,SAAS,SAAS,KAAK,SAAS,YAAY,EAAE,GAC1E,QAAQ,IAAI,gBAAgB,SAAS,OAAO,KAAK,IAAI,CAAC,EAAE;EAC1D;AAEA,UAAQ,IAAI,MAAM,IAAI;IAAO,SAAI,OAAO,EAAE,CAAC,CAAC,GAC5C,QAAQ,IACN,MAAM,IACJ;SAAY,UAAU,MAAM,YAAY,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE,CAC5E;AAEL;AAKA,eAAe,eACb,SACA,IAAU;AAIV,MAAI,EADc,MAAM,QAAQ,KAAI,GACrB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpC,UAAM,IAAI,SAAS,uBAAuB,EAAE,EAAE;AAGhD,QAAM,QAAQ,OAAO,EAAE,GACvB,QAAQ,IAAI,MAAM,MAAM,4BAAuB,EAAE,EAAE,CAAC;AACtD;AAKA,eAAe,eAAe,SAAwB;AAEpD,QAAM,SADY,MAAM,QAAQ,KAAI,GACZ;AAExB,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,MAAM,IAAI,wBAAwB,CAAC;AAC/C;EACF;AAEA,QAAM,QAAQ,MAAK,GACnB,QAAQ,IACN,MAAM,MACJ,kBAAa,KAAK,YAAY,UAAU,IAAI,KAAK,GAAG,EAAE,CACvD;AAEL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ import ansis from "ansis";
2
+ import { writeFile, ensureDir } from "../utils/file-io.js";
3
+ import { getErrorMessage, CLIError } from "../utils/errors.js";
4
+ import { formatAuditReport, formatNodeAuditReport } from "../export/audit-formatters.js";
5
+ import { SnapshotStorage } from "../audit/snapshot-storage.js";
6
+ import { ModelAuditOrchestrator } from "../audit/relationships/model/orchestrator.js";
7
+ import { ModelNodeAuditOrchestrator } from "../audit/nodes/model/orchestrator.js";
8
+ import { formatDate } from "../utils/date-utils.js";
9
+ import path from "path";
10
+ async function auditCommand(options) {
11
+ try {
12
+ const validAuditTypes = ["relationships", "nodes", "all"];
13
+ if (options.type && !validAuditTypes.includes(options.type))
14
+ throw new CLIError(`Invalid audit type: "${options.type}". Valid values are: ${validAuditTypes.join(", ")}.`);
15
+ const auditType = options.type ?? "relationships";
16
+ let format = "text";
17
+ if (options.format)
18
+ format = options.format;
19
+ else if (options.output) {
20
+ const ext = path.extname(options.output).toLowerCase();
21
+ ext === ".json" ? format = "json" : ext === ".md" && (format = "markdown");
22
+ }
23
+ let output;
24
+ if (auditType === "nodes") {
25
+ const report = await new ModelNodeAuditOrchestrator().runAudit({
26
+ layer: options.layer,
27
+ verbose: options.verbose,
28
+ projectRoot: process.cwd()
29
+ });
30
+ output = formatNodeAuditReport(report, { format, verbose: options.verbose });
31
+ } else if (auditType === "all") {
32
+ const [relResult, nodeResult] = await Promise.allSettled([
33
+ new ModelAuditOrchestrator().runAudit({
34
+ layer: options.layer,
35
+ verbose: options.verbose,
36
+ debug: options.debug,
37
+ projectRoot: process.cwd()
38
+ }),
39
+ new ModelNodeAuditOrchestrator().runAudit({
40
+ layer: options.layer,
41
+ verbose: options.verbose,
42
+ projectRoot: process.cwd()
43
+ })
44
+ ]);
45
+ let relOutput, nodeOutput;
46
+ if (relResult.status === "fulfilled" ? relOutput = formatAuditReport(relResult.value, { format, verbose: options.verbose }) : console.error(ansis.red(`\u26A0\uFE0F Relationship audit failed: ${getErrorMessage(relResult.reason)}`)), nodeResult.status === "fulfilled" ? nodeOutput = formatNodeAuditReport(nodeResult.value, { format, verbose: options.verbose }) : console.error(ansis.red(`\u26A0\uFE0F Node audit failed: ${getErrorMessage(nodeResult.reason)}`)), !relOutput && !nodeOutput)
47
+ throw new CLIError("Both audit types failed. See errors above.");
48
+ if (format === "json") {
49
+ const merged = {};
50
+ relOutput && (merged.relationships = JSON.parse(relOutput)), nodeOutput && (merged.nodes = JSON.parse(nodeOutput)), output = JSON.stringify(merged, null, 2);
51
+ } else
52
+ output = [relOutput, nodeOutput].filter(Boolean).join(`
53
+
54
+ `);
55
+ } else {
56
+ const report = await new ModelAuditOrchestrator().runAudit({
57
+ layer: options.layer,
58
+ verbose: options.verbose,
59
+ debug: options.debug,
60
+ projectRoot: process.cwd()
61
+ });
62
+ if (output = formatAuditReport(report, { format, verbose: options.verbose }), options.saveSnapshot) {
63
+ options.debug && console.log(ansis.dim("Saving audit snapshot..."));
64
+ const metadata = await new SnapshotStorage().save(report);
65
+ console.log(ansis.green(`\u2713 Snapshot saved: ${metadata.id}`)), console.log(ansis.dim(` Timestamp: ${formatDate(metadata.timestamp)}`));
66
+ }
67
+ }
68
+ if (options.output) {
69
+ const outputPath = path.resolve(process.cwd(), options.output), outputDir = path.dirname(outputPath);
70
+ await ensureDir(outputDir), await writeFile(outputPath, output), console.log(ansis.green(`\u2713 Audit report written to ${options.output}`));
71
+ } else
72
+ console.log(output);
73
+ } catch (error) {
74
+ const message = getErrorMessage(error);
75
+ throw options.debug && console.error(error), new CLIError(`Audit failed: ${message}`);
76
+ }
77
+ }
78
+ export {
79
+ auditCommand
80
+ };
81
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/audit.ts"],
4
+ "sourcesContent": ["/**\n * Audit command - Analyze relationship coverage, gaps, duplicates, and balance\n */\n\nimport ansis from \"ansis\";\nimport { writeFile, ensureDir } from \"../utils/file-io.js\";\nimport { getErrorMessage, CLIError } from \"../utils/errors.js\";\nimport {\n formatAuditReport,\n formatNodeAuditReport,\n AuditReportFormat,\n} from \"../export/audit-formatters.js\";\nimport { SnapshotStorage } from \"../audit/snapshot-storage.js\";\nimport { ModelAuditOrchestrator } from \"../audit/relationships/model/orchestrator.js\";\nimport { ModelNodeAuditOrchestrator } from \"../audit/nodes/model/orchestrator.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\nimport path from \"path\";\n\nexport type AuditType = \"relationships\" | \"nodes\" | \"all\";\n\nexport interface AuditOptions {\n layer?: string;\n type?: AuditType;\n format?: AuditReportFormat;\n output?: string;\n verbose?: boolean;\n debug?: boolean;\n saveSnapshot?: boolean;\n}\n\n/**\n * Run the audit command\n */\nexport async function auditCommand(options: AuditOptions): Promise<void> {\n try {\n const validAuditTypes: AuditType[] = [\"relationships\", \"nodes\", \"all\"];\n if (options.type && !validAuditTypes.includes(options.type)) {\n throw new CLIError(\n `Invalid audit type: \"${options.type}\". Valid values are: ${validAuditTypes.join(\", \")}.`\n );\n }\n const auditType: AuditType = options.type ?? \"relationships\";\n\n // Determine output format\n let format: AuditReportFormat = \"text\";\n if (options.format) {\n format = options.format;\n } else if (options.output) {\n const ext = path.extname(options.output).toLowerCase();\n if (ext === \".json\") {\n format = \"json\";\n } else if (ext === \".md\") {\n format = \"markdown\";\n }\n }\n\n let output: string;\n\n if (auditType === \"nodes\") {\n // Node type audit - analyzes element types in the model\n const orchestrator = new ModelNodeAuditOrchestrator();\n const report = await orchestrator.runAudit({\n layer: options.layer,\n verbose: options.verbose,\n projectRoot: process.cwd(),\n });\n\n output = formatNodeAuditReport(report, { format, verbose: options.verbose });\n } else if (auditType === \"all\") {\n // Combined audit - run both independently; one failing does not suppress the other\n const [relResult, nodeResult] = await Promise.allSettled([\n new ModelAuditOrchestrator().runAudit({\n layer: options.layer,\n verbose: options.verbose,\n debug: options.debug,\n projectRoot: process.cwd(),\n }),\n new ModelNodeAuditOrchestrator().runAudit({\n layer: options.layer,\n verbose: options.verbose,\n projectRoot: process.cwd(),\n }),\n ]);\n\n let relOutput: string | undefined;\n let nodeOutput: string | undefined;\n\n if (relResult.status === \"fulfilled\") {\n relOutput = formatAuditReport(relResult.value, { format, verbose: options.verbose });\n } else {\n console.error(ansis.red(`\u26A0\uFE0F Relationship audit failed: ${getErrorMessage(relResult.reason)}`));\n }\n if (nodeResult.status === \"fulfilled\") {\n nodeOutput = formatNodeAuditReport(nodeResult.value, { format, verbose: options.verbose });\n } else {\n console.error(ansis.red(`\u26A0\uFE0F Node audit failed: ${getErrorMessage(nodeResult.reason)}`));\n }\n\n if (!relOutput && !nodeOutput) {\n throw new CLIError(\"Both audit types failed. See errors above.\");\n }\n\n if (format === \"json\") {\n const merged: Record<string, unknown> = {};\n if (relOutput) merged.relationships = JSON.parse(relOutput);\n if (nodeOutput) merged.nodes = JSON.parse(nodeOutput);\n output = JSON.stringify(merged, null, 2);\n } else {\n output = [relOutput, nodeOutput].filter(Boolean).join(\"\\n\\n\");\n }\n } else {\n // Default: relationships audit - analyzes the project's actual relationship instances\n const orchestrator = new ModelAuditOrchestrator();\n const report = await orchestrator.runAudit({\n layer: options.layer,\n verbose: options.verbose,\n debug: options.debug,\n projectRoot: process.cwd(),\n });\n\n output = formatAuditReport(report, { format, verbose: options.verbose });\n\n // Save snapshot if requested (relationships audit only)\n if (options.saveSnapshot) {\n if (options.debug) {\n console.log(ansis.dim(\"Saving audit snapshot...\"));\n }\n\n const storage = new SnapshotStorage();\n const metadata = await storage.save(report);\n\n console.log(ansis.green(`\u2713 Snapshot saved: ${metadata.id}`));\n console.log(ansis.dim(` Timestamp: ${formatDate(metadata.timestamp)}`));\n }\n }\n\n // Write to file or stdout\n if (options.output) {\n const outputPath = path.resolve(process.cwd(), options.output);\n const outputDir = path.dirname(outputPath);\n\n await ensureDir(outputDir);\n await writeFile(outputPath, output);\n\n console.log(ansis.green(`\u2713 Audit report written to ${options.output}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n const message = getErrorMessage(error);\n if (options.debug) {\n console.error(error);\n }\n throw new CLIError(`Audit failed: ${message}`);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }