@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,218 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ import { AuditOrchestrator } from "../relationships/spec/orchestrator.js";
4
+ import { ReportGenerator } from "../reports/report-generator.js";
5
+ import { DifferentialAnalyzer } from "../differential-analyzer.js";
6
+ import { SnapshotStorage } from "../snapshot-storage.js";
7
+ import { AIEvaluator } from "../relationships/ai/evaluator.js";
8
+ import { AIEvaluationAbortError } from "../ai/runner.js";
9
+ import { CANONICAL_LAYER_NAMES } from "../../core/layers.js";
10
+ class PipelineOrchestrator {
11
+ auditOrchestrator;
12
+ reportGenerator;
13
+ differentialAnalyzer;
14
+ snapshotStorage;
15
+ constructor() {
16
+ this.auditOrchestrator = new AuditOrchestrator(), this.reportGenerator = new ReportGenerator(), this.differentialAnalyzer = new DifferentialAnalyzer(), this.snapshotStorage = new SnapshotStorage();
17
+ }
18
+ /**
19
+ * Execute the complete audit pipeline
20
+ */
21
+ async executePipeline(options = {}) {
22
+ const baseOutputDir = options.outputDir ?? "audit-results", timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"), sessionDir = path.join(baseOutputDir, timestamp), beforeDir = path.join(sessionDir, "before"), afterDir = path.join(sessionDir, "after"), summaryDir = path.join(sessionDir, "summary");
23
+ await fs.mkdir(beforeDir, { recursive: !0 }), await fs.mkdir(afterDir, { recursive: !0 }), await fs.mkdir(summaryDir, { recursive: !0 }), console.log(`
24
+ \u{1F4CA} Starting Audit Pipeline`), console.log(` Output: ${sessionDir}
25
+ `), console.log("\u23F3 Step 1/4: Running initial audit (BEFORE AI evaluation)...");
26
+ const beforeResult = await this.runAudit(options);
27
+ await this.snapshotStorage.save(beforeResult);
28
+ const beforeReportPath = await this.reportGenerator.generateReport(beforeResult, {
29
+ phase: "before",
30
+ outputDir: beforeDir,
31
+ format: options.format ?? "markdown",
32
+ layer: options.layer,
33
+ verbose: options.verbose
34
+ });
35
+ console.log(`\u2705 Before audit complete: ${beforeReportPath}`);
36
+ const reports = {
37
+ before: beforeReportPath
38
+ };
39
+ if (!options.enableAI)
40
+ return console.log(`
41
+ \u{1F4CB} Pipeline complete (AI evaluation disabled)`), {
42
+ beforeResult,
43
+ reports
44
+ };
45
+ console.log(`
46
+ \u23F3 Step 2/4: Running AI-assisted evaluation...`), console.log(" (Claude CLI must be installed and authenticated)");
47
+ const aiEvaluator = new AIEvaluator({
48
+ outputDir: "audit-reports/relationships"
49
+ }), getPredicatesForLayer = async (layer) => this.auditOrchestrator.getPredicatesForLayer(layer);
50
+ console.log(" Step 2a/3: Evaluating low-coverage elements...");
51
+ let aiAborted = !1;
52
+ try {
53
+ await aiEvaluator.evaluateLowCoverageElements(beforeResult.coverage, getPredicatesForLayer);
54
+ } catch (error) {
55
+ error instanceof AIEvaluationAbortError ? (console.error(" \u274C AI evaluation aborted \u2014 Claude CLI unavailable. Skipping remaining AI steps."), aiAborted = !0) : console.error(" \u26A0\uFE0F Error evaluating low-coverage elements:", error instanceof Error ? error.message : String(error));
56
+ }
57
+ if (!aiAborted) {
58
+ console.log(" Step 2b/3: Reviewing layer coherence...");
59
+ try {
60
+ const layerNames = beforeResult.coverage.map((c) => c.layer);
61
+ await aiEvaluator.reviewLayerCoherence(layerNames, beforeResult.coverage);
62
+ } catch (error) {
63
+ error instanceof AIEvaluationAbortError ? (console.error(" \u274C AI evaluation aborted \u2014 Claude CLI unavailable. Skipping remaining AI steps."), aiAborted = !0) : console.error(" \u26A0\uFE0F Error reviewing layer coherence:", error instanceof Error ? error.message : String(error));
64
+ }
65
+ }
66
+ if (!aiAborted) {
67
+ console.log(" Step 2c/3: Validating inter-layer relationships...");
68
+ try {
69
+ const layerPairs = [];
70
+ for (let i = 0; i < CANONICAL_LAYER_NAMES.length; i++)
71
+ for (let j = i + 1; j < CANONICAL_LAYER_NAMES.length; j++)
72
+ layerPairs.push({ source: CANONICAL_LAYER_NAMES[i], target: CANONICAL_LAYER_NAMES[j] });
73
+ await aiEvaluator.validateInterLayerReferences(layerPairs);
74
+ } catch (error) {
75
+ error instanceof AIEvaluationAbortError ? console.error(" \u274C AI evaluation aborted \u2014 Claude CLI unavailable.") : console.error(" \u26A0\uFE0F Error validating inter-layer relationships:", error instanceof Error ? error.message : String(error));
76
+ }
77
+ }
78
+ console.log(`
79
+ \u23F3 Step 3/4: Running post-evaluation audit (AFTER AI evaluation)...`);
80
+ const afterResult = await this.runAudit(options);
81
+ await this.snapshotStorage.save(afterResult);
82
+ const afterReportPath = await this.reportGenerator.generateReport(afterResult, {
83
+ phase: "after",
84
+ outputDir: afterDir,
85
+ format: options.format ?? "markdown",
86
+ layer: options.layer,
87
+ verbose: options.verbose
88
+ });
89
+ console.log(`\u2705 After audit complete: ${afterReportPath}`), console.log(`
90
+ \u23F3 Step 4/4: Generating differential summary and finalizing...`);
91
+ const differential = this.differentialAnalyzer.analyze(beforeResult, afterResult), summaryReportPath = await this.generateSummaryReport(differential, beforeResult, afterResult, summaryDir, options.format ?? "markdown");
92
+ console.log(`\u2705 Summary report complete: ${summaryReportPath}`);
93
+ const avgDensityBefore = beforeResult.coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (beforeResult.coverage.length || 1), avgDensityAfter = afterResult.coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (afterResult.coverage.length || 1), summary = {
94
+ relationshipsAdded: differential.summary.relationshipsAdded,
95
+ gapsResolved: differential.detailed.gapChanges.resolved.length,
96
+ coverageImprovement: avgDensityAfter - avgDensityBefore
97
+ };
98
+ return console.log(`
99
+ \u{1F4CA} Pipeline Results:`), console.log(` Relationships Added: ${summary.relationshipsAdded}`), console.log(` Gaps Resolved: ${summary.gapsResolved}`), console.log(` Coverage Improvement: ${summary.coverageImprovement.toFixed(2)} relationships/node type`), console.log(`
100
+ \u2705 Pipeline complete: ${sessionDir}
101
+ `), {
102
+ beforeResult,
103
+ afterResult,
104
+ reports: {
105
+ before: beforeReportPath,
106
+ after: afterReportPath,
107
+ summary: summaryReportPath
108
+ },
109
+ summary
110
+ };
111
+ }
112
+ /**
113
+ * Run audit with current options
114
+ */
115
+ async runAudit(options) {
116
+ const auditOptions = {
117
+ layer: options.layer,
118
+ verbose: options.verbose ?? !1
119
+ };
120
+ return this.auditOrchestrator.runAudit(auditOptions);
121
+ }
122
+ /**
123
+ * Generate differential summary report with side-by-side metrics
124
+ */
125
+ async generateSummaryReport(differential, beforeResult, afterResult, outputDir, format) {
126
+ let content, filename;
127
+ switch (format) {
128
+ case "json":
129
+ content = JSON.stringify(this.serializeDifferential(differential), null, 2), filename = "summary.json";
130
+ break;
131
+ case "markdown":
132
+ content = this.generateMarkdownSummary(differential, beforeResult, afterResult), filename = "summary.md";
133
+ break;
134
+ case "text":
135
+ default:
136
+ content = this.generateTextSummary(differential, beforeResult, afterResult), filename = "summary.txt";
137
+ break;
138
+ }
139
+ const outputPath = path.join(outputDir, filename);
140
+ return await fs.writeFile(outputPath, content, "utf-8"), outputPath;
141
+ }
142
+ /**
143
+ * Generate Markdown summary with side-by-side metrics
144
+ */
145
+ generateMarkdownSummary(differential, beforeResult, afterResult) {
146
+ const lines = [];
147
+ lines.push("# Differential Audit Summary"), lines.push(""), lines.push(`**Analysis Date**: ${(/* @__PURE__ */ new Date()).toISOString()}`), lines.push("");
148
+ const beforeCoverage = beforeResult.coverage, afterCoverage = afterResult.coverage, avgIsolationBefore = beforeCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / (beforeCoverage.length || 1), avgIsolationAfter = afterCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / (afterCoverage.length || 1), avgDensityBefore = beforeCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (beforeCoverage.length || 1), avgDensityAfter = afterCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (afterCoverage.length || 1), avgUtilizationBefore = beforeCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / (beforeCoverage.length || 1), avgUtilizationAfter = afterCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / (afterCoverage.length || 1);
149
+ return lines.push("## Coverage Metrics Comparison"), lines.push(""), lines.push("| Metric | Before | After | Change |"), lines.push("|--------|--------|-------|--------|"), [
150
+ {
151
+ name: "Isolation Rate",
152
+ before: avgIsolationBefore,
153
+ after: avgIsolationAfter,
154
+ unit: "%"
155
+ },
156
+ {
157
+ name: "Density",
158
+ before: avgDensityBefore,
159
+ after: avgDensityAfter,
160
+ unit: " rel/type"
161
+ },
162
+ {
163
+ name: "Predicate Utilization",
164
+ before: avgUtilizationBefore,
165
+ after: avgUtilizationAfter,
166
+ unit: "%"
167
+ }
168
+ ].forEach((metric) => {
169
+ const change = metric.after - metric.before, changeStr = change > 0 ? `+${change.toFixed(2)}${metric.unit}` : `${change.toFixed(2)}${metric.unit}`;
170
+ lines.push(`| ${metric.name} | ${metric.before.toFixed(2)}${metric.unit} | ${metric.after.toFixed(2)}${metric.unit} | ${changeStr} |`);
171
+ }), lines.push(""), differential.detailed.gapChanges.resolved.length > 0 && (lines.push("## Resolved Gaps"), lines.push(""), differential.detailed.gapChanges.resolved.forEach((gap) => {
172
+ lines.push(`- \u2705 **${gap.sourceNodeType}** \u2192 **${gap.destinationNodeType}**: ${gap.suggestedPredicate}`);
173
+ }), lines.push("")), differential.summary.relationshipsAdded > 0 && (lines.push("## Added Relationships"), lines.push(""), lines.push(`Total: ${differential.summary.relationshipsAdded}`), lines.push("")), lines.push("## Coverage Heatmap"), lines.push(""), lines.push("### Before"), lines.push(this.generateCoverageHeatmap(beforeResult.coverage)), lines.push(""), lines.push("### After"), lines.push(this.generateCoverageHeatmap(afterResult.coverage)), lines.push(""), lines.join(`
174
+ `);
175
+ }
176
+ /**
177
+ * Generate text summary
178
+ */
179
+ generateTextSummary(differential, beforeResult, afterResult) {
180
+ const lines = [];
181
+ lines.push("=".repeat(80)), lines.push("DIFFERENTIAL AUDIT SUMMARY"), lines.push("=".repeat(80)), lines.push(""), lines.push(`Analysis Date: ${(/* @__PURE__ */ new Date()).toISOString()}`), lines.push("");
182
+ const beforeCoverage = beforeResult.coverage, afterCoverage = afterResult.coverage, isolationBefore = beforeCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / (beforeCoverage.length || 1), isolationAfter = afterCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / (afterCoverage.length || 1), densityBefore = beforeCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (beforeCoverage.length || 1), densityAfter = afterCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / (afterCoverage.length || 1), predicateBefore = beforeCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / (beforeCoverage.length || 1), predicateAfter = afterCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / (afterCoverage.length || 1);
183
+ return lines.push("-".repeat(80)), lines.push("COVERAGE METRICS COMPARISON"), lines.push("-".repeat(80)), lines.push(""), lines.push(`Isolation Rate: ${isolationBefore.toFixed(1)}% \u2192 ${isolationAfter.toFixed(1)}% (${(isolationAfter - isolationBefore).toFixed(1)}%)`), lines.push(`Density: ${densityBefore.toFixed(2)} \u2192 ${densityAfter.toFixed(2)} (${(densityAfter - densityBefore).toFixed(2)})`), lines.push(`Predicate Usage: ${predicateBefore.toFixed(1)}% \u2192 ${predicateAfter.toFixed(1)}% (${(predicateAfter - predicateBefore).toFixed(1)}%)`), lines.push(""), differential.detailed.gapChanges.resolved.length > 0 && (lines.push("-".repeat(80)), lines.push("RESOLVED GAPS"), lines.push("-".repeat(80)), lines.push(""), differential.detailed.gapChanges.resolved.forEach((gap, i) => {
184
+ lines.push(` ${i + 1}. ${gap.sourceNodeType} \u2192 ${gap.destinationNodeType}: ${gap.suggestedPredicate}`);
185
+ }), lines.push("")), differential.summary.relationshipsAdded > 0 && (lines.push("-".repeat(80)), lines.push("ADDED RELATIONSHIPS"), lines.push("-".repeat(80)), lines.push(""), lines.push(`Total: ${differential.summary.relationshipsAdded}`), lines.push("")), lines.push("=".repeat(80)), lines.join(`
186
+ `);
187
+ }
188
+ /**
189
+ * Convert DifferentialAnalysis to JSON-serializable format
190
+ * Maps need to be converted to plain objects
191
+ */
192
+ serializeDifferential(differential) {
193
+ return {
194
+ ...differential,
195
+ detailed: {
196
+ ...differential.detailed,
197
+ coverageByLayer: Object.fromEntries(differential.detailed.coverageByLayer)
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Generate a simple coverage heatmap visualization
203
+ */
204
+ generateCoverageHeatmap(coverage) {
205
+ if (!coverage || coverage.length === 0)
206
+ return "No coverage data available";
207
+ const lines = [], avgIsolation = coverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / coverage.length, avgDensity = coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / coverage.length, avgPredicateUtil = coverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / coverage.length, barLength = 50, generateBar = (fillRatio) => {
208
+ const filledLength = Math.max(0, Math.min(barLength, Math.floor(fillRatio * barLength))), emptyLength = barLength - filledLength;
209
+ return `${"\u2588".repeat(filledLength)}${" ".repeat(emptyLength)}`;
210
+ };
211
+ return lines.push("```"), lines.push(`Isolation: ${generateBar(avgIsolation / 100)} ${avgIsolation.toFixed(1)}%`), lines.push(`Density: ${generateBar(avgDensity / 5)} ${avgDensity.toFixed(2)}`), lines.push(`Predicates: ${generateBar(avgPredicateUtil / 100)} ${avgPredicateUtil.toFixed(1)}%`), lines.push("```"), lines.join(`
212
+ `);
213
+ }
214
+ }
215
+ export {
216
+ PipelineOrchestrator
217
+ };
218
+ //# sourceMappingURL=pipeline-orchestrator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/audit/pipeline/pipeline-orchestrator.ts"],
4
+ "sourcesContent": ["import fs from \"fs/promises\";\nimport path from \"path\";\nimport type { AuditReport, CoverageMetrics, GapCandidate } from \"../types.js\";\nimport { AuditOrchestrator, type AuditOptions } from \"../relationships/spec/orchestrator.js\";\nimport { ReportGenerator } from \"../reports/report-generator.js\";\nimport { DifferentialAnalyzer, type DifferentialAnalysis } from \"../differential-analyzer.js\";\nimport { SnapshotStorage } from \"../snapshot-storage.js\";\nimport { AIEvaluator } from \"../relationships/ai/evaluator.js\";\nimport { AIEvaluationAbortError } from \"../ai/runner.js\";\nimport { CANONICAL_LAYER_NAMES } from \"../../core/layers.js\";\n\nexport interface PipelineOptions {\n /**\n * Base output directory for all pipeline artifacts\n * Default: \"audit-results\"\n */\n outputDir?: string;\n\n /**\n * Layer to audit (or undefined for all layers)\n */\n layer?: string;\n\n /**\n * Report format\n */\n format?: \"text\" | \"json\" | \"markdown\";\n\n /**\n * Whether to run AI-assisted evaluation\n * Requires Claude Code CLI to be installed and authenticated on the system\n */\n enableAI?: boolean;\n\n /**\n * Verbose output\n */\n verbose?: boolean;\n}\n\n/**\n * Pipeline result when AI is disabled\n * Contains only before snapshot and report\n */\nexport interface PipelineResultWithoutAI {\n beforeResult: AuditReport;\n afterResult?: never;\n reports: {\n before: string;\n after?: never;\n summary?: never;\n };\n summary?: never;\n}\n\n/**\n * Pipeline result when AI is enabled\n * Contains before and after snapshots, all reports, and summary metrics\n */\nexport interface PipelineResultWithAI {\n beforeResult: AuditReport;\n afterResult: AuditReport;\n reports: {\n before: string;\n after: string;\n summary: string;\n };\n summary: {\n relationshipsAdded: number;\n gapsResolved: number;\n coverageImprovement: number;\n };\n}\n\n/**\n * Discriminated union of pipeline results based on AI enablement\n * Enforces type safety: afterResult, reports.after, reports.summary, and summary\n * must be present together or absent together\n */\nexport type PipelineResult = PipelineResultWithoutAI | PipelineResultWithAI;\n\n/**\n * Orchestrates the complete audit pipeline:\n * 1. Before audit \u2192 output to audit-results/before/\n * 2. AI-assisted evaluation (if enabled)\n * 3. After audit \u2192 output to audit-results/after/\n * 4. Differential summary \u2192 output to audit-results/summary/\n */\nexport class PipelineOrchestrator {\n private readonly auditOrchestrator: AuditOrchestrator;\n private readonly reportGenerator: ReportGenerator;\n private readonly differentialAnalyzer: DifferentialAnalyzer;\n private readonly snapshotStorage: SnapshotStorage;\n\n constructor() {\n this.auditOrchestrator = new AuditOrchestrator();\n this.reportGenerator = new ReportGenerator();\n this.differentialAnalyzer = new DifferentialAnalyzer();\n this.snapshotStorage = new SnapshotStorage();\n }\n\n /**\n * Execute the complete audit pipeline\n */\n async executePipeline(options: PipelineOptions = {}): Promise<PipelineResult> {\n const baseOutputDir = options.outputDir ?? \"audit-results\";\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const sessionDir = path.join(baseOutputDir, timestamp);\n\n // Create output directories\n const beforeDir = path.join(sessionDir, \"before\");\n const afterDir = path.join(sessionDir, \"after\");\n const summaryDir = path.join(sessionDir, \"summary\");\n\n await fs.mkdir(beforeDir, { recursive: true });\n await fs.mkdir(afterDir, { recursive: true });\n await fs.mkdir(summaryDir, { recursive: true });\n\n console.log(`\\n\uD83D\uDCCA Starting Audit Pipeline`);\n console.log(` Output: ${sessionDir}\\n`);\n\n // Step 1: Run BEFORE audit\n console.log(\"\u23F3 Step 1/4: Running initial audit (BEFORE AI evaluation)...\");\n const beforeResult = await this.runAudit(options);\n\n // Save BEFORE snapshot\n await this.snapshotStorage.save(beforeResult);\n\n // Generate BEFORE report\n const beforeReportPath = await this.reportGenerator.generateReport(beforeResult, {\n phase: \"before\",\n outputDir: beforeDir,\n format: options.format ?? \"markdown\",\n layer: options.layer,\n verbose: options.verbose,\n });\n\n console.log(`\u2705 Before audit complete: ${beforeReportPath}`);\n\n const reports = {\n before: beforeReportPath,\n };\n\n // If AI evaluation is disabled, stop here\n if (!options.enableAI) {\n console.log(\"\\n\uD83D\uDCCB Pipeline complete (AI evaluation disabled)\");\n return {\n beforeResult,\n reports,\n };\n }\n\n // Step 2: Run AI-assisted evaluation\n console.log(\"\\n\u23F3 Step 2/4: Running AI-assisted evaluation...\");\n console.log(\" (Claude CLI must be installed and authenticated)\");\n\n // Run AI-assisted evaluation using the AIEvaluator.\n // Output goes to audit-reports/relationships/ so dr-audit-resolve and dr-audit-refine\n // can discover and consume the results alongside the main relationship audit JSON.\n const aiEvaluator = new AIEvaluator({\n outputDir: \"audit-reports/relationships\",\n });\n\n // Provide predicate retrieval function for AI evaluation\n // Predicates are used in AI prompts to suggest available relationship types\n const getPredicatesForLayer = async (layer: string): Promise<string[]> => {\n return this.auditOrchestrator.getPredicatesForLayer(layer);\n };\n\n // Step 2a: Evaluate low-coverage elements\n console.log(\" Step 2a/3: Evaluating low-coverage elements...\");\n let aiAborted = false;\n try {\n await aiEvaluator.evaluateLowCoverageElements(beforeResult.coverage as CoverageMetrics[], getPredicatesForLayer);\n } catch (error) {\n if (error instanceof AIEvaluationAbortError) {\n console.error(\" \u274C AI evaluation aborted \u2014 Claude CLI unavailable. Skipping remaining AI steps.\");\n aiAborted = true;\n } else {\n console.error(\" \u26A0\uFE0F Error evaluating low-coverage elements:\", error instanceof Error ? error.message : String(error));\n }\n }\n\n // Step 2b: Review layer coherence\n if (!aiAborted) {\n console.log(\" Step 2b/3: Reviewing layer coherence...\");\n try {\n const layerNames = (beforeResult.coverage as CoverageMetrics[]).map((c) => c.layer);\n await aiEvaluator.reviewLayerCoherence(layerNames, beforeResult.coverage as CoverageMetrics[]);\n } catch (error) {\n if (error instanceof AIEvaluationAbortError) {\n console.error(\" \u274C AI evaluation aborted \u2014 Claude CLI unavailable. Skipping remaining AI steps.\");\n aiAborted = true;\n } else {\n console.error(\" \u26A0\uFE0F Error reviewing layer coherence:\", error instanceof Error ? error.message : String(error));\n }\n }\n }\n\n // Step 2c: Validate inter-layer references\n if (!aiAborted) {\n console.log(\" Step 2c/3: Validating inter-layer relationships...\");\n try {\n // Build layer pairs for validation (higher layers \u2192 lower layers following the architecture)\n const layerPairs: Array<{ source: string; target: string }> = [];\n for (let i = 0; i < CANONICAL_LAYER_NAMES.length; i++) {\n for (let j = i + 1; j < CANONICAL_LAYER_NAMES.length; j++) {\n layerPairs.push({ source: CANONICAL_LAYER_NAMES[i], target: CANONICAL_LAYER_NAMES[j] });\n }\n }\n await aiEvaluator.validateInterLayerReferences(layerPairs);\n } catch (error) {\n if (error instanceof AIEvaluationAbortError) {\n console.error(\" \u274C AI evaluation aborted \u2014 Claude CLI unavailable.\");\n } else {\n console.error(\" \u26A0\uFE0F Error validating inter-layer relationships:\", error instanceof Error ? error.message : String(error));\n }\n }\n }\n\n // Step 3: Run AFTER audit\n console.log(\"\\n\u23F3 Step 3/4: Running post-evaluation audit (AFTER AI evaluation)...\");\n const afterResult = await this.runAudit(options);\n\n // Save AFTER snapshot\n await this.snapshotStorage.save(afterResult);\n\n // Generate AFTER report\n const afterReportPath = await this.reportGenerator.generateReport(afterResult, {\n phase: \"after\",\n outputDir: afterDir,\n format: options.format ?? \"markdown\",\n layer: options.layer,\n verbose: options.verbose,\n });\n\n console.log(`\u2705 After audit complete: ${afterReportPath}`);\n\n // Step 4: Generate differential summary and finalize\n console.log(\"\\n\u23F3 Step 4/4: Generating differential summary and finalizing...\");\n\n const differential = this.differentialAnalyzer.analyze(\n beforeResult,\n afterResult\n );\n\n // Generate summary report\n const summaryReportPath = await this.generateSummaryReport(\n differential,\n beforeResult,\n afterResult,\n summaryDir,\n options.format ?? \"markdown\"\n );\n\n console.log(`\u2705 Summary report complete: ${summaryReportPath}`);\n\n // Calculate summary metrics\n const avgDensityBefore =\n beforeResult.coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (beforeResult.coverage.length || 1);\n const avgDensityAfter =\n afterResult.coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (afterResult.coverage.length || 1);\n\n const summary = {\n relationshipsAdded: differential.summary.relationshipsAdded,\n gapsResolved: differential.detailed.gapChanges.resolved.length,\n coverageImprovement: avgDensityAfter - avgDensityBefore,\n };\n\n console.log(\"\\n\uD83D\uDCCA Pipeline Results:\");\n console.log(` Relationships Added: ${summary.relationshipsAdded}`);\n console.log(` Gaps Resolved: ${summary.gapsResolved}`);\n console.log(` Coverage Improvement: ${summary.coverageImprovement.toFixed(2)} relationships/node type`);\n console.log(`\\n\u2705 Pipeline complete: ${sessionDir}\\n`);\n\n return {\n beforeResult,\n afterResult,\n reports: {\n before: beforeReportPath,\n after: afterReportPath,\n summary: summaryReportPath,\n },\n summary,\n };\n }\n\n /**\n * Run audit with current options\n */\n private async runAudit(options: PipelineOptions): Promise<AuditReport> {\n const auditOptions: AuditOptions = {\n layer: options.layer,\n verbose: options.verbose ?? false,\n };\n\n return this.auditOrchestrator.runAudit(auditOptions);\n }\n\n /**\n * Generate differential summary report with side-by-side metrics\n */\n private async generateSummaryReport(\n differential: DifferentialAnalysis,\n beforeResult: AuditReport,\n afterResult: AuditReport,\n outputDir: string,\n format: \"text\" | \"json\" | \"markdown\"\n ): Promise<string> {\n let content: string;\n let filename: string;\n\n switch (format) {\n case \"json\":\n content = JSON.stringify(this.serializeDifferential(differential), null, 2);\n filename = \"summary.json\";\n break;\n\n case \"markdown\":\n content = this.generateMarkdownSummary(differential, beforeResult, afterResult);\n filename = \"summary.md\";\n break;\n\n case \"text\":\n default:\n content = this.generateTextSummary(differential, beforeResult, afterResult);\n filename = \"summary.txt\";\n break;\n }\n\n const outputPath = path.join(outputDir, filename);\n await fs.writeFile(outputPath, content, \"utf-8\");\n return outputPath;\n }\n\n /**\n * Generate Markdown summary with side-by-side metrics\n */\n private generateMarkdownSummary(differential: DifferentialAnalysis, beforeResult: AuditReport, afterResult: AuditReport): string {\n const lines: string[] = [];\n\n lines.push(\"# Differential Audit Summary\");\n lines.push(\"\");\n lines.push(`**Analysis Date**: ${new Date().toISOString()}`);\n lines.push(\"\");\n\n // Calculate average metrics across all layers\n const beforeCoverage = beforeResult.coverage;\n const afterCoverage = afterResult.coverage;\n\n const avgIsolationBefore =\n beforeCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) /\n (beforeCoverage.length || 1);\n const avgIsolationAfter =\n afterCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) /\n (afterCoverage.length || 1);\n\n const avgDensityBefore =\n beforeCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (beforeCoverage.length || 1);\n const avgDensityAfter =\n afterCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (afterCoverage.length || 1);\n\n const avgUtilizationBefore =\n beforeCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) /\n (beforeCoverage.length || 1);\n const avgUtilizationAfter =\n afterCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) /\n (afterCoverage.length || 1);\n\n // Side-by-side metrics table\n lines.push(\"## Coverage Metrics Comparison\");\n lines.push(\"\");\n lines.push(\"| Metric | Before | After | Change |\");\n lines.push(\"|--------|--------|-------|--------|\");\n\n const metrics = [\n {\n name: \"Isolation Rate\",\n before: avgIsolationBefore,\n after: avgIsolationAfter,\n unit: \"%\",\n },\n {\n name: \"Density\",\n before: avgDensityBefore,\n after: avgDensityAfter,\n unit: \" rel/type\",\n },\n {\n name: \"Predicate Utilization\",\n before: avgUtilizationBefore,\n after: avgUtilizationAfter,\n unit: \"%\",\n },\n ];\n\n metrics.forEach((metric) => {\n const change = metric.after - metric.before;\n const changeStr =\n change > 0\n ? `+${change.toFixed(2)}${metric.unit}`\n : `${change.toFixed(2)}${metric.unit}`;\n lines.push(\n `| ${metric.name} | ${metric.before.toFixed(2)}${metric.unit} | ${metric.after.toFixed(2)}${metric.unit} | ${changeStr} |`\n );\n });\n\n lines.push(\"\");\n\n // Resolved gaps\n if (differential.detailed.gapChanges.resolved.length > 0) {\n lines.push(\"## Resolved Gaps\");\n lines.push(\"\");\n differential.detailed.gapChanges.resolved.forEach((gap: GapCandidate) => {\n lines.push(`- \u2705 **${gap.sourceNodeType}** \u2192 **${gap.destinationNodeType}**: ${gap.suggestedPredicate}`);\n });\n lines.push(\"\");\n }\n\n // Added relationships (from summary)\n if (differential.summary.relationshipsAdded > 0) {\n lines.push(\"## Added Relationships\");\n lines.push(\"\");\n lines.push(`Total: ${differential.summary.relationshipsAdded}`);\n lines.push(\"\");\n }\n\n // Visual diff of coverage heatmap (simplified)\n lines.push(\"## Coverage Heatmap\");\n lines.push(\"\");\n lines.push(\"### Before\");\n lines.push(this.generateCoverageHeatmap(beforeResult.coverage as CoverageMetrics[]));\n lines.push(\"\");\n lines.push(\"### After\");\n lines.push(this.generateCoverageHeatmap(afterResult.coverage as CoverageMetrics[]));\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate text summary\n */\n private generateTextSummary(differential: DifferentialAnalysis, beforeResult: AuditReport, afterResult: AuditReport): string {\n const lines: string[] = [];\n\n lines.push(\"=\".repeat(80));\n lines.push(\"DIFFERENTIAL AUDIT SUMMARY\");\n lines.push(\"=\".repeat(80));\n lines.push(\"\");\n lines.push(`Analysis Date: ${new Date().toISOString()}`);\n lines.push(\"\");\n\n // Calculate average metrics\n const beforeCoverage = beforeResult.coverage;\n const afterCoverage = afterResult.coverage;\n\n const isolationBefore =\n beforeCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) /\n (beforeCoverage.length || 1);\n const isolationAfter =\n afterCoverage.reduce((sum, c) => sum + c.isolationPercentage, 0) /\n (afterCoverage.length || 1);\n\n const densityBefore =\n beforeCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (beforeCoverage.length || 1);\n const densityAfter =\n afterCoverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) /\n (afterCoverage.length || 1);\n\n const predicateBefore =\n beforeCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) /\n (beforeCoverage.length || 1);\n const predicateAfter =\n afterCoverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) /\n (afterCoverage.length || 1);\n\n // Metrics comparison\n lines.push(\"-\".repeat(80));\n lines.push(\"COVERAGE METRICS COMPARISON\");\n lines.push(\"-\".repeat(80));\n lines.push(\"\");\n\n lines.push(\n `Isolation Rate: ${isolationBefore.toFixed(1)}% \u2192 ${isolationAfter.toFixed(1)}% (${(isolationAfter - isolationBefore).toFixed(1)}%)`\n );\n lines.push(\n `Density: ${densityBefore.toFixed(2)} \u2192 ${densityAfter.toFixed(2)} (${(densityAfter - densityBefore).toFixed(2)})`\n );\n lines.push(\n `Predicate Usage: ${predicateBefore.toFixed(1)}% \u2192 ${predicateAfter.toFixed(1)}% (${(predicateAfter - predicateBefore).toFixed(1)}%)`\n );\n\n lines.push(\"\");\n\n // Resolved gaps\n if (differential.detailed.gapChanges.resolved.length > 0) {\n lines.push(\"-\".repeat(80));\n lines.push(\"RESOLVED GAPS\");\n lines.push(\"-\".repeat(80));\n lines.push(\"\");\n differential.detailed.gapChanges.resolved.forEach((gap: GapCandidate, i: number) => {\n lines.push(` ${i + 1}. ${gap.sourceNodeType} \u2192 ${gap.destinationNodeType}: ${gap.suggestedPredicate}`);\n });\n lines.push(\"\");\n }\n\n // Added relationships\n if (differential.summary.relationshipsAdded > 0) {\n lines.push(\"-\".repeat(80));\n lines.push(\"ADDED RELATIONSHIPS\");\n lines.push(\"-\".repeat(80));\n lines.push(\"\");\n lines.push(`Total: ${differential.summary.relationshipsAdded}`);\n lines.push(\"\");\n }\n\n lines.push(\"=\".repeat(80));\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Convert DifferentialAnalysis to JSON-serializable format\n * Maps need to be converted to plain objects\n */\n private serializeDifferential(differential: DifferentialAnalysis): Record<string, unknown> {\n return {\n ...differential,\n detailed: {\n ...differential.detailed,\n coverageByLayer: Object.fromEntries(differential.detailed.coverageByLayer),\n },\n };\n }\n\n /**\n * Generate a simple coverage heatmap visualization\n */\n private generateCoverageHeatmap(coverage: CoverageMetrics[]): string {\n if (!coverage || coverage.length === 0) {\n return \"No coverage data available\";\n }\n\n const lines: string[] = [];\n\n // Calculate averages across all layers\n const avgIsolation =\n coverage.reduce((sum, c) => sum + c.isolationPercentage, 0) / coverage.length;\n const avgDensity =\n coverage.reduce((sum, c) => sum + c.relationshipsPerNodeType, 0) / coverage.length;\n const avgPredicateUtil =\n coverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / coverage.length;\n\n // Simple bar chart visualization\n const barLength = 50;\n\n // Helper to safely generate bar with clamped fill\n const generateBar = (fillRatio: number): string => {\n const filledLength = Math.max(0, Math.min(barLength, Math.floor(fillRatio * barLength)));\n const emptyLength = barLength - filledLength;\n return `${\"\u2588\".repeat(filledLength)}${\" \".repeat(emptyLength)}`;\n };\n\n lines.push(\"```\");\n lines.push(\n `Isolation: ${generateBar(avgIsolation / 100)} ${avgIsolation.toFixed(1)}%`\n );\n lines.push(\n `Density: ${generateBar(avgDensity / 5)} ${avgDensity.toFixed(2)}`\n );\n lines.push(\n `Predicates: ${generateBar(avgPredicateUtil / 100)} ${avgPredicateUtil.toFixed(1)}%`\n );\n lines.push(\"```\");\n\n return lines.join(\"\\n\");\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,235 @@
1
+ import { writeFile, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { AuditAIRunner, AIEvaluationAbortError } from "../../ai/runner.js";
4
+ import { PromptTemplates } from "./prompts.js";
5
+ import { ResponseParser } from "./parser.js";
6
+ import { getErrorMessage } from "../../../utils/errors.js";
7
+ import { CANONICAL_LAYER_NAMES } from "../../../core/layers.js";
8
+ class InMemoryProgressTracker {
9
+ completed = /* @__PURE__ */ new Set();
10
+ total = 0;
11
+ constructor(totalItems) {
12
+ this.total = totalItems;
13
+ }
14
+ isCompleted(key) {
15
+ return this.completed.has(key);
16
+ }
17
+ async markCompleted(key) {
18
+ this.completed.add(key);
19
+ }
20
+ getProgress() {
21
+ return {
22
+ completed: this.completed.size,
23
+ total: this.total
24
+ };
25
+ }
26
+ }
27
+ class AIEvaluator {
28
+ runner;
29
+ promptTemplates;
30
+ responseParser;
31
+ config;
32
+ failures = [];
33
+ constructor(config = {}) {
34
+ this.runner = new AuditAIRunner(), this.promptTemplates = new PromptTemplates(), this.responseParser = new ResponseParser(), this.config = {
35
+ outputDir: config.outputDir || "audit-reports/relationships",
36
+ lowCoverageThreshold: config.lowCoverageThreshold ?? 1,
37
+ resumable: config.resumable ?? !0
38
+ };
39
+ }
40
+ /**
41
+ * Evaluate all low-coverage elements sequentially
42
+ * @param coverage - Array of coverage metrics for all layers
43
+ * @param getPredicatesForLayer - Function to retrieve available predicates for a given layer
44
+ * @param tracker - Optional progress tracker for resume support (defaults to in-memory tracker)
45
+ * @returns Promise resolving when all evaluations are complete
46
+ * @throws Error if consecutive invocation failures exceed threshold or if AI evaluation is misconfigured
47
+ */
48
+ async evaluateLowCoverageElements(coverage, getPredicatesForLayer, tracker) {
49
+ const elementRecsDir = join(this.config.outputDir, "element-recommendations");
50
+ await mkdir(elementRecsDir, { recursive: !0 });
51
+ const lowCoverageTypes = [];
52
+ for (const layerMetrics of coverage)
53
+ for (const nodeType of layerMetrics.isolatedNodeTypes)
54
+ lowCoverageTypes.push({ nodeType, metrics: layerMetrics });
55
+ tracker || (tracker = new InMemoryProgressTracker(lowCoverageTypes.length));
56
+ let successCount = 0;
57
+ for (const { nodeType, metrics } of lowCoverageTypes) {
58
+ if (this.config.resumable && tracker.isCompleted(nodeType)) {
59
+ console.log(`Skipping already-evaluated: ${nodeType}`), successCount++;
60
+ continue;
61
+ }
62
+ console.log(`Evaluating element: ${nodeType} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`);
63
+ const predicates = await getPredicatesForLayer(metrics.layer);
64
+ try {
65
+ const prompt = this.promptTemplates.elementEvaluation(nodeType, metrics, predicates), response = await this.runner.invoke(prompt, nodeType), recommendations = this.responseParser.parseElementRecommendations(response);
66
+ await this.saveElementRecommendations(nodeType, recommendations), await tracker.markCompleted(nodeType), console.log(`Completed: ${nodeType} (${recommendations.length} recommendations)`), successCount++;
67
+ } catch (error) {
68
+ const errorMessage = getErrorMessage(error);
69
+ if (console.error(`Failed to evaluate ${nodeType}: ${errorMessage}`), this.failures.push({
70
+ type: "element",
71
+ key: nodeType,
72
+ error: errorMessage,
73
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
74
+ }), error instanceof AIEvaluationAbortError)
75
+ throw error;
76
+ }
77
+ }
78
+ lowCoverageTypes.length > 0 && (console.log(`
79
+ \u2713 Element evaluation complete: ${successCount}/${lowCoverageTypes.length} successful`), this.failures.filter((f) => f.type === "element").length > 0 && console.error(`\u26A0\uFE0F ${this.failures.filter((f) => f.type === "element").length} element(s) failed - see summary for details`));
80
+ }
81
+ /**
82
+ * Review layer coherence sequentially
83
+ */
84
+ async reviewLayerCoherence(layers, coverage, tracker) {
85
+ const layerReviewsDir = join(this.config.outputDir, "layer-reviews");
86
+ await mkdir(layerReviewsDir, { recursive: !0 }), tracker || (tracker = new InMemoryProgressTracker(layers.length));
87
+ let successCount = 0;
88
+ for (const layer of layers) {
89
+ if (this.config.resumable && tracker.isCompleted(layer)) {
90
+ console.log(`Skipping already-reviewed layer: ${layer}`), successCount++;
91
+ continue;
92
+ }
93
+ console.log(`Reviewing layer: ${layer} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`);
94
+ try {
95
+ const prompt = this.promptTemplates.layerReview(layer, coverage), response = await this.runner.invoke(prompt, layer), review = this.responseParser.parseLayerReview(response);
96
+ await this.saveLayerReview(layer, review), await tracker.markCompleted(layer), console.log(`Completed: ${layer} (${review.recommendations.length} recommendations)`), successCount++;
97
+ } catch (error) {
98
+ const errorMessage = getErrorMessage(error);
99
+ if (console.error(`Failed to review layer ${layer}: ${errorMessage}`), this.failures.push({
100
+ type: "layer",
101
+ key: layer,
102
+ error: errorMessage,
103
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
104
+ }), error instanceof AIEvaluationAbortError)
105
+ throw error;
106
+ }
107
+ }
108
+ layers.length > 0 && (console.log(`
109
+ \u2713 Layer review complete: ${successCount}/${layers.length} successful`), this.failures.filter((f) => f.type === "layer").length > 0 && console.error(`\u26A0\uFE0F ${this.failures.filter((f) => f.type === "layer").length} layer(s) failed - see summary for details`));
110
+ }
111
+ /**
112
+ * Validate inter-layer references sequentially
113
+ */
114
+ async validateInterLayerReferences(layerPairs, tracker) {
115
+ const interLayerDir = join(this.config.outputDir, "inter-layer-validation");
116
+ await mkdir(interLayerDir, { recursive: !0 }), tracker || (tracker = new InMemoryProgressTracker(layerPairs.length));
117
+ let successCount = 0;
118
+ for (const { source, target } of layerPairs) {
119
+ const pairKey = `${source}->${target}`;
120
+ if (this.config.resumable && tracker.isCompleted(pairKey)) {
121
+ console.log(`Skipping already-validated: ${pairKey}`), successCount++;
122
+ continue;
123
+ }
124
+ console.log(`Validating inter-layer: ${pairKey} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`);
125
+ try {
126
+ const sourceLayerNumber = CANONICAL_LAYER_NAMES.indexOf(source) + 1, targetLayerNumber = CANONICAL_LAYER_NAMES.indexOf(target) + 1, prompt = this.promptTemplates.interLayerValidation(source, target, {
127
+ sourceLayerNumber,
128
+ targetLayerNumber
129
+ }), response = await this.runner.invoke(prompt, pairKey), validation = this.responseParser.parseInterLayerValidation(response);
130
+ await this.saveInterLayerValidation(pairKey, validation), await tracker.markCompleted(pairKey), console.log(`Completed: ${pairKey} (${validation.violations.length} violations, ${validation.recommendations.length} recommendations)`), successCount++;
131
+ } catch (error) {
132
+ const errorMessage = getErrorMessage(error);
133
+ if (console.error(`Failed to validate ${pairKey}: ${errorMessage}`), this.failures.push({
134
+ type: "inter-layer",
135
+ key: pairKey,
136
+ error: errorMessage,
137
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
138
+ }), error instanceof AIEvaluationAbortError)
139
+ throw error;
140
+ }
141
+ }
142
+ layerPairs.length > 0 && (console.log(`
143
+ \u2713 Inter-layer validation complete: ${successCount}/${layerPairs.length} successful`), this.failures.filter((f) => f.type === "inter-layer").length > 0 && console.error(`\u26A0\uFE0F ${this.failures.filter((f) => f.type === "inter-layer").length} pair(s) failed - see summary for details`));
144
+ }
145
+ /**
146
+ * Sanitize a string for use in file paths, removing path traversal characters
147
+ */
148
+ sanitizeForFilePath(input) {
149
+ return input.replace(/\.\./g, "_").replace(/[\/\\]/g, "_").replace(/[<>:"|?*]/g, "_");
150
+ }
151
+ async saveElementRecommendations(nodeType, recommendations) {
152
+ const filename = `${this.sanitizeForFilePath(nodeType)}.json`, filepath = join(this.config.outputDir, "element-recommendations", filename);
153
+ try {
154
+ await writeFile(filepath, JSON.stringify({
155
+ nodeType,
156
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
157
+ recommendations
158
+ }, null, 2));
159
+ } catch (error) {
160
+ const errorMessage = getErrorMessage(error);
161
+ throw new Error(`Failed to save element recommendations for "${nodeType}" to ${filepath}: ${errorMessage}. AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`);
162
+ }
163
+ }
164
+ async saveLayerReview(layer, review) {
165
+ const filename = `${this.sanitizeForFilePath(layer)}.review.json`, filepath = join(this.config.outputDir, "layer-reviews", filename);
166
+ try {
167
+ await writeFile(filepath, JSON.stringify({
168
+ layer,
169
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
170
+ review
171
+ }, null, 2));
172
+ } catch (error) {
173
+ const errorMessage = getErrorMessage(error);
174
+ throw new Error(`Failed to save layer review for "${layer}" to ${filepath}: ${errorMessage}. AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`);
175
+ }
176
+ }
177
+ async saveInterLayerValidation(pairKey, validation) {
178
+ const filename = `${pairKey.replace("->", "_to_")}.json`, filepath = join(this.config.outputDir, "inter-layer-validation", filename);
179
+ try {
180
+ await writeFile(filepath, JSON.stringify({
181
+ pair: pairKey,
182
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
183
+ validation
184
+ }, null, 2));
185
+ } catch (error) {
186
+ const errorMessage = getErrorMessage(error);
187
+ throw new Error(`Failed to save inter-layer validation for "${pairKey}" to ${filepath}: ${errorMessage}. AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`);
188
+ }
189
+ }
190
+ getEvaluationSummary(totalAttempted) {
191
+ return {
192
+ totalAttempted,
193
+ successful: totalAttempted - this.failures.length,
194
+ failed: this.failures.length,
195
+ failures: this.failures
196
+ };
197
+ }
198
+ async saveEvaluationSummary(totalAttempted) {
199
+ const summary = this.getEvaluationSummary(totalAttempted), filepath = join(this.config.outputDir, "evaluation-summary.json");
200
+ try {
201
+ await writeFile(filepath, JSON.stringify(summary, null, 2));
202
+ } catch (error) {
203
+ const errorMessage = getErrorMessage(error);
204
+ throw new Error(`Failed to save evaluation summary to ${filepath}: ${errorMessage}. Summary of evaluation results was not persisted. Please ensure the output directory is writable and has sufficient disk space.`);
205
+ }
206
+ }
207
+ printFailureSummary() {
208
+ if (this.failures.length === 0) {
209
+ console.log(`
210
+ \u2713 All AI evaluations completed successfully`);
211
+ return;
212
+ }
213
+ console.error(`
214
+ \u26A0\uFE0F AI Evaluation Failures Summary:`), console.error(`Total failures: ${this.failures.length}
215
+ `);
216
+ const failuresByType = {
217
+ element: this.failures.filter((f) => f.type === "element"),
218
+ layer: this.failures.filter((f) => f.type === "layer"),
219
+ "inter-layer": this.failures.filter((f) => f.type === "inter-layer")
220
+ };
221
+ for (const [type, failures] of Object.entries(failuresByType))
222
+ if (failures.length > 0) {
223
+ console.error(`${type} failures (${failures.length}):`);
224
+ for (const failure of failures)
225
+ console.error(` - ${failure.key}: ${failure.error}`);
226
+ console.error("");
227
+ }
228
+ console.error(`Full details saved to: ${join(this.config.outputDir, "evaluation-summary.json")}`);
229
+ }
230
+ }
231
+ export {
232
+ AIEvaluator,
233
+ InMemoryProgressTracker
234
+ };
235
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/audit/relationships/ai/evaluator.ts"],
4
+ "sourcesContent": ["import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { CoverageMetrics } from \"../../types.js\";\nimport { AuditAIRunner, AIEvaluationAbortError } from \"../../ai/runner.js\";\nimport { PromptTemplates } from \"./prompts.js\";\nimport { ResponseParser } from \"./parser.js\";\nimport type { RelationshipRecommendation, LayerReview, InterLayerValidation } from \"./parser.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { CANONICAL_LAYER_NAMES } from \"../../../core/layers.js\";\n\n/**\n * Tracks progress of AI evaluation operations, enabling resume support\n * for interrupted or long-running evaluation pipelines.\n * Implementations may persist progress to disk or store in memory.\n */\nexport interface ProgressTracker {\n isCompleted(key: string): boolean;\n markCompleted(key: string): Promise<void>;\n getProgress(): { completed: number; total: number };\n}\n\nexport interface AIEvaluationConfig {\n outputDir: string;\n lowCoverageThreshold: number; // Relationships per node type\n resumable: boolean;\n}\n\nexport interface EvaluationFailure {\n type: \"element\" | \"layer\" | \"inter-layer\";\n key: string;\n error: string;\n timestamp: string;\n}\n\nexport interface EvaluationSummary {\n totalAttempted: number;\n successful: number;\n failed: number;\n failures: EvaluationFailure[];\n}\n\n/**\n * In-memory progress tracker for AI evaluation\n */\nexport class InMemoryProgressTracker implements ProgressTracker {\n private completed = new Set<string>();\n private total = 0;\n\n constructor(totalItems: number) {\n this.total = totalItems;\n }\n\n isCompleted(key: string): boolean {\n return this.completed.has(key);\n }\n\n async markCompleted(key: string): Promise<void> {\n this.completed.add(key);\n }\n\n getProgress(): { completed: number; total: number } {\n return {\n completed: this.completed.size,\n total: this.total,\n };\n }\n}\n\n/**\n * AI-powered relationship evaluation orchestrator\n */\nexport class AIEvaluator {\n private runner: AuditAIRunner;\n private promptTemplates: PromptTemplates;\n private responseParser: ResponseParser;\n private config: AIEvaluationConfig;\n private failures: EvaluationFailure[] = [];\n\n constructor(config: Partial<AIEvaluationConfig> = {}) {\n this.runner = new AuditAIRunner();\n this.promptTemplates = new PromptTemplates();\n this.responseParser = new ResponseParser();\n this.config = {\n outputDir: config.outputDir || \"audit-reports/relationships\",\n lowCoverageThreshold: config.lowCoverageThreshold ?? 1.0,\n resumable: config.resumable ?? true,\n };\n }\n\n /**\n * Evaluate all low-coverage elements sequentially\n * @param coverage - Array of coverage metrics for all layers\n * @param getPredicatesForLayer - Function to retrieve available predicates for a given layer\n * @param tracker - Optional progress tracker for resume support (defaults to in-memory tracker)\n * @returns Promise resolving when all evaluations are complete\n * @throws Error if consecutive invocation failures exceed threshold or if AI evaluation is misconfigured\n */\n async evaluateLowCoverageElements(\n coverage: CoverageMetrics[],\n getPredicatesForLayer: (layer: string) => Promise<string[]>,\n tracker?: ProgressTracker\n ): Promise<void> {\n // Ensure output directory exists\n const elementRecsDir = join(this.config.outputDir, \"element-recommendations\");\n await mkdir(elementRecsDir, { recursive: true });\n\n // Collect all low-coverage node types\n const lowCoverageTypes: Array<{ nodeType: string; metrics: CoverageMetrics }> =\n [];\n\n for (const layerMetrics of coverage) {\n for (const nodeType of layerMetrics.isolatedNodeTypes) {\n lowCoverageTypes.push({ nodeType, metrics: layerMetrics });\n }\n }\n\n // Create tracker if not provided\n if (!tracker) {\n tracker = new InMemoryProgressTracker(lowCoverageTypes.length);\n }\n\n let successCount = 0;\n\n for (const { nodeType, metrics } of lowCoverageTypes) {\n // Check if already evaluated (resume support)\n if (this.config.resumable && tracker.isCompleted(nodeType)) {\n console.log(`Skipping already-evaluated: ${nodeType}`);\n successCount++;\n continue;\n }\n\n console.log(\n `Evaluating element: ${nodeType} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`\n );\n\n // Predicate fetch is infrastructure \u2014 propagate immediately if it fails\n const predicates = await getPredicatesForLayer(metrics.layer);\n\n try {\n const prompt = this.promptTemplates.elementEvaluation(nodeType, metrics, predicates);\n const response = await this.runner.invoke(prompt, nodeType);\n\n const recommendations =\n this.responseParser.parseElementRecommendations(response);\n\n await this.saveElementRecommendations(nodeType, recommendations);\n await tracker.markCompleted(nodeType);\n\n console.log(\n `Completed: ${nodeType} (${recommendations.length} recommendations)`\n );\n successCount++;\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n console.error(`Failed to evaluate ${nodeType}: ${errorMessage}`);\n\n this.failures.push({\n type: \"element\",\n key: nodeType,\n error: errorMessage,\n timestamp: new Date().toISOString(),\n });\n\n if (error instanceof AIEvaluationAbortError) {\n throw error;\n }\n }\n }\n\n if (lowCoverageTypes.length > 0) {\n console.log(\n `\\n\u2713 Element evaluation complete: ${successCount}/${lowCoverageTypes.length} successful`\n );\n if (this.failures.filter((f) => f.type === \"element\").length > 0) {\n console.error(\n `\u26A0\uFE0F ${this.failures.filter((f) => f.type === \"element\").length} element(s) failed - see summary for details`\n );\n }\n }\n }\n\n /**\n * Review layer coherence sequentially\n */\n async reviewLayerCoherence(\n layers: string[],\n coverage: CoverageMetrics[],\n tracker?: ProgressTracker\n ): Promise<void> {\n const layerReviewsDir = join(this.config.outputDir, \"layer-reviews\");\n await mkdir(layerReviewsDir, { recursive: true });\n\n if (!tracker) {\n tracker = new InMemoryProgressTracker(layers.length);\n }\n\n let successCount = 0;\n for (const layer of layers) {\n if (this.config.resumable && tracker.isCompleted(layer)) {\n console.log(`Skipping already-reviewed layer: ${layer}`);\n successCount++;\n continue;\n }\n\n console.log(\n `Reviewing layer: ${layer} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`\n );\n\n try {\n const prompt = this.promptTemplates.layerReview(layer, coverage);\n const response = await this.runner.invoke(prompt, layer);\n\n const review = this.responseParser.parseLayerReview(response);\n await this.saveLayerReview(layer, review);\n await tracker.markCompleted(layer);\n\n console.log(\n `Completed: ${layer} (${review.recommendations.length} recommendations)`\n );\n successCount++;\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n console.error(`Failed to review layer ${layer}: ${errorMessage}`);\n\n this.failures.push({\n type: \"layer\",\n key: layer,\n error: errorMessage,\n timestamp: new Date().toISOString(),\n });\n\n if (error instanceof AIEvaluationAbortError) {\n throw error;\n }\n }\n }\n\n if (layers.length > 0) {\n console.log(`\\n\u2713 Layer review complete: ${successCount}/${layers.length} successful`);\n if (this.failures.filter((f) => f.type === \"layer\").length > 0) {\n console.error(\n `\u26A0\uFE0F ${this.failures.filter((f) => f.type === \"layer\").length} layer(s) failed - see summary for details`\n );\n }\n }\n }\n\n /**\n * Validate inter-layer references sequentially\n */\n async validateInterLayerReferences(\n layerPairs: Array<{ source: string; target: string }>,\n tracker?: ProgressTracker\n ): Promise<void> {\n const interLayerDir = join(this.config.outputDir, \"inter-layer-validation\");\n await mkdir(interLayerDir, { recursive: true });\n\n if (!tracker) {\n tracker = new InMemoryProgressTracker(layerPairs.length);\n }\n\n let successCount = 0;\n for (const { source, target } of layerPairs) {\n const pairKey = `${source}->${target}`;\n\n if (this.config.resumable && tracker.isCompleted(pairKey)) {\n console.log(`Skipping already-validated: ${pairKey}`);\n successCount++;\n continue;\n }\n\n console.log(\n `Validating inter-layer: ${pairKey} (${tracker.getProgress().completed + 1}/${tracker.getProgress().total})`\n );\n\n try {\n const sourceLayerNumber =\n (CANONICAL_LAYER_NAMES as readonly string[]).indexOf(source) + 1;\n const targetLayerNumber =\n (CANONICAL_LAYER_NAMES as readonly string[]).indexOf(target) + 1;\n const prompt = this.promptTemplates.interLayerValidation(source, target, {\n sourceLayerNumber,\n targetLayerNumber,\n });\n const response = await this.runner.invoke(prompt, pairKey);\n\n const validation = this.responseParser.parseInterLayerValidation(response);\n await this.saveInterLayerValidation(pairKey, validation);\n await tracker.markCompleted(pairKey);\n\n console.log(\n `Completed: ${pairKey} (${validation.violations.length} violations, ${validation.recommendations.length} recommendations)`\n );\n successCount++;\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n console.error(`Failed to validate ${pairKey}: ${errorMessage}`);\n\n this.failures.push({\n type: \"inter-layer\",\n key: pairKey,\n error: errorMessage,\n timestamp: new Date().toISOString(),\n });\n\n if (error instanceof AIEvaluationAbortError) {\n throw error;\n }\n }\n }\n\n if (layerPairs.length > 0) {\n console.log(\n `\\n\u2713 Inter-layer validation complete: ${successCount}/${layerPairs.length} successful`\n );\n if (this.failures.filter((f) => f.type === \"inter-layer\").length > 0) {\n console.error(\n `\u26A0\uFE0F ${this.failures.filter((f) => f.type === \"inter-layer\").length} pair(s) failed - see summary for details`\n );\n }\n }\n }\n\n /**\n * Sanitize a string for use in file paths, removing path traversal characters\n */\n private sanitizeForFilePath(input: string): string {\n return input\n .replace(/\\.\\./g, \"_\")\n .replace(/[\\/\\\\]/g, \"_\")\n .replace(/[<>:\"|?*]/g, \"_\");\n }\n\n private async saveElementRecommendations(\n nodeType: string,\n recommendations: RelationshipRecommendation[]\n ): Promise<void> {\n const sanitizedNodeType = this.sanitizeForFilePath(nodeType);\n const filename = `${sanitizedNodeType}.json`;\n const filepath = join(this.config.outputDir, \"element-recommendations\", filename);\n\n try {\n await writeFile(\n filepath,\n JSON.stringify(\n {\n nodeType,\n timestamp: new Date().toISOString(),\n recommendations,\n },\n null,\n 2\n )\n );\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to save element recommendations for \"${nodeType}\" to ${filepath}: ${errorMessage}. ` +\n `AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`\n );\n }\n }\n\n private async saveLayerReview(layer: string, review: LayerReview): Promise<void> {\n const sanitizedLayer = this.sanitizeForFilePath(layer);\n const filename = `${sanitizedLayer}.review.json`;\n const filepath = join(this.config.outputDir, \"layer-reviews\", filename);\n\n try {\n await writeFile(\n filepath,\n JSON.stringify(\n {\n layer,\n timestamp: new Date().toISOString(),\n review,\n },\n null,\n 2\n )\n );\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to save layer review for \"${layer}\" to ${filepath}: ${errorMessage}. ` +\n `AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`\n );\n }\n }\n\n private async saveInterLayerValidation(\n pairKey: string,\n validation: InterLayerValidation\n ): Promise<void> {\n const filename = `${pairKey.replace(\"->\", \"_to_\")}.json`;\n const filepath = join(this.config.outputDir, \"inter-layer-validation\", filename);\n\n try {\n await writeFile(\n filepath,\n JSON.stringify(\n {\n pair: pairKey,\n timestamp: new Date().toISOString(),\n validation,\n },\n null,\n 2\n )\n );\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to save inter-layer validation for \"${pairKey}\" to ${filepath}: ${errorMessage}. ` +\n `AI evaluation results were not persisted. Please ensure the output directory is writable and has sufficient disk space.`\n );\n }\n }\n\n getEvaluationSummary(totalAttempted: number): EvaluationSummary {\n return {\n totalAttempted,\n successful: totalAttempted - this.failures.length,\n failed: this.failures.length,\n failures: this.failures,\n };\n }\n\n async saveEvaluationSummary(totalAttempted: number): Promise<void> {\n const summary = this.getEvaluationSummary(totalAttempted);\n const filepath = join(this.config.outputDir, \"evaluation-summary.json\");\n\n try {\n await writeFile(filepath, JSON.stringify(summary, null, 2));\n } catch (error: unknown) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to save evaluation summary to ${filepath}: ${errorMessage}. ` +\n `Summary of evaluation results was not persisted. Please ensure the output directory is writable and has sufficient disk space.`\n );\n }\n }\n\n printFailureSummary(): void {\n if (this.failures.length === 0) {\n console.log(\"\\n\u2713 All AI evaluations completed successfully\");\n return;\n }\n\n console.error(`\\n\u26A0\uFE0F AI Evaluation Failures Summary:`);\n console.error(`Total failures: ${this.failures.length}\\n`);\n\n const failuresByType = {\n element: this.failures.filter((f) => f.type === \"element\"),\n layer: this.failures.filter((f) => f.type === \"layer\"),\n \"inter-layer\": this.failures.filter((f) => f.type === \"inter-layer\"),\n };\n\n for (const [type, failures] of Object.entries(failuresByType)) {\n if (failures.length > 0) {\n console.error(`${type} failures (${failures.length}):`);\n for (const failure of failures) {\n console.error(` - ${failure.key}: ${failure.error}`);\n }\n console.error(\"\");\n }\n }\n\n console.error(\n `Full details saved to: ${join(this.config.outputDir, \"evaluation-summary.json\")}`\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }