@yasserkhanorg/impact-gate 2.0.0

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 (587) hide show
  1. package/LICENSE +168 -0
  2. package/README.md +520 -0
  3. package/dist/adapters/cypress.d.ts +10 -0
  4. package/dist/adapters/cypress.d.ts.map +1 -0
  5. package/dist/adapters/cypress.js +86 -0
  6. package/dist/adapters/framework_adapter.d.ts +41 -0
  7. package/dist/adapters/framework_adapter.d.ts.map +1 -0
  8. package/dist/adapters/framework_adapter.js +152 -0
  9. package/dist/adapters/playwright.d.ts +10 -0
  10. package/dist/adapters/playwright.d.ts.map +1 -0
  11. package/dist/adapters/playwright.js +86 -0
  12. package/dist/adapters/pytest.d.ts +10 -0
  13. package/dist/adapters/pytest.d.ts.map +1 -0
  14. package/dist/adapters/pytest.js +96 -0
  15. package/dist/adapters/supertest.d.ts +12 -0
  16. package/dist/adapters/supertest.d.ts.map +1 -0
  17. package/dist/adapters/supertest.js +85 -0
  18. package/dist/agent/api_catalog.d.ts +11 -0
  19. package/dist/agent/api_catalog.d.ts.map +1 -0
  20. package/dist/agent/api_catalog.js +210 -0
  21. package/dist/agent/config.d.ts +193 -0
  22. package/dist/agent/config.d.ts.map +1 -0
  23. package/dist/agent/config.js +875 -0
  24. package/dist/agent/feedback.d.ts +91 -0
  25. package/dist/agent/feedback.d.ts.map +1 -0
  26. package/dist/agent/feedback.js +323 -0
  27. package/dist/agent/git.d.ts +19 -0
  28. package/dist/agent/git.d.ts.map +1 -0
  29. package/dist/agent/git.js +257 -0
  30. package/dist/agent/handoff.d.ts +22 -0
  31. package/dist/agent/handoff.d.ts.map +1 -0
  32. package/dist/agent/handoff.js +180 -0
  33. package/dist/agent/llm_agents_flow.d.ts +15 -0
  34. package/dist/agent/llm_agents_flow.d.ts.map +1 -0
  35. package/dist/agent/llm_agents_flow.js +434 -0
  36. package/dist/agent/native_flow.d.ts +6 -0
  37. package/dist/agent/native_flow.d.ts.map +1 -0
  38. package/dist/agent/native_flow.js +179 -0
  39. package/dist/agent/pipeline.d.ts +7 -0
  40. package/dist/agent/pipeline.d.ts.map +1 -0
  41. package/dist/agent/pipeline.js +260 -0
  42. package/dist/agent/pipeline_types.d.ts +54 -0
  43. package/dist/agent/pipeline_types.d.ts.map +1 -0
  44. package/dist/agent/pipeline_types.js +4 -0
  45. package/dist/agent/pipeline_utils.d.ts +12 -0
  46. package/dist/agent/pipeline_utils.d.ts.map +1 -0
  47. package/dist/agent/pipeline_utils.js +156 -0
  48. package/dist/agent/plan.d.ts +170 -0
  49. package/dist/agent/plan.d.ts.map +1 -0
  50. package/dist/agent/plan.js +86 -0
  51. package/dist/agent/playwright_report.d.ts +8 -0
  52. package/dist/agent/playwright_report.d.ts.map +1 -0
  53. package/dist/agent/playwright_report.js +126 -0
  54. package/dist/agent/process_runner.d.ts +10 -0
  55. package/dist/agent/process_runner.d.ts.map +1 -0
  56. package/dist/agent/process_runner.js +92 -0
  57. package/dist/agent/spec_generator.d.ts +5 -0
  58. package/dist/agent/spec_generator.d.ts.map +1 -0
  59. package/dist/agent/spec_generator.js +253 -0
  60. package/dist/agent/test_path.d.ts +2 -0
  61. package/dist/agent/test_path.d.ts.map +1 -0
  62. package/dist/agent/test_path.js +23 -0
  63. package/dist/agent/traceability_capture.d.ts +18 -0
  64. package/dist/agent/traceability_capture.d.ts.map +1 -0
  65. package/dist/agent/traceability_capture.js +313 -0
  66. package/dist/agent/traceability_ingest.d.ts +21 -0
  67. package/dist/agent/traceability_ingest.d.ts.map +1 -0
  68. package/dist/agent/traceability_ingest.js +237 -0
  69. package/dist/agent/types.d.ts +42 -0
  70. package/dist/agent/types.d.ts.map +1 -0
  71. package/dist/agent/types.js +4 -0
  72. package/dist/agent/utils.d.ts +13 -0
  73. package/dist/agent/utils.d.ts.map +1 -0
  74. package/dist/agent/utils.js +152 -0
  75. package/dist/agent/validation_runner.d.ts +5 -0
  76. package/dist/agent/validation_runner.d.ts.map +1 -0
  77. package/dist/agent/validation_runner.js +77 -0
  78. package/dist/agentic/fix_loop.d.ts +26 -0
  79. package/dist/agentic/fix_loop.d.ts.map +1 -0
  80. package/dist/agentic/fix_loop.js +96 -0
  81. package/dist/agentic/playwright_runner.d.ts +43 -0
  82. package/dist/agentic/playwright_runner.d.ts.map +1 -0
  83. package/dist/agentic/playwright_runner.js +165 -0
  84. package/dist/agentic/runner.d.ts +27 -0
  85. package/dist/agentic/runner.d.ts.map +1 -0
  86. package/dist/agentic/runner.js +210 -0
  87. package/dist/agentic/types.d.ts +62 -0
  88. package/dist/agentic/types.d.ts.map +1 -0
  89. package/dist/agentic/types.js +4 -0
  90. package/dist/agents/coverage-evaluator.d.ts +8 -0
  91. package/dist/agents/coverage-evaluator.d.ts.map +1 -0
  92. package/dist/agents/coverage-evaluator.js +41 -0
  93. package/dist/agents/cross-impact.d.ts +13 -0
  94. package/dist/agents/cross-impact.d.ts.map +1 -0
  95. package/dist/agents/cross-impact.js +140 -0
  96. package/dist/agents/executor.d.ts +8 -0
  97. package/dist/agents/executor.d.ts.map +1 -0
  98. package/dist/agents/executor.js +75 -0
  99. package/dist/agents/explorer.d.ts +12 -0
  100. package/dist/agents/explorer.d.ts.map +1 -0
  101. package/dist/agents/explorer.js +43 -0
  102. package/dist/agents/generator.d.ts +8 -0
  103. package/dist/agents/generator.d.ts.map +1 -0
  104. package/dist/agents/generator.js +77 -0
  105. package/dist/agents/healer.d.ts +8 -0
  106. package/dist/agents/healer.d.ts.map +1 -0
  107. package/dist/agents/healer.js +31 -0
  108. package/dist/agents/impact-analyst.d.ts +8 -0
  109. package/dist/agents/impact-analyst.d.ts.map +1 -0
  110. package/dist/agents/impact-analyst.js +38 -0
  111. package/dist/agents/regression-advisor.d.ts +8 -0
  112. package/dist/agents/regression-advisor.d.ts.map +1 -0
  113. package/dist/agents/regression-advisor.js +116 -0
  114. package/dist/agents/strategist.d.ts +9 -0
  115. package/dist/agents/strategist.d.ts.map +1 -0
  116. package/dist/agents/strategist.js +92 -0
  117. package/dist/agents/test-designer.d.ts +8 -0
  118. package/dist/agents/test-designer.d.ts.map +1 -0
  119. package/dist/agents/test-designer.js +111 -0
  120. package/dist/anthropic_provider.d.ts +65 -0
  121. package/dist/anthropic_provider.d.ts.map +1 -0
  122. package/dist/anthropic_provider.js +334 -0
  123. package/dist/api.d.ts +48 -0
  124. package/dist/api.d.ts.map +1 -0
  125. package/dist/api.js +151 -0
  126. package/dist/base_provider.d.ts +109 -0
  127. package/dist/base_provider.d.ts.map +1 -0
  128. package/dist/base_provider.js +203 -0
  129. package/dist/budget_ledger.d.ts +28 -0
  130. package/dist/budget_ledger.d.ts.map +1 -0
  131. package/dist/budget_ledger.js +62 -0
  132. package/dist/cache/cached_provider.d.ts +49 -0
  133. package/dist/cache/cached_provider.d.ts.map +1 -0
  134. package/dist/cache/cached_provider.js +91 -0
  135. package/dist/cache/response_cache.d.ts +79 -0
  136. package/dist/cache/response_cache.d.ts.map +1 -0
  137. package/dist/cache/response_cache.js +177 -0
  138. package/dist/cli/commands/analyze.d.ts +3 -0
  139. package/dist/cli/commands/analyze.d.ts.map +1 -0
  140. package/dist/cli/commands/analyze.js +77 -0
  141. package/dist/cli/commands/bootstrap.d.ts +3 -0
  142. package/dist/cli/commands/bootstrap.d.ts.map +1 -0
  143. package/dist/cli/commands/bootstrap.js +109 -0
  144. package/dist/cli/commands/cost_report.d.ts +3 -0
  145. package/dist/cli/commands/cost_report.d.ts.map +1 -0
  146. package/dist/cli/commands/cost_report.js +115 -0
  147. package/dist/cli/commands/crew.d.ts +3 -0
  148. package/dist/cli/commands/crew.d.ts.map +1 -0
  149. package/dist/cli/commands/crew.js +255 -0
  150. package/dist/cli/commands/feedback.d.ts +3 -0
  151. package/dist/cli/commands/feedback.d.ts.map +1 -0
  152. package/dist/cli/commands/feedback.js +39 -0
  153. package/dist/cli/commands/finalize.d.ts +3 -0
  154. package/dist/cli/commands/finalize.d.ts.map +1 -0
  155. package/dist/cli/commands/finalize.js +41 -0
  156. package/dist/cli/commands/gate.d.ts +3 -0
  157. package/dist/cli/commands/gate.d.ts.map +1 -0
  158. package/dist/cli/commands/gate.js +89 -0
  159. package/dist/cli/commands/generate.d.ts +4 -0
  160. package/dist/cli/commands/generate.d.ts.map +1 -0
  161. package/dist/cli/commands/generate.js +108 -0
  162. package/dist/cli/commands/heal.d.ts +3 -0
  163. package/dist/cli/commands/heal.d.ts.map +1 -0
  164. package/dist/cli/commands/heal.js +60 -0
  165. package/dist/cli/commands/impact.d.ts +4 -0
  166. package/dist/cli/commands/impact.d.ts.map +1 -0
  167. package/dist/cli/commands/impact.js +33 -0
  168. package/dist/cli/commands/init.d.ts +2 -0
  169. package/dist/cli/commands/init.d.ts.map +1 -0
  170. package/dist/cli/commands/init.js +169 -0
  171. package/dist/cli/commands/llm_health.d.ts +2 -0
  172. package/dist/cli/commands/llm_health.d.ts.map +1 -0
  173. package/dist/cli/commands/llm_health.js +22 -0
  174. package/dist/cli/commands/plan.d.ts +4 -0
  175. package/dist/cli/commands/plan.d.ts.map +1 -0
  176. package/dist/cli/commands/plan.js +120 -0
  177. package/dist/cli/commands/plan_crew.d.ts +17 -0
  178. package/dist/cli/commands/plan_crew.d.ts.map +1 -0
  179. package/dist/cli/commands/plan_crew.js +316 -0
  180. package/dist/cli/commands/traceability.d.ts +4 -0
  181. package/dist/cli/commands/traceability.d.ts.map +1 -0
  182. package/dist/cli/commands/traceability.js +77 -0
  183. package/dist/cli/commands/train.d.ts +3 -0
  184. package/dist/cli/commands/train.d.ts.map +1 -0
  185. package/dist/cli/commands/train.js +391 -0
  186. package/dist/cli/defaults.d.ts +35 -0
  187. package/dist/cli/defaults.d.ts.map +1 -0
  188. package/dist/cli/defaults.js +172 -0
  189. package/dist/cli/errors.d.ts +27 -0
  190. package/dist/cli/errors.d.ts.map +1 -0
  191. package/dist/cli/errors.js +57 -0
  192. package/dist/cli/parse_args.d.ts +6 -0
  193. package/dist/cli/parse_args.d.ts.map +1 -0
  194. package/dist/cli/parse_args.js +257 -0
  195. package/dist/cli/types.d.ts +87 -0
  196. package/dist/cli/types.d.ts.map +1 -0
  197. package/dist/cli/types.js +4 -0
  198. package/dist/cli/usage.d.ts +2 -0
  199. package/dist/cli/usage.d.ts.map +1 -0
  200. package/dist/cli/usage.js +109 -0
  201. package/dist/cli.d.ts +3 -0
  202. package/dist/cli.d.ts.map +1 -0
  203. package/dist/cli.js +194 -0
  204. package/dist/crew/context.d.ts +55 -0
  205. package/dist/crew/context.d.ts.map +1 -0
  206. package/dist/crew/context.js +36 -0
  207. package/dist/crew/orchestrator.d.ts +50 -0
  208. package/dist/crew/orchestrator.d.ts.map +1 -0
  209. package/dist/crew/orchestrator.js +329 -0
  210. package/dist/crew/protocol.d.ts +46 -0
  211. package/dist/crew/protocol.d.ts.map +1 -0
  212. package/dist/crew/protocol.js +4 -0
  213. package/dist/crew/provider.d.ts +17 -0
  214. package/dist/crew/provider.d.ts.map +1 -0
  215. package/dist/crew/provider.js +36 -0
  216. package/dist/crew/sanitize.d.ts +3 -0
  217. package/dist/crew/sanitize.d.ts.map +1 -0
  218. package/dist/crew/sanitize.js +31 -0
  219. package/dist/crew/types.d.ts +52 -0
  220. package/dist/crew/types.d.ts.map +1 -0
  221. package/dist/crew/types.js +4 -0
  222. package/dist/crew/workflows.d.ts +52 -0
  223. package/dist/crew/workflows.d.ts.map +1 -0
  224. package/dist/crew/workflows.js +36 -0
  225. package/dist/custom_provider.d.ts +20 -0
  226. package/dist/custom_provider.d.ts.map +1 -0
  227. package/dist/custom_provider.js +277 -0
  228. package/dist/engine/ai_enrichment.d.ts +44 -0
  229. package/dist/engine/ai_enrichment.d.ts.map +1 -0
  230. package/dist/engine/ai_enrichment.js +267 -0
  231. package/dist/engine/diff_loader.d.ts +11 -0
  232. package/dist/engine/diff_loader.d.ts.map +1 -0
  233. package/dist/engine/diff_loader.js +63 -0
  234. package/dist/engine/impact_engine.d.ts +72 -0
  235. package/dist/engine/impact_engine.d.ts.map +1 -0
  236. package/dist/engine/impact_engine.js +298 -0
  237. package/dist/engine/plan_builder.d.ts +11 -0
  238. package/dist/engine/plan_builder.d.ts.map +1 -0
  239. package/dist/engine/plan_builder.js +599 -0
  240. package/dist/esm/adapters/cypress.js +49 -0
  241. package/dist/esm/adapters/framework_adapter.js +114 -0
  242. package/dist/esm/adapters/playwright.js +49 -0
  243. package/dist/esm/adapters/pytest.js +59 -0
  244. package/dist/esm/adapters/supertest.js +48 -0
  245. package/dist/esm/agent/api_catalog.js +199 -0
  246. package/dist/esm/agent/config.js +872 -0
  247. package/dist/esm/agent/feedback.js +317 -0
  248. package/dist/esm/agent/git.js +252 -0
  249. package/dist/esm/agent/handoff.js +177 -0
  250. package/dist/esm/agent/llm_agents_flow.js +421 -0
  251. package/dist/esm/agent/native_flow.js +175 -0
  252. package/dist/esm/agent/pipeline.js +256 -0
  253. package/dist/esm/agent/pipeline_types.js +3 -0
  254. package/dist/esm/agent/pipeline_utils.js +146 -0
  255. package/dist/esm/agent/plan.js +83 -0
  256. package/dist/esm/agent/playwright_report.js +123 -0
  257. package/dist/esm/agent/process_runner.js +83 -0
  258. package/dist/esm/agent/spec_generator.js +249 -0
  259. package/dist/esm/agent/test_path.js +20 -0
  260. package/dist/esm/agent/traceability_capture.js +310 -0
  261. package/dist/esm/agent/traceability_ingest.js +234 -0
  262. package/dist/esm/agent/types.js +3 -0
  263. package/dist/esm/agent/utils.js +138 -0
  264. package/dist/esm/agent/validation_runner.js +73 -0
  265. package/dist/esm/agentic/fix_loop.js +91 -0
  266. package/dist/esm/agentic/playwright_runner.js +161 -0
  267. package/dist/esm/agentic/runner.js +207 -0
  268. package/dist/esm/agentic/types.js +3 -0
  269. package/dist/esm/agents/coverage-evaluator.js +37 -0
  270. package/dist/esm/agents/cross-impact.js +136 -0
  271. package/dist/esm/agents/executor.js +71 -0
  272. package/dist/esm/agents/explorer.js +39 -0
  273. package/dist/esm/agents/generator.js +73 -0
  274. package/dist/esm/agents/healer.js +27 -0
  275. package/dist/esm/agents/impact-analyst.js +34 -0
  276. package/dist/esm/agents/regression-advisor.js +112 -0
  277. package/dist/esm/agents/strategist.js +88 -0
  278. package/dist/esm/agents/test-designer.js +107 -0
  279. package/dist/esm/anthropic_provider.js +326 -0
  280. package/dist/esm/api.js +143 -0
  281. package/dist/esm/base_provider.js +198 -0
  282. package/dist/esm/budget_ledger.js +58 -0
  283. package/dist/esm/cache/cached_provider.js +85 -0
  284. package/dist/esm/cache/response_cache.js +140 -0
  285. package/dist/esm/cli/commands/analyze.js +74 -0
  286. package/dist/esm/cli/commands/bootstrap.js +106 -0
  287. package/dist/esm/cli/commands/cost_report.js +112 -0
  288. package/dist/esm/cli/commands/crew.js +252 -0
  289. package/dist/esm/cli/commands/feedback.js +36 -0
  290. package/dist/esm/cli/commands/finalize.js +38 -0
  291. package/dist/esm/cli/commands/gate.js +86 -0
  292. package/dist/esm/cli/commands/generate.js +105 -0
  293. package/dist/esm/cli/commands/heal.js +57 -0
  294. package/dist/esm/cli/commands/impact.js +30 -0
  295. package/dist/esm/cli/commands/init.js +133 -0
  296. package/dist/esm/cli/commands/llm_health.js +19 -0
  297. package/dist/esm/cli/commands/plan.js +117 -0
  298. package/dist/esm/cli/commands/plan_crew.js +309 -0
  299. package/dist/esm/cli/commands/traceability.js +73 -0
  300. package/dist/esm/cli/commands/train.js +355 -0
  301. package/dist/esm/cli/defaults.js +165 -0
  302. package/dist/esm/cli/errors.js +52 -0
  303. package/dist/esm/cli/parse_args.js +251 -0
  304. package/dist/esm/cli/types.js +3 -0
  305. package/dist/esm/cli/usage.js +106 -0
  306. package/dist/esm/cli.js +192 -0
  307. package/dist/esm/crew/context.js +32 -0
  308. package/dist/esm/crew/orchestrator.js +325 -0
  309. package/dist/esm/crew/protocol.js +3 -0
  310. package/dist/esm/crew/provider.js +33 -0
  311. package/dist/esm/crew/sanitize.js +27 -0
  312. package/dist/esm/crew/types.js +3 -0
  313. package/dist/esm/crew/workflows.js +33 -0
  314. package/dist/esm/custom_provider.js +273 -0
  315. package/dist/esm/engine/ai_enrichment.js +264 -0
  316. package/dist/esm/engine/diff_loader.js +59 -0
  317. package/dist/esm/engine/impact_engine.js +291 -0
  318. package/dist/esm/engine/plan_builder.js +593 -0
  319. package/dist/esm/index.js +72 -0
  320. package/dist/esm/knowledge/api_surface.js +408 -0
  321. package/dist/esm/knowledge/cluster_utils.js +60 -0
  322. package/dist/esm/knowledge/context_loader.js +85 -0
  323. package/dist/esm/knowledge/failure_history.js +121 -0
  324. package/dist/esm/knowledge/kg_bridge.js +381 -0
  325. package/dist/esm/knowledge/kg_types.js +3 -0
  326. package/dist/esm/knowledge/route_families.js +393 -0
  327. package/dist/esm/knowledge/spec_index.js +122 -0
  328. package/dist/esm/logger.js +115 -0
  329. package/dist/esm/mcp-server.js +621 -0
  330. package/dist/esm/metrics/prometheus.js +149 -0
  331. package/dist/esm/model_router.js +59 -0
  332. package/dist/esm/ollama_provider.js +301 -0
  333. package/dist/esm/openai_provider.js +243 -0
  334. package/dist/esm/package.json +3 -0
  335. package/dist/esm/pipeline/orchestrator.js +228 -0
  336. package/dist/esm/pipeline/spec_verifier.js +75 -0
  337. package/dist/esm/pipeline/stage0_preprocess.js +102 -0
  338. package/dist/esm/pipeline/stage1_impact.js +140 -0
  339. package/dist/esm/pipeline/stage2_coverage.js +153 -0
  340. package/dist/esm/pipeline/stage3_generation.js +284 -0
  341. package/dist/esm/pipeline/stage4_heal.js +288 -0
  342. package/dist/esm/progress.js +112 -0
  343. package/dist/esm/prompts/coverage.js +57 -0
  344. package/dist/esm/prompts/cross-impact.js +53 -0
  345. package/dist/esm/prompts/generation.js +297 -0
  346. package/dist/esm/prompts/generation_profile.js +147 -0
  347. package/dist/esm/prompts/heal.js +91 -0
  348. package/dist/esm/prompts/impact.js +63 -0
  349. package/dist/esm/prompts/json_extract.js +36 -0
  350. package/dist/esm/prompts/strategist.js +61 -0
  351. package/dist/esm/prompts/test-designer.js +92 -0
  352. package/dist/esm/provider_factory.js +366 -0
  353. package/dist/esm/provider_interface.js +23 -0
  354. package/dist/esm/provider_utils.js +96 -0
  355. package/dist/esm/qa-agent/cli.js +205 -0
  356. package/dist/esm/qa-agent/orchestrator.js +120 -0
  357. package/dist/esm/qa-agent/phase1/runner.js +139 -0
  358. package/dist/esm/qa-agent/phase1/scope.js +126 -0
  359. package/dist/esm/qa-agent/phase2/agent_browser.js +95 -0
  360. package/dist/esm/qa-agent/phase2/agent_loop.js +351 -0
  361. package/dist/esm/qa-agent/phase2/exploration_state.js +97 -0
  362. package/dist/esm/qa-agent/phase2/tools.js +386 -0
  363. package/dist/esm/qa-agent/phase2/vision.js +75 -0
  364. package/dist/esm/qa-agent/phase3/feedback.js +34 -0
  365. package/dist/esm/qa-agent/phase3/reporter.js +145 -0
  366. package/dist/esm/qa-agent/phase3/spec_generator.js +62 -0
  367. package/dist/esm/qa-agent/phase3/verdict.js +66 -0
  368. package/dist/esm/qa-agent/safe_env.js +23 -0
  369. package/dist/esm/qa-agent/types.js +3 -0
  370. package/dist/esm/reporters/junit.js +86 -0
  371. package/dist/esm/reporters/reporter.js +3 -0
  372. package/dist/esm/reporters/sarif.js +132 -0
  373. package/dist/esm/resilience/circuit_breaker.js +78 -0
  374. package/dist/esm/resilience/retry.js +56 -0
  375. package/dist/esm/sanitize.js +66 -0
  376. package/dist/esm/training/enricher.js +345 -0
  377. package/dist/esm/training/kg_scanner.js +115 -0
  378. package/dist/esm/training/merger.js +204 -0
  379. package/dist/esm/training/scanner.js +923 -0
  380. package/dist/esm/training/types.js +6 -0
  381. package/dist/esm/training/validator.js +254 -0
  382. package/dist/esm/validation/guardrails.js +101 -0
  383. package/dist/esm/validation/output_schema.js +80 -0
  384. package/dist/esm/version.js +33 -0
  385. package/dist/index.d.ts +99 -0
  386. package/dist/index.d.ts.map +1 -0
  387. package/dist/index.js +169 -0
  388. package/dist/knowledge/api_surface.d.ts +37 -0
  389. package/dist/knowledge/api_surface.d.ts.map +1 -0
  390. package/dist/knowledge/api_surface.js +418 -0
  391. package/dist/knowledge/cluster_utils.d.ts +28 -0
  392. package/dist/knowledge/cluster_utils.d.ts.map +1 -0
  393. package/dist/knowledge/cluster_utils.js +67 -0
  394. package/dist/knowledge/context_loader.d.ts +13 -0
  395. package/dist/knowledge/context_loader.d.ts.map +1 -0
  396. package/dist/knowledge/context_loader.js +90 -0
  397. package/dist/knowledge/failure_history.d.ts +39 -0
  398. package/dist/knowledge/failure_history.d.ts.map +1 -0
  399. package/dist/knowledge/failure_history.js +128 -0
  400. package/dist/knowledge/kg_bridge.d.ts +31 -0
  401. package/dist/knowledge/kg_bridge.d.ts.map +1 -0
  402. package/dist/knowledge/kg_bridge.js +388 -0
  403. package/dist/knowledge/kg_types.d.ts +75 -0
  404. package/dist/knowledge/kg_types.d.ts.map +1 -0
  405. package/dist/knowledge/kg_types.js +4 -0
  406. package/dist/knowledge/route_families.d.ts +98 -0
  407. package/dist/knowledge/route_families.d.ts.map +1 -0
  408. package/dist/knowledge/route_families.js +410 -0
  409. package/dist/knowledge/spec_index.d.ts +18 -0
  410. package/dist/knowledge/spec_index.d.ts.map +1 -0
  411. package/dist/knowledge/spec_index.js +128 -0
  412. package/dist/logger.d.ts +31 -0
  413. package/dist/logger.d.ts.map +1 -0
  414. package/dist/logger.js +119 -0
  415. package/dist/mcp-server.d.ts +68 -0
  416. package/dist/mcp-server.d.ts.map +1 -0
  417. package/dist/mcp-server.js +629 -0
  418. package/dist/metrics/prometheus.d.ts +37 -0
  419. package/dist/metrics/prometheus.d.ts.map +1 -0
  420. package/dist/metrics/prometheus.js +153 -0
  421. package/dist/model_router.d.ts +28 -0
  422. package/dist/model_router.d.ts.map +1 -0
  423. package/dist/model_router.js +63 -0
  424. package/dist/ollama_provider.d.ts +65 -0
  425. package/dist/ollama_provider.d.ts.map +1 -0
  426. package/dist/ollama_provider.js +309 -0
  427. package/dist/openai_provider.d.ts +23 -0
  428. package/dist/openai_provider.d.ts.map +1 -0
  429. package/dist/openai_provider.js +251 -0
  430. package/dist/pipeline/orchestrator.d.ts +33 -0
  431. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  432. package/dist/pipeline/orchestrator.js +231 -0
  433. package/dist/pipeline/spec_verifier.d.ts +20 -0
  434. package/dist/pipeline/spec_verifier.d.ts.map +1 -0
  435. package/dist/pipeline/spec_verifier.js +79 -0
  436. package/dist/pipeline/stage0_preprocess.d.ts +31 -0
  437. package/dist/pipeline/stage0_preprocess.d.ts.map +1 -0
  438. package/dist/pipeline/stage0_preprocess.js +105 -0
  439. package/dist/pipeline/stage1_impact.d.ts +19 -0
  440. package/dist/pipeline/stage1_impact.d.ts.map +1 -0
  441. package/dist/pipeline/stage1_impact.js +143 -0
  442. package/dist/pipeline/stage2_coverage.d.ts +19 -0
  443. package/dist/pipeline/stage2_coverage.d.ts.map +1 -0
  444. package/dist/pipeline/stage2_coverage.js +156 -0
  445. package/dist/pipeline/stage3_generation.d.ts +43 -0
  446. package/dist/pipeline/stage3_generation.d.ts.map +1 -0
  447. package/dist/pipeline/stage3_generation.js +287 -0
  448. package/dist/pipeline/stage4_heal.d.ts +62 -0
  449. package/dist/pipeline/stage4_heal.d.ts.map +1 -0
  450. package/dist/pipeline/stage4_heal.js +294 -0
  451. package/dist/progress.d.ts +22 -0
  452. package/dist/progress.d.ts.map +1 -0
  453. package/dist/progress.js +116 -0
  454. package/dist/prompts/coverage.d.ts +39 -0
  455. package/dist/prompts/coverage.d.ts.map +1 -0
  456. package/dist/prompts/coverage.js +61 -0
  457. package/dist/prompts/cross-impact.d.ts +23 -0
  458. package/dist/prompts/cross-impact.d.ts.map +1 -0
  459. package/dist/prompts/cross-impact.js +57 -0
  460. package/dist/prompts/generation.d.ts +25 -0
  461. package/dist/prompts/generation.d.ts.map +1 -0
  462. package/dist/prompts/generation.js +302 -0
  463. package/dist/prompts/generation_profile.d.ts +29 -0
  464. package/dist/prompts/generation_profile.d.ts.map +1 -0
  465. package/dist/prompts/generation_profile.js +151 -0
  466. package/dist/prompts/heal.d.ts +23 -0
  467. package/dist/prompts/heal.d.ts.map +1 -0
  468. package/dist/prompts/heal.js +95 -0
  469. package/dist/prompts/impact.d.ts +31 -0
  470. package/dist/prompts/impact.d.ts.map +1 -0
  471. package/dist/prompts/impact.js +67 -0
  472. package/dist/prompts/json_extract.d.ts +14 -0
  473. package/dist/prompts/json_extract.d.ts.map +1 -0
  474. package/dist/prompts/json_extract.js +39 -0
  475. package/dist/prompts/strategist.d.ts +25 -0
  476. package/dist/prompts/strategist.d.ts.map +1 -0
  477. package/dist/prompts/strategist.js +65 -0
  478. package/dist/prompts/test-designer.d.ts +35 -0
  479. package/dist/prompts/test-designer.d.ts.map +1 -0
  480. package/dist/prompts/test-designer.js +96 -0
  481. package/dist/provider_factory.d.ts +104 -0
  482. package/dist/provider_factory.d.ts.map +1 -0
  483. package/dist/provider_factory.js +371 -0
  484. package/dist/provider_interface.d.ts +365 -0
  485. package/dist/provider_interface.d.ts.map +1 -0
  486. package/dist/provider_interface.js +28 -0
  487. package/dist/provider_utils.d.ts +39 -0
  488. package/dist/provider_utils.d.ts.map +1 -0
  489. package/dist/provider_utils.js +103 -0
  490. package/dist/qa-agent/cli.d.ts +3 -0
  491. package/dist/qa-agent/cli.d.ts.map +1 -0
  492. package/dist/qa-agent/cli.js +207 -0
  493. package/dist/qa-agent/orchestrator.d.ts +3 -0
  494. package/dist/qa-agent/orchestrator.d.ts.map +1 -0
  495. package/dist/qa-agent/orchestrator.js +123 -0
  496. package/dist/qa-agent/phase1/runner.d.ts +3 -0
  497. package/dist/qa-agent/phase1/runner.d.ts.map +1 -0
  498. package/dist/qa-agent/phase1/runner.js +142 -0
  499. package/dist/qa-agent/phase1/scope.d.ts +6 -0
  500. package/dist/qa-agent/phase1/scope.d.ts.map +1 -0
  501. package/dist/qa-agent/phase1/scope.js +129 -0
  502. package/dist/qa-agent/phase2/agent_browser.d.ts +35 -0
  503. package/dist/qa-agent/phase2/agent_browser.d.ts.map +1 -0
  504. package/dist/qa-agent/phase2/agent_browser.js +99 -0
  505. package/dist/qa-agent/phase2/agent_loop.d.ts +3 -0
  506. package/dist/qa-agent/phase2/agent_loop.d.ts.map +1 -0
  507. package/dist/qa-agent/phase2/agent_loop.js +357 -0
  508. package/dist/qa-agent/phase2/exploration_state.d.ts +12 -0
  509. package/dist/qa-agent/phase2/exploration_state.d.ts.map +1 -0
  510. package/dist/qa-agent/phase2/exploration_state.js +109 -0
  511. package/dist/qa-agent/phase2/tools.d.ts +28 -0
  512. package/dist/qa-agent/phase2/tools.d.ts.map +1 -0
  513. package/dist/qa-agent/phase2/tools.js +390 -0
  514. package/dist/qa-agent/phase2/vision.d.ts +3 -0
  515. package/dist/qa-agent/phase2/vision.d.ts.map +1 -0
  516. package/dist/qa-agent/phase2/vision.js +78 -0
  517. package/dist/qa-agent/phase3/feedback.d.ts +3 -0
  518. package/dist/qa-agent/phase3/feedback.d.ts.map +1 -0
  519. package/dist/qa-agent/phase3/feedback.js +37 -0
  520. package/dist/qa-agent/phase3/reporter.d.ts +3 -0
  521. package/dist/qa-agent/phase3/reporter.d.ts.map +1 -0
  522. package/dist/qa-agent/phase3/reporter.js +148 -0
  523. package/dist/qa-agent/phase3/spec_generator.d.ts +3 -0
  524. package/dist/qa-agent/phase3/spec_generator.d.ts.map +1 -0
  525. package/dist/qa-agent/phase3/spec_generator.js +65 -0
  526. package/dist/qa-agent/phase3/verdict.d.ts +3 -0
  527. package/dist/qa-agent/phase3/verdict.d.ts.map +1 -0
  528. package/dist/qa-agent/phase3/verdict.js +69 -0
  529. package/dist/qa-agent/safe_env.d.ts +3 -0
  530. package/dist/qa-agent/safe_env.d.ts.map +1 -0
  531. package/dist/qa-agent/safe_env.js +26 -0
  532. package/dist/qa-agent/types.d.ts +130 -0
  533. package/dist/qa-agent/types.d.ts.map +1 -0
  534. package/dist/qa-agent/types.js +4 -0
  535. package/dist/reporters/junit.d.ts +6 -0
  536. package/dist/reporters/junit.d.ts.map +1 -0
  537. package/dist/reporters/junit.js +89 -0
  538. package/dist/reporters/reporter.d.ts +42 -0
  539. package/dist/reporters/reporter.d.ts.map +1 -0
  540. package/dist/reporters/reporter.js +4 -0
  541. package/dist/reporters/sarif.d.ts +7 -0
  542. package/dist/reporters/sarif.d.ts.map +1 -0
  543. package/dist/reporters/sarif.js +135 -0
  544. package/dist/resilience/circuit_breaker.d.ts +36 -0
  545. package/dist/resilience/circuit_breaker.d.ts.map +1 -0
  546. package/dist/resilience/circuit_breaker.js +82 -0
  547. package/dist/resilience/retry.d.ts +11 -0
  548. package/dist/resilience/retry.d.ts.map +1 -0
  549. package/dist/resilience/retry.js +59 -0
  550. package/dist/sanitize.d.ts +15 -0
  551. package/dist/sanitize.d.ts.map +1 -0
  552. package/dist/sanitize.js +71 -0
  553. package/dist/training/enricher.d.ts +17 -0
  554. package/dist/training/enricher.d.ts.map +1 -0
  555. package/dist/training/enricher.js +350 -0
  556. package/dist/training/kg_scanner.d.ts +13 -0
  557. package/dist/training/kg_scanner.d.ts.map +1 -0
  558. package/dist/training/kg_scanner.js +118 -0
  559. package/dist/training/merger.d.ts +15 -0
  560. package/dist/training/merger.d.ts.map +1 -0
  561. package/dist/training/merger.js +208 -0
  562. package/dist/training/scanner.d.ts +36 -0
  563. package/dist/training/scanner.d.ts.map +1 -0
  564. package/dist/training/scanner.js +932 -0
  565. package/dist/training/types.d.ts +117 -0
  566. package/dist/training/types.d.ts.map +1 -0
  567. package/dist/training/types.js +9 -0
  568. package/dist/training/validator.d.ts +21 -0
  569. package/dist/training/validator.d.ts.map +1 -0
  570. package/dist/training/validator.js +262 -0
  571. package/dist/validation/guardrails.d.ts +31 -0
  572. package/dist/validation/guardrails.d.ts.map +1 -0
  573. package/dist/validation/guardrails.js +112 -0
  574. package/dist/validation/output_schema.d.ts +67 -0
  575. package/dist/validation/output_schema.d.ts.map +1 -0
  576. package/dist/validation/output_schema.js +84 -0
  577. package/dist/version.d.ts +6 -0
  578. package/dist/version.d.ts.map +1 -0
  579. package/dist/version.js +36 -0
  580. package/package.json +126 -0
  581. package/schemas/flow-decision.schema.json +83 -0
  582. package/schemas/gap.schema.json +18 -0
  583. package/schemas/impact.schema.json +455 -0
  584. package/schemas/plan.schema.json +491 -0
  585. package/schemas/route-families.schema.json +137 -0
  586. package/schemas/subsystem-risk-map.schema.json +62 -0
  587. package/schemas/traceability-input.schema.json +122 -0
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.preprocess = preprocess;
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const route_families_js_1 = require("../knowledge/route_families.js");
9
+ const api_surface_js_1 = require("../knowledge/api_surface.js");
10
+ const spec_index_js_1 = require("../knowledge/spec_index.js");
11
+ const context_loader_js_1 = require("../knowledge/context_loader.js");
12
+ const MAX_SNIPPET_CHARS = 3000;
13
+ const MAX_FILES_PER_GROUP = 30;
14
+ function loadFileSnippet(appPath, filePath) {
15
+ const candidates = [
16
+ (0, path_1.join)(appPath, filePath),
17
+ filePath,
18
+ ];
19
+ for (const candidate of candidates) {
20
+ if ((0, fs_1.existsSync)(candidate)) {
21
+ try {
22
+ const content = (0, fs_1.readFileSync)(candidate, 'utf-8');
23
+ if (content.length <= MAX_SNIPPET_CHARS) {
24
+ return content;
25
+ }
26
+ return content.slice(0, MAX_SNIPPET_CHARS) + '\n// ... truncated';
27
+ }
28
+ catch {
29
+ continue;
30
+ }
31
+ }
32
+ }
33
+ return undefined;
34
+ }
35
+ function preprocess(changedFiles, config) {
36
+ const warnings = [];
37
+ // Load route family manifest, fall back to heuristic families
38
+ let manifest = (0, route_families_js_1.loadRouteFamilyManifest)(config.testsRoot, config.routeFamilies);
39
+ if (!manifest) {
40
+ manifest = (0, route_families_js_1.buildHeuristicFamilies)(changedFiles, config.testsRoot);
41
+ warnings.push('Route family manifest not found. Using directory-based heuristics (lower accuracy).', 'Tip: Run `impact-gate train` to generate a proper manifest.');
42
+ }
43
+ // Load API surface catalog
44
+ const apiSurface = (0, api_surface_js_1.loadOrBuildApiSurface)(config.testsRoot, config.apiSurface);
45
+ if (apiSurface.pageObjects.length === 0) {
46
+ warnings.push('API surface catalog is empty. Generated test validation will be limited.');
47
+ }
48
+ // Build spec index
49
+ const specIndex = (0, spec_index_js_1.buildSpecIndex)(config.testsRoot, undefined, manifest);
50
+ // Load context documents
51
+ const context = (0, context_loader_js_1.loadContextDocuments)(config.testsRoot, config.appPath);
52
+ warnings.push(...context.warnings);
53
+ // Bind files to families (manifest is always non-null now — either real or heuristic)
54
+ const fileBindings = (0, route_families_js_1.bindFilesToFamilies)(changedFiles, manifest);
55
+ const unboundFiles = fileBindings
56
+ .filter((fb) => fb.bindings.length === 0)
57
+ .map((fb) => fb.file);
58
+ if (unboundFiles.length > 0) {
59
+ warnings.push(`${unboundFiles.length} changed file(s) did not match any route family: ${unboundFiles.slice(0, 5).join(', ')}${unboundFiles.length > 5 ? '...' : ''}`);
60
+ }
61
+ // Group files by family+feature
62
+ const groupMap = new Map();
63
+ for (const binding of fileBindings) {
64
+ if (binding.bindings.length === 0) {
65
+ // Unbound files go into a special "unbound" group
66
+ const key = '__unbound__';
67
+ if (!groupMap.has(key)) {
68
+ groupMap.set(key, { familyId: '__unbound__', files: [] });
69
+ }
70
+ const group = groupMap.get(key);
71
+ if (group.files.length < MAX_FILES_PER_GROUP) {
72
+ group.files.push({
73
+ path: binding.file,
74
+ snippet: loadFileSnippet(config.appPath, binding.file),
75
+ });
76
+ }
77
+ continue;
78
+ }
79
+ for (const b of binding.bindings) {
80
+ const key = b.feature ? `${b.family}::${b.feature}` : b.family;
81
+ if (!groupMap.has(key)) {
82
+ groupMap.set(key, { familyId: b.family, featureId: b.feature, files: [] });
83
+ }
84
+ const group = groupMap.get(key);
85
+ if (group.files.length < MAX_FILES_PER_GROUP) {
86
+ group.files.push({
87
+ path: binding.file,
88
+ snippet: loadFileSnippet(config.appPath, binding.file),
89
+ });
90
+ }
91
+ }
92
+ }
93
+ const familyGroups = Array.from(groupMap.values()).filter((g) => g.familyId !== '__unbound__');
94
+ return {
95
+ changedFiles,
96
+ fileBindings,
97
+ unboundFiles,
98
+ familyGroups,
99
+ manifest,
100
+ apiSurface,
101
+ specIndex,
102
+ context,
103
+ warnings,
104
+ };
105
+ }
@@ -0,0 +1,19 @@
1
+ import { type RouteFamilyManifest } from '../knowledge/route_families.js';
2
+ import { type SpecIndex } from '../knowledge/spec_index.js';
3
+ import type { ApiSurfaceCatalog } from '../knowledge/api_surface.js';
4
+ import type { LoadedContext } from '../knowledge/context_loader.js';
5
+ import type { FamilyGroup } from './stage0_preprocess.js';
6
+ import type { FlowDecision } from '../validation/output_schema.js';
7
+ export interface ImpactConfig {
8
+ provider?: string;
9
+ maxTokens?: number;
10
+ temperature?: number;
11
+ timeout?: number;
12
+ }
13
+ export interface ImpactResult {
14
+ decisions: FlowDecision[];
15
+ warnings: string[];
16
+ providerName: string;
17
+ }
18
+ export declare function runImpactStage(familyGroups: FamilyGroup[], manifest: RouteFamilyManifest | null, specIndex: SpecIndex, apiSurface: ApiSurfaceCatalog, context: LoadedContext, config: ImpactConfig, testsRoot?: string): Promise<ImpactResult>;
19
+ //# sourceMappingURL=stage1_impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage1_impact.d.ts","sourceRoot":"","sources":["../../src/pipeline/stage1_impact.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgD,KAAK,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAEvH,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAC,YAAY,EAA+B,MAAM,gCAAgC,CAAC;AAG/F,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACxB;AAgBD,wBAAsB,cAAc,CAChC,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,EACpB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAqIvB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.runImpactStage = runImpactStage;
6
+ const provider_factory_js_1 = require("../provider_factory.js");
7
+ const impact_js_1 = require("../prompts/impact.js");
8
+ const context_loader_js_1 = require("../knowledge/context_loader.js");
9
+ const route_families_js_1 = require("../knowledge/route_families.js");
10
+ const failure_history_js_1 = require("../knowledge/failure_history.js");
11
+ const spec_index_js_1 = require("../knowledge/spec_index.js");
12
+ const guardrails_js_1 = require("../validation/guardrails.js");
13
+ function normalizePriority(value) {
14
+ if (value === 'P0' || value === 'P1' || value === 'P2') {
15
+ return value;
16
+ }
17
+ return 'P2';
18
+ }
19
+ async function getProvider(config) {
20
+ if (config.provider && config.provider !== 'auto') {
21
+ return provider_factory_js_1.LLMProviderFactory.createFromString(config.provider);
22
+ }
23
+ return provider_factory_js_1.LLMProviderFactory.createFromEnv();
24
+ }
25
+ async function runImpactStage(familyGroups, manifest, specIndex, apiSurface, context, config, testsRoot) {
26
+ const warnings = [];
27
+ const allDecisions = [];
28
+ if (familyGroups.length === 0) {
29
+ warnings.push('No family groups to analyze. All changed files were unbound.');
30
+ return { decisions: [], warnings, providerName: 'none' };
31
+ }
32
+ let provider;
33
+ try {
34
+ provider = await getProvider(config);
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ warnings.push(`Impact agent unavailable: ${message}`);
39
+ return { decisions: [], warnings, providerName: 'none' };
40
+ }
41
+ const contextBlock = (0, context_loader_js_1.formatContextForPrompt)(context);
42
+ // Load historical failure correlations for confidence boosting
43
+ const failureHistory = testsRoot ? (0, failure_history_js_1.loadFailureHistory)(testsRoot) : null;
44
+ for (const group of familyGroups) {
45
+ const family = manifest ? (0, route_families_js_1.getFamilyById)(manifest, group.familyId) : null;
46
+ if (!family) {
47
+ // For unbound groups, create cannot_determine decisions
48
+ for (const file of group.files) {
49
+ allDecisions.push({
50
+ flowId: `unbound_${file.path.replace(/[^a-zA-Z0-9]/g, '_')}`,
51
+ flowName: `Unbound file: ${file.path}`,
52
+ routeFamily: '__unbound__',
53
+ changedFiles: [file.path],
54
+ evidence: 'File does not match any known route family in the manifest.',
55
+ evidenceSource: 'deterministic',
56
+ confidence: 0,
57
+ existingSpecs: [],
58
+ action: 'cannot_determine',
59
+ blockingReason: 'File not mapped to any route family. Update route-families.json to include this file path.',
60
+ priority: 'P2',
61
+ userActions: [],
62
+ });
63
+ }
64
+ continue;
65
+ }
66
+ const specs = (0, spec_index_js_1.getSpecsForFamily)(specIndex, group.familyId, group.featureId);
67
+ const promptCtx = {
68
+ family,
69
+ featureId: group.featureId,
70
+ changedFiles: group.files,
71
+ existingSpecs: specs,
72
+ apiSurface,
73
+ contextBlock,
74
+ };
75
+ const prompt = (0, impact_js_1.buildImpactPrompt)(promptCtx);
76
+ try {
77
+ const response = await provider.generateText(prompt, {
78
+ maxTokens: config.maxTokens || 4000,
79
+ temperature: config.temperature ?? 0,
80
+ timeout: config.timeout || 45000,
81
+ systemPrompt: 'Return only valid JSON. Do not include markdown fences unless necessary.',
82
+ });
83
+ const parsed = (0, impact_js_1.parseImpactResponse)(response.text);
84
+ if (!parsed || parsed.flows.length === 0) {
85
+ warnings.push(`Impact agent returned no flows for family ${group.familyId}.`);
86
+ continue;
87
+ }
88
+ for (const flow of parsed.flows) {
89
+ if (!flow.id || !flow.changedFiles || !Array.isArray(flow.changedFiles)) {
90
+ continue;
91
+ }
92
+ // Compute confidence with optional historical failure boost
93
+ const changedFilesList = Array.isArray(flow.changedFiles)
94
+ ? flow.changedFiles.filter((f) => typeof f === 'string')
95
+ : [];
96
+ const historyBoost = failureHistory
97
+ ? Math.max(...changedFilesList.map((f) => (0, failure_history_js_1.getConfidenceBoost)(failureHistory, f)), 0)
98
+ : 0;
99
+ const confidence = typeof flow.confidence === 'number'
100
+ ? Math.min(100, Math.max(0, flow.confidence) + historyBoost)
101
+ : (0, guardrails_js_1.computeConfidence)({
102
+ hasRouteFamily: true,
103
+ hasSpecificRoute: Boolean(flow.route),
104
+ hasPageObject: Boolean(flow.pageObjects && flow.pageObjects.length > 0),
105
+ hasUserAction: Boolean(flow.userActions && flow.userActions.length > 0),
106
+ hasExistingSpecCited: false,
107
+ historyBoost,
108
+ });
109
+ // Resolve assertion patterns from manifest for this flow's family/feature
110
+ const assertionPatterns = manifest
111
+ ? (0, route_families_js_1.getAssertionPatternsForBinding)(manifest, { family: group.familyId, feature: group.featureId })
112
+ : [];
113
+ const decision = {
114
+ flowId: flow.id,
115
+ flowName: flow.name || flow.id,
116
+ routeFamily: group.familyId,
117
+ featureId: group.featureId,
118
+ specificRoute: flow.route,
119
+ changedFiles: flow.changedFiles.filter((f) => typeof f === 'string'),
120
+ evidence: flow.evidence || 'AI identified this flow as impacted.',
121
+ evidenceSource: 'ai',
122
+ confidence,
123
+ existingSpecs: [],
124
+ action: (0, guardrails_js_1.shouldForceCannotDetermine)(confidence) ? 'cannot_determine' : 'run_existing',
125
+ blockingReason: (0, guardrails_js_1.shouldForceCannotDetermine)(confidence) ? 'Confidence too low to determine action.' : undefined,
126
+ priority: normalizePriority(flow.priority),
127
+ userActions: Array.isArray(flow.userActions) ? flow.userActions.filter((a) => typeof a === 'string') : [],
128
+ assertionPatterns: assertionPatterns.length > 0 ? assertionPatterns : undefined,
129
+ };
130
+ allDecisions.push(decision);
131
+ }
132
+ }
133
+ catch (error) {
134
+ const message = error instanceof Error ? error.message : String(error);
135
+ warnings.push(`Impact agent failed for family ${group.familyId}: ${message}`);
136
+ }
137
+ }
138
+ return {
139
+ decisions: allDecisions,
140
+ warnings,
141
+ providerName: provider.name,
142
+ };
143
+ }
@@ -0,0 +1,19 @@
1
+ import { type LoadedContext } from '../knowledge/context_loader.js';
2
+ import { type SpecIndex } from '../knowledge/spec_index.js';
3
+ import type { FlowDecision } from '../validation/output_schema.js';
4
+ import type { GenerationProfile } from '../prompts/generation_profile.js';
5
+ export interface CoverageConfig {
6
+ provider?: string;
7
+ maxTokens?: number;
8
+ temperature?: number;
9
+ timeout?: number;
10
+ maxSpecContentChars?: number;
11
+ profile?: GenerationProfile;
12
+ }
13
+ export interface CoverageResult {
14
+ decisions: FlowDecision[];
15
+ warnings: string[];
16
+ providerName: string;
17
+ }
18
+ export declare function runCoverageStage(decisions: FlowDecision[], specIndex: SpecIndex, context: LoadedContext, testsRoot: string, config: CoverageConfig): Promise<CoverageResult>;
19
+ //# sourceMappingURL=stage2_coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage2_coverage.d.ts","sourceRoot":"","sources":["../../src/pipeline/stage2_coverage.ts"],"names":[],"mappings":"AAMA,OAAO,EAA8C,KAAK,aAAa,EAAC,MAAM,gCAAgC,CAAC;AAC/G,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAC,YAAY,EAA4B,MAAM,gCAAgC,CAAC;AAC5F,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACxB;AAYD,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,YAAY,EAAE,EACzB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAyJzB"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.runCoverageStage = runCoverageStage;
6
+ const provider_factory_js_1 = require("../provider_factory.js");
7
+ const coverage_js_1 = require("../prompts/coverage.js");
8
+ const context_loader_js_1 = require("../knowledge/context_loader.js");
9
+ const spec_index_js_1 = require("../knowledge/spec_index.js");
10
+ const VALID_ACTIONS = ['run_existing', 'add_scenarios', 'create_spec', 'cannot_determine'];
11
+ const VALID_COVERAGE = ['full', 'partial', 'none'];
12
+ async function getProvider(config) {
13
+ if (config.provider && config.provider !== 'auto') {
14
+ return provider_factory_js_1.LLMProviderFactory.createFromString(config.provider);
15
+ }
16
+ return provider_factory_js_1.LLMProviderFactory.createFromEnv();
17
+ }
18
+ async function runCoverageStage(decisions, specIndex, context, testsRoot, config) {
19
+ const warnings = [];
20
+ // Filter to only actionable decisions (not cannot_determine)
21
+ const actionable = decisions.filter((d) => d.action !== 'cannot_determine');
22
+ if (actionable.length === 0) {
23
+ return { decisions, warnings, providerName: 'none' };
24
+ }
25
+ let provider;
26
+ try {
27
+ provider = await getProvider(config);
28
+ }
29
+ catch (error) {
30
+ const message = error instanceof Error ? error.message : String(error);
31
+ warnings.push(`Coverage agent unavailable: ${message}. Decisions will not have coverage evaluation.`);
32
+ return { decisions, warnings, providerName: 'none' };
33
+ }
34
+ // Group decisions by route family for efficient prompting
35
+ const byFamily = new Map();
36
+ for (const d of actionable) {
37
+ const key = d.routeFamily;
38
+ if (!byFamily.has(key)) {
39
+ byFamily.set(key, []);
40
+ }
41
+ byFamily.get(key).push(d);
42
+ }
43
+ const updatedDecisions = new Map();
44
+ const contextBlock = (0, context_loader_js_1.formatContextForPrompt)(context);
45
+ const maxSpecChars = config.maxSpecContentChars || 15000;
46
+ for (const [familyId, familyDecisions] of byFamily) {
47
+ // Gather relevant specs
48
+ const specs = (0, spec_index_js_1.getSpecsForFamily)(specIndex, familyId);
49
+ // Two-tier approach: send all spec titles (compact), full content for top matches only
50
+ const allSpecSummaries = specs.map((s) => ({
51
+ relativePath: s.relativePath,
52
+ testTitles: s.testTitles,
53
+ }));
54
+ // Load full content with a total budget of 200K chars (~50K tokens) to avoid blowing context windows
55
+ const MAX_TOTAL_SPEC_CHARS = 200000;
56
+ let totalSpecChars = 0;
57
+ const specsWithContent = [];
58
+ for (const s of specs) {
59
+ if (specsWithContent.length >= 30)
60
+ break;
61
+ const content = (0, context_loader_js_1.loadSpecFileContent)(testsRoot, s.relativePath, maxSpecChars);
62
+ if (!content)
63
+ continue;
64
+ if (totalSpecChars + content.length > MAX_TOTAL_SPEC_CHARS)
65
+ break;
66
+ totalSpecChars += content.length;
67
+ specsWithContent.push({ relativePath: s.relativePath, content, testTitles: s.testTitles });
68
+ }
69
+ if (specsWithContent.length === 0) {
70
+ // No specs to evaluate — mark all as create_spec
71
+ for (const d of familyDecisions) {
72
+ updatedDecisions.set(d.flowId, {
73
+ ...d,
74
+ action: 'create_spec',
75
+ existingSpecs: [],
76
+ evidence: d.evidence + ' No existing specs found for this route family.',
77
+ });
78
+ }
79
+ continue;
80
+ }
81
+ const flows = familyDecisions.map((d) => ({
82
+ flowId: d.flowId,
83
+ flowName: d.flowName,
84
+ route: d.specificRoute || d.routeFamily,
85
+ userActions: d.userActions,
86
+ evidence: d.evidence,
87
+ priority: d.priority,
88
+ }));
89
+ // Include titles-only summaries for specs beyond the content limit
90
+ const extraSummaries = allSpecSummaries
91
+ .slice(specsWithContent.length)
92
+ .map((s) => ` - ${s.relativePath}: ${s.testTitles.join(', ')}`)
93
+ .join('\n');
94
+ const extraContext = extraSummaries
95
+ ? `\nADDITIONAL SPECS (titles only, no content loaded):\n${extraSummaries}\n`
96
+ : '';
97
+ const prompt = (0, coverage_js_1.buildCoveragePrompt)({
98
+ flows,
99
+ specs: specsWithContent,
100
+ contextBlock: contextBlock + extraContext,
101
+ profile: config.profile,
102
+ });
103
+ try {
104
+ const response = await provider.generateText(prompt, {
105
+ maxTokens: config.maxTokens || 4000,
106
+ temperature: config.temperature ?? 0,
107
+ timeout: config.timeout || 60000,
108
+ systemPrompt: 'Return only valid JSON. Do not include markdown fences unless necessary.',
109
+ });
110
+ const parsed = (0, coverage_js_1.parseCoverageResponse)(response.text);
111
+ if (!parsed || parsed.coverage.length === 0) {
112
+ warnings.push(`Coverage agent returned no results for family ${familyId}.`);
113
+ continue;
114
+ }
115
+ for (const entry of parsed.coverage) {
116
+ const original = familyDecisions.find((d) => d.flowId === entry.flowId);
117
+ if (!original) {
118
+ continue;
119
+ }
120
+ const action = VALID_ACTIONS.includes(entry.action)
121
+ ? entry.action
122
+ : 'cannot_determine';
123
+ const existingSpecs = (entry.existingSpecs || []).map((s) => ({
124
+ path: s.path || '',
125
+ testTitles: Array.isArray(s.testTitles) ? s.testTitles.filter((t) => typeof t === 'string') : [],
126
+ coverageLevel: (VALID_COVERAGE.includes(s.coverageLevel) ? s.coverageLevel : 'none'),
127
+ missingScenarios: Array.isArray(s.missingScenarios) ? s.missingScenarios.filter((t) => typeof t === 'string') : undefined,
128
+ }));
129
+ const confidence = typeof entry.confidence === 'number'
130
+ ? Math.max(0, Math.min(100, entry.confidence))
131
+ : original.confidence;
132
+ updatedDecisions.set(original.flowId, {
133
+ ...original,
134
+ action,
135
+ confidence,
136
+ existingSpecs,
137
+ targetSpec: entry.targetSpec,
138
+ newSpecPath: entry.newSpecPath,
139
+ scenariosToAdd: entry.scenariosToAdd?.filter((s) => typeof s === 'string'),
140
+ blockingReason: entry.blockingReason,
141
+ });
142
+ }
143
+ }
144
+ catch (error) {
145
+ const message = error instanceof Error ? error.message : String(error);
146
+ warnings.push(`Coverage agent failed for family ${familyId}: ${message}`);
147
+ }
148
+ }
149
+ // Merge updated decisions back
150
+ const finalDecisions = decisions.map((d) => updatedDecisions.get(d.flowId) || d);
151
+ return {
152
+ decisions: finalDecisions,
153
+ warnings,
154
+ providerName: provider.name,
155
+ };
156
+ }
@@ -0,0 +1,43 @@
1
+ import { loadSpecFileContent } from '../knowledge/context_loader.js';
2
+ import type { FlowDecision } from '../validation/output_schema.js';
3
+ import type { ApiSurfaceCatalog } from '../knowledge/api_surface.js';
4
+ import type { GenerationProfile } from '../prompts/generation_profile.js';
5
+ export interface GenerationConfig {
6
+ provider?: string;
7
+ maxTokens?: number;
8
+ temperature?: number;
9
+ timeout?: number;
10
+ /** Directory to write generated specs into when no path is specified */
11
+ defaultOutputDir?: string;
12
+ /** Set to true to log hallucination warnings but still write the file */
13
+ warnOnHallucinations?: boolean;
14
+ /** When true, only log what would be written without actually writing files */
15
+ dryRun?: boolean;
16
+ profile?: GenerationProfile;
17
+ }
18
+ export interface GeneratedSpec {
19
+ flowId: string;
20
+ specPath: string;
21
+ mode: 'create_spec' | 'add_scenarios';
22
+ written: boolean;
23
+ hallucinationWarnings: string[];
24
+ /** Whether the spec passed compile + smoke-run verification */
25
+ verified?: boolean;
26
+ /** If verification failed, the reason */
27
+ verificationError?: string;
28
+ }
29
+ export interface GenerationResult {
30
+ generated: GeneratedSpec[];
31
+ skipped: string[];
32
+ warnings: string[];
33
+ providerName: string;
34
+ /** Total number of specs generated */
35
+ generatedCount: number;
36
+ /** Number that passed compile + smoke-run */
37
+ verifiedCount: number;
38
+ /** Number that failed verification */
39
+ failedCount: number;
40
+ }
41
+ export declare function runGenerationStage(decisions: FlowDecision[], apiSurface: ApiSurfaceCatalog, testsRoot: string, config: GenerationConfig): Promise<GenerationResult>;
42
+ export { loadSpecFileContent };
43
+ //# sourceMappingURL=stage3_generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage3_generation.d.ts","sourceRoot":"","sources":["../../src/pipeline/stage3_generation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAInE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACvB;AAyCD,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA8J3B;AAqHD,OAAO,EAAC,mBAAmB,EAAC,CAAC"}