@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,311 @@
1
+ import * as yaml from "yaml";
2
+ import { join, dirname, isAbsolute } from "node:path";
3
+ import { mkdir, readFile as fsReadFile, writeFile as fsWriteFile, rm, copyFile } from "node:fs/promises";
4
+ import { existsSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
6
+ import { computeDirectoryHashes, computeFileHash } from "./hash-utils.js";
7
+ import { validateVersionData } from "./types.js";
8
+ import { findProjectRoot } from "../utils/project-paths.js";
9
+ import { getCliVersion as getCliVersionFromUtils } from "../utils/spec-version.js";
10
+ import { getErrorMessage } from "../utils/errors.js";
11
+ class BaseIntegrationManager {
12
+ /**
13
+ * Get path to integration source files
14
+ *
15
+ * Handles both development (integrations/ in repo) and production (bundled in dist/)
16
+ * environments by checking for the existence of source directories.
17
+ *
18
+ * Development structure:
19
+ * /workspace/integrations/{integrationSourceDir}/
20
+ *
21
+ * Production structure:
22
+ * dist/integrations/{integrationSourceDir}/
23
+ *
24
+ * @returns Absolute path to integration source directory
25
+ * @throws Error if integration source directory cannot be found
26
+ */
27
+ getSourceRoot() {
28
+ const cliDir = dirname(fileURLToPath(import.meta.url)), prodPath = join(cliDir, this.integrationSourceDir);
29
+ if (existsSync(prodPath))
30
+ return prodPath;
31
+ const repoRoot = dirname(dirname(dirname(dirname(cliDir)))), devPath = join(repoRoot, "integrations", this.integrationSourceDir);
32
+ if (existsSync(devPath))
33
+ return devPath;
34
+ throw new Error(`Integration source directory not found for ${this.integrationSourceDir}. Checked: ${prodPath} and ${devPath}`);
35
+ }
36
+ /**
37
+ * Get the absolute path to the target directory
38
+ *
39
+ * Resolves the project root and combines it with the relative targetDir.
40
+ * This method ensures that integration operations work from any directory
41
+ * within the project, not just from the project root.
42
+ *
43
+ * @returns Absolute path to the target directory
44
+ * @throws Error if project root cannot be found
45
+ */
46
+ async getAbsoluteTargetDir() {
47
+ if (isAbsolute(this.targetDir))
48
+ return this.targetDir;
49
+ const projectRoot = await findProjectRoot();
50
+ if (!projectRoot)
51
+ throw new Error("Could not find project root. Are you in a Documentation Robotics project? Expected to find 'documentation-robotics' folder in directory hierarchy.");
52
+ return join(projectRoot, this.targetDir);
53
+ }
54
+ /**
55
+ * Check if integration is already installed
56
+ *
57
+ * @returns True if version file exists in target directory
58
+ */
59
+ async isInstalled() {
60
+ const absoluteTargetDir = await this.getAbsoluteTargetDir(), versionFilePath = join(absoluteTargetDir, this.versionFileName);
61
+ return existsSync(versionFilePath);
62
+ }
63
+ /**
64
+ * Load version file from target directory
65
+ *
66
+ * Parses YAML format version file tracking installed version and file hashes.
67
+ * Validates deserialized data to ensure all required fields are present and correctly typed.
68
+ *
69
+ * @returns VersionData if version file exists, null otherwise
70
+ * @throws Error if version file cannot be parsed or fails validation
71
+ */
72
+ async loadVersionFile() {
73
+ const absoluteTargetDir = await this.getAbsoluteTargetDir(), versionFilePath = join(absoluteTargetDir, this.versionFileName);
74
+ if (!existsSync(versionFilePath))
75
+ return null;
76
+ try {
77
+ const content = await fsReadFile(versionFilePath, "utf-8"), parsed = yaml.parse(content);
78
+ return validateVersionData(parsed);
79
+ } catch (error) {
80
+ throw new Error(`Failed to parse version file at ${versionFilePath}: ${error}`);
81
+ }
82
+ }
83
+ /**
84
+ * Check if a component is tracked (DR-owned)
85
+ *
86
+ * A component is tracked if its tracked property is not explicitly false.
87
+ * This handles the implicit default of true for backwards compatibility.
88
+ *
89
+ * @param componentName - Component name
90
+ * @returns True if component should be tracked in version file
91
+ */
92
+ isTrackedComponent(componentName) {
93
+ const config = this.components[componentName];
94
+ return config ? config.tracked !== !1 : !1;
95
+ }
96
+ /**
97
+ * Update version file with current CLI version and component hashes
98
+ *
99
+ * Records the hash of each installed (target) file as the baseline for future
100
+ * change detection. Using the installed hash — rather than the source hash —
101
+ * keeps the baseline in sync with what is actually on disk, so files that were
102
+ * skipped during a previous install (conflict/user-modified) do not generate
103
+ * false conflict reports on the next upgrade.
104
+ *
105
+ * Only DR-owned components (tracked: true) are included in the version file.
106
+ * User-customizable components (tracked: false) are not tracked to avoid
107
+ * conflicts with user modifications.
108
+ *
109
+ * @param cliVersion - Current CLI version (usually from package.json)
110
+ * @throws Error if version file cannot be written
111
+ */
112
+ async updateVersionFile(cliVersion) {
113
+ const components = {}, sourceRoot = this.getSourceRoot(), absoluteTargetDir = await this.getAbsoluteTargetDir();
114
+ try {
115
+ for (const [componentName] of Object.entries(this.components)) {
116
+ if (!this.isTrackedComponent(componentName))
117
+ continue;
118
+ const config = this.components[componentName], sourceDir = join(sourceRoot, config.source), targetPath = join(absoluteTargetDir, config.target), sourceHashes = existsSync(sourceDir) ? await computeDirectoryHashes(sourceDir, config.prefix) : /* @__PURE__ */ new Map();
119
+ components[componentName] = {};
120
+ for (const [filePath, sourceHash] of sourceHashes) {
121
+ const targetFilePath = join(targetPath, filePath);
122
+ let targetHash, hashComputeFailed = !1;
123
+ if (existsSync(targetFilePath))
124
+ try {
125
+ targetHash = await computeFileHash(targetFilePath);
126
+ } catch (error) {
127
+ hashComputeFailed = !0, console.warn(`\u26A0 Warning: Could not compute hash for ${targetFilePath}: ${getErrorMessage(error)}`);
128
+ }
129
+ components[componentName][filePath] = {
130
+ hash: targetHash ?? sourceHash,
131
+ modified: hashComputeFailed || targetHash !== void 0 && targetHash !== sourceHash
132
+ };
133
+ }
134
+ }
135
+ const versionData = {
136
+ version: cliVersion,
137
+ installed_at: (/* @__PURE__ */ new Date()).toISOString(),
138
+ components
139
+ }, versionFilePath = join(absoluteTargetDir, this.versionFileName);
140
+ await mkdir(dirname(versionFilePath), { recursive: !0 });
141
+ const yamlContent = yaml.stringify(versionData);
142
+ await fsWriteFile(versionFilePath, yamlContent, "utf-8");
143
+ } catch (error) {
144
+ throw new Error(`Failed to update version file: ${getErrorMessage(error)}`);
145
+ }
146
+ }
147
+ /**
148
+ * Detect files present in installation but missing from source
149
+ *
150
+ * Compares installed files (from version file) against current source files,
151
+ * identifying which files no longer exist in source and should be removed.
152
+ *
153
+ * @returns Array of obsolete files (empty if none found)
154
+ */
155
+ async detectObsoleteFiles() {
156
+ const versionData = await this.loadVersionFile();
157
+ if (!versionData)
158
+ return [];
159
+ const obsolete = [], sourceRoot = this.getSourceRoot();
160
+ for (const [componentName, files] of Object.entries(versionData.components)) {
161
+ if (!this.isTrackedComponent(componentName))
162
+ continue;
163
+ const config = this.components[componentName], sourceDir = join(sourceRoot, config.source);
164
+ for (const filePath of Object.keys(files)) {
165
+ const sourcePath = join(sourceDir, filePath);
166
+ existsSync(sourcePath) || obsolete.push({
167
+ path: filePath,
168
+ component: componentName
169
+ });
170
+ }
171
+ }
172
+ return obsolete;
173
+ }
174
+ /**
175
+ * Check for updates to a component's files
176
+ *
177
+ * Compares source files against installed files using hashes to detect:
178
+ * - New files (in source but not installed)
179
+ * - Modified files (hash changed in source)
180
+ * - Deleted files (in installation but not in source)
181
+ * - User-modified files (hash differs from recorded hash)
182
+ * - Conflicts (user modified, but source also changed)
183
+ *
184
+ * @param componentName - Component to check
185
+ * @param versionData - Current version data from installation
186
+ * @returns Array of FileChange objects describing all detected changes
187
+ */
188
+ async checkUpdates(componentName, versionData) {
189
+ const changes = [], config = this.components[componentName];
190
+ if (!config)
191
+ throw new Error(`Unknown component: ${componentName}`);
192
+ const sourceRoot = this.getSourceRoot(), sourceDir = join(sourceRoot, config.source), absoluteTargetDir = await this.getAbsoluteTargetDir(), targetPath = join(absoluteTargetDir, config.target), sourceHashes = await computeDirectoryHashes(sourceDir, config.prefix), installedHashes = existsSync(targetPath) ? await computeDirectoryHashes(targetPath, config.prefix) : /* @__PURE__ */ new Map(), recordedHashes = versionData.components[componentName] || {};
193
+ for (const [filePath, sourceHash] of sourceHashes) {
194
+ const installedHash = installedHashes.get(filePath), recordedHash = recordedHashes[filePath]?.hash;
195
+ installedHash ? sourceHash !== recordedHash ? recordedHash ? sourceHash === installedHash || (installedHash !== recordedHash ? changes.push({
196
+ path: filePath,
197
+ component: componentName,
198
+ changeType: "conflict",
199
+ sourceHash,
200
+ installedHash
201
+ }) : changes.push({
202
+ path: filePath,
203
+ component: componentName,
204
+ changeType: "modified",
205
+ sourceHash,
206
+ installedHash
207
+ })) : changes.push({
208
+ path: filePath,
209
+ component: componentName,
210
+ changeType: "modified",
211
+ sourceHash,
212
+ installedHash
213
+ }) : installedHash !== recordedHash && changes.push({
214
+ path: filePath,
215
+ component: componentName,
216
+ changeType: "user-modified",
217
+ sourceHash,
218
+ installedHash
219
+ }) : changes.push({
220
+ path: filePath,
221
+ component: componentName,
222
+ changeType: "added",
223
+ sourceHash
224
+ });
225
+ }
226
+ for (const [filePath] of Object.entries(recordedHashes))
227
+ sourceHashes.has(filePath) || changes.push({
228
+ path: filePath,
229
+ component: componentName,
230
+ changeType: "deleted",
231
+ installedHash: installedHashes.get(filePath)
232
+ });
233
+ return changes;
234
+ }
235
+ /**
236
+ * Install or update a component's files
237
+ *
238
+ * Copies all files from source to target directory, creating parent
239
+ * directories as needed. Optionally forces overwrite of user-modified files.
240
+ *
241
+ * @param componentName - Component to install
242
+ * @param force - If true, overwrite user-modified files
243
+ * @returns Number of files installed/updated
244
+ * @throws Error if installation fails
245
+ */
246
+ async installComponent(componentName, force = !1) {
247
+ const config = this.components[componentName];
248
+ if (!config)
249
+ throw new Error(`Unknown component: ${componentName}`);
250
+ const sourceRoot = this.getSourceRoot(), sourceDir = join(sourceRoot, config.source), absoluteTargetDir = await this.getAbsoluteTargetDir(), targetPath = join(absoluteTargetDir, config.target), versionData = await this.loadVersionFile(), changes = versionData ? await this.checkUpdates(componentName, versionData) : [];
251
+ let filesInstalled = 0;
252
+ const sourceHashes = await computeDirectoryHashes(sourceDir, config.prefix);
253
+ for (const filePath of sourceHashes.keys()) {
254
+ const sourcePath = join(sourceDir, filePath), targetFilePath = join(targetPath, filePath), change = changes.find((c) => c.path === filePath);
255
+ change && !force && (change.changeType === "user-modified" || change.changeType === "conflict") || (await mkdir(dirname(targetFilePath), { recursive: !0 }), await copyFile(sourcePath, targetFilePath), filesInstalled++);
256
+ }
257
+ return filesInstalled;
258
+ }
259
+ /**
260
+ * Remove a file from the installation
261
+ *
262
+ * @param filePath - Relative path to file to remove
263
+ * @throws Error if file cannot be deleted
264
+ */
265
+ async removeFile(filePath) {
266
+ const versionData = await this.loadVersionFile();
267
+ if (!versionData)
268
+ return;
269
+ const absoluteTargetDir = await this.getAbsoluteTargetDir();
270
+ for (const [componentName] of Object.entries(versionData.components)) {
271
+ const config = this.components[componentName];
272
+ if (!config)
273
+ continue;
274
+ const targetPath = join(absoluteTargetDir, config.target), fullPath = join(targetPath, filePath);
275
+ if (existsSync(fullPath)) {
276
+ await rm(fullPath, { force: !0 });
277
+ return;
278
+ }
279
+ }
280
+ }
281
+ /**
282
+ * Remove all obsolete files
283
+ *
284
+ * Deletes files that are in the installation but no longer exist in source.
285
+ *
286
+ * @returns Number of files removed
287
+ */
288
+ async removeObsoleteFiles() {
289
+ const obsolete = await this.detectObsoleteFiles();
290
+ let removed = 0;
291
+ for (const obsoleteFile of obsolete)
292
+ try {
293
+ await this.removeFile(obsoleteFile.path), removed++;
294
+ } catch (error) {
295
+ console.error(`Failed to remove obsolete file ${obsoleteFile.path}:`, error);
296
+ }
297
+ return removed;
298
+ }
299
+ /**
300
+ * Get the current CLI version
301
+ *
302
+ * @returns Version string (e.g., "0.1.0")
303
+ */
304
+ async getCliVersion() {
305
+ return getCliVersionFromUtils();
306
+ }
307
+ }
308
+ export {
309
+ BaseIntegrationManager
310
+ };
311
+ //# sourceMappingURL=base-manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/integrations/base-manager.ts"],
4
+ "sourcesContent": ["/**\n * Base Integration Manager\n *\n * Abstract base class providing shared logic for integration managers.\n * Handles file operations, version management, change detection, and installation.\n *\n * Subclasses (ClaudeIntegrationManager, CopilotIntegrationManager) must define:\n * - components: Registry of component configurations\n * - targetDir: Installation target directory (.claude or .github)\n * - versionFileName: Version file name (.dr-version or .dr-copilot-version)\n * - integrationSourceDir: Integration directory name (claude_code or github_copilot)\n */\n\nimport * as yaml from \"yaml\";\nimport { join, dirname, isAbsolute } from \"node:path\";\nimport {\n mkdir,\n readFile as fsReadFile,\n writeFile as fsWriteFile,\n rm,\n copyFile,\n} from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { computeDirectoryHashes, computeFileHash } from \"./hash-utils.js\";\nimport {\n ComponentConfig,\n VersionData,\n FileChange,\n ObsoleteFile,\n validateVersionData,\n} from \"./types.js\";\nimport { findProjectRoot } from \"../utils/project-paths.js\";\nimport { getCliVersion as getCliVersionFromUtils } from \"../utils/spec-version.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\n/**\n * Abstract base class for integration managers\n * Provides shared logic for file operations, version management, and update detection\n */\nexport abstract class BaseIntegrationManager {\n /**\n * Component registry mapping component names to their configurations\n * Must be defined by subclasses\n */\n protected abstract readonly components: Record<string, ComponentConfig>;\n\n /**\n * Target directory for installation (.claude or .github)\n * Must be defined by subclasses\n */\n protected abstract readonly targetDir: string;\n\n /**\n * Version file name (.dr-version or .dr-copilot-version)\n * Must be defined by subclasses\n */\n protected abstract readonly versionFileName: string;\n\n /**\n * Integration source directory name (claude_code or github_copilot)\n * Must be defined by subclasses\n */\n protected abstract readonly integrationSourceDir: string;\n\n /**\n * Get path to integration source files\n *\n * Handles both development (integrations/ in repo) and production (bundled in dist/)\n * environments by checking for the existence of source directories.\n *\n * Development structure:\n * /workspace/integrations/{integrationSourceDir}/\n *\n * Production structure:\n * dist/integrations/{integrationSourceDir}/\n *\n * @returns Absolute path to integration source directory\n * @throws Error if integration source directory cannot be found\n */\n protected getSourceRoot(): string {\n // Get the path to the compiled CLI directory\n // import.meta.url points to the compiled .js file, e.g., dist/integrations/base-manager.js\n const cliDir = dirname(fileURLToPath(import.meta.url));\n\n // Production: dist/integrations/{integrationSourceDir}/\n // The integrations/ directory is in the same dist/ folder as cli.js\n const prodPath = join(cliDir, this.integrationSourceDir);\n if (existsSync(prodPath)) {\n return prodPath;\n }\n\n // Development: integrations/{integrationSourceDir}/ relative to repo root\n // From dist/integrations/base-manager.js, go up 3 levels to repo root\n const repoRoot = dirname(dirname(dirname(dirname(cliDir))));\n const devPath = join(repoRoot, \"integrations\", this.integrationSourceDir);\n if (existsSync(devPath)) {\n return devPath;\n }\n\n throw new Error(\n `Integration source directory not found for ${this.integrationSourceDir}. ` +\n `Checked: ${prodPath} and ${devPath}`\n );\n }\n\n /**\n * Get the absolute path to the target directory\n *\n * Resolves the project root and combines it with the relative targetDir.\n * This method ensures that integration operations work from any directory\n * within the project, not just from the project root.\n *\n * @returns Absolute path to the target directory\n * @throws Error if project root cannot be found\n */\n protected async getAbsoluteTargetDir(): Promise<string> {\n if (isAbsolute(this.targetDir)) {\n return this.targetDir;\n }\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n throw new Error(\n `Could not find project root. Are you in a Documentation Robotics project? ` +\n `Expected to find 'documentation-robotics' folder in directory hierarchy.`\n );\n }\n return join(projectRoot, this.targetDir);\n }\n\n /**\n * Check if integration is already installed\n *\n * @returns True if version file exists in target directory\n */\n public async isInstalled(): Promise<boolean> {\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n const versionFilePath = join(absoluteTargetDir, this.versionFileName);\n return existsSync(versionFilePath);\n }\n\n /**\n * Load version file from target directory\n *\n * Parses YAML format version file tracking installed version and file hashes.\n * Validates deserialized data to ensure all required fields are present and correctly typed.\n *\n * @returns VersionData if version file exists, null otherwise\n * @throws Error if version file cannot be parsed or fails validation\n */\n public async loadVersionFile(): Promise<VersionData | null> {\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n const versionFilePath = join(absoluteTargetDir, this.versionFileName);\n\n if (!existsSync(versionFilePath)) {\n return null;\n }\n\n try {\n const content = await fsReadFile(versionFilePath, \"utf-8\");\n const parsed = yaml.parse(content);\n // Validate deserialized data at boundary to catch corrupted files early\n return validateVersionData(parsed);\n } catch (error) {\n throw new Error(`Failed to parse version file at ${versionFilePath}: ${error}`);\n }\n }\n\n /**\n * Check if a component is tracked (DR-owned)\n *\n * A component is tracked if its tracked property is not explicitly false.\n * This handles the implicit default of true for backwards compatibility.\n *\n * @param componentName - Component name\n * @returns True if component should be tracked in version file\n */\n protected isTrackedComponent(componentName: string): boolean {\n const config = this.components[componentName];\n if (!config) {\n return false;\n }\n return config.tracked !== false;\n }\n\n /**\n * Update version file with current CLI version and component hashes\n *\n * Records the hash of each installed (target) file as the baseline for future\n * change detection. Using the installed hash \u2014 rather than the source hash \u2014\n * keeps the baseline in sync with what is actually on disk, so files that were\n * skipped during a previous install (conflict/user-modified) do not generate\n * false conflict reports on the next upgrade.\n *\n * Only DR-owned components (tracked: true) are included in the version file.\n * User-customizable components (tracked: false) are not tracked to avoid\n * conflicts with user modifications.\n *\n * @param cliVersion - Current CLI version (usually from package.json)\n * @throws Error if version file cannot be written\n */\n protected async updateVersionFile(cliVersion: string): Promise<void> {\n const components: VersionData[\"components\"] = {};\n const sourceRoot = this.getSourceRoot();\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n\n try {\n // Compute hashes for all DR-owned component files\n for (const [componentName] of Object.entries(this.components)) {\n // Skip non-tracked components (user-customizable)\n if (!this.isTrackedComponent(componentName)) {\n continue;\n }\n\n const config = this.components[componentName];\n\n const sourceDir = join(sourceRoot, config.source);\n const targetPath = join(absoluteTargetDir, config.target);\n\n // Compute hashes for files in SOURCE directory (DR-owned files only)\n const sourceHashes = existsSync(sourceDir)\n ? await computeDirectoryHashes(sourceDir, config.prefix)\n : new Map<string, string>();\n\n // Record hashes for installed files\n components[componentName] = {};\n for (const [filePath, sourceHash] of sourceHashes) {\n const targetFilePath = join(targetPath, filePath);\n let targetHash: string | undefined;\n let hashComputeFailed = false;\n\n if (existsSync(targetFilePath)) {\n try {\n targetHash = await computeFileHash(targetFilePath);\n } catch (error) {\n // If we can't compute hash, record as modified to err on the side of\n // caution \u2014 prevents silent data loss on next upgrade.\n hashComputeFailed = true;\n console.warn(\n `\u26A0 Warning: Could not compute hash for ${targetFilePath}: ${getErrorMessage(error)}`\n );\n }\n }\n\n // Record the installed (target) hash as the baseline for change detection.\n // This keeps the recorded hash in sync with what is actually on disk, so that\n // files skipped during a previous install (conflict/user-modified) don't\n // generate false conflict reports on the next upgrade.\n components[componentName][filePath] = {\n hash: targetHash ?? sourceHash,\n modified: hashComputeFailed || (targetHash !== undefined && targetHash !== sourceHash),\n };\n }\n }\n\n // Create version data structure\n const versionData: VersionData = {\n version: cliVersion,\n installed_at: new Date().toISOString(),\n components,\n };\n\n // Write version file\n const versionFilePath = join(absoluteTargetDir, this.versionFileName);\n await mkdir(dirname(versionFilePath), { recursive: true });\n const yamlContent = yaml.stringify(versionData);\n await fsWriteFile(versionFilePath, yamlContent, \"utf-8\");\n } catch (error) {\n throw new Error(`Failed to update version file: ${getErrorMessage(error)}`);\n }\n }\n\n /**\n * Detect files present in installation but missing from source\n *\n * Compares installed files (from version file) against current source files,\n * identifying which files no longer exist in source and should be removed.\n *\n * @returns Array of obsolete files (empty if none found)\n */\n protected async detectObsoleteFiles(): Promise<ObsoleteFile[]> {\n const versionData = await this.loadVersionFile();\n if (!versionData) {\n return []; // No installed version, nothing is obsolete\n }\n\n const obsolete: ObsoleteFile[] = [];\n const sourceRoot = this.getSourceRoot();\n\n // Check each component and its files\n for (const [componentName, files] of Object.entries(versionData.components)) {\n // Only check tracked components\n if (!this.isTrackedComponent(componentName)) {\n continue;\n }\n\n const config = this.components[componentName];\n const sourceDir = join(sourceRoot, config.source);\n\n // Check each installed file against source\n for (const filePath of Object.keys(files)) {\n const sourcePath = join(sourceDir, filePath);\n if (!existsSync(sourcePath)) {\n obsolete.push({\n path: filePath,\n component: componentName,\n });\n }\n }\n }\n\n return obsolete;\n }\n\n /**\n * Check for updates to a component's files\n *\n * Compares source files against installed files using hashes to detect:\n * - New files (in source but not installed)\n * - Modified files (hash changed in source)\n * - Deleted files (in installation but not in source)\n * - User-modified files (hash differs from recorded hash)\n * - Conflicts (user modified, but source also changed)\n *\n * @param componentName - Component to check\n * @param versionData - Current version data from installation\n * @returns Array of FileChange objects describing all detected changes\n */\n protected async checkUpdates(\n componentName: string,\n versionData: VersionData\n ): Promise<FileChange[]> {\n const changes: FileChange[] = [];\n const config = this.components[componentName];\n\n if (!config) {\n throw new Error(`Unknown component: ${componentName}`);\n }\n\n const sourceRoot = this.getSourceRoot();\n const sourceDir = join(sourceRoot, config.source);\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n const targetPath = join(absoluteTargetDir, config.target);\n\n // Get hashes from source\n const sourceHashes = await computeDirectoryHashes(sourceDir, config.prefix);\n\n // Get hashes from installation (empty map if directory doesn't exist)\n const installedHashes = existsSync(targetPath)\n ? await computeDirectoryHashes(targetPath, config.prefix)\n : new Map<string, string>();\n\n // Get recorded hashes from version file\n const recordedHashes = versionData.components[componentName] || {};\n\n // Check source files\n for (const [filePath, sourceHash] of sourceHashes) {\n const installedHash = installedHashes.get(filePath);\n const recordedEntry = recordedHashes[filePath];\n const recordedHash = recordedEntry?.hash;\n\n if (!installedHash) {\n // File exists in source but not installed\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"added\",\n sourceHash,\n });\n } else if (sourceHash !== recordedHash) {\n // Source file changed (or no baseline exists)\n if (!recordedHash) {\n // No baseline recorded (upgrading from version without hash tracking)\n // Treat as clean upgrade - modified, not conflict\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"modified\",\n sourceHash,\n installedHash,\n });\n } else if (sourceHash === installedHash) {\n // Source and installed are already in sync; stale recorded hash, no action needed\n } else if (installedHash !== recordedHash) {\n // User also modified the file - real conflict\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"conflict\",\n sourceHash,\n installedHash,\n });\n } else {\n // Only source changed\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"modified\",\n sourceHash,\n installedHash,\n });\n }\n } else if (installedHash !== recordedHash) {\n // User modified the file\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"user-modified\",\n sourceHash,\n installedHash,\n });\n }\n }\n\n // Check for deleted files (in version but not in source)\n for (const [filePath] of Object.entries(recordedHashes)) {\n if (!sourceHashes.has(filePath)) {\n changes.push({\n path: filePath,\n component: componentName,\n changeType: \"deleted\",\n installedHash: installedHashes.get(filePath),\n });\n }\n }\n\n return changes;\n }\n\n /**\n * Install or update a component's files\n *\n * Copies all files from source to target directory, creating parent\n * directories as needed. Optionally forces overwrite of user-modified files.\n *\n * @param componentName - Component to install\n * @param force - If true, overwrite user-modified files\n * @returns Number of files installed/updated\n * @throws Error if installation fails\n */\n protected async installComponent(componentName: string, force: boolean = false): Promise<number> {\n const config = this.components[componentName];\n\n if (!config) {\n throw new Error(`Unknown component: ${componentName}`);\n }\n\n const sourceRoot = this.getSourceRoot();\n const sourceDir = join(sourceRoot, config.source);\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n const targetPath = join(absoluteTargetDir, config.target);\n const versionData = await this.loadVersionFile();\n\n // Get list of changes\n const changes = versionData ? await this.checkUpdates(componentName, versionData) : [];\n\n let filesInstalled = 0;\n\n // Get all source files\n const sourceHashes = await computeDirectoryHashes(sourceDir, config.prefix);\n\n // Copy files from source\n for (const filePath of sourceHashes.keys()) {\n const sourcePath = join(sourceDir, filePath);\n const targetFilePath = join(targetPath, filePath);\n\n // Check for conflicts with user modifications or conflicts\n const change = changes.find((c) => c.path === filePath);\n if (change && !force) {\n // Skip user-modified files unless force is set\n if (change.changeType === \"user-modified\") {\n continue;\n }\n // Skip conflict files - they require explicit resolution\n if (change.changeType === \"conflict\") {\n continue;\n }\n }\n\n // Create parent directories\n await mkdir(dirname(targetFilePath), { recursive: true });\n\n // Copy file\n await copyFile(sourcePath, targetFilePath);\n filesInstalled++;\n }\n\n return filesInstalled;\n }\n\n /**\n * Remove a file from the installation\n *\n * @param filePath - Relative path to file to remove\n * @throws Error if file cannot be deleted\n */\n protected async removeFile(filePath: string): Promise<void> {\n // Find which component this file belongs to\n const versionData = await this.loadVersionFile();\n if (!versionData) {\n return;\n }\n\n const absoluteTargetDir = await this.getAbsoluteTargetDir();\n\n for (const [componentName] of Object.entries(versionData.components)) {\n const config = this.components[componentName];\n if (!config) continue;\n\n const targetPath = join(absoluteTargetDir, config.target);\n const fullPath = join(targetPath, filePath);\n\n if (existsSync(fullPath)) {\n await rm(fullPath, { force: true });\n return;\n }\n }\n }\n\n /**\n * Remove all obsolete files\n *\n * Deletes files that are in the installation but no longer exist in source.\n *\n * @returns Number of files removed\n */\n protected async removeObsoleteFiles(): Promise<number> {\n const obsolete = await this.detectObsoleteFiles();\n let removed = 0;\n\n for (const obsoleteFile of obsolete) {\n try {\n await this.removeFile(obsoleteFile.path);\n removed++;\n } catch (error) {\n // Log error but continue removing other files\n console.error(`Failed to remove obsolete file ${obsoleteFile.path}:`, error);\n }\n }\n\n return removed;\n }\n\n /**\n * Get the current CLI version\n *\n * @returns Version string (e.g., \"0.1.0\")\n */\n protected async getCliVersion(): Promise<string> {\n return getCliVersionFromUtils();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }