@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
package/dist/index.js ADDED
@@ -0,0 +1,169 @@
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.runAgenticGeneration = exports.getSpecsForFamily = exports.buildSpecIndex = exports.loadOrBuildApiSurface = exports.buildApiSurface = exports.getUserFlowsForBinding = exports.getPriorityForBinding = exports.getCypressSpecDirsForBinding = exports.bindFilesToFamilies = exports.loadRouteFamilyManifest = exports.buildQualityFixPrompt = exports.buildHealPrompt = exports.renderHealMarkdown = exports.resolveHealTargets = exports.healFromReport = exports.runHealStage = exports.detectHallucinatedMethods = exports.parseGenerationResponse = exports.buildGenerationPrompt = exports.runGenerationStage = exports.runPipeline = exports.captureTraceabilityInput = exports.ingestTraceabilityInput = exports.finalizeGeneratedTests = exports.getAdaptiveThresholds = exports.readFlakyTests = exports.readCalibration = exports.appendFeedbackAndRecompute = exports.buildPlanFromImpact = exports.extractScenarios = exports.getPartialGaps = exports.getGapsWithSuppressed = exports.getGaps = exports.analyzeImpactV2 = exports.captureTraceability = exports.ingestTraceability = exports.handoffGeneratedTests = exports.recommendTestsDeterministic = exports.analyzeImpactDeterministic = exports.validateProviderSetup = exports.LLMProviderFactory = exports.CustomProvider = exports.checkOpenAISetup = exports.OpenAIProvider = exports.checkOllamaSetup = exports.OllamaProvider = exports.checkAnthropicSetup = exports.AnthropicProvider = exports.UnsupportedCapabilityError = exports.LLMProviderError = void 0;
6
+ exports.serializeManifest = exports.detectTestMode = exports.detectFramework = exports.isMattermostProfile = exports.resolveGenerationProfile = exports.scanFromKnowledgeGraph = exports.loadDiffOverlay = exports.transformKGToFamilies = exports.classifyProjectType = exports.loadKnowledgeGraph = exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = exports.EXIT_CODES = exports.classifyError = exports.CliError = exports.sanitizeObject = exports.containsSecrets = exports.sanitizeSecrets = exports.PrometheusMetrics = exports.CircuitBreaker = exports.withRetry = exports.ModelRouter = exports.BudgetLedger = exports.BudgetExceededError = exports.BaseProvider = exports.RegressionAdvisorAgent = exports.CrossImpactAgent = exports.TestDesignerAgent = exports.StrategistAgent = exports.ExplorerAgent = exports.HealerAgent = exports.ExecutorAgent = exports.GeneratorAgent = exports.CoverageEvaluatorAgent = exports.ImpactAnalystAgent = exports.WORKFLOWS = exports.CrewOrchestrator = void 0;
7
+ var provider_interface_js_1 = require("./provider_interface.js");
8
+ Object.defineProperty(exports, "LLMProviderError", { enumerable: true, get: function () { return provider_interface_js_1.LLMProviderError; } });
9
+ Object.defineProperty(exports, "UnsupportedCapabilityError", { enumerable: true, get: function () { return provider_interface_js_1.UnsupportedCapabilityError; } });
10
+ // Provider implementations
11
+ var anthropic_provider_js_1 = require("./anthropic_provider.js");
12
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_provider_js_1.AnthropicProvider; } });
13
+ Object.defineProperty(exports, "checkAnthropicSetup", { enumerable: true, get: function () { return anthropic_provider_js_1.checkAnthropicSetup; } });
14
+ var ollama_provider_js_1 = require("./ollama_provider.js");
15
+ Object.defineProperty(exports, "OllamaProvider", { enumerable: true, get: function () { return ollama_provider_js_1.OllamaProvider; } });
16
+ Object.defineProperty(exports, "checkOllamaSetup", { enumerable: true, get: function () { return ollama_provider_js_1.checkOllamaSetup; } });
17
+ var openai_provider_js_1 = require("./openai_provider.js");
18
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_provider_js_1.OpenAIProvider; } });
19
+ Object.defineProperty(exports, "checkOpenAISetup", { enumerable: true, get: function () { return openai_provider_js_1.checkOpenAISetup; } });
20
+ var custom_provider_js_1 = require("./custom_provider.js");
21
+ Object.defineProperty(exports, "CustomProvider", { enumerable: true, get: function () { return custom_provider_js_1.CustomProvider; } });
22
+ // Factory
23
+ var provider_factory_js_1 = require("./provider_factory.js");
24
+ Object.defineProperty(exports, "LLMProviderFactory", { enumerable: true, get: function () { return provider_factory_js_1.LLMProviderFactory; } });
25
+ Object.defineProperty(exports, "validateProviderSetup", { enumerable: true, get: function () { return provider_factory_js_1.validateProviderSetup; } });
26
+ // Agent API (deterministic impact + plan, traceability)
27
+ var api_js_1 = require("./api.js");
28
+ Object.defineProperty(exports, "analyzeImpactDeterministic", { enumerable: true, get: function () { return api_js_1.analyzeImpactDeterministic; } });
29
+ Object.defineProperty(exports, "recommendTestsDeterministic", { enumerable: true, get: function () { return api_js_1.recommendTestsDeterministic; } });
30
+ Object.defineProperty(exports, "handoffGeneratedTests", { enumerable: true, get: function () { return api_js_1.handoffGeneratedTests; } });
31
+ Object.defineProperty(exports, "ingestTraceability", { enumerable: true, get: function () { return api_js_1.ingestTraceability; } });
32
+ Object.defineProperty(exports, "captureTraceability", { enumerable: true, get: function () { return api_js_1.captureTraceability; } });
33
+ // V2 Engine (deterministic impact + plan)
34
+ var impact_engine_js_1 = require("./engine/impact_engine.js");
35
+ Object.defineProperty(exports, "analyzeImpactV2", { enumerable: true, get: function () { return impact_engine_js_1.analyzeImpact; } });
36
+ Object.defineProperty(exports, "getGaps", { enumerable: true, get: function () { return impact_engine_js_1.getGaps; } });
37
+ Object.defineProperty(exports, "getGapsWithSuppressed", { enumerable: true, get: function () { return impact_engine_js_1.getGapsWithSuppressed; } });
38
+ Object.defineProperty(exports, "getPartialGaps", { enumerable: true, get: function () { return impact_engine_js_1.getPartialGaps; } });
39
+ var impact_engine_js_2 = require("./engine/impact_engine.js");
40
+ Object.defineProperty(exports, "extractScenarios", { enumerable: true, get: function () { return impact_engine_js_2.extractScenarios; } });
41
+ var plan_builder_js_1 = require("./engine/plan_builder.js");
42
+ Object.defineProperty(exports, "buildPlanFromImpact", { enumerable: true, get: function () { return plan_builder_js_1.buildPlanFromImpact; } });
43
+ var feedback_js_1 = require("./agent/feedback.js");
44
+ Object.defineProperty(exports, "appendFeedbackAndRecompute", { enumerable: true, get: function () { return feedback_js_1.appendFeedbackAndRecompute; } });
45
+ Object.defineProperty(exports, "readCalibration", { enumerable: true, get: function () { return feedback_js_1.readCalibration; } });
46
+ Object.defineProperty(exports, "readFlakyTests", { enumerable: true, get: function () { return feedback_js_1.readFlakyTests; } });
47
+ Object.defineProperty(exports, "getAdaptiveThresholds", { enumerable: true, get: function () { return feedback_js_1.getAdaptiveThresholds; } });
48
+ var handoff_js_1 = require("./agent/handoff.js");
49
+ Object.defineProperty(exports, "finalizeGeneratedTests", { enumerable: true, get: function () { return handoff_js_1.finalizeGeneratedTests; } });
50
+ var traceability_ingest_js_1 = require("./agent/traceability_ingest.js");
51
+ Object.defineProperty(exports, "ingestTraceabilityInput", { enumerable: true, get: function () { return traceability_ingest_js_1.ingestTraceabilityInput; } });
52
+ var traceability_capture_js_1 = require("./agent/traceability_capture.js");
53
+ Object.defineProperty(exports, "captureTraceabilityInput", { enumerable: true, get: function () { return traceability_capture_js_1.captureTraceabilityInput; } });
54
+ // Pipeline API (route-family-bound impact analysis)
55
+ var orchestrator_js_1 = require("./pipeline/orchestrator.js");
56
+ Object.defineProperty(exports, "runPipeline", { enumerable: true, get: function () { return orchestrator_js_1.runPipeline; } });
57
+ var stage3_generation_js_1 = require("./pipeline/stage3_generation.js");
58
+ Object.defineProperty(exports, "runGenerationStage", { enumerable: true, get: function () { return stage3_generation_js_1.runGenerationStage; } });
59
+ var generation_js_1 = require("./prompts/generation.js");
60
+ Object.defineProperty(exports, "buildGenerationPrompt", { enumerable: true, get: function () { return generation_js_1.buildGenerationPrompt; } });
61
+ Object.defineProperty(exports, "parseGenerationResponse", { enumerable: true, get: function () { return generation_js_1.parseGenerationResponse; } });
62
+ Object.defineProperty(exports, "detectHallucinatedMethods", { enumerable: true, get: function () { return generation_js_1.detectHallucinatedMethods; } });
63
+ var stage4_heal_js_1 = require("./pipeline/stage4_heal.js");
64
+ Object.defineProperty(exports, "runHealStage", { enumerable: true, get: function () { return stage4_heal_js_1.runHealStage; } });
65
+ Object.defineProperty(exports, "healFromReport", { enumerable: true, get: function () { return stage4_heal_js_1.healFromReport; } });
66
+ Object.defineProperty(exports, "resolveHealTargets", { enumerable: true, get: function () { return stage4_heal_js_1.resolveHealTargets; } });
67
+ Object.defineProperty(exports, "renderHealMarkdown", { enumerable: true, get: function () { return stage4_heal_js_1.renderHealMarkdown; } });
68
+ var heal_js_1 = require("./prompts/heal.js");
69
+ Object.defineProperty(exports, "buildHealPrompt", { enumerable: true, get: function () { return heal_js_1.buildHealPrompt; } });
70
+ Object.defineProperty(exports, "buildQualityFixPrompt", { enumerable: true, get: function () { return heal_js_1.buildQualityFixPrompt; } });
71
+ // Knowledge modules
72
+ var route_families_js_1 = require("./knowledge/route_families.js");
73
+ Object.defineProperty(exports, "loadRouteFamilyManifest", { enumerable: true, get: function () { return route_families_js_1.loadRouteFamilyManifest; } });
74
+ Object.defineProperty(exports, "bindFilesToFamilies", { enumerable: true, get: function () { return route_families_js_1.bindFilesToFamilies; } });
75
+ Object.defineProperty(exports, "getCypressSpecDirsForBinding", { enumerable: true, get: function () { return route_families_js_1.getCypressSpecDirsForBinding; } });
76
+ Object.defineProperty(exports, "getPriorityForBinding", { enumerable: true, get: function () { return route_families_js_1.getPriorityForBinding; } });
77
+ Object.defineProperty(exports, "getUserFlowsForBinding", { enumerable: true, get: function () { return route_families_js_1.getUserFlowsForBinding; } });
78
+ var api_surface_js_1 = require("./knowledge/api_surface.js");
79
+ Object.defineProperty(exports, "buildApiSurface", { enumerable: true, get: function () { return api_surface_js_1.buildApiSurface; } });
80
+ Object.defineProperty(exports, "loadOrBuildApiSurface", { enumerable: true, get: function () { return api_surface_js_1.loadOrBuildApiSurface; } });
81
+ var spec_index_js_1 = require("./knowledge/spec_index.js");
82
+ Object.defineProperty(exports, "buildSpecIndex", { enumerable: true, get: function () { return spec_index_js_1.buildSpecIndex; } });
83
+ Object.defineProperty(exports, "getSpecsForFamily", { enumerable: true, get: function () { return spec_index_js_1.getSpecsForFamily; } });
84
+ // Agentic generation
85
+ var runner_js_1 = require("./agentic/runner.js");
86
+ Object.defineProperty(exports, "runAgenticGeneration", { enumerable: true, get: function () { return runner_js_1.runAgenticGeneration; } });
87
+ // Crew (multi-agent QA workflows)
88
+ var orchestrator_js_2 = require("./crew/orchestrator.js");
89
+ Object.defineProperty(exports, "CrewOrchestrator", { enumerable: true, get: function () { return orchestrator_js_2.CrewOrchestrator; } });
90
+ var workflows_js_1 = require("./crew/workflows.js");
91
+ Object.defineProperty(exports, "WORKFLOWS", { enumerable: true, get: function () { return workflows_js_1.WORKFLOWS; } });
92
+ // Crew agents
93
+ var impact_analyst_js_1 = require("./agents/impact-analyst.js");
94
+ Object.defineProperty(exports, "ImpactAnalystAgent", { enumerable: true, get: function () { return impact_analyst_js_1.ImpactAnalystAgent; } });
95
+ var coverage_evaluator_js_1 = require("./agents/coverage-evaluator.js");
96
+ Object.defineProperty(exports, "CoverageEvaluatorAgent", { enumerable: true, get: function () { return coverage_evaluator_js_1.CoverageEvaluatorAgent; } });
97
+ var generator_js_1 = require("./agents/generator.js");
98
+ Object.defineProperty(exports, "GeneratorAgent", { enumerable: true, get: function () { return generator_js_1.GeneratorAgent; } });
99
+ var executor_js_1 = require("./agents/executor.js");
100
+ Object.defineProperty(exports, "ExecutorAgent", { enumerable: true, get: function () { return executor_js_1.ExecutorAgent; } });
101
+ var healer_js_1 = require("./agents/healer.js");
102
+ Object.defineProperty(exports, "HealerAgent", { enumerable: true, get: function () { return healer_js_1.HealerAgent; } });
103
+ var explorer_js_1 = require("./agents/explorer.js");
104
+ Object.defineProperty(exports, "ExplorerAgent", { enumerable: true, get: function () { return explorer_js_1.ExplorerAgent; } });
105
+ var strategist_js_1 = require("./agents/strategist.js");
106
+ Object.defineProperty(exports, "StrategistAgent", { enumerable: true, get: function () { return strategist_js_1.StrategistAgent; } });
107
+ var test_designer_js_1 = require("./agents/test-designer.js");
108
+ Object.defineProperty(exports, "TestDesignerAgent", { enumerable: true, get: function () { return test_designer_js_1.TestDesignerAgent; } });
109
+ var cross_impact_js_1 = require("./agents/cross-impact.js");
110
+ Object.defineProperty(exports, "CrossImpactAgent", { enumerable: true, get: function () { return cross_impact_js_1.CrossImpactAgent; } });
111
+ var regression_advisor_js_1 = require("./agents/regression-advisor.js");
112
+ Object.defineProperty(exports, "RegressionAdvisorAgent", { enumerable: true, get: function () { return regression_advisor_js_1.RegressionAdvisorAgent; } });
113
+ // Base provider (for extending with custom providers)
114
+ var base_provider_js_1 = require("./base_provider.js");
115
+ Object.defineProperty(exports, "BaseProvider", { enumerable: true, get: function () { return base_provider_js_1.BaseProvider; } });
116
+ Object.defineProperty(exports, "BudgetExceededError", { enumerable: true, get: function () { return base_provider_js_1.BudgetExceededError; } });
117
+ // Budget tracking
118
+ var budget_ledger_js_1 = require("./budget_ledger.js");
119
+ Object.defineProperty(exports, "BudgetLedger", { enumerable: true, get: function () { return budget_ledger_js_1.BudgetLedger; } });
120
+ // Model routing
121
+ var model_router_js_1 = require("./model_router.js");
122
+ Object.defineProperty(exports, "ModelRouter", { enumerable: true, get: function () { return model_router_js_1.ModelRouter; } });
123
+ // Resilience
124
+ var retry_js_1 = require("./resilience/retry.js");
125
+ Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_js_1.withRetry; } });
126
+ var circuit_breaker_js_1 = require("./resilience/circuit_breaker.js");
127
+ Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_js_1.CircuitBreaker; } });
128
+ // Metrics
129
+ var prometheus_js_1 = require("./metrics/prometheus.js");
130
+ Object.defineProperty(exports, "PrometheusMetrics", { enumerable: true, get: function () { return prometheus_js_1.PrometheusMetrics; } });
131
+ // Secret scanning
132
+ var sanitize_js_1 = require("./sanitize.js");
133
+ Object.defineProperty(exports, "sanitizeSecrets", { enumerable: true, get: function () { return sanitize_js_1.sanitizeSecrets; } });
134
+ Object.defineProperty(exports, "containsSecrets", { enumerable: true, get: function () { return sanitize_js_1.containsSecrets; } });
135
+ Object.defineProperty(exports, "sanitizeObject", { enumerable: true, get: function () { return sanitize_js_1.sanitizeObject; } });
136
+ // CLI errors
137
+ var errors_js_1 = require("./cli/errors.js");
138
+ Object.defineProperty(exports, "CliError", { enumerable: true, get: function () { return errors_js_1.CliError; } });
139
+ Object.defineProperty(exports, "classifyError", { enumerable: true, get: function () { return errors_js_1.classifyError; } });
140
+ Object.defineProperty(exports, "EXIT_CODES", { enumerable: true, get: function () { return errors_js_1.EXIT_CODES; } });
141
+ // Training (route-families bootstrap and maintenance)
142
+ var scanner_js_1 = require("./training/scanner.js");
143
+ Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_js_1.scanProject; } });
144
+ var merger_js_1 = require("./training/merger.js");
145
+ Object.defineProperty(exports, "mergeFamilies", { enumerable: true, get: function () { return merger_js_1.mergeFamilies; } });
146
+ Object.defineProperty(exports, "detectStaleFamilies", { enumerable: true, get: function () { return merger_js_1.detectStaleFamilies; } });
147
+ var enricher_js_1 = require("./training/enricher.js");
148
+ Object.defineProperty(exports, "enrichFamilies", { enumerable: true, get: function () { return enricher_js_1.enrichFamilies; } });
149
+ var validator_js_1 = require("./training/validator.js");
150
+ Object.defineProperty(exports, "getCommitFiles", { enumerable: true, get: function () { return validator_js_1.getCommitFiles; } });
151
+ Object.defineProperty(exports, "validateCommit", { enumerable: true, get: function () { return validator_js_1.validateCommit; } });
152
+ Object.defineProperty(exports, "buildValidationReport", { enumerable: true, get: function () { return validator_js_1.buildValidationReport; } });
153
+ Object.defineProperty(exports, "formatValidationReport", { enumerable: true, get: function () { return validator_js_1.formatValidationReport; } });
154
+ var kg_bridge_js_1 = require("./knowledge/kg_bridge.js");
155
+ Object.defineProperty(exports, "loadKnowledgeGraph", { enumerable: true, get: function () { return kg_bridge_js_1.loadKnowledgeGraph; } });
156
+ Object.defineProperty(exports, "classifyProjectType", { enumerable: true, get: function () { return kg_bridge_js_1.classifyProjectType; } });
157
+ Object.defineProperty(exports, "transformKGToFamilies", { enumerable: true, get: function () { return kg_bridge_js_1.transformKGToFamilies; } });
158
+ Object.defineProperty(exports, "loadDiffOverlay", { enumerable: true, get: function () { return kg_bridge_js_1.loadDiffOverlay; } });
159
+ var kg_scanner_js_1 = require("./training/kg_scanner.js");
160
+ Object.defineProperty(exports, "scanFromKnowledgeGraph", { enumerable: true, get: function () { return kg_scanner_js_1.scanFromKnowledgeGraph; } });
161
+ var generation_profile_js_1 = require("./prompts/generation_profile.js");
162
+ Object.defineProperty(exports, "resolveGenerationProfile", { enumerable: true, get: function () { return generation_profile_js_1.resolveGenerationProfile; } });
163
+ Object.defineProperty(exports, "isMattermostProfile", { enumerable: true, get: function () { return generation_profile_js_1.isMattermostProfile; } });
164
+ var framework_adapter_js_1 = require("./adapters/framework_adapter.js");
165
+ Object.defineProperty(exports, "detectFramework", { enumerable: true, get: function () { return framework_adapter_js_1.detectFramework; } });
166
+ Object.defineProperty(exports, "detectTestMode", { enumerable: true, get: function () { return framework_adapter_js_1.detectTestMode; } });
167
+ // Route families (additional)
168
+ var route_families_js_2 = require("./knowledge/route_families.js");
169
+ Object.defineProperty(exports, "serializeManifest", { enumerable: true, get: function () { return route_families_js_2.serializeManifest; } });
@@ -0,0 +1,37 @@
1
+ export interface MethodParam {
2
+ name: string;
3
+ type?: string;
4
+ optional?: boolean;
5
+ }
6
+ export interface MethodSignature {
7
+ name: string;
8
+ kind: 'method' | 'property' | 'getter';
9
+ params?: MethodParam[];
10
+ returnType?: string;
11
+ async?: boolean;
12
+ }
13
+ export interface PageObjectSurface {
14
+ className: string;
15
+ file: string;
16
+ methods: MethodSignature[];
17
+ /** Base class name if the class extends another */
18
+ extends?: string;
19
+ }
20
+ export interface ApiSurfaceCatalog {
21
+ pageObjects: PageObjectSurface[];
22
+ generatedAt: string;
23
+ }
24
+ export interface ApiSurfaceConfig {
25
+ enabled: boolean;
26
+ pageObjectsDir?: string;
27
+ componentsDir?: string;
28
+ cachePath?: string;
29
+ /** Use fast regex extraction instead of TypeScript AST (fallback mode) */
30
+ useRegexFallback?: boolean;
31
+ }
32
+ export declare function buildApiSurface(testsRoot: string, config?: ApiSurfaceConfig): ApiSurfaceCatalog;
33
+ export declare function loadOrBuildApiSurface(testsRoot: string, config?: ApiSurfaceConfig): ApiSurfaceCatalog;
34
+ export declare function getMethodsForPageObject(catalog: ApiSurfaceCatalog, className: string): MethodSignature[];
35
+ export declare function validateMethodCall(catalog: ApiSurfaceCatalog, className: string, methodName: string): boolean;
36
+ export declare function formatApiSurfaceForPrompt(catalog: ApiSurfaceCatalog, classNames: string[]): string;
37
+ //# sourceMappingURL=api_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api_surface.d.ts","sourceRoot":"","sources":["../../src/knowledge/api_surface.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAgVD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAqC/F;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAgCrG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAGxG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG7G;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BlG"}
@@ -0,0 +1,418 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildApiSurface = buildApiSurface;
9
+ exports.loadOrBuildApiSurface = loadOrBuildApiSurface;
10
+ exports.getMethodsForPageObject = getMethodsForPageObject;
11
+ exports.validateMethodCall = validateMethodCall;
12
+ exports.formatApiSurfaceForPrompt = formatApiSurfaceForPrompt;
13
+ const fs_1 = require("fs");
14
+ const path_1 = require("path");
15
+ const typescript_1 = __importDefault(require("typescript"));
16
+ // ── TypeScript AST-based extraction ────────────────────────
17
+ function extractMethodsFromAST(sourceFile, checker) {
18
+ const surfaces = [];
19
+ typescript_1.default.forEachChild(sourceFile, (node) => {
20
+ if (!typescript_1.default.isClassDeclaration(node) || !node.name) {
21
+ return;
22
+ }
23
+ const className = node.name.text;
24
+ const methods = [];
25
+ const seen = new Set();
26
+ // Get base class name if extends
27
+ let extendsName;
28
+ if (node.heritageClauses) {
29
+ for (const clause of node.heritageClauses) {
30
+ if (clause.token === typescript_1.default.SyntaxKind.ExtendsKeyword && clause.types.length > 0) {
31
+ const expr = clause.types[0].expression;
32
+ if (typescript_1.default.isIdentifier(expr)) {
33
+ extendsName = expr.text;
34
+ }
35
+ }
36
+ }
37
+ }
38
+ for (const member of node.members) {
39
+ // Skip constructor
40
+ if (typescript_1.default.isConstructorDeclaration(member)) {
41
+ continue;
42
+ }
43
+ // Skip private/protected members
44
+ const modifiers = typescript_1.default.canHaveModifiers(member) ? typescript_1.default.getModifiers(member) : undefined;
45
+ if (modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.PrivateKeyword || m.kind === typescript_1.default.SyntaxKind.ProtectedKeyword)) {
46
+ continue;
47
+ }
48
+ const name = member.name && typescript_1.default.isIdentifier(member.name) ? member.name.text : null;
49
+ if (!name || name.startsWith('_') || seen.has(name)) {
50
+ continue;
51
+ }
52
+ seen.add(name);
53
+ if (typescript_1.default.isMethodDeclaration(member)) {
54
+ const isAsync = modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.AsyncKeyword) ?? false;
55
+ const params = extractParams(member.parameters, checker);
56
+ const returnType = extractReturnType(member, checker);
57
+ methods.push({
58
+ name,
59
+ kind: 'method',
60
+ async: isAsync ? true : undefined,
61
+ params: params.length > 0 ? params : undefined,
62
+ returnType: returnType || undefined,
63
+ });
64
+ }
65
+ else if (typescript_1.default.isGetAccessorDeclaration(member)) {
66
+ methods.push({ name, kind: 'getter' });
67
+ }
68
+ else if (typescript_1.default.isPropertyDeclaration(member)) {
69
+ // Check if it's an arrow function property (e.g., name = async () => {})
70
+ if (member.initializer && (typescript_1.default.isArrowFunction(member.initializer) || typescript_1.default.isFunctionExpression(member.initializer))) {
71
+ const fn = member.initializer;
72
+ const fnModifiers = typescript_1.default.canHaveModifiers(fn) ? typescript_1.default.getModifiers(fn) : undefined;
73
+ const isAsync = fnModifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.AsyncKeyword) ?? false;
74
+ const params = extractParams(fn.parameters, checker);
75
+ methods.push({
76
+ name,
77
+ kind: 'method',
78
+ async: isAsync ? true : undefined,
79
+ params: params.length > 0 ? params : undefined,
80
+ });
81
+ }
82
+ else {
83
+ methods.push({ name, kind: 'property' });
84
+ }
85
+ }
86
+ }
87
+ if (methods.length > 0) {
88
+ surfaces.push({
89
+ className,
90
+ file: sourceFile.fileName,
91
+ methods,
92
+ extends: extendsName,
93
+ });
94
+ }
95
+ });
96
+ return surfaces;
97
+ }
98
+ function extractParams(params, checker) {
99
+ return params.map((p) => {
100
+ const name = typescript_1.default.isIdentifier(p.name) ? p.name.text : p.name.getText();
101
+ const optional = p.questionToken !== undefined || p.initializer !== undefined;
102
+ let type;
103
+ if (p.type) {
104
+ type = p.type.getText();
105
+ }
106
+ else if (checker) {
107
+ try {
108
+ const symbol = checker.getSymbolAtLocation(p.name);
109
+ if (symbol) {
110
+ const t = checker.getTypeOfSymbolAtLocation(symbol, p);
111
+ type = checker.typeToString(t);
112
+ }
113
+ }
114
+ catch {
115
+ // Type inference failure is non-fatal
116
+ }
117
+ }
118
+ return { name, type, optional: optional || undefined };
119
+ });
120
+ }
121
+ function extractReturnType(method, checker) {
122
+ if (method.type) {
123
+ return method.type.getText();
124
+ }
125
+ if (checker) {
126
+ try {
127
+ const signature = checker.getSignatureFromDeclaration(method);
128
+ if (signature) {
129
+ const returnType = checker.getReturnTypeOfSignature(signature);
130
+ const typeStr = checker.typeToString(returnType);
131
+ // Skip overly verbose inferred types
132
+ if (typeStr.length < 100) {
133
+ return typeStr;
134
+ }
135
+ }
136
+ }
137
+ catch {
138
+ // Type inference failure is non-fatal
139
+ }
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Extract page objects using the TypeScript Compiler API.
145
+ * Falls back to regex if compilation fails.
146
+ */
147
+ function extractWithAST(files) {
148
+ if (files.length === 0) {
149
+ return [];
150
+ }
151
+ // Find the nearest tsconfig.json
152
+ const firstDir = (0, path_1.join)(files[0], '..');
153
+ const tsconfigPath = typescript_1.default.findConfigFile(firstDir, typescript_1.default.sys.fileExists, 'tsconfig.json');
154
+ let program;
155
+ if (tsconfigPath) {
156
+ const configFile = typescript_1.default.readConfigFile(tsconfigPath, typescript_1.default.sys.readFile);
157
+ const parsedConfig = typescript_1.default.parseJsonConfigFileContent(configFile.config, typescript_1.default.sys, (0, path_1.join)(tsconfigPath, '..'));
158
+ // Only compile the files we care about, using the config's compiler options
159
+ program = typescript_1.default.createProgram(files, parsedConfig.options);
160
+ }
161
+ else {
162
+ program = typescript_1.default.createProgram(files, {
163
+ target: typescript_1.default.ScriptTarget.ES2022,
164
+ module: typescript_1.default.ModuleKind.ESNext,
165
+ moduleResolution: typescript_1.default.ModuleResolutionKind.Bundler,
166
+ strict: true,
167
+ allowJs: false,
168
+ noEmit: true,
169
+ });
170
+ }
171
+ const checker = program.getTypeChecker();
172
+ const surfaces = [];
173
+ for (const filePath of files) {
174
+ const sourceFile = program.getSourceFile(filePath);
175
+ if (!sourceFile) {
176
+ continue;
177
+ }
178
+ surfaces.push(...extractMethodsFromAST(sourceFile, checker));
179
+ }
180
+ // Resolve inherited methods: if class extends another class in the catalog,
181
+ // merge parent methods that the child doesn't override
182
+ resolveInheritance(surfaces);
183
+ return surfaces;
184
+ }
185
+ /**
186
+ * Merge parent class methods into child classes that extend them.
187
+ */
188
+ function resolveInheritance(surfaces) {
189
+ const byName = new Map(surfaces.map((s) => [s.className, s]));
190
+ for (const surface of surfaces) {
191
+ if (!surface.extends) {
192
+ continue;
193
+ }
194
+ const parent = byName.get(surface.extends);
195
+ if (!parent) {
196
+ continue;
197
+ }
198
+ const childMethodNames = new Set(surface.methods.map((m) => m.name));
199
+ for (const parentMethod of parent.methods) {
200
+ if (!childMethodNames.has(parentMethod.name)) {
201
+ surface.methods.push({ ...parentMethod });
202
+ }
203
+ }
204
+ }
205
+ }
206
+ // ── Regex-based extraction (fallback) ──────────────────────
207
+ const RESERVED_WORDS = new Set([
208
+ 'private', 'protected', 'static', 'abstract', 'override',
209
+ 'if', 'for', 'while', 'switch', 'return',
210
+ 'const', 'let', 'var', 'import', 'export',
211
+ 'class', 'type', 'interface', 'constructor',
212
+ ]);
213
+ function extractMethodsFromRegex(content) {
214
+ const methods = [];
215
+ const seen = new Set();
216
+ const asyncMethodRe = /(?:async\s+)([a-zA-Z_]\w*)\s*\(/g;
217
+ let match;
218
+ while ((match = asyncMethodRe.exec(content)) !== null) {
219
+ const name = match[1];
220
+ if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
221
+ seen.add(name);
222
+ methods.push({ name, kind: 'method', async: true });
223
+ }
224
+ }
225
+ const methodRe = /^\s+(?:readonly\s+)?([a-zA-Z_]\w*)\s*(?:\(|=\s*(?:async\s*)?\()/gm;
226
+ while ((match = methodRe.exec(content)) !== null) {
227
+ const name = match[1];
228
+ if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
229
+ seen.add(name);
230
+ const isAsync = match[0].includes('async');
231
+ methods.push({ name, kind: 'method', async: isAsync ? true : undefined });
232
+ }
233
+ }
234
+ const arrowRe = /^\s+([a-zA-Z_]\w*)\s*=\s*(async\s+)?(?:\([^)]*\)|[a-zA-Z_]\w*)\s*=>/gm;
235
+ while ((match = arrowRe.exec(content)) !== null) {
236
+ const name = match[1];
237
+ if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
238
+ seen.add(name);
239
+ methods.push({ name, kind: 'method', async: match[2] ? true : undefined });
240
+ }
241
+ }
242
+ const getterRe = /\bget\s+([a-zA-Z_]\w*)\s*\(\)/g;
243
+ while ((match = getterRe.exec(content)) !== null) {
244
+ const name = match[1];
245
+ if (!seen.has(name)) {
246
+ seen.add(name);
247
+ methods.push({ name, kind: 'getter' });
248
+ }
249
+ }
250
+ const propRe = /^\s+(?:readonly\s+)?([a-zA-Z_]\w*)\s*[:=]/gm;
251
+ while ((match = propRe.exec(content)) !== null) {
252
+ const name = match[1];
253
+ if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
254
+ seen.add(name);
255
+ methods.push({ name, kind: 'property' });
256
+ }
257
+ }
258
+ return methods;
259
+ }
260
+ function extractClassName(content) {
261
+ const match = content.match(/(?:export\s+)?class\s+(\w+)/);
262
+ return match ? match[1] : null;
263
+ }
264
+ // ── Directory scanning ─────────────────────────────────────
265
+ function collectTypeScriptFiles(dir) {
266
+ const files = [];
267
+ if (!(0, fs_1.existsSync)(dir)) {
268
+ return files;
269
+ }
270
+ const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
271
+ for (const entry of entries) {
272
+ const fullPath = (0, path_1.join)(dir, entry.name);
273
+ if (entry.isDirectory()) {
274
+ files.push(...collectTypeScriptFiles(fullPath));
275
+ continue;
276
+ }
277
+ const ext = (0, path_1.extname)(entry.name);
278
+ if (ext === '.ts' || ext === '.tsx') {
279
+ files.push(fullPath);
280
+ }
281
+ }
282
+ return files;
283
+ }
284
+ function scanDirectoryWithRegex(dir) {
285
+ const surfaces = [];
286
+ if (!(0, fs_1.existsSync)(dir)) {
287
+ return surfaces;
288
+ }
289
+ const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
290
+ for (const entry of entries) {
291
+ const fullPath = (0, path_1.join)(dir, entry.name);
292
+ if (entry.isDirectory()) {
293
+ surfaces.push(...scanDirectoryWithRegex(fullPath));
294
+ continue;
295
+ }
296
+ const ext = (0, path_1.extname)(entry.name);
297
+ if (ext !== '.ts' && ext !== '.tsx') {
298
+ continue;
299
+ }
300
+ try {
301
+ const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
302
+ const className = extractClassName(content);
303
+ if (!className) {
304
+ continue;
305
+ }
306
+ const extractedMethods = extractMethodsFromRegex(content);
307
+ if (extractedMethods.length > 0) {
308
+ surfaces.push({ className, file: fullPath, methods: extractedMethods });
309
+ }
310
+ }
311
+ catch {
312
+ continue;
313
+ }
314
+ }
315
+ return surfaces;
316
+ }
317
+ // ── Public API ──────────────────────────────────────────────
318
+ function buildApiSurface(testsRoot, config) {
319
+ const pageObjectsDir = config?.pageObjectsDir
320
+ ? (0, path_1.join)(testsRoot, config.pageObjectsDir)
321
+ : (0, path_1.join)(testsRoot, 'lib', 'src', 'ui', 'pages');
322
+ const componentsDir = config?.componentsDir
323
+ ? (0, path_1.join)(testsRoot, config.componentsDir)
324
+ : (0, path_1.join)(testsRoot, 'lib', 'src', 'ui', 'components');
325
+ let pageObjects;
326
+ if (config?.useRegexFallback) {
327
+ pageObjects = [
328
+ ...scanDirectoryWithRegex(pageObjectsDir),
329
+ ...scanDirectoryWithRegex(componentsDir),
330
+ ];
331
+ }
332
+ else {
333
+ // Use TypeScript AST — full type info, inheritance, params
334
+ const allFiles = [
335
+ ...collectTypeScriptFiles(pageObjectsDir),
336
+ ...collectTypeScriptFiles(componentsDir),
337
+ ];
338
+ try {
339
+ pageObjects = extractWithAST(allFiles);
340
+ }
341
+ catch {
342
+ // Fall back to regex if AST extraction fails
343
+ pageObjects = [
344
+ ...scanDirectoryWithRegex(pageObjectsDir),
345
+ ...scanDirectoryWithRegex(componentsDir),
346
+ ];
347
+ }
348
+ }
349
+ return {
350
+ pageObjects,
351
+ generatedAt: new Date().toISOString(),
352
+ };
353
+ }
354
+ function loadOrBuildApiSurface(testsRoot, config) {
355
+ if (!config?.enabled) {
356
+ return { pageObjects: [], generatedAt: new Date().toISOString() };
357
+ }
358
+ const cachePath = config.cachePath
359
+ ? (0, path_1.join)(testsRoot, config.cachePath)
360
+ : (0, path_1.join)(testsRoot, '.e2e-ai-agents', 'api-surface.json');
361
+ if ((0, fs_1.existsSync)(cachePath)) {
362
+ try {
363
+ const cached = JSON.parse((0, fs_1.readFileSync)(cachePath, 'utf-8'));
364
+ if (cached.pageObjects && Array.isArray(cached.pageObjects)) {
365
+ return cached;
366
+ }
367
+ }
368
+ catch {
369
+ // Rebuild if cache is corrupt
370
+ }
371
+ }
372
+ const catalog = buildApiSurface(testsRoot, config);
373
+ try {
374
+ const dir = (0, path_1.join)(cachePath, '..');
375
+ if ((0, fs_1.existsSync)(dir)) {
376
+ (0, fs_1.writeFileSync)(cachePath, JSON.stringify(catalog, null, 2), 'utf-8');
377
+ }
378
+ }
379
+ catch {
380
+ // Cache write failure is non-fatal
381
+ }
382
+ return catalog;
383
+ }
384
+ function getMethodsForPageObject(catalog, className) {
385
+ const surface = catalog.pageObjects.find((po) => po.className === className);
386
+ return surface?.methods || [];
387
+ }
388
+ function validateMethodCall(catalog, className, methodName) {
389
+ const methods = getMethodsForPageObject(catalog, className);
390
+ return methods.some((m) => m.name === methodName);
391
+ }
392
+ function formatApiSurfaceForPrompt(catalog, classNames) {
393
+ const sections = [];
394
+ for (const name of classNames) {
395
+ const surface = catalog.pageObjects.find((po) => po.className === name);
396
+ if (!surface) {
397
+ continue;
398
+ }
399
+ const methodList = surface.methods
400
+ .map((m) => {
401
+ if (m.kind === 'property') {
402
+ return ` ${m.name} (property)`;
403
+ }
404
+ if (m.kind === 'getter') {
405
+ return ` get ${m.name}()`;
406
+ }
407
+ const prefix = m.async ? 'async ' : '';
408
+ const paramStr = m.params
409
+ ? m.params.map((p) => `${p.name}${p.optional ? '?' : ''}${p.type ? `: ${p.type}` : ''}`).join(', ')
410
+ : '';
411
+ const retStr = m.returnType ? `: ${m.returnType}` : '';
412
+ return ` ${prefix}${m.name}(${paramStr})${retStr}`;
413
+ })
414
+ .join('\n');
415
+ sections.push(`${name}:\n${methodList}`);
416
+ }
417
+ return sections.join('\n\n');
418
+ }