@documentation-robotics/cli 0.1.0 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +208 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +162 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +42 -16
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -0,0 +1,511 @@
1
+ import { intro, outro, select, isCancel } from "@clack/prompts";
2
+ import ansis from "ansis";
3
+ import { promises as fs } from "fs";
4
+ import * as path from "path";
5
+ import { AnalyzerRegistry } from "../analyzers/registry.js";
6
+ import { MappingLoader } from "../analyzers/mapping-loader.js";
7
+ import { readSession, writeSession, writeStatus, readIndexMeta } from "../analyzers/session-state.js";
8
+ import { CLIError, ModelNotFoundError, ErrorCategory, categorizeError } from "../utils/errors.js";
9
+ import { findProjectRoot } from "../utils/project-paths.js";
10
+ import { performDiscover } from "./discover-logic.js";
11
+ import { formatVerifyReport } from "../export/verify-formatters.js";
12
+ function analyzerCommands(program) {
13
+ const analyzer = program.command("analyzer").description("Manage analyzer discovery and indexing");
14
+ analyzer.command("discover").description("Discover and select an analyzer").option("--json", "Output as JSON").option("--reselect", "Force re-selection even if analyzer already selected").addHelpText("after", `
15
+ Examples:
16
+ $ dr analyzer discover # Scan and select analyzer
17
+ $ dr analyzer discover --reselect # Force re-selection
18
+ $ dr analyzer discover --json # Output discovery results as JSON`).action(async (options) => {
19
+ try {
20
+ const projectRoot = await findProjectRoot() || process.cwd(), registry = AnalyzerRegistry.getInstance();
21
+ if (await registry.initialize(), !options.reselect) {
22
+ const session = await readSession(projectRoot);
23
+ if (session)
24
+ if (options.json) {
25
+ const analyzerNames = await registry.getAnalyzerNames(), analyzerOptions2 = [];
26
+ for (const name of analyzerNames)
27
+ try {
28
+ const backend = await registry.getAnalyzer(name);
29
+ if (!backend)
30
+ continue;
31
+ const detection = await backend.detect(), metadata = (await MappingLoader.load(name)).getAnalyzerMetadata();
32
+ analyzerOptions2.push({ backend, detection, metadata });
33
+ } catch (error) {
34
+ const errorMsg = error instanceof Error ? error.message : String(error);
35
+ console.error(`Failed to discover analyzer "${name}": ${errorMsg}`);
36
+ }
37
+ const installed2 = analyzerOptions2.filter((a) => a.detection.installed), discoveryResult2 = {
38
+ found: analyzerOptions2.map((a) => ({
39
+ name: a.backend.name,
40
+ display_name: a.backend.displayName,
41
+ description: a.metadata?.description || "",
42
+ homepage: a.metadata?.homepage || "",
43
+ installed: a.detection.installed
44
+ })),
45
+ installed_count: installed2.length,
46
+ selected: session.active_analyzer
47
+ };
48
+ console.log(JSON.stringify(discoveryResult2, null, 2));
49
+ return;
50
+ } else {
51
+ console.log(ansis.green(`\u2713 Using analyzer: ${session.active_analyzer} (use --reselect to change)`));
52
+ return;
53
+ }
54
+ }
55
+ const discoverResult = await performDiscover(registry, {
56
+ json: options.json,
57
+ reselect: options.reselect,
58
+ isTTY: process.stdin.isTTY
59
+ }), { discoveryResult, installed, analyzerOptions, selectedAnalyzer, shouldWriteSession } = discoverResult;
60
+ if (options.json) {
61
+ if (selectedAnalyzer && shouldWriteSession) {
62
+ const state = {
63
+ active_analyzer: selectedAnalyzer,
64
+ selected_at: (/* @__PURE__ */ new Date()).toISOString()
65
+ };
66
+ await writeSession(state, projectRoot), discoveryResult.selected = selectedAnalyzer;
67
+ }
68
+ console.log(JSON.stringify(discoveryResult, null, 2));
69
+ return;
70
+ }
71
+ if (installed.length === 0) {
72
+ intro(ansis.blue("\u{1F4CA} Analyzer Discovery")), console.log(""), console.log(ansis.yellow("No analyzers installed. Install one of the following:")), console.log("");
73
+ for (const opt of analyzerOptions) {
74
+ const name = ansis.bold(opt.backend.displayName), homepage = opt.metadata?.homepage || "(homepage not available)";
75
+ console.log(` ${name} ${ansis.dim(`(${homepage})`)}`);
76
+ }
77
+ console.log(""), outro(ansis.dim("To install: follow the links above or use your package manager"));
78
+ return;
79
+ }
80
+ if (intro(ansis.blue("\u{1F4CA} Analyzer Selection")), process.stdin.isTTY) {
81
+ const selectedName = await select({
82
+ message: "Select an analyzer",
83
+ options: installed.map((a) => ({
84
+ value: a.backend.name,
85
+ label: a.backend.displayName,
86
+ hint: a.metadata?.description || ""
87
+ }))
88
+ });
89
+ if (isCancel(selectedName)) {
90
+ outro(ansis.dim("Cancelled"));
91
+ return;
92
+ }
93
+ const state = {
94
+ active_analyzer: selectedName,
95
+ selected_at: (/* @__PURE__ */ new Date()).toISOString()
96
+ };
97
+ await writeSession(state, projectRoot), outro(ansis.green(`\u2713 Selected analyzer: ${selectedName} (saved to .dr/analyzers/session.json)`));
98
+ } else if (selectedAnalyzer) {
99
+ const state = {
100
+ active_analyzer: selectedAnalyzer,
101
+ selected_at: (/* @__PURE__ */ new Date()).toISOString()
102
+ };
103
+ await writeSession(state, projectRoot), console.log(ansis.green(`\u2713 Selected analyzer: ${selectedAnalyzer} (non-interactive mode)`)), outro(ansis.dim("Saved to .dr/analyzers/session.json"));
104
+ }
105
+ } catch (error) {
106
+ if (error instanceof CLIError)
107
+ throw error;
108
+ const category = categorizeError(error), cliError = new CLIError(error instanceof Error ? error.message : String(error), category);
109
+ throw error instanceof Error && (cliError.cause = error), cliError;
110
+ }
111
+ }), analyzer.command("status").description("Check analyzer detection and project index status").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
112
+ Examples:
113
+ $ dr analyzer status # Show status of active analyzer
114
+ $ dr analyzer status --name cbm # Show status of specific analyzer
115
+ $ dr analyzer status --json # Output as JSON`).action(async (options) => {
116
+ try {
117
+ const projectRoot = await findProjectRoot() || process.cwd();
118
+ let analyzerName = options.name;
119
+ if (!analyzerName) {
120
+ const session = await readSession(projectRoot);
121
+ if (!session)
122
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
123
+ analyzerName = session.active_analyzer;
124
+ }
125
+ const registry = AnalyzerRegistry.getInstance();
126
+ await registry.initialize();
127
+ const backend = await registry.getAnalyzer(analyzerName);
128
+ if (!backend)
129
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND, ["Check the analyzer name with `dr analyzer discover`"]);
130
+ const actualProjectRoot = await findProjectRoot();
131
+ let status;
132
+ if (actualProjectRoot ? status = await backend.status(actualProjectRoot) : status = {
133
+ detected: await backend.detect(),
134
+ indexed: !1,
135
+ fresh: !1
136
+ }, options.json) {
137
+ console.log(JSON.stringify(status, null, 2)), actualProjectRoot && await writeStatus(status, actualProjectRoot, analyzerName);
138
+ return;
139
+ }
140
+ console.log(""), console.log(ansis.bold("Analyzer Status")), console.log(ansis.dim("\u2500".repeat(40))), console.log(`Installed: ${status.detected.installed ? ansis.green("\u2713 Yes") : ansis.red("\u2717 No")}`), status.detected.binary_path && console.log(`Binary: ${ansis.dim(status.detected.binary_path)}`), status.detected.version && console.log(`Version: ${ansis.dim(status.detected.version)}`), status.detected.installed && (console.log(`MCP Registered: ${status.detected.mcp_registered ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`), console.log(`Contract Valid: ${status.detected.contract_ok ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`)), actualProjectRoot && (console.log(`Indexed: ${status.indexed ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`), status.indexed ? (console.log(`Fresh: ${status.fresh ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No (use --force to reindex)")}`), status.last_indexed && console.log(`Last indexed: ${ansis.dim(status.last_indexed)}`)) : console.log(ansis.dim("Run `dr analyzer index` to index the project"))), console.log(""), actualProjectRoot && await writeStatus(status, actualProjectRoot, analyzerName);
141
+ } catch (error) {
142
+ if (error instanceof CLIError)
143
+ throw error;
144
+ const category = categorizeError(error), cliError = new CLIError(error instanceof Error ? error.message : String(error), category);
145
+ throw error instanceof Error && (cliError.cause = error), cliError;
146
+ }
147
+ }), analyzer.command("index").description("Index the current project with the analyzer").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--force", "Force re-indexing even if index is fresh").addHelpText("after", `
148
+ Examples:
149
+ $ dr analyzer index # Index with active analyzer
150
+ $ dr analyzer index --force # Force re-index
151
+ $ dr analyzer index --name cbm # Index with specific analyzer`).action(async (options) => {
152
+ try {
153
+ const projectRoot = await findProjectRoot();
154
+ if (!projectRoot)
155
+ throw new ModelNotFoundError();
156
+ let analyzerName = options.name;
157
+ if (!analyzerName) {
158
+ const session = await readSession(projectRoot);
159
+ if (!session)
160
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
161
+ analyzerName = session.active_analyzer;
162
+ }
163
+ const registry = AnalyzerRegistry.getInstance();
164
+ await registry.initialize();
165
+ const backend = await registry.getAnalyzer(analyzerName);
166
+ if (!backend)
167
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND, ["Check the analyzer name with `dr analyzer discover`"]);
168
+ if (!(await backend.detect()).installed) {
169
+ const homepageUrl = (await MappingLoader.load(analyzerName)).getAnalyzerMetadata()?.homepage || "https://github.com/search?q=codebase-memory";
170
+ throw new CLIError(`Analyzer not installed: ${analyzerName}`, ErrorCategory.USER, [
171
+ "Run `dr analyzer discover` to find available analyzers and installation instructions",
172
+ `Visit: ${homepageUrl}`
173
+ ]);
174
+ }
175
+ console.log(`Indexing project with ${analyzerName}...`);
176
+ const result = await backend.index(projectRoot, { force: options.force });
177
+ console.log(ansis.green("\u2713 Indexing complete")), console.log(` Nodes: ${result.node_count}`), console.log(` Edges: ${result.edge_count}`), console.log(` Git HEAD: ${result.git_head}`);
178
+ } catch (error) {
179
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
180
+ throw error;
181
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), ErrorCategory.SYSTEM);
182
+ throw error instanceof Error && (cliError.cause = error), cliError;
183
+ }
184
+ }), analyzer.command("endpoints").description("List discovered API endpoints from indexed project").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
185
+ Examples:
186
+ $ dr analyzer endpoints # List endpoints from active analyzer
187
+ $ dr analyzer endpoints --json # Output as JSON
188
+ $ dr analyzer endpoints --name cbm # List endpoints from specific analyzer`).action(async (options) => {
189
+ try {
190
+ const projectRoot = await findProjectRoot();
191
+ if (!projectRoot)
192
+ throw new ModelNotFoundError();
193
+ let analyzerName = options.name;
194
+ if (!analyzerName) {
195
+ const session = await readSession(projectRoot);
196
+ if (!session)
197
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
198
+ analyzerName = session.active_analyzer;
199
+ }
200
+ const registry = AnalyzerRegistry.getInstance();
201
+ await registry.initialize();
202
+ const backend = await registry.getAnalyzer(analyzerName);
203
+ if (!backend)
204
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
205
+ if (!(await backend.status(projectRoot)).indexed)
206
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` to index the project first"]);
207
+ const endpoints = await backend.endpoints(projectRoot);
208
+ if (options.json) {
209
+ console.log(JSON.stringify(endpoints, null, 2));
210
+ return;
211
+ }
212
+ if (endpoints.length === 0) {
213
+ console.log(ansis.yellow("No endpoints found"));
214
+ return;
215
+ }
216
+ console.log(""), console.log(ansis.bold(`API Endpoints (${endpoints.length} found):`)), console.log(ansis.dim("\u2500".repeat(135)));
217
+ const methodWidth = 8, pathWidth = 20, nameWidth = 18, idFragmentWidth = 18, symbolWidth = 18, confidenceWidth = 12, fileWidth = 25;
218
+ console.log(ansis.cyan(`${"Method".padEnd(methodWidth)} ${"Path".padEnd(pathWidth)} ${"Name".padEnd(nameWidth)} ${"ID Fragment".padEnd(idFragmentWidth)} ${"Symbol".padEnd(symbolWidth)} ${"Confidence".padEnd(confidenceWidth)} File`)), console.log(ansis.dim("\u2500".repeat(135)));
219
+ for (const endpoint of endpoints) {
220
+ const method = endpoint.http_method.padEnd(methodWidth), path2 = endpoint.http_path.substring(0, pathWidth).padEnd(pathWidth), name = endpoint.suggested_name.substring(0, nameWidth).padEnd(nameWidth), idFragment = endpoint.suggested_id_fragment.substring(0, idFragmentWidth).padEnd(idFragmentWidth), symbol = endpoint.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth), confidence = endpoint.confidence.toUpperCase().padEnd(confidenceWidth), file = endpoint.source_file.substring(0, fileWidth);
221
+ console.log(`${method} ${path2} ${name} ${idFragment} ${symbol} ${confidence} ${ansis.dim(file)}`);
222
+ }
223
+ console.log(ansis.dim("\u2500".repeat(135))), console.log(ansis.dim(`Total: ${endpoints.length} endpoint(s)`)), console.log("");
224
+ } catch (error) {
225
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
226
+ throw error;
227
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
228
+ throw error instanceof Error && (cliError.cause = error), cliError;
229
+ }
230
+ }), analyzer.command("services").description("Query for services/components in the indexed project").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--layer <layer>", "Filter by layer (e.g., 'application')").option("--json", "Output as JSON").addHelpText("after", `
231
+ Examples:
232
+ $ dr analyzer services # List all services
233
+ $ dr analyzer services --layer application
234
+ $ dr analyzer services --json # Output as JSON`).action(async (options) => {
235
+ try {
236
+ const projectRoot = await findProjectRoot();
237
+ if (!projectRoot)
238
+ throw new ModelNotFoundError();
239
+ let analyzerName = options.name;
240
+ if (!analyzerName) {
241
+ const session = await readSession(projectRoot);
242
+ if (!session)
243
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
244
+ analyzerName = session.active_analyzer;
245
+ }
246
+ const registry = AnalyzerRegistry.getInstance();
247
+ await registry.initialize();
248
+ const backend = await registry.getAnalyzer(analyzerName);
249
+ if (!backend)
250
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
251
+ if (!await readIndexMeta(projectRoot, analyzerName))
252
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
253
+ let services = await backend.services(projectRoot);
254
+ if (options.layer && (services = services.filter((s) => s.suggested_layer === options.layer)), options.json) {
255
+ console.log(JSON.stringify(services, null, 2));
256
+ return;
257
+ }
258
+ if (services.length === 0) {
259
+ console.log(ansis.yellow("No services found"));
260
+ return;
261
+ }
262
+ console.log(""), console.log(ansis.bold(`Services (${services.length} found):`)), console.log(ansis.dim("\u2500".repeat(120)));
263
+ const nameWidth = 20, layerWidth = 15, typeWidth = 18, symbolWidth = 20, confidenceWidth = 12, fileWidth = 25;
264
+ console.log(ansis.cyan(`${"Name".padEnd(nameWidth)} ${"Layer".padEnd(layerWidth)} ${"Type".padEnd(typeWidth)} ${"Symbol".padEnd(symbolWidth)} ${"Confidence".padEnd(confidenceWidth)} File`)), console.log(ansis.dim("\u2500".repeat(120)));
265
+ for (const service of services) {
266
+ const name = service.suggested_name.substring(0, nameWidth).padEnd(nameWidth), layer = service.suggested_layer.substring(0, layerWidth).padEnd(layerWidth), type = service.suggested_element_type.substring(0, typeWidth).padEnd(typeWidth), symbol = service.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth), confidence = service.confidence.toUpperCase().padEnd(confidenceWidth), file = service.source_file.substring(0, fileWidth);
267
+ console.log(`${name} ${layer} ${type} ${symbol} ${confidence} ${ansis.dim(file)}`);
268
+ }
269
+ console.log(ansis.dim("\u2500".repeat(120))), console.log(ansis.dim(`Total: ${services.length} service(s)`)), console.log("");
270
+ } catch (error) {
271
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
272
+ throw error;
273
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
274
+ throw error instanceof Error && (cliError.cause = error), cliError;
275
+ }
276
+ }), analyzer.command("datastores").description("Query for datastores/databases inferred from code analysis").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
277
+ Examples:
278
+ $ dr analyzer datastores # List all inferred datastores
279
+ $ dr analyzer datastores --json # Output as JSON`).action(async (options) => {
280
+ try {
281
+ const projectRoot = await findProjectRoot();
282
+ if (!projectRoot)
283
+ throw new ModelNotFoundError();
284
+ let analyzerName = options.name;
285
+ if (!analyzerName) {
286
+ const session = await readSession(projectRoot);
287
+ if (!session)
288
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
289
+ analyzerName = session.active_analyzer;
290
+ }
291
+ const registry = AnalyzerRegistry.getInstance();
292
+ await registry.initialize();
293
+ const backend = await registry.getAnalyzer(analyzerName);
294
+ if (!backend)
295
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
296
+ if (!await readIndexMeta(projectRoot, analyzerName))
297
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
298
+ const datastores = await backend.datastores(projectRoot);
299
+ if (options.json) {
300
+ console.log(JSON.stringify(datastores, null, 2));
301
+ return;
302
+ }
303
+ if (datastores.length === 0) {
304
+ console.log(ansis.yellow("No datastores found"));
305
+ return;
306
+ }
307
+ console.log(""), console.log(ansis.bold(`Datastores (${datastores.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
308
+ for (const ds of datastores) {
309
+ console.log(` ${ansis.cyan(ds.suggested_name)}`), console.log(" Inferred from:");
310
+ for (const evidence of ds.inferred_from)
311
+ console.log(` - ${evidence.source_file}: ${evidence.import_pattern}`);
312
+ ds.notes && console.log(` Notes: ${ds.notes}`), console.log("");
313
+ }
314
+ console.log(ansis.dim(`Total: ${datastores.length} datastore(s)`)), console.log("");
315
+ } catch (error) {
316
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
317
+ throw error;
318
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
319
+ throw error instanceof Error && (cliError.cause = error), cliError;
320
+ }
321
+ }), analyzer.command("callers <qualified-name>").description("Query for callers of a specific function or symbol").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--depth <n>", "Maximum depth for call graph traversal (default: 3, max: 10)", "3").option("--json", "Output as JSON").addHelpText("after", `
322
+ Examples:
323
+ $ dr analyzer callers com.example.Service.handleRequest
324
+ $ dr analyzer callers com.example.Service.handleRequest --depth 5
325
+ $ dr analyzer callers com.example.Service.handleRequest --json`).action(async (qualifiedName, options) => {
326
+ try {
327
+ const depth = parseInt(options.depth, 10);
328
+ if (isNaN(depth) || depth < 1)
329
+ throw new CLIError("Invalid --depth value: must be a positive integer", ErrorCategory.USER);
330
+ const projectRoot = await findProjectRoot();
331
+ if (!projectRoot)
332
+ throw new ModelNotFoundError();
333
+ let analyzerName = options.name;
334
+ if (!analyzerName) {
335
+ const session = await readSession(projectRoot);
336
+ if (!session)
337
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
338
+ analyzerName = session.active_analyzer;
339
+ }
340
+ const registry = AnalyzerRegistry.getInstance();
341
+ await registry.initialize();
342
+ const backend = await registry.getAnalyzer(analyzerName);
343
+ if (!backend)
344
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
345
+ if (!await readIndexMeta(projectRoot, analyzerName))
346
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
347
+ const callers = await backend.callers(projectRoot, qualifiedName, depth);
348
+ if (options.json) {
349
+ console.log(JSON.stringify(callers, null, 2));
350
+ return;
351
+ }
352
+ if (callers.length === 0) {
353
+ console.log(ansis.yellow(`No callers found for ${qualifiedName}`));
354
+ return;
355
+ }
356
+ console.log(""), console.log(ansis.bold(`Callers of ${ansis.cyan(qualifiedName)} (${callers.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
357
+ for (const caller of callers)
358
+ console.log(` ${ansis.bold(caller.qualified_name)}`), console.log(` File: ${caller.source_file}`), console.log(` Symbol: ${caller.source_symbol}`), console.log(` Depth: ${caller.depth}`), console.log(` Edge: ${caller.edge_type}`), console.log("");
359
+ console.log(ansis.dim(`Total: ${callers.length} caller(s)`)), console.log("");
360
+ } catch (error) {
361
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
362
+ throw error;
363
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
364
+ throw error instanceof Error && (cliError.cause = error), cliError;
365
+ }
366
+ }), analyzer.command("callees <qualified-name>").description("Query for callees of a specific function or symbol").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--depth <n>", "Maximum depth for call graph traversal (default: 3, max: 10)", "3").option("--json", "Output as JSON").addHelpText("after", `
367
+ Examples:
368
+ $ dr analyzer callees com.example.Service.handleRequest
369
+ $ dr analyzer callees com.example.Service.handleRequest --depth 5
370
+ $ dr analyzer callees com.example.Service.handleRequest --json`).action(async (qualifiedName, options) => {
371
+ try {
372
+ const depth = parseInt(options.depth, 10);
373
+ if (isNaN(depth) || depth < 1)
374
+ throw new CLIError("Invalid --depth value: must be a positive integer", ErrorCategory.USER);
375
+ const projectRoot = await findProjectRoot();
376
+ if (!projectRoot)
377
+ throw new ModelNotFoundError();
378
+ let analyzerName = options.name;
379
+ if (!analyzerName) {
380
+ const session = await readSession(projectRoot);
381
+ if (!session)
382
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
383
+ analyzerName = session.active_analyzer;
384
+ }
385
+ const registry = AnalyzerRegistry.getInstance();
386
+ await registry.initialize();
387
+ const backend = await registry.getAnalyzer(analyzerName);
388
+ if (!backend)
389
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
390
+ if (!await readIndexMeta(projectRoot, analyzerName))
391
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
392
+ const callees = await backend.callees(projectRoot, qualifiedName, depth);
393
+ if (options.json) {
394
+ console.log(JSON.stringify(callees, null, 2));
395
+ return;
396
+ }
397
+ if (callees.length === 0) {
398
+ console.log(ansis.yellow(`No callees found for ${qualifiedName}`));
399
+ return;
400
+ }
401
+ console.log(""), console.log(ansis.bold(`Callees of ${ansis.cyan(qualifiedName)} (${callees.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
402
+ for (const callee of callees)
403
+ console.log(` ${ansis.bold(callee.qualified_name)}`), console.log(` File: ${callee.source_file}`), console.log(` Symbol: ${callee.source_symbol}`), console.log(` Depth: ${callee.depth}`), console.log(` Edge: ${callee.edge_type}`), console.log("");
404
+ console.log(ansis.dim(`Total: ${callees.length} callee(s)`)), console.log("");
405
+ } catch (error) {
406
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
407
+ throw error;
408
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
409
+ throw error instanceof Error && (cliError.cause = error), cliError;
410
+ }
411
+ }), analyzer.command("query <cypher>").description("Execute a raw Cypher query against the analyzer graph (advanced escape hatch)").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON (default format for query results)").addHelpText("before", `Advanced Escape Hatch: This command directly executes graph queries without validation or wrapping.
412
+ Use for advanced analysis when standard commands don't meet your needs.
413
+ `).addHelpText("after", `
414
+ Query syntax depends on the analyzer backend (e.g., Cypher for graph analyzers).
415
+ Results are always output as JSON.
416
+
417
+ Examples:
418
+ $ dr analyzer query "MATCH (n) RETURN n LIMIT 10"
419
+ $ dr analyzer query "MATCH (n:Service) RETURN n.name"
420
+ $ dr analyzer query "MATCH (n) RETURN n LIMIT 10" --json`).action(async (cypher, options) => {
421
+ try {
422
+ const projectRoot = await findProjectRoot();
423
+ if (!projectRoot)
424
+ throw new ModelNotFoundError();
425
+ let analyzerName = options.name;
426
+ if (!analyzerName) {
427
+ const session = await readSession(projectRoot);
428
+ if (!session)
429
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
430
+ analyzerName = session.active_analyzer;
431
+ }
432
+ const registry = AnalyzerRegistry.getInstance();
433
+ await registry.initialize();
434
+ const backend = await registry.getAnalyzer(analyzerName);
435
+ if (!backend)
436
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
437
+ if (!await readIndexMeta(projectRoot, analyzerName))
438
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
439
+ const result = await backend.query(projectRoot, cypher);
440
+ options.json, console.log(JSON.stringify(result, null, 2));
441
+ } catch (error) {
442
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
443
+ throw error;
444
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
445
+ throw error instanceof Error && (cliError.cause = error), cliError;
446
+ }
447
+ }), analyzer.command("verify").description("Verify that graph-discovered routes align with model endpoints").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--layer <layer>", "Layer(s) to verify (can be used multiple times)", (value, previous) => previous ? [...previous, value] : [value]).option("--json", "Output as JSON").option("--format <format>", "Output format: text, json, markdown (default: text)").option("--output <path>", "Write report to file").addHelpText("after", `
448
+ Examples:
449
+ $ dr analyzer verify # Verify api layer (default)
450
+ $ dr analyzer verify --layer api # Explicitly specify api layer
451
+ $ dr analyzer verify --json # Output as JSON to stdout
452
+ $ dr analyzer verify --format markdown # Output as Markdown to stdout
453
+ $ dr analyzer verify --output report.json # Save report to file (format inferred as JSON)
454
+ $ dr analyzer verify --output report.md # Save report as Markdown`).action(async (options) => {
455
+ try {
456
+ let format = "text";
457
+ if (options.json)
458
+ options.format && console.warn(ansis.yellow(`\u26A0 Both --json and --format "${options.format}" were provided. Using --json format (--format is ignored).`)), format = "json";
459
+ else if (options.format) {
460
+ const validFormats = ["text", "json", "markdown"];
461
+ if (!validFormats.includes(options.format))
462
+ throw new CLIError(`Invalid format: "${options.format}". Valid values are: ${validFormats.join(", ")}.`, ErrorCategory.USER);
463
+ format = options.format;
464
+ } else if (options.output) {
465
+ const ext = path.extname(options.output).toLowerCase();
466
+ ext === ".json" ? format = "json" : ext === ".md" ? format = "markdown" : ext && console.warn(ansis.yellow(`\u26A0 Unrecognized file extension "${ext}" in --output. Using text format by default.`));
467
+ }
468
+ const projectRoot = await findProjectRoot();
469
+ if (!projectRoot)
470
+ throw new ModelNotFoundError();
471
+ const requestedLayers = options.layer || ["api"], apiLayers = requestedLayers.filter((layer) => layer === "api"), nonApiLayers = requestedLayers.filter((layer) => layer !== "api");
472
+ for (const layer of nonApiLayers)
473
+ console.log(ansis.dim(`No verification available for layer '${layer}'`));
474
+ if (apiLayers.length === 0)
475
+ return;
476
+ let analyzerName = options.name;
477
+ if (!analyzerName) {
478
+ const session = await readSession(projectRoot);
479
+ if (!session)
480
+ throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
481
+ analyzerName = session.active_analyzer;
482
+ }
483
+ const registry = AnalyzerRegistry.getInstance();
484
+ await registry.initialize();
485
+ const backend = await registry.getAnalyzer(analyzerName);
486
+ if (!backend)
487
+ throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
488
+ if (!await readIndexMeta(projectRoot, analyzerName))
489
+ throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
490
+ const report = await backend.verify(projectRoot, {
491
+ layers: apiLayers,
492
+ changesetAware: !0
493
+ }), formatted = formatVerifyReport(report, { format });
494
+ if (options.output) {
495
+ const outputPath = path.resolve(options.output);
496
+ await fs.writeFile(outputPath, formatted, "utf-8"), console.log(ansis.green(`\u2713 Report written to ${outputPath}`));
497
+ return;
498
+ }
499
+ console.log(formatted);
500
+ } catch (error) {
501
+ if (error instanceof CLIError || error instanceof ModelNotFoundError)
502
+ throw error;
503
+ const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
504
+ throw error instanceof Error && (cliError.cause = error), cliError;
505
+ }
506
+ });
507
+ }
508
+ export {
509
+ analyzerCommands
510
+ };
511
+ //# sourceMappingURL=analyzer.js.map