@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,255 @@
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.runCrewCommand = runCrewCommand;
6
+ /**
7
+ * CLI command: crew — runs multi-agent QA analysis workflows.
8
+ */
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const config_js_1 = require("../../agent/config.js");
12
+ const orchestrator_js_1 = require("../../crew/orchestrator.js");
13
+ const response_cache_js_1 = require("../../cache/response_cache.js");
14
+ const workflows_js_1 = require("../../crew/workflows.js");
15
+ const impact_analyst_js_1 = require("../../agents/impact-analyst.js");
16
+ const generator_js_1 = require("../../agents/generator.js");
17
+ const executor_js_1 = require("../../agents/executor.js");
18
+ const healer_js_1 = require("../../agents/healer.js");
19
+ const strategist_js_1 = require("../../agents/strategist.js");
20
+ const test_designer_js_1 = require("../../agents/test-designer.js");
21
+ const cross_impact_js_1 = require("../../agents/cross-impact.js");
22
+ const regression_advisor_js_1 = require("../../agents/regression-advisor.js");
23
+ const VALID_WORKFLOWS = ['full-qa', 'quick-check', 'design-only'];
24
+ async function runCrewCommand(args, autoConfig) {
25
+ if (!args.path && !autoConfig) {
26
+ console.error('Error: --path is required for crew command');
27
+ process.exit(1);
28
+ }
29
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
30
+ path: args.path,
31
+ profile: args.profile,
32
+ testsRoot: args.testsRoot,
33
+ mode: 'impact',
34
+ gitSince: args.gitSince,
35
+ llmProvider: args.llmProvider,
36
+ });
37
+ const testsRoot = config.testsRoot || config.path;
38
+ const rawWorkflow = args.crewWorkflow || 'full-qa';
39
+ if (!VALID_WORKFLOWS.includes(rawWorkflow)) {
40
+ console.error(`Error: invalid workflow '${rawWorkflow}'. Valid: ${VALID_WORKFLOWS.join(', ')}`);
41
+ process.exit(1);
42
+ }
43
+ const workflowName = rawWorkflow;
44
+ // Degraded mode: skip all AI features, deterministic analysis only
45
+ const degraded = args.degradedMode || process.env.E2E_AGENTS_DEGRADED === 'true';
46
+ if (degraded) {
47
+ console.log('Running in degraded mode — deterministic analysis only, no LLM calls.');
48
+ }
49
+ // Prune expired cache entries to prevent unbounded growth on CI
50
+ try {
51
+ const cache = new response_cache_js_1.ResponseCache(testsRoot);
52
+ const pruned = cache.prune();
53
+ if (pruned > 0) {
54
+ console.log(`Cache: pruned ${pruned} expired entries.`);
55
+ }
56
+ }
57
+ catch (err) {
58
+ const msg = err instanceof Error ? err.message : String(err);
59
+ console.error(`Cache prune warning: ${msg}`);
60
+ }
61
+ const crewConfig = {
62
+ appPath: config.path,
63
+ testsRoot,
64
+ gitSince: args.gitSince || config.git.since,
65
+ routeFamilies: config.routeFamilies,
66
+ apiSurface: config.apiSurface,
67
+ workflow: workflowName,
68
+ providerOverride: args.llmProvider,
69
+ budgetUSD: args.budgetUSD,
70
+ dryRun: degraded || args.dryRun,
71
+ plugins: args.plugins,
72
+ };
73
+ // Create orchestrator and register all agents
74
+ const orchestrator = new orchestrator_js_1.CrewOrchestrator();
75
+ orchestrator.registerAgent(new impact_analyst_js_1.ImpactAnalystAgent());
76
+ orchestrator.registerAgent(new generator_js_1.GeneratorAgent());
77
+ orchestrator.registerAgent(new executor_js_1.ExecutorAgent());
78
+ orchestrator.registerAgent(new healer_js_1.HealerAgent());
79
+ orchestrator.registerAgent(new strategist_js_1.StrategistAgent());
80
+ orchestrator.registerAgent(new test_designer_js_1.TestDesignerAgent());
81
+ orchestrator.registerAgent(new cross_impact_js_1.CrossImpactAgent());
82
+ orchestrator.registerAgent(new regression_advisor_js_1.RegressionAdvisorAgent());
83
+ let result;
84
+ try {
85
+ result = await orchestrator.run(crewConfig);
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ console.error(`Crew workflow failed: ${message}`);
90
+ process.exit(1);
91
+ }
92
+ const ctx = result.context;
93
+ // Dry-run output
94
+ if (result.dryRun) {
95
+ printDryRunOutput(result, workflowName, args.jsonOutput);
96
+ return;
97
+ }
98
+ // Write crew metrics to metrics.jsonl for cost-report
99
+ if (ctx.usage.requestCount > 0) {
100
+ try {
101
+ const baseDir = (0, path_1.join)(testsRoot, '.e2e-ai-agents');
102
+ (0, fs_1.mkdirSync)(baseDir, { recursive: true });
103
+ const metricsPath = (0, path_1.join)(baseDir, 'metrics.jsonl');
104
+ const crewMetric = {
105
+ type: 'crew-run',
106
+ timestamp: new Date().toISOString(),
107
+ workflow: workflowName,
108
+ totalCost: ctx.usage.totalCost,
109
+ totalTokens: ctx.usage.totalTokens,
110
+ totalInputTokens: ctx.usage.totalInputTokens,
111
+ totalOutputTokens: ctx.usage.totalOutputTokens,
112
+ agentUsage: ctx.agentUsage,
113
+ };
114
+ (0, fs_1.appendFileSync)(metricsPath, `${JSON.stringify(crewMetric)}\n`, 'utf-8');
115
+ }
116
+ catch {
117
+ // Non-fatal: metrics writing should not break the workflow
118
+ }
119
+ }
120
+ // JSON output mode
121
+ if (args.jsonOutput) {
122
+ const jsonReport = {
123
+ workflow: workflowName,
124
+ changedFiles: ctx.changedFiles.length,
125
+ impactedFlows: ctx.impactedFlows,
126
+ strategyEntries: ctx.strategyEntries,
127
+ testDesigns: ctx.testDesigns,
128
+ crossImpacts: ctx.crossImpacts,
129
+ regressionRisks: ctx.regressionRisks,
130
+ findings: ctx.findings,
131
+ generatedSpecs: ctx.generatedSpecs.map((s) => ({ flowId: s.flowId, specPath: s.specPath, mode: s.mode, written: s.written })),
132
+ usage: { cost: ctx.usage.totalCost, requests: ctx.usage.requestCount, tokens: ctx.usage.totalTokens },
133
+ timings: result.timings,
134
+ warnings: result.warnings,
135
+ };
136
+ console.log(JSON.stringify(jsonReport, null, 2));
137
+ return;
138
+ }
139
+ // Human-readable output
140
+ console.log(`Crew workflow: ${workflowName}`);
141
+ console.log(`Changed files: ${ctx.changedFiles.length}`);
142
+ console.log(`Impacted flows: ${ctx.impactedFlows.length}`);
143
+ console.log(`Strategy entries: ${ctx.strategyEntries.length}`);
144
+ console.log(`Test designs: ${ctx.testDesigns.length} (${ctx.testDesigns.reduce((sum, td) => sum + td.testCases.length, 0)} test cases)`);
145
+ console.log(`Cross-impacts: ${ctx.crossImpacts.length}`);
146
+ console.log(`Regression risks: ${ctx.regressionRisks.length}`);
147
+ console.log(`Findings: ${ctx.findings.length}`);
148
+ console.log(`Generated specs: ${ctx.generatedSpecs.length}`);
149
+ console.log(`Cost: $${ctx.usage.totalCost.toFixed(4)}`);
150
+ if (ctx.strategyEntries.length > 0) {
151
+ console.log('\nTest Strategy:');
152
+ for (const entry of ctx.strategyEntries) {
153
+ console.log(` ${entry.priority} ${entry.flowName} → ${entry.approach} [${entry.testCategories.join(', ')}]`);
154
+ }
155
+ }
156
+ if (ctx.testDesigns.length > 0) {
157
+ console.log('\nTest Designs:');
158
+ for (const design of ctx.testDesigns) {
159
+ console.log(` ${design.flowName}: ${design.testCases.length} test cases`);
160
+ for (const tc of design.testCases) {
161
+ console.log(` [${tc.type}] ${tc.name} (${tc.priority})`);
162
+ }
163
+ }
164
+ }
165
+ if (ctx.crossImpacts.length > 0) {
166
+ console.log('\nCross-Family Impacts:');
167
+ for (const ci of ctx.crossImpacts) {
168
+ console.log(` ${ci.sourceFamily} → ${ci.affectedFamily} (${ci.riskLevel}): ${ci.sharedDependency}`);
169
+ }
170
+ }
171
+ if (result.timings && Object.keys(result.timings).length > 0) {
172
+ console.log('\nPhase timings:');
173
+ for (const [phase, ms] of Object.entries(result.timings)) {
174
+ console.log(` ${phase}: ${ms}ms`);
175
+ }
176
+ }
177
+ if (result.warnings.length > 0) {
178
+ console.log(`\nWarnings: ${result.warnings.length}`);
179
+ for (const w of result.warnings.slice(0, 10)) {
180
+ console.log(` - ${w}`);
181
+ }
182
+ if (result.warnings.length > 10) {
183
+ console.log(` ... and ${result.warnings.length - 10} more`);
184
+ }
185
+ }
186
+ }
187
+ function printDryRunOutput(result, workflowName, jsonOutput) {
188
+ const ctx = result.context;
189
+ const workflow = workflows_js_1.WORKFLOWS[workflowName];
190
+ if (jsonOutput) {
191
+ console.log(JSON.stringify({
192
+ dryRun: true,
193
+ workflow: workflowName,
194
+ changedFiles: ctx.changedFiles,
195
+ familyGroups: ctx.familyGroups.map((fg) => ({
196
+ familyId: fg.familyId,
197
+ featureId: fg.featureId,
198
+ files: fg.files,
199
+ })),
200
+ phases: workflow.phases.map((p) => ({
201
+ name: p.name,
202
+ agents: p.parallel || p.sequential || [],
203
+ })),
204
+ manifestSource: ctx.manifest?.source || 'none',
205
+ warnings: result.warnings,
206
+ }, null, 2));
207
+ return;
208
+ }
209
+ console.log('Dry run — no LLM calls will be made.\n');
210
+ console.log(`Changed files (${ctx.changedFiles.length}):`);
211
+ for (const f of ctx.changedFiles.slice(0, 20)) {
212
+ console.log(` ${f}`);
213
+ }
214
+ if (ctx.changedFiles.length > 20) {
215
+ console.log(` ... and ${ctx.changedFiles.length - 20} more`);
216
+ }
217
+ console.log(`\nAffected families (${ctx.familyGroups.length}):`);
218
+ for (const fg of ctx.familyGroups) {
219
+ const label = fg.featureId ? `${fg.familyId}/${fg.featureId}` : fg.familyId;
220
+ console.log(` ${label} (${fg.files.length} files)`);
221
+ }
222
+ if (ctx.manifest?.source === 'heuristic') {
223
+ console.log('\n Note: Using directory-based heuristics. Run `impact-gate train` for better accuracy.');
224
+ }
225
+ console.log(`\nWorkflow: ${workflowName}`);
226
+ const phaseNames = workflow.phases
227
+ .map((p) => {
228
+ const agents = p.parallel || p.sequential || [];
229
+ return agents.length > 0 ? `${p.name} (${agents.join(', ')})` : p.name;
230
+ })
231
+ .join(' → ');
232
+ console.log(`Phases: ${phaseNames}`);
233
+ // Cost estimation based on workflow and family count
234
+ const familyCount = Math.max(ctx.familyGroups.length, 1);
235
+ const agentCount = workflow.phases.reduce((sum, p) => sum + (p.parallel?.length || 0) + (p.sequential?.length || 0), 0);
236
+ const costEstimate = estimateCost(workflowName, familyCount, agentCount);
237
+ console.log(`\nEstimated cost: $${costEstimate.low.toFixed(2)}-$${costEstimate.high.toFixed(2)}`);
238
+ if (ctx.modelRoutingProviderType) {
239
+ console.log(` With model routing: $${(costEstimate.low * 0.5).toFixed(2)}-$${(costEstimate.high * 0.5).toFixed(2)} (Haiku for classification)`);
240
+ }
241
+ }
242
+ /** Rough cost estimation based on observed averages per workflow type */
243
+ function estimateCost(workflow, families, _agents) {
244
+ // Per-family cost ranges by workflow (based on typical Sonnet pricing)
245
+ const ranges = {
246
+ 'quick-check': { low: 0.03, high: 0.10 },
247
+ 'design-only': { low: 0.10, high: 0.40 },
248
+ 'full-qa': { low: 0.30, high: 1.00 },
249
+ };
250
+ const range = ranges[workflow] || ranges['full-qa'];
251
+ return {
252
+ low: range.low * families,
253
+ high: range.high * families,
254
+ };
255
+ }
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from '../types.js';
2
+ export declare function runFeedbackCommand(args: ParsedArgs, autoConfig: string | undefined): void;
3
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAiCzF"}
@@ -0,0 +1,39 @@
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.runFeedbackCommand = runFeedbackCommand;
6
+ const fs_1 = require("fs");
7
+ const config_js_1 = require("../../agent/config.js");
8
+ const feedback_js_1 = require("../../agent/feedback.js");
9
+ function runFeedbackCommand(args, autoConfig) {
10
+ if (!args.path && !autoConfig) {
11
+ console.error('Error: --path is required for feedback command');
12
+ process.exit(1);
13
+ }
14
+ if (!args.feedbackInputPath) {
15
+ console.error('Error: --feedback-input <path> is required for feedback command');
16
+ process.exit(1);
17
+ }
18
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
19
+ path: args.path,
20
+ profile: args.profile,
21
+ testsRoot: args.testsRoot,
22
+ mode: 'impact',
23
+ llmProvider: args.llmProvider,
24
+ });
25
+ const reportRoot = config.testsRoot || config.path;
26
+ const raw = JSON.parse((0, fs_1.readFileSync)(args.feedbackInputPath, 'utf-8'));
27
+ const payload = {
28
+ timestamp: raw.timestamp || new Date().toISOString(),
29
+ runSet: raw.runSet || 'targeted',
30
+ recommendedTests: raw.recommendedTests || [],
31
+ executedTests: raw.executedTests || [],
32
+ failedTests: raw.failedTests || [],
33
+ escapedFailures: raw.escapedFailures || [],
34
+ };
35
+ const output = (0, feedback_js_1.appendFeedbackAndRecompute)(reportRoot, payload);
36
+ console.log(`Feedback data: ${output.feedbackPath}`);
37
+ console.log(`Calibration data: ${output.calibrationPath}`);
38
+ console.log(`Calibration overall: precision=${output.calibration.overall.precision}, recall=${output.calibration.overall.recall}, fnr=${output.calibration.overall.falseNegativeRate}`);
39
+ }
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from '../types.js';
2
+ export declare function runFinalizeCommand(args: ParsedArgs, autoConfig: string | undefined): void;
3
+ //# sourceMappingURL=finalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/finalize.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAiCzF"}
@@ -0,0 +1,41 @@
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.runFinalizeCommand = runFinalizeCommand;
6
+ const config_js_1 = require("../../agent/config.js");
7
+ const handoff_js_1 = require("../../agent/handoff.js");
8
+ function runFinalizeCommand(args, autoConfig) {
9
+ if (!args.path && !autoConfig) {
10
+ console.error('Error: --path is required for finalize-generated-tests command');
11
+ process.exit(1);
12
+ }
13
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
14
+ path: args.path,
15
+ profile: args.profile,
16
+ testsRoot: args.testsRoot,
17
+ mode: 'gap',
18
+ llmProvider: args.llmProvider,
19
+ });
20
+ const result = (0, handoff_js_1.finalizeGeneratedTests)({
21
+ appPath: config.path,
22
+ testsRoot: config.testsRoot || config.path,
23
+ branch: args.branch,
24
+ commitMessage: args.commitMessage,
25
+ createPr: args.createPr,
26
+ prTitle: args.prTitle,
27
+ prBody: args.prBody,
28
+ baseBranch: args.prBase,
29
+ dryRun: args.dryRun,
30
+ });
31
+ console.log(`Finalize repo root: ${result.repoRoot}`);
32
+ console.log(`Finalize branch: ${result.branch}`);
33
+ console.log(`Finalize staged paths: ${result.stagedPaths.join(', ') || 'none'}`);
34
+ console.log(`Finalize commit: ${result.committed ? 'created' : 'skipped'}`);
35
+ if (result.commitSha) {
36
+ console.log(`Finalize commit sha: ${result.commitSha}`);
37
+ }
38
+ if (result.prUrl) {
39
+ console.log(`Finalize PR: ${result.prUrl}`);
40
+ }
41
+ }
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from '../types.js';
2
+ export declare function runGateCommand(args: ParsedArgs, autoConfig: string | undefined): Promise<void>;
3
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/gate.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFpG"}
@@ -0,0 +1,89 @@
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.runGateCommand = runGateCommand;
6
+ /**
7
+ * CLI command: gate — CI coverage gate that exits 1 if coverage is below threshold.
8
+ *
9
+ * Runs deterministic impact analysis (no LLM required) and checks what
10
+ * percentage of impacted features have test coverage.
11
+ *
12
+ * Usage:
13
+ * impact-gate gate --threshold 80 --path . --since origin/main
14
+ */
15
+ const config_js_1 = require("../../agent/config.js");
16
+ const git_js_1 = require("../../agent/git.js");
17
+ const impact_engine_js_1 = require("../../engine/impact_engine.js");
18
+ async function runGateCommand(args, autoConfig) {
19
+ if (!args.path && !autoConfig) {
20
+ console.error('Error: --path is required for gate command');
21
+ process.exit(1);
22
+ }
23
+ let threshold = args.gateThreshold ?? 80;
24
+ if (threshold > 0 && threshold < 1) {
25
+ threshold = threshold * 100;
26
+ }
27
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
28
+ path: args.path,
29
+ profile: args.profile,
30
+ testsRoot: args.testsRoot,
31
+ mode: 'impact',
32
+ gitSince: args.gitSince,
33
+ });
34
+ const testsRoot = config.testsRoot || config.path;
35
+ const gitSince = args.gitSince || config.git.since;
36
+ // Get changed files
37
+ const result = await (0, git_js_1.getChangedFiles)(config.path, gitSince);
38
+ const changedFiles = result.files;
39
+ if (changedFiles.length === 0) {
40
+ console.log('No changed files detected. Gate passes.');
41
+ process.exit(0);
42
+ }
43
+ // Run deterministic impact analysis
44
+ const impact = (0, impact_engine_js_1.analyzeImpact)(changedFiles, {
45
+ testsRoot,
46
+ routeFamilies: config.routeFamilies,
47
+ });
48
+ const totalFeatures = impact.impactedFeatures.length;
49
+ if (totalFeatures === 0) {
50
+ console.log('No impacted features detected. Gate passes.');
51
+ process.exit(0);
52
+ }
53
+ const coveredFeatures = impact.impactedFeatures.filter((f) => f.coverageStatus === 'covered' || f.coverageStatus === 'partial').length;
54
+ const coveragePercent = Math.round((coveredFeatures / totalFeatures) * 100);
55
+ // Output
56
+ if (args.jsonOutput) {
57
+ console.log(JSON.stringify({
58
+ threshold,
59
+ coveragePercent,
60
+ totalFeatures,
61
+ coveredFeatures,
62
+ passed: coveragePercent >= threshold,
63
+ uncoveredFeatures: impact.impactedFeatures
64
+ .filter((f) => f.coverageStatus === 'uncovered')
65
+ .map((f) => ({ id: f.featureId || f.familyId, priority: f.priority })),
66
+ }, null, 2));
67
+ }
68
+ else {
69
+ console.log(`Coverage gate: ${coveragePercent}% (${coveredFeatures}/${totalFeatures} features covered)`);
70
+ console.log(`Threshold: ${threshold}%`);
71
+ if (coveragePercent < threshold) {
72
+ console.log(`\nFAILED — coverage ${coveragePercent}% is below ${threshold}% threshold`);
73
+ const uncovered = impact.impactedFeatures.filter((f) => f.coverageStatus === 'uncovered');
74
+ if (uncovered.length > 0) {
75
+ console.log('\nUncovered features:');
76
+ for (const f of uncovered.slice(0, 10)) {
77
+ console.log(` ${f.priority || 'P2'} ${f.featureId || f.familyId}`);
78
+ }
79
+ if (uncovered.length > 10) {
80
+ console.log(` ... and ${uncovered.length - 10} more`);
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ console.log('\nPASSED');
86
+ }
87
+ }
88
+ process.exit(coveragePercent >= threshold ? 0 : 1);
89
+ }
@@ -0,0 +1,4 @@
1
+ import type { resolveConfig } from '../../agent/config.js';
2
+ import type { ParsedArgs } from '../types.js';
3
+ export declare function runGenerateCommand(args: ParsedArgs, config: ReturnType<typeof resolveConfig>['config']): Promise<void>;
4
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAKzD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0G5H"}
@@ -0,0 +1,108 @@
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.runGenerateCommand = runGenerateCommand;
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const provider_factory_js_1 = require("../../provider_factory.js");
9
+ const runner_js_1 = require("../../agentic/runner.js");
10
+ const api_surface_js_1 = require("../../knowledge/api_surface.js");
11
+ async function runGenerateCommand(args, config) {
12
+ const reportRoot = config.testsRoot || config.path;
13
+ // Load scenarios from --scenarios flag or plan-report.json
14
+ let scenarios = [];
15
+ if (args.generateScenarios) {
16
+ let raw;
17
+ if ((0, fs_1.existsSync)(args.generateScenarios)) {
18
+ raw = JSON.parse((0, fs_1.readFileSync)(args.generateScenarios, 'utf-8'));
19
+ }
20
+ else {
21
+ raw = JSON.parse(args.generateScenarios);
22
+ }
23
+ if (!Array.isArray(raw)) {
24
+ console.error('--scenarios must be a JSON array of ScenarioInput objects.');
25
+ process.exit(1);
26
+ }
27
+ for (const item of raw) {
28
+ if (!item.id || !item.name || !Array.isArray(item.scenarios) || !item.routeFamily || !item.priority) {
29
+ console.error(`Invalid scenario: each must have id, name, scenarios[], routeFamily, priority.`);
30
+ process.exit(1);
31
+ }
32
+ }
33
+ scenarios = raw;
34
+ }
35
+ else {
36
+ // Try plan.json first (written by plan/suggest command), then plan-report.json (legacy)
37
+ const planJsonPath = (0, path_1.join)(reportRoot, '.e2e-ai-agents', 'plan.json');
38
+ const planReportPath = (0, path_1.join)(reportRoot, '.e2e-ai-agents', 'plan-report.json');
39
+ const resolvedPlanPath = (0, fs_1.existsSync)(planJsonPath) ? planJsonPath : (0, fs_1.existsSync)(planReportPath) ? planReportPath : null;
40
+ if (!resolvedPlanPath) {
41
+ console.error('No plan report found. Run `plan` first or pass --scenarios.');
42
+ process.exit(1);
43
+ }
44
+ const planReport = JSON.parse((0, fs_1.readFileSync)(resolvedPlanPath, 'utf-8'));
45
+ scenarios = (planReport.gapDetails || []).map((gap) => ({
46
+ id: gap.id,
47
+ name: gap.id,
48
+ scenarios: gap.missingScenarios || gap.reasons || ['Verify core user flow'],
49
+ routeFamily: gap.id.split('.')[0] || gap.id,
50
+ priority: 'P1',
51
+ }));
52
+ }
53
+ if (scenarios.length === 0) {
54
+ console.log('No scenarios to generate tests for.');
55
+ return;
56
+ }
57
+ let apiSurface;
58
+ try {
59
+ apiSurface = (0, api_surface_js_1.loadOrBuildApiSurface)(reportRoot, config.apiSurface);
60
+ }
61
+ catch {
62
+ console.warn('Could not load API surface catalog. Generation will use generic selectors.');
63
+ }
64
+ const provider = await provider_factory_js_1.LLMProviderFactory.createFromPreference(config.llm.provider);
65
+ console.log(`Generating tests for ${scenarios.length} scenario(s)...`);
66
+ const summary = await (0, runner_js_1.runAgenticGeneration)({
67
+ scenarios,
68
+ config: {
69
+ maxAttempts: args.maxAttempts || 3,
70
+ project: args.pipelineProject || 'chrome',
71
+ baseUrl: args.pipelineBaseUrl,
72
+ testTimeoutMs: 120000,
73
+ testsRoot: reportRoot,
74
+ dryRun: args.dryRun,
75
+ },
76
+ provider,
77
+ apiSurface,
78
+ });
79
+ console.log(`\nAgentic Generation Summary:`);
80
+ console.log(` Generated: ${summary.totalGenerated}`);
81
+ console.log(` Passed: ${summary.totalPassed}`);
82
+ console.log(` Failed: ${summary.totalFailed}`);
83
+ console.log(` Attempts: ${summary.totalAttempts}`);
84
+ console.log(` Duration: ${(summary.durationMs / 1000).toFixed(1)}s`);
85
+ for (const result of summary.results) {
86
+ const icon = result.status === 'passed' ? 'PASS' : result.status === 'skipped' ? 'SKIP' : 'FAIL';
87
+ console.log(` [${icon}] ${result.scenarioSource} (${result.attempts} attempts)`);
88
+ if (result.status === 'passed' || result.status === 'skipped') {
89
+ console.log(` ${result.specPath}`);
90
+ }
91
+ }
92
+ if (summary.warnings.length > 0) {
93
+ console.log(`\nWarnings:`);
94
+ for (const w of summary.warnings) {
95
+ console.warn(` - ${w}`);
96
+ }
97
+ }
98
+ const summaryDir = (0, path_1.join)(reportRoot, '.e2e-ai-agents');
99
+ if (!(0, fs_1.existsSync)(summaryDir)) {
100
+ (0, fs_1.mkdirSync)(summaryDir, { recursive: true });
101
+ }
102
+ const summaryPath = (0, path_1.join)(summaryDir, 'agentic-summary.json');
103
+ (0, fs_1.writeFileSync)(summaryPath, JSON.stringify(summary, null, 2), 'utf-8');
104
+ console.log(`\nReport: ${summaryPath}`);
105
+ if (summary.totalFailed > 0) {
106
+ process.exit(1);
107
+ }
108
+ }
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from '../types.js';
2
+ export declare function runHealCommand(args: ParsedArgs, autoConfig: string | undefined): void;
3
+ //# sourceMappingURL=heal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heal.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/heal.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CA0DrF"}
@@ -0,0 +1,60 @@
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.runHealCommand = runHealCommand;
6
+ const config_js_1 = require("../../agent/config.js");
7
+ const pipeline_js_1 = require("../../agent/pipeline.js");
8
+ const playwright_report_js_1 = require("../../agent/playwright_report.js");
9
+ function runHealCommand(args, autoConfig) {
10
+ if (!args.path && !autoConfig) {
11
+ console.error('Error: --path is required for heal command');
12
+ process.exit(1);
13
+ }
14
+ if (!args.traceabilityReportPath) {
15
+ console.error('Error: --traceability-report <path> is required for heal command');
16
+ process.exit(1);
17
+ }
18
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
19
+ path: args.path,
20
+ profile: args.profile,
21
+ testsRoot: args.testsRoot,
22
+ mode: 'gap',
23
+ framework: args.framework,
24
+ pipeline: {
25
+ enabled: true,
26
+ scenarios: args.pipelineScenarios,
27
+ outputDir: args.pipelineOutput,
28
+ baseUrl: args.pipelineBaseUrl,
29
+ browser: args.pipelineBrowser,
30
+ headless: args.pipelineHeadless,
31
+ project: args.pipelineProject,
32
+ parallel: args.pipelineParallel,
33
+ dryRun: args.pipelineDryRun,
34
+ mcp: args.pipelineMcp,
35
+ mcpAllowFallback: args.pipelineMcpAllowFallback,
36
+ mcpOnly: args.pipelineMcpOnly,
37
+ },
38
+ llmProvider: args.llmProvider,
39
+ });
40
+ const reportRoot = config.testsRoot || config.path;
41
+ const unstableSpecs = (0, playwright_report_js_1.extractPlaywrightUnstableSpecs)(args.traceabilityReportPath, [reportRoot, config.path]);
42
+ if (unstableSpecs.length === 0) {
43
+ console.log('Heal targeted unstable specs: 0');
44
+ return;
45
+ }
46
+ const targetedSummary = (0, pipeline_js_1.runTargetedSpecHeal)(reportRoot, unstableSpecs.map((spec) => ({
47
+ specPath: spec.specPath,
48
+ status: spec.status,
49
+ reason: `Playwright report: failingTests=${spec.failingTests}, flakyTests=${spec.flakyTests}`,
50
+ })), {
51
+ ...config.pipeline,
52
+ enabled: true,
53
+ heal: true,
54
+ });
55
+ const healedCount = targetedSummary.results.filter((result) => result.healStatus === 'success').length;
56
+ console.log(`Heal targeted unstable specs: ${unstableSpecs.length} (healed=${healedCount})`);
57
+ if (targetedSummary.warnings.length > 0) {
58
+ console.log(`Heal warnings: ${targetedSummary.warnings.join(' | ')}`);
59
+ }
60
+ }
@@ -0,0 +1,4 @@
1
+ import type { resolveConfig } from '../../agent/config.js';
2
+ import type { ParsedArgs } from '../types.js';
3
+ export declare function runImpactCommand(args: ParsedArgs, config: ReturnType<typeof resolveConfig>['config']): void;
4
+ //# sourceMappingURL=impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/impact.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAIzD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAwB3G"}