@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,629 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
4
+ // See LICENSE.txt for license information.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.E2EAgentsMCPServer = void 0;
7
+ exports.encodeJsonRpcMessage = encodeJsonRpcMessage;
8
+ exports.parseJsonRpcFrames = parseJsonRpcFrames;
9
+ exports.handleJsonRpcMessage = handleJsonRpcMessage;
10
+ exports.startStdioServer = startStdioServer;
11
+ /**
12
+ * MCP Server for Impact Gate - SECURITY HARDENED
13
+ * Exposes tools for Claude and Playwright agents to discover, generate, and heal tests
14
+ */
15
+ const child_process_1 = require("child_process");
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ const glob_1 = require("glob");
19
+ /**
20
+ * SECURITY: Path validation helper
21
+ * Prevents directory traversal attacks
22
+ */
23
+ function validatePathIsWithinRoot(filePath, rootPath) {
24
+ try {
25
+ const normalized = (0, path_1.resolve)(filePath);
26
+ const normalizedRoot = (0, path_1.resolve)(rootPath);
27
+ return normalized.startsWith(normalizedRoot + '/') || normalized === normalizedRoot;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * SECURITY: Input validation for shell arguments
35
+ * Prevents command injection attacks
36
+ */
37
+ function validatePlaywrightPattern(pattern) {
38
+ // Allow alphanumeric, dots, dashes, slashes, asterisks, underscores only
39
+ return /^[a-zA-Z0-9_\-.*\/]+$/.test(pattern) && !pattern.includes('..') && pattern.length < 512;
40
+ }
41
+ /**
42
+ * SECURITY: Validate git refs to prevent argument injection
43
+ */
44
+ function validateGitRef(ref) {
45
+ // Allow standard git ref patterns: branches, tags, commit hashes
46
+ // Blocks patterns that start with -- (options) or contain spaces
47
+ return (/^[a-zA-Z0-9_\-./~^]+$/.test(ref) &&
48
+ !ref.startsWith('--') &&
49
+ ref.length < 256 &&
50
+ !ref.includes('\n') &&
51
+ !ref.includes('\0'));
52
+ }
53
+ /**
54
+ * SECURITY: Validate browser names against allowlist
55
+ */
56
+ function validateBrowsers(browsers) {
57
+ const allowedBrowsers = new Set(['chromium', 'firefox', 'webkit']);
58
+ return browsers.length > 0 && browsers.length <= 3 && browsers.every((b) => allowedBrowsers.has(b));
59
+ }
60
+ /**
61
+ * SECURITY: Glob pattern validation
62
+ * Restricts to test-related patterns to prevent enumeration of sensitive files
63
+ */
64
+ function validateGlobPattern(pattern) {
65
+ // Block attempts to enumerate sensitive patterns
66
+ const blockedPatterns = [/\*\*\/\*\*/, /\.env/, /\.pem/, /\.key/, /aws|credentials|secret|password/i];
67
+ if (pattern.length > 256)
68
+ return false;
69
+ if (blockedPatterns.some((p) => p.test(pattern)))
70
+ return false;
71
+ if (pattern.includes('..'))
72
+ return false;
73
+ return /^[a-zA-Z0-9_\-.*\/]+$/.test(pattern);
74
+ }
75
+ /**
76
+ * SECURITY: Sanitize error messages to prevent information leakage
77
+ */
78
+ function sanitizeError(error, operation) {
79
+ if (error instanceof Error) {
80
+ // Only return safe error message, hide internal details
81
+ if (error.message.includes('ENOENT')) {
82
+ return `File not found (${operation})`;
83
+ }
84
+ if (error.message.includes('EACCES')) {
85
+ return `Permission denied (${operation})`;
86
+ }
87
+ if (error.message.includes('EISDIR')) {
88
+ return `Is a directory (${operation})`;
89
+ }
90
+ return `Operation failed: ${operation}`;
91
+ }
92
+ return 'An unexpected error occurred';
93
+ }
94
+ /**
95
+ * SECURITY: Rate limiter helper
96
+ */
97
+ class RateLimiter {
98
+ constructor(maxRequests = 100, windowMs = 60000) {
99
+ this.requests = [];
100
+ this.maxRequests = maxRequests;
101
+ this.windowMs = windowMs;
102
+ }
103
+ isAllowed() {
104
+ const now = Date.now();
105
+ this.requests = this.requests.filter((time) => now - time < this.windowMs);
106
+ if (this.requests.length >= this.maxRequests) {
107
+ return false;
108
+ }
109
+ this.requests.push(now);
110
+ return true;
111
+ }
112
+ }
113
+ /**
114
+ * MCP Server for autonomous test discovery, generation, and healing
115
+ * Provides tools for Claude to interact with test framework
116
+ */
117
+ class E2EAgentsMCPServer {
118
+ constructor(repoRoot = process.cwd()) {
119
+ this.repoRoot = repoRoot;
120
+ this.tools = this.defineTools();
121
+ this.rateLimiter = new RateLimiter(100, 60000); // 100 requests per minute
122
+ }
123
+ defineTools() {
124
+ return [
125
+ {
126
+ name: 'discover_tests',
127
+ description: 'Discover tests that need to be written based on code changes',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ since: {
132
+ type: 'string',
133
+ description: 'Git ref to compare against (e.g., HEAD~5, main)',
134
+ },
135
+ pattern: {
136
+ type: 'string',
137
+ description: "Test file pattern to search (e.g., '**/*.spec.ts')",
138
+ },
139
+ },
140
+ },
141
+ },
142
+ {
143
+ name: 'read_file',
144
+ description: 'Read a file from the repository',
145
+ inputSchema: {
146
+ type: 'object',
147
+ properties: {
148
+ path: {
149
+ type: 'string',
150
+ description: 'File path relative to repo root',
151
+ },
152
+ },
153
+ required: ['path'],
154
+ },
155
+ },
156
+ {
157
+ name: 'write_file',
158
+ description: 'Write or create a file in the repository',
159
+ inputSchema: {
160
+ type: 'object',
161
+ properties: {
162
+ path: {
163
+ type: 'string',
164
+ description: 'File path relative to repo root',
165
+ },
166
+ content: {
167
+ type: 'string',
168
+ description: 'File content to write',
169
+ },
170
+ },
171
+ required: ['path', 'content'],
172
+ },
173
+ },
174
+ {
175
+ name: 'run_tests',
176
+ description: 'Run Playwright tests matching a pattern',
177
+ inputSchema: {
178
+ type: 'object',
179
+ properties: {
180
+ pattern: {
181
+ type: 'string',
182
+ description: "Test file pattern (e.g., 'tests/**/*.spec.ts')",
183
+ },
184
+ browsers: {
185
+ type: 'array',
186
+ items: { type: 'string' },
187
+ description: 'Browsers to test (chromium, firefox, webkit)',
188
+ },
189
+ },
190
+ },
191
+ },
192
+ {
193
+ name: 'get_git_changes',
194
+ description: 'Get files changed since a git reference',
195
+ inputSchema: {
196
+ type: 'object',
197
+ properties: {
198
+ since: {
199
+ type: 'string',
200
+ description: 'Git ref to compare against (e.g., HEAD~5, main)',
201
+ },
202
+ },
203
+ },
204
+ },
205
+ {
206
+ name: 'get_repository_context',
207
+ description: 'Get repository structure and project metadata',
208
+ inputSchema: {
209
+ type: 'object',
210
+ properties: {
211
+ include: {
212
+ type: 'array',
213
+ items: { type: 'string' },
214
+ description: 'What to include (package.json, tsconfig, playwright.config, tests)',
215
+ },
216
+ },
217
+ },
218
+ },
219
+ ];
220
+ }
221
+ /**
222
+ * Handle tool calls from Claude/Playwright agents
223
+ * SECURITY: Rate limiting enforced
224
+ */
225
+ async callTool(name, args) {
226
+ // SECURITY: Rate limiting
227
+ if (!this.rateLimiter.isAllowed()) {
228
+ return JSON.stringify({ error: 'Rate limit exceeded. Too many requests.' });
229
+ }
230
+ switch (name) {
231
+ case 'discover_tests':
232
+ return this.discoverTests(args);
233
+ case 'read_file':
234
+ return this.readFile(args);
235
+ case 'write_file':
236
+ return this.writeFile(args);
237
+ case 'run_tests':
238
+ return this.runTests(args);
239
+ case 'get_git_changes':
240
+ return this.getGitChanges(args);
241
+ case 'get_repository_context':
242
+ return this.getRepositoryContext(args);
243
+ default:
244
+ return JSON.stringify({ error: 'Unknown tool' });
245
+ }
246
+ }
247
+ discoverTests(args) {
248
+ try {
249
+ const since = args.since || 'HEAD~5';
250
+ const pattern = args.pattern || '**/*.spec.ts';
251
+ // SECURITY: Validate inputs
252
+ if (!validateGitRef(since)) {
253
+ return JSON.stringify({ error: 'Invalid git reference format' });
254
+ }
255
+ if (!validateGlobPattern(pattern)) {
256
+ return JSON.stringify({ error: 'Invalid pattern format' });
257
+ }
258
+ // Get changed files
259
+ const changedFiles = this.getChangedFiles(since);
260
+ // Find test files that might need updating
261
+ const testFiles = (0, glob_1.globSync)(pattern, { cwd: this.repoRoot });
262
+ return JSON.stringify({
263
+ changedFiles,
264
+ existingTests: testFiles,
265
+ recommendedTests: this.analyzeChangesForTests(changedFiles, testFiles),
266
+ });
267
+ }
268
+ catch (error) {
269
+ return JSON.stringify({ error: sanitizeError(error, 'discover_tests') });
270
+ }
271
+ }
272
+ readFile(args) {
273
+ try {
274
+ // SECURITY: Path traversal prevention
275
+ const filePath = (0, path_1.resolve)(this.repoRoot, args.path);
276
+ if (!validatePathIsWithinRoot(filePath, this.repoRoot)) {
277
+ return JSON.stringify({ error: 'Access denied' });
278
+ }
279
+ if (!(0, fs_1.existsSync)(filePath)) {
280
+ return JSON.stringify({ error: 'File not found' });
281
+ }
282
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
283
+ return JSON.stringify({ path: args.path, content });
284
+ }
285
+ catch (error) {
286
+ return JSON.stringify({ error: sanitizeError(error, 'read_file') });
287
+ }
288
+ }
289
+ writeFile(args) {
290
+ try {
291
+ // SECURITY: Path traversal prevention
292
+ const filePath = (0, path_1.resolve)(this.repoRoot, args.path);
293
+ if (!validatePathIsWithinRoot(filePath, this.repoRoot)) {
294
+ return JSON.stringify({ error: 'Access denied' });
295
+ }
296
+ // SECURITY: Symlink resolution — resolve the real path to prevent symlink escape.
297
+ // Only check if the parent directory exists (file itself may not exist yet).
298
+ const parentDir = (0, path_1.resolve)(filePath, '..');
299
+ if ((0, fs_1.existsSync)(parentDir)) {
300
+ const realParent = (0, fs_1.realpathSync)(parentDir);
301
+ if (!validatePathIsWithinRoot(realParent, this.repoRoot)) {
302
+ return JSON.stringify({ error: 'Access denied' });
303
+ }
304
+ }
305
+ // SECURITY: Restrict writes to test-related paths only.
306
+ // Allowed: specs/, .e2e-ai-agents/, and files matching *.spec.ts / *.test.ts
307
+ const relPath = args.path.replace(/\\/g, '/');
308
+ const isTestSpec = /\.(spec|test)\.(ts|js|tsx|jsx)$/.test(relPath);
309
+ const isAllowedDir = relPath.startsWith('specs/') || relPath.startsWith('.e2e-ai-agents/');
310
+ if (!isTestSpec && !isAllowedDir) {
311
+ return JSON.stringify({ error: 'Access denied: writes restricted to test specs and .e2e-ai-agents/' });
312
+ }
313
+ // SECURITY: Size limit to prevent resource exhaustion
314
+ if (args.content.length > 10 * 1024 * 1024) {
315
+ // 10MB limit
316
+ return JSON.stringify({ error: 'File too large' });
317
+ }
318
+ (0, fs_1.writeFileSync)(filePath, args.content, 'utf-8');
319
+ return JSON.stringify({ success: true, path: args.path });
320
+ }
321
+ catch (error) {
322
+ return JSON.stringify({ error: sanitizeError(error, 'write_file') });
323
+ }
324
+ }
325
+ runTests(args) {
326
+ try {
327
+ const pattern = args.pattern || '**/*.spec.ts';
328
+ const browsers = args.browsers || ['chromium'];
329
+ // SECURITY: Validate inputs
330
+ if (!validatePlaywrightPattern(pattern)) {
331
+ return JSON.stringify({ error: 'Invalid test pattern' });
332
+ }
333
+ if (!validateBrowsers(browsers)) {
334
+ return JSON.stringify({ error: 'Invalid browser specification' });
335
+ }
336
+ const projectArgs = browsers.flatMap((browser) => ['--project', browser]);
337
+ // SECURITY: Use -- to separate playwright options from test args
338
+ const result = (0, child_process_1.spawnSync)('npx', [
339
+ 'playwright',
340
+ 'test',
341
+ ...projectArgs,
342
+ '--',
343
+ pattern,
344
+ ], {
345
+ cwd: this.repoRoot,
346
+ encoding: 'utf-8',
347
+ timeout: 300000, // 5 minute timeout
348
+ maxBuffer: 1024 * 1024, // 1MB output limit
349
+ });
350
+ if (result.error) {
351
+ return JSON.stringify({
352
+ success: false,
353
+ error: 'Test execution failed',
354
+ });
355
+ }
356
+ // SECURITY: Don't leak full stdout/stderr, summarize instead
357
+ const stdout = result.stdout ? result.stdout.substring(0, 5000) : '';
358
+ const stderr = result.stderr ? result.stderr.substring(0, 5000) : '';
359
+ return JSON.stringify({
360
+ success: result.status === 0,
361
+ summary: `Exit code: ${result.status}`,
362
+ testsPassed: stdout.includes('passed'),
363
+ testsFailed: stdout.includes('failed'),
364
+ });
365
+ }
366
+ catch (error) {
367
+ return JSON.stringify({
368
+ success: false,
369
+ error: 'Test execution error',
370
+ });
371
+ }
372
+ }
373
+ getGitChanges(args) {
374
+ try {
375
+ const since = args.since || 'HEAD~5';
376
+ // SECURITY: Validate git ref
377
+ if (!validateGitRef(since)) {
378
+ return JSON.stringify({ error: 'Invalid git reference format' });
379
+ }
380
+ const result = (0, child_process_1.spawnSync)('git', ['diff', '--name-only', `${since}..HEAD`], {
381
+ cwd: this.repoRoot,
382
+ encoding: 'utf-8',
383
+ timeout: 30000,
384
+ });
385
+ if (result.error) {
386
+ return JSON.stringify({ error: 'Git operation failed' });
387
+ }
388
+ const changedFiles = result.stdout.trim().split('\n').filter((f) => f);
389
+ return JSON.stringify({ changedFiles });
390
+ }
391
+ catch (error) {
392
+ return JSON.stringify({ error: 'Git operation error' });
393
+ }
394
+ }
395
+ getRepositoryContext(args) {
396
+ try {
397
+ const defaultInclude = ['package.json', 'tsconfig.json', 'playwright.config.ts', 'playwright.config.js'];
398
+ const include = args.include || defaultInclude;
399
+ // SECURITY: Limit to allowed filenames
400
+ const allowedFiles = new Set([
401
+ 'package.json',
402
+ 'tsconfig.json',
403
+ 'tsconfig.base.json',
404
+ 'playwright.config.ts',
405
+ 'playwright.config.js',
406
+ 'jest.config.js',
407
+ '.npmrc',
408
+ 'README.md',
409
+ ]);
410
+ const context = {};
411
+ for (const file of include) {
412
+ // SECURITY: Validate each path
413
+ if (!allowedFiles.has(file)) {
414
+ continue; // Skip non-allowed files
415
+ }
416
+ const filePath = (0, path_1.resolve)(this.repoRoot, file);
417
+ if (!validatePathIsWithinRoot(filePath, this.repoRoot)) {
418
+ continue;
419
+ }
420
+ if ((0, fs_1.existsSync)(filePath)) {
421
+ try {
422
+ context[file] = (0, fs_1.readFileSync)(filePath, 'utf-8');
423
+ }
424
+ catch {
425
+ // Ignore read errors for individual files
426
+ }
427
+ }
428
+ }
429
+ // Add test structure with safe globbing
430
+ const testFiles = (0, glob_1.globSync)('**/*.spec.ts', {
431
+ cwd: this.repoRoot,
432
+ ignore: 'node_modules/**',
433
+ maxDepth: 5,
434
+ });
435
+ context.testFiles = testFiles.slice(0, 100); // Limit to 100 files
436
+ return JSON.stringify(context);
437
+ }
438
+ catch (error) {
439
+ return JSON.stringify({ error: sanitizeError(error, 'get_repository_context') });
440
+ }
441
+ }
442
+ getChangedFiles(since) {
443
+ try {
444
+ // SECURITY: Validate git ref before use
445
+ if (!validateGitRef(since)) {
446
+ return [];
447
+ }
448
+ const result = (0, child_process_1.spawnSync)('git', ['diff', '--name-only', `${since}..HEAD`], {
449
+ cwd: this.repoRoot,
450
+ encoding: 'utf-8',
451
+ timeout: 30000,
452
+ });
453
+ if (result.error) {
454
+ return [];
455
+ }
456
+ return result.stdout.trim().split('\n').filter((f) => f);
457
+ }
458
+ catch {
459
+ return [];
460
+ }
461
+ }
462
+ analyzeChangesForTests(changedFiles, existingTests) {
463
+ // Simple heuristic: if a source file changed, suggest a test for it
464
+ return changedFiles
465
+ .filter((f) => !f.endsWith('.spec.ts') && !f.endsWith('.test.ts'))
466
+ .slice(0, 10) // Limit results
467
+ .map((f) => {
468
+ const testFile = f.replace(/\.(ts|js)$/, '.spec.ts');
469
+ return testFile;
470
+ });
471
+ }
472
+ /**
473
+ * Get all available tools
474
+ */
475
+ getTools() {
476
+ return this.tools;
477
+ }
478
+ }
479
+ exports.E2EAgentsMCPServer = E2EAgentsMCPServer;
480
+ /**
481
+ * Read the package version at runtime so the MCP initialize response
482
+ * always reflects the installed version.
483
+ */
484
+ function getPackageVersion() {
485
+ try {
486
+ const pkgPath = (0, path_1.join)((0, path_1.dirname)(__dirname), 'package.json');
487
+ const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf-8'));
488
+ return pkg.version || '0.0.0';
489
+ }
490
+ catch {
491
+ return '0.0.0';
492
+ }
493
+ }
494
+ /**
495
+ * Encode a JSON-RPC message with Content-Length framing.
496
+ * Exported for testability.
497
+ */
498
+ function encodeJsonRpcMessage(message) {
499
+ const body = JSON.stringify(message);
500
+ return `Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n${body}`;
501
+ }
502
+ /**
503
+ * Parse Content-Length framed JSON-RPC messages from a buffer.
504
+ * Returns parsed messages and the remaining (unconsumed) buffer.
505
+ * Exported for testability.
506
+ */
507
+ function parseJsonRpcFrames(input) {
508
+ const messages = [];
509
+ let buffer = Buffer.from(input);
510
+ while (true) {
511
+ const headerEnd = buffer.indexOf('\r\n\r\n');
512
+ if (headerEnd === -1)
513
+ break;
514
+ const headerText = buffer.slice(0, headerEnd).toString('utf8');
515
+ const match = headerText.match(/Content-Length:\s*(\d+)/i);
516
+ if (!match) {
517
+ buffer = Buffer.alloc(0);
518
+ break;
519
+ }
520
+ const contentLength = Number(match[1]);
521
+ const messageEnd = headerEnd + 4 + contentLength;
522
+ if (buffer.length < messageEnd)
523
+ break;
524
+ const body = buffer.slice(headerEnd + 4, messageEnd).toString('utf8');
525
+ buffer = buffer.slice(messageEnd);
526
+ messages.push(JSON.parse(body));
527
+ }
528
+ return { messages, remainder: buffer };
529
+ }
530
+ /**
531
+ * Handle a single JSON-RPC message against the server.
532
+ * Returns the response message (or null for notifications).
533
+ * Exported for testability.
534
+ */
535
+ async function handleJsonRpcMessage(server, message) {
536
+ const { id, method, params } = message;
537
+ const version = getPackageVersion();
538
+ if (method === 'initialize') {
539
+ return {
540
+ jsonrpc: '2.0',
541
+ id,
542
+ result: {
543
+ protocolVersion: typeof params?.protocolVersion === 'string' ? params.protocolVersion : '2024-11-05',
544
+ capabilities: { tools: {}, resources: {}, prompts: {} },
545
+ serverInfo: { name: 'impact-gate-mcp', version },
546
+ },
547
+ };
548
+ }
549
+ if (method === 'notifications/initialized' || method === 'initialized') {
550
+ return null;
551
+ }
552
+ if (method === 'tools/list') {
553
+ return {
554
+ jsonrpc: '2.0',
555
+ id,
556
+ result: {
557
+ tools: server.getTools().map((tool) => ({
558
+ name: tool.name,
559
+ description: tool.description,
560
+ inputSchema: tool.inputSchema,
561
+ })),
562
+ },
563
+ };
564
+ }
565
+ if (method === 'tools/call') {
566
+ const resultText = await server.callTool(typeof params?.name === 'string' ? params.name : '', typeof params?.arguments === 'object' && params.arguments !== null ? params.arguments : {});
567
+ let isError = false;
568
+ try {
569
+ const parsed = JSON.parse(resultText);
570
+ isError = Boolean(parsed.error);
571
+ }
572
+ catch {
573
+ isError = false;
574
+ }
575
+ return {
576
+ jsonrpc: '2.0',
577
+ id,
578
+ result: { content: [{ type: 'text', text: resultText }], isError },
579
+ };
580
+ }
581
+ if (method === 'resources/list') {
582
+ return { jsonrpc: '2.0', id, result: { resources: [] } };
583
+ }
584
+ if (method === 'prompts/list') {
585
+ return { jsonrpc: '2.0', id, result: { prompts: [] } };
586
+ }
587
+ if (method === 'ping') {
588
+ return { jsonrpc: '2.0', id, result: {} };
589
+ }
590
+ return { jsonrpc: '2.0', id, error: { code: -32601, message: `Method not found: ${method}` } };
591
+ }
592
+ /**
593
+ * Start MCP server over stdio using Content-Length framed JSON-RPC messages.
594
+ */
595
+ function startStdioServer(repoRoot = process.cwd()) {
596
+ const server = new E2EAgentsMCPServer(repoRoot);
597
+ let buffer = Buffer.alloc(0);
598
+ const sendMessage = (message) => {
599
+ process.stdout.write(encodeJsonRpcMessage(message));
600
+ };
601
+ const sendError = (id, code, msg) => {
602
+ sendMessage({ jsonrpc: '2.0', id, error: { code, message: msg } });
603
+ };
604
+ const processBuffer = () => {
605
+ const { messages, remainder } = parseJsonRpcFrames(buffer);
606
+ buffer = remainder;
607
+ for (const parsed of messages) {
608
+ void handleJsonRpcMessage(server, parsed)
609
+ .then((response) => {
610
+ if (response)
611
+ sendMessage(response);
612
+ })
613
+ .catch((error) => {
614
+ sendError(parsed.id ?? null, -32603, error instanceof Error ? error.message : String(error));
615
+ });
616
+ }
617
+ };
618
+ process.stdin.on('data', (chunk) => {
619
+ buffer = Buffer.concat([buffer, chunk]);
620
+ processBuffer();
621
+ });
622
+ process.stdin.on('end', () => {
623
+ process.exit(0);
624
+ });
625
+ }
626
+ if (require.main === module) {
627
+ startStdioServer();
628
+ }
629
+ exports.default = E2EAgentsMCPServer;
@@ -0,0 +1,37 @@
1
+ export declare class PrometheusMetrics {
2
+ private counters;
3
+ private gauges;
4
+ private histograms;
5
+ /**
6
+ * Record an LLM request.
7
+ */
8
+ recordLLMRequest(provider: string, agent: string, durationMs: number, costUSD: number, tokens: number): void;
9
+ /**
10
+ * Record a crew workflow run.
11
+ */
12
+ recordCrewRun(workflow: string, families: number, durationMs: number, costUSD: number): void;
13
+ /**
14
+ * Record a budget check event.
15
+ */
16
+ recordBudgetCheck(exceeded: boolean, currentUSD: number, limitUSD: number): void;
17
+ /**
18
+ * Record a circuit breaker state change.
19
+ */
20
+ recordCircuitBreakerState(state: 'closed' | 'open' | 'half-open'): void;
21
+ /**
22
+ * Record a cache hit or miss.
23
+ */
24
+ recordCacheResult(hit: boolean, agent: string): void;
25
+ /**
26
+ * Export all metrics in Prometheus text exposition format.
27
+ */
28
+ export(): string;
29
+ /**
30
+ * Reset all metrics to zero.
31
+ */
32
+ reset(): void;
33
+ private incrementCounter;
34
+ private setGauge;
35
+ private observeHistogram;
36
+ }
37
+ //# sourceMappingURL=prometheus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prometheus.d.ts","sourceRoot":"","sources":["../../src/metrics/prometheus.ts"],"names":[],"mappings":"AAkCA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAmB;IAErC;;OAEG;IACH,gBAAgB,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACf,IAAI;IAOP;;OAEG;IACH,aAAa,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAChB,IAAI;IAOP;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMhF;;OAEG;IACH,yBAAyB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI;IAKvE;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpD;;OAEG;IACH,MAAM,IAAI,MAAM;IA+ChB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,gBAAgB;CAc3B"}