@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,152 @@
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.hasGlobChars = hasGlobChars;
6
+ exports.globToRegExp = globToRegExp;
7
+ exports.matchGlob = matchGlob;
8
+ exports.safeReadTextFile = safeReadTextFile;
9
+ exports.normalizePath = normalizePath;
10
+ exports.toRelativePosix = toRelativePosix;
11
+ exports.isPathWithinRoot = isPathWithinRoot;
12
+ exports.fileExtension = fileExtension;
13
+ exports.baseNameWithoutExt = baseNameWithoutExt;
14
+ exports.tokenize = tokenize;
15
+ exports.uniqueTokens = uniqueTokens;
16
+ exports.titleCase = titleCase;
17
+ const fs_1 = require("fs");
18
+ const path_1 = require("path");
19
+ const MAX_READ_BYTES = 1024 * 1024; // 1MB
20
+ const STOP_WORDS = new Set([
21
+ 'index',
22
+ 'component',
23
+ 'components',
24
+ 'page',
25
+ 'pages',
26
+ 'screen',
27
+ 'screens',
28
+ 'view',
29
+ 'views',
30
+ 'route',
31
+ 'routes',
32
+ 'feature',
33
+ 'features',
34
+ 'module',
35
+ 'modules',
36
+ 'flow',
37
+ 'flows',
38
+ 'test',
39
+ 'tests',
40
+ 'spec',
41
+ 'specs',
42
+ 'hooks',
43
+ 'hook',
44
+ 'context',
45
+ 'state',
46
+ 'store',
47
+ ]);
48
+ const GLOB_CHARS = /[*?[\]{}()!]/;
49
+ function hasGlobChars(value) {
50
+ return GLOB_CHARS.test(value);
51
+ }
52
+ function globToRegExp(pattern) {
53
+ const normalized = normalizePath(pattern);
54
+ let regex = '^';
55
+ let i = 0;
56
+ while (i < normalized.length) {
57
+ const char = normalized[i];
58
+ if (char === '*') {
59
+ const next = normalized[i + 1];
60
+ if (next === '*') {
61
+ regex += '.*';
62
+ i += 2;
63
+ continue;
64
+ }
65
+ regex += '[^/]*';
66
+ i += 1;
67
+ continue;
68
+ }
69
+ if (char === '?') {
70
+ regex += '[^/]';
71
+ i += 1;
72
+ continue;
73
+ }
74
+ if ('\\.[]{}()+-^$|'.includes(char)) {
75
+ regex += `\\${char}`;
76
+ }
77
+ else {
78
+ regex += char;
79
+ }
80
+ i += 1;
81
+ }
82
+ regex += '$';
83
+ return new RegExp(regex);
84
+ }
85
+ function matchGlob(pathValue, pattern) {
86
+ const normalizedPath = normalizePath(pathValue);
87
+ const normalizedPattern = normalizePath(pattern);
88
+ if (!hasGlobChars(normalizedPattern)) {
89
+ if (normalizedPattern.endsWith('/')) {
90
+ return normalizedPath.startsWith(normalizedPattern);
91
+ }
92
+ return normalizedPath === normalizedPattern || normalizedPath.startsWith(`${normalizedPattern}/`);
93
+ }
94
+ const regex = globToRegExp(normalizedPattern);
95
+ return regex.test(normalizedPath);
96
+ }
97
+ function safeReadTextFile(path) {
98
+ try {
99
+ const stats = (0, fs_1.statSync)(path);
100
+ if (stats.size > MAX_READ_BYTES) {
101
+ return null;
102
+ }
103
+ return (0, fs_1.readFileSync)(path, 'utf-8');
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ function normalizePath(pathValue) {
110
+ return pathValue.split('\\').join('/');
111
+ }
112
+ function toRelativePosix(root, filePath) {
113
+ const relative = path_1.posix.relative(normalizePath(root), normalizePath(filePath));
114
+ return relative.startsWith('../') ? normalizePath(filePath) : relative;
115
+ }
116
+ function isPathWithinRoot(root, target) {
117
+ const rootAbs = (0, path_1.resolve)(root);
118
+ const targetAbs = (0, path_1.resolve)(target);
119
+ const rel = (0, path_1.relative)(rootAbs, targetAbs);
120
+ return rel === '' || (!rel.startsWith('..') && !rel.includes(`..${path_1.posix.sep}`) && !rel.includes('..\\'));
121
+ }
122
+ function fileExtension(pathValue) {
123
+ return (0, path_1.extname)(pathValue).replace('.', '').toLowerCase();
124
+ }
125
+ function baseNameWithoutExt(pathValue) {
126
+ const base = (0, path_1.basename)(pathValue);
127
+ const ext = (0, path_1.extname)(base);
128
+ return ext ? base.slice(0, -ext.length) : base;
129
+ }
130
+ function splitCamelCase(value) {
131
+ return value.replace(/([a-z])([A-Z])/g, '$1 $2');
132
+ }
133
+ function tokenize(value) {
134
+ const normalized = splitCamelCase(value)
135
+ .replace(/[_\-.]/g, ' ')
136
+ .replace(/[^a-zA-Z0-9\s]/g, ' ')
137
+ .toLowerCase();
138
+ return normalized
139
+ .split(/\s+/)
140
+ .map((token) => token.trim())
141
+ .filter((token) => token.length > 2 && !STOP_WORDS.has(token));
142
+ }
143
+ function uniqueTokens(tokens) {
144
+ return Array.from(new Set(tokens.filter(Boolean)));
145
+ }
146
+ function titleCase(value) {
147
+ return value
148
+ .split(/[\s_-]+/)
149
+ .filter(Boolean)
150
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
151
+ .join(' ');
152
+ }
@@ -0,0 +1,5 @@
1
+ import type { PipelineConfig } from './config.js';
2
+ import type { ValidationResult } from './pipeline_types.js';
3
+ export declare function runPlaywrightRuntimeValidation(testsRoot: string, testFile: string, pipeline: PipelineConfig, playwrightBinary: string | null): ValidationResult;
4
+ export declare function runPlaywrightListValidation(testsRoot: string, testFile: string, pipeline: PipelineConfig, playwrightBinary: string | null): ValidationResult;
5
+ //# sourceMappingURL=validation_runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation_runner.d.ts","sourceRoot":"","sources":["../../src/agent/validation_runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAI1D,wBAAgB,8BAA8B,CAC1C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAChC,gBAAgB,CA+BlB;AAED,wBAAgB,2BAA2B,CACvC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAChC,gBAAgB,CAqClB"}
@@ -0,0 +1,77 @@
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.runPlaywrightRuntimeValidation = runPlaywrightRuntimeValidation;
6
+ exports.runPlaywrightListValidation = runPlaywrightListValidation;
7
+ const path_1 = require("path");
8
+ const utils_js_1 = require("./utils.js");
9
+ const process_runner_js_1 = require("./process_runner.js");
10
+ function runPlaywrightRuntimeValidation(testsRoot, testFile, pipeline, playwrightBinary) {
11
+ if (!playwrightBinary) {
12
+ return {
13
+ status: 'failed',
14
+ detail: 'Playwright binary not found; cannot execute runtime validation.',
15
+ };
16
+ }
17
+ const relativeSpecPath = (0, utils_js_1.normalizePath)((0, path_1.relative)(testsRoot, testFile));
18
+ if (relativeSpecPath.startsWith('../') || relativeSpecPath.startsWith('..\\')) {
19
+ return {
20
+ status: 'failed',
21
+ detail: 'Generated spec path resolved outside testsRoot during runtime validation.',
22
+ };
23
+ }
24
+ const args = ['test', relativeSpecPath, '--workers', '1', '--retries', '0', '--max-failures', '1', '--reporter', 'line'];
25
+ if (pipeline.headless === false) {
26
+ args.push('--headed');
27
+ }
28
+ if (pipeline.project) {
29
+ args.push('--project', pipeline.project);
30
+ }
31
+ const commandResult = (0, process_runner_js_1.runCommand)(playwrightBinary, args, testsRoot, 10 * 60 * 1000);
32
+ if (commandResult.status === 0) {
33
+ return { status: 'passed' };
34
+ }
35
+ const summary = (0, process_runner_js_1.summarizeCommandOutput)(commandResult.stdout, commandResult.stderr);
36
+ return {
37
+ status: 'failed',
38
+ detail: summary || commandResult.error || `playwright test failed with status ${commandResult.status}`,
39
+ };
40
+ }
41
+ function runPlaywrightListValidation(testsRoot, testFile, pipeline, playwrightBinary) {
42
+ if (!playwrightBinary) {
43
+ return {
44
+ status: 'skipped',
45
+ detail: 'Playwright binary not found under testsRoot/node_modules/.bin; runtime compile validation skipped.',
46
+ };
47
+ }
48
+ const relativeSpecPath = (0, utils_js_1.normalizePath)((0, path_1.relative)(testsRoot, testFile));
49
+ if (relativeSpecPath.startsWith('../') || relativeSpecPath.startsWith('..\\')) {
50
+ return {
51
+ status: 'failed',
52
+ detail: 'Generated spec path resolved outside testsRoot during validation.',
53
+ };
54
+ }
55
+ const args = ['test', '--list', relativeSpecPath];
56
+ if (pipeline.headless === false) {
57
+ args.push('--headed');
58
+ }
59
+ if (pipeline.project) {
60
+ args.push('--project', pipeline.project);
61
+ }
62
+ const commandResult = (0, process_runner_js_1.runCommand)(playwrightBinary, args, testsRoot);
63
+ if (commandResult.error && /ENOENT/.test(commandResult.error)) {
64
+ return {
65
+ status: 'skipped',
66
+ detail: 'Playwright binary was not executable; runtime compile validation skipped.',
67
+ };
68
+ }
69
+ if (commandResult.status === 0) {
70
+ return { status: 'passed' };
71
+ }
72
+ const summary = (0, process_runner_js_1.summarizeCommandOutput)(commandResult.stdout, commandResult.stderr);
73
+ return {
74
+ status: 'failed',
75
+ detail: summary || commandResult.error || `playwright --list failed with status ${commandResult.status}`,
76
+ };
77
+ }
@@ -0,0 +1,26 @@
1
+ import type { LLMProvider } from '../provider_interface.js';
2
+ import type { TestFailure } from './types.js';
3
+ export interface FixPromptContext {
4
+ specCode: string;
5
+ failures: TestFailure[];
6
+ attempt: number;
7
+ maxAttempts: number;
8
+ apiSurfaceHint?: string;
9
+ }
10
+ export declare function buildFixPrompt(ctx: FixPromptContext): string;
11
+ /**
12
+ * Extract fixed spec code from an LLM response.
13
+ * Returns null if the response doesn't contain valid test code.
14
+ */
15
+ export declare function applyFix(llmResponse: string): string | null;
16
+ /**
17
+ * Run one fix attempt: call LLM with failure context, return fixed code.
18
+ */
19
+ export declare function generateFix(provider: LLMProvider, ctx: FixPromptContext): Promise<{
20
+ code: string | null;
21
+ tokensUsed: {
22
+ input: number;
23
+ output: number;
24
+ };
25
+ }>;
26
+ //# sourceMappingURL=fix_loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix_loop.d.ts","sourceRoot":"","sources":["../../src/agentic/fix_loop.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CA+C5D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB3D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,gBAAgB,GACtB,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAA;CAAC,CAAC,CAe7E"}
@@ -0,0 +1,96 @@
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.buildFixPrompt = buildFixPrompt;
6
+ exports.applyFix = applyFix;
7
+ exports.generateFix = generateFix;
8
+ const sanitize_js_1 = require("../crew/sanitize.js");
9
+ function buildFixPrompt(ctx) {
10
+ const isCompileError = ctx.failures.some((f) => f.testTitle === '(compile)');
11
+ const failuresBlock = ctx.failures.map((f) => {
12
+ const lines = [` Test: ${(0, sanitize_js_1.sanitizeForPrompt)(f.testTitle)}`, ` Error: ${(0, sanitize_js_1.sanitizeForPrompt)(f.error)}`];
13
+ if (f.stack)
14
+ lines.push(` Stack: ${(0, sanitize_js_1.sanitizeForPrompt)(f.stack)}`);
15
+ if (f.line)
16
+ lines.push(` Line: ${f.line}`);
17
+ if (f.expected)
18
+ lines.push(` Expected: ${(0, sanitize_js_1.sanitizeForPrompt)(f.expected)}`);
19
+ if (f.actual)
20
+ lines.push(` Actual: ${(0, sanitize_js_1.sanitizeForPrompt)(f.actual)}`);
21
+ return lines.join('\n');
22
+ }).join('\n\n');
23
+ const errorType = isCompileError ? 'COMPILE ERROR' : 'TEST FAILURE';
24
+ const apiBlock = ctx.apiSurfaceHint
25
+ ? `\nAVAILABLE PAGE OBJECT API:\n${ctx.apiSurfaceHint}\n`
26
+ : '';
27
+ return [
28
+ `Fix this Playwright E2E test. This is attempt ${ctx.attempt} of ${ctx.maxAttempts}.`,
29
+ '',
30
+ `## ${errorType}`,
31
+ '',
32
+ failuresBlock,
33
+ '',
34
+ '## CURRENT SPEC CODE',
35
+ '',
36
+ '```typescript',
37
+ ctx.specCode,
38
+ '```',
39
+ apiBlock,
40
+ '## RULES',
41
+ '',
42
+ '1. Import ONLY from "@mattermost/playwright-lib" — no "@playwright/test" imports.',
43
+ '2. Every test must call `await pw.initSetup()` first.',
44
+ '3. Use `await pw.testBrowser.login(user)` to log in.',
45
+ '4. Use ONLY page object methods listed in the API above. Do NOT invent methods.',
46
+ '5. If a method is not available, use `page.getByRole()` or `page.getByTestId()`.',
47
+ '6. For flaky/timing issues: add `await expect(locator).toBeVisible()` waits before interactions.',
48
+ '7. Keep the same test scenarios — fix the implementation, not the intent.',
49
+ '8. Return the COMPLETE fixed spec file — not a diff or partial code.',
50
+ '',
51
+ isCompileError
52
+ ? 'The file does not compile. Fix syntax errors, missing imports, or invalid method calls.'
53
+ : 'The test compiles but fails at runtime. Fix selectors, waits, or assertion logic.',
54
+ '',
55
+ 'Return ONLY the complete TypeScript code. No explanations, no markdown fences (except wrapping the code).',
56
+ ].join('\n');
57
+ }
58
+ /**
59
+ * Extract fixed spec code from an LLM response.
60
+ * Returns null if the response doesn't contain valid test code.
61
+ */
62
+ function applyFix(llmResponse) {
63
+ let code = llmResponse.trim();
64
+ if (!code)
65
+ return null;
66
+ // Strip markdown fences
67
+ const fenced = code.match(/```(?:typescript|ts)?\s*([\s\S]*?)```/i);
68
+ if (fenced) {
69
+ code = fenced[1].trim();
70
+ }
71
+ // Must contain test( to be valid
72
+ if (!code.includes('test('))
73
+ return null;
74
+ // Ensure it has the right import
75
+ if (!code.includes('@mattermost/playwright-lib')) {
76
+ code = `import {expect, test} from '@mattermost/playwright-lib';\n\n${code}`;
77
+ }
78
+ return code;
79
+ }
80
+ /**
81
+ * Run one fix attempt: call LLM with failure context, return fixed code.
82
+ */
83
+ async function generateFix(provider, ctx) {
84
+ const prompt = buildFixPrompt(ctx);
85
+ const response = await provider.generateText(prompt, {
86
+ maxTokens: 8000,
87
+ temperature: 0.1,
88
+ timeout: 60000,
89
+ systemPrompt: 'You are an expert Playwright test fixer for Mattermost. Return only TypeScript code.',
90
+ });
91
+ const code = applyFix(response.text);
92
+ return {
93
+ code,
94
+ tokensUsed: { input: response.usage?.inputTokens || 0, output: response.usage?.outputTokens || 0 },
95
+ };
96
+ }
@@ -0,0 +1,43 @@
1
+ import type { PlaywrightRunResult } from './types.js';
2
+ interface PlaywrightReportSpec {
3
+ title: string;
4
+ ok: boolean;
5
+ tests: Array<{
6
+ status: string;
7
+ results: Array<{
8
+ status: string;
9
+ duration: number;
10
+ error?: {
11
+ message: string;
12
+ stack?: string;
13
+ };
14
+ }>;
15
+ }>;
16
+ }
17
+ interface PlaywrightReportSuite {
18
+ title: string;
19
+ specs: PlaywrightReportSpec[];
20
+ suites?: PlaywrightReportSuite[];
21
+ }
22
+ interface PlaywrightReport {
23
+ suites: PlaywrightReportSuite[];
24
+ stats: {
25
+ expected: number;
26
+ unexpected: number;
27
+ flaky: number;
28
+ skipped: number;
29
+ duration: number;
30
+ };
31
+ }
32
+ export declare function parsePlaywrightJsonReport(report: PlaywrightReport, specPath: string): PlaywrightRunResult;
33
+ /**
34
+ * Run a single Playwright spec file and return structured results.
35
+ * Uses a temp JSON reporter to get machine-readable output.
36
+ */
37
+ export declare function runPlaywrightSpec(specPath: string, testsRoot: string, options: {
38
+ project?: string;
39
+ baseUrl?: string;
40
+ timeoutMs?: number;
41
+ }): PlaywrightRunResult;
42
+ export {};
43
+ //# sourceMappingURL=playwright_runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright_runner.d.ts","sourceRoot":"","sources":["../../src/agentic/playwright_runner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,mBAAmB,EAAc,MAAM,YAAY,CAAC;AAMjE,UAAU,oBAAoB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,KAAK,CAAC;YACX,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE;gBAAC,OAAO,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAC,CAAC;SAC7C,CAAC,CAAC;KACN,CAAC,CAAC;CACN;AAED,UAAU,qBAAqB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACpC;AAED,UAAU,gBAAgB;IACtB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,KAAK,EAAE;QACH,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;CACL;AAaD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAkCzG;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,GAClE,mBAAmB,CAsGrB"}
@@ -0,0 +1,165 @@
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.parsePlaywrightJsonReport = parsePlaywrightJsonReport;
6
+ exports.runPlaywrightSpec = runPlaywrightSpec;
7
+ const child_process_1 = require("child_process");
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const MAX_STDOUT_CHARS = 8000;
11
+ const MAX_ERROR_CHARS = 2000;
12
+ const MAX_STACK_CHARS = 1000;
13
+ function extractSpecs(suites) {
14
+ const specs = [];
15
+ for (const suite of suites) {
16
+ specs.push(...suite.specs);
17
+ if (suite.suites) {
18
+ specs.push(...extractSpecs(suite.suites));
19
+ }
20
+ }
21
+ return specs;
22
+ }
23
+ function parsePlaywrightJsonReport(report, specPath) {
24
+ const failures = [];
25
+ const allSpecs = extractSpecs(report.suites);
26
+ let passed = 0;
27
+ let failed = 0;
28
+ for (const spec of allSpecs) {
29
+ if (spec.ok) {
30
+ passed++;
31
+ }
32
+ else {
33
+ failed++;
34
+ const lastResult = spec.tests[0]?.results?.at(-1);
35
+ failures.push({
36
+ testTitle: spec.title,
37
+ specPath,
38
+ error: (lastResult?.error?.message || 'Unknown error').slice(0, MAX_ERROR_CHARS),
39
+ stack: (lastResult?.error?.stack || '').slice(0, MAX_STACK_CHARS),
40
+ line: extractLineNumber(lastResult?.error?.stack),
41
+ });
42
+ }
43
+ }
44
+ return {
45
+ specPath,
46
+ passed,
47
+ failed,
48
+ flaky: report.stats.flaky || 0,
49
+ skipped: report.stats.skipped || 0,
50
+ failures,
51
+ stdout: '',
52
+ durationMs: report.stats.duration || 0,
53
+ compiled: true,
54
+ };
55
+ }
56
+ function extractLineNumber(stack) {
57
+ if (!stack)
58
+ return undefined;
59
+ const match = stack.match(/:(\d+):\d+\)?$/m);
60
+ return match ? parseInt(match[1], 10) : undefined;
61
+ }
62
+ /**
63
+ * Run a single Playwright spec file and return structured results.
64
+ * Uses a temp JSON reporter to get machine-readable output.
65
+ */
66
+ function runPlaywrightSpec(specPath, testsRoot, options) {
67
+ // SECURITY: Validate spec path is within testsRoot and has valid extension
68
+ const resolvedSpec = (0, path_1.resolve)(specPath);
69
+ const resolvedRoot = (0, path_1.resolve)(testsRoot);
70
+ if (!resolvedSpec.startsWith(resolvedRoot + '/')) {
71
+ throw new Error(`Security: spec path ${specPath} is outside testsRoot`);
72
+ }
73
+ if (!resolvedSpec.endsWith('.spec.ts') && !resolvedSpec.endsWith('.test.ts')) {
74
+ throw new Error(`Security: spec path must end in .spec.ts or .test.ts`);
75
+ }
76
+ const reportDir = (0, path_1.join)(testsRoot, '.e2e-ai-agents', 'agentic-reports');
77
+ if (!(0, fs_1.existsSync)(reportDir)) {
78
+ (0, fs_1.mkdirSync)(reportDir, { recursive: true });
79
+ }
80
+ const reportPath = (0, path_1.join)(reportDir, `report-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.json`);
81
+ const args = [
82
+ 'playwright', 'test',
83
+ specPath,
84
+ '--reporter', 'json',
85
+ '--project', options.project || 'chrome',
86
+ ];
87
+ if (options.baseUrl) {
88
+ args.push('--config', 'playwright.config.ts');
89
+ }
90
+ const startTime = Date.now();
91
+ const result = (0, child_process_1.spawnSync)('npx', args, {
92
+ cwd: testsRoot,
93
+ encoding: 'utf-8',
94
+ timeout: options.timeoutMs || 120000,
95
+ maxBuffer: 2 * 1024 * 1024,
96
+ env: {
97
+ ...process.env,
98
+ PLAYWRIGHT_JSON_OUTPUT_NAME: reportPath,
99
+ },
100
+ });
101
+ const durationMs = Date.now() - startTime;
102
+ const stdout = (result.stdout || '').slice(0, MAX_STDOUT_CHARS);
103
+ const stderr = (result.stderr || '').slice(0, MAX_STDOUT_CHARS);
104
+ // Check for compile errors
105
+ if (stderr.includes('SyntaxError') || stderr.includes('Cannot find module') || stderr.includes('TypeError')) {
106
+ return {
107
+ specPath,
108
+ passed: 0,
109
+ failed: 1,
110
+ flaky: 0,
111
+ skipped: 0,
112
+ failures: [{
113
+ testTitle: '(compile)',
114
+ specPath,
115
+ error: stderr.slice(0, MAX_ERROR_CHARS),
116
+ stack: '',
117
+ }],
118
+ stdout: `${stdout}\n${stderr}`,
119
+ durationMs,
120
+ compiled: false,
121
+ };
122
+ }
123
+ // Try to parse JSON report from stdout (Playwright JSON reporter writes to stdout)
124
+ try {
125
+ const jsonReport = JSON.parse(stdout);
126
+ const parsed = parsePlaywrightJsonReport(jsonReport, specPath);
127
+ parsed.durationMs = durationMs;
128
+ parsed.stdout = stdout;
129
+ return parsed;
130
+ }
131
+ catch {
132
+ // Fallback: try the file-based report
133
+ }
134
+ // Try file-based report
135
+ if ((0, fs_1.existsSync)(reportPath)) {
136
+ try {
137
+ const jsonReport = JSON.parse((0, fs_1.readFileSync)(reportPath, 'utf-8'));
138
+ const parsed = parsePlaywrightJsonReport(jsonReport, specPath);
139
+ parsed.durationMs = durationMs;
140
+ parsed.stdout = stdout;
141
+ try {
142
+ (0, fs_1.rmSync)(reportPath);
143
+ }
144
+ catch { /* ignore */ }
145
+ return parsed;
146
+ }
147
+ catch {
148
+ // Fallback to exit code
149
+ }
150
+ }
151
+ // Last resort: use exit code
152
+ return {
153
+ specPath,
154
+ passed: result.status === 0 ? 1 : 0,
155
+ failed: result.status === 0 ? 0 : 1,
156
+ flaky: 0,
157
+ skipped: 0,
158
+ failures: result.status !== 0
159
+ ? [{ testTitle: '(unknown)', specPath, error: stderr.slice(0, MAX_ERROR_CHARS), stack: '' }]
160
+ : [],
161
+ stdout,
162
+ durationMs,
163
+ compiled: !stderr.includes('Error'),
164
+ };
165
+ }
@@ -0,0 +1,27 @@
1
+ import type { LLMProvider } from '../provider_interface.js';
2
+ import type { AgenticConfig, AgenticSummary } from './types.js';
3
+ import type { ApiSurfaceCatalog } from '../knowledge/api_surface.js';
4
+ import type { GenerationProfile } from '../prompts/generation_profile.js';
5
+ export interface ScenarioInput {
6
+ id: string;
7
+ name: string;
8
+ scenarios: string[];
9
+ routeFamily: string;
10
+ priority: string;
11
+ /** Existing spec to add scenarios to */
12
+ targetSpec?: string;
13
+ /** Changed files for context */
14
+ changedFiles?: string[];
15
+ /** Evidence from impact analysis */
16
+ evidence?: string;
17
+ }
18
+ export interface AgenticRunOptions {
19
+ scenarios: ScenarioInput[];
20
+ config: AgenticConfig;
21
+ provider: LLMProvider;
22
+ apiSurfaceHint?: string;
23
+ apiSurface?: ApiSurfaceCatalog;
24
+ generationProfile?: GenerationProfile;
25
+ }
26
+ export declare function runAgenticGeneration(options: AgenticRunOptions): Promise<AgenticSummary>;
27
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agentic/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAC,aAAa,EAAiB,cAAc,EAAsB,MAAM,YAAY,CAAC;AAKlG,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAC;AAGxE,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACzC;AAwMD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwB9F"}