@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,350 @@
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.validateEntries = validateEntries;
6
+ exports.parseEnrichResponse = parseEnrichResponse;
7
+ exports.enrichFamilies = enrichFamilies;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const logger_js_1 = require("../logger.js");
11
+ const types_js_1 = require("./types.js");
12
+ const MAX_FILES_PER_FAMILY = 20;
13
+ const MAX_LINES_PER_FILE = 50;
14
+ const LLM_TIMEOUT_MS = 60000;
15
+ const MAX_PROMPT_CHARS = 100000;
16
+ const SENSITIVE_PATTERNS = [
17
+ /[._]env/, /secret/i, /credential/i, /\.pem$/, /\.key$/, /password/i,
18
+ /config\/secrets/, /fixtures\/.*auth/i, /\.npmrc/, /\.netrc/,
19
+ /id_rsa/, /id_ed25519/, /\.p12$/, /\.pfx$/, /tokens?\.json/i,
20
+ ];
21
+ const SKIP_DIRS = new Set([
22
+ 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt', 'coverage',
23
+ ]);
24
+ function sampleFiles(dir, maxFiles) {
25
+ const files = [];
26
+ function walk(d, depth = 0, maxDepth = 10) {
27
+ if (files.length >= maxFiles)
28
+ return;
29
+ if (depth > maxDepth)
30
+ return;
31
+ try {
32
+ for (const entry of (0, fs_1.readdirSync)(d)) {
33
+ if (files.length >= maxFiles)
34
+ return;
35
+ // Skip dot-dirs and known heavy directories
36
+ if (entry.startsWith('.') || SKIP_DIRS.has(entry))
37
+ continue;
38
+ const full = (0, path_1.join)(d, entry);
39
+ try {
40
+ // Skip symlinks
41
+ const lstat = (0, fs_1.lstatSync)(full);
42
+ if (lstat.isSymbolicLink())
43
+ continue;
44
+ // Skip sensitive files (test against relative path from scan root)
45
+ const relPath = (0, path_1.relative)(dir, full);
46
+ if (SENSITIVE_PATTERNS.some((p) => p.test(relPath) || p.test(entry)))
47
+ continue;
48
+ if (lstat.isDirectory()) {
49
+ walk(full, depth + 1, maxDepth);
50
+ }
51
+ else if (lstat.isFile() && lstat.size < 50000) {
52
+ const ext = entry.slice(entry.lastIndexOf('.'));
53
+ if (['.ts', '.tsx', '.js', '.jsx', '.go', '.py', '.rs'].includes(ext)) {
54
+ const content = (0, fs_1.readFileSync)(full, 'utf-8');
55
+ const lines = content.split('\n').slice(0, MAX_LINES_PER_FILE).join('\n');
56
+ files.push({ path: full, content: lines });
57
+ }
58
+ }
59
+ }
60
+ catch { /* skip */ }
61
+ }
62
+ }
63
+ catch { /* skip */ }
64
+ }
65
+ walk(dir);
66
+ return files;
67
+ }
68
+ /**
69
+ * Build a shallow directory listing of the source tree (depth 2-3) so the LLM
70
+ * can suggest accurate webappPaths / serverPaths for test-derived families.
71
+ */
72
+ function getSourceTreeListing(projectRoot, maxDepth = 3) {
73
+ const lines = [];
74
+ function walk(dir, depth, prefix) {
75
+ if (depth > maxDepth || lines.length > 200)
76
+ return;
77
+ let entries;
78
+ try {
79
+ entries = (0, fs_1.readdirSync)(dir).sort();
80
+ }
81
+ catch {
82
+ return;
83
+ }
84
+ const dirs = entries.filter((e) => {
85
+ if (e.startsWith('.') || SKIP_DIRS.has(e))
86
+ return false;
87
+ try {
88
+ const stat = (0, fs_1.lstatSync)((0, path_1.join)(dir, e));
89
+ return !stat.isSymbolicLink() && stat.isDirectory();
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ });
95
+ for (const d of dirs) {
96
+ lines.push(`${prefix}${d}/`);
97
+ walk((0, path_1.join)(dir, d), depth + 1, prefix + ' ');
98
+ }
99
+ }
100
+ walk((0, path_1.resolve)(projectRoot), 0, '');
101
+ return lines.join('\n');
102
+ }
103
+ function buildEnrichPrompt(families, projectRoot, testsRoot) {
104
+ const sections = [];
105
+ const hasTestOnlyFamilies = families.some((f) => f.webappPaths.length === 0 && f.serverPaths.length === 0);
106
+ const resolvedTestsRoot = testsRoot ? (0, path_1.resolve)(testsRoot) : (0, path_1.resolve)(projectRoot);
107
+ for (const family of families) {
108
+ const isTestOnly = family.webappPaths.length === 0 && family.serverPaths.length === 0;
109
+ const allDirs = [
110
+ ...family.webappPaths.map((p) => p.replace(/\/?\*.*$/, '')),
111
+ ...family.serverPaths.map((p) => p.replace(/\/?\*.*$/, '')),
112
+ ];
113
+ const samples = [];
114
+ for (const dir of allDirs) {
115
+ if (!dir)
116
+ continue;
117
+ const fullDir = (0, path_1.join)((0, path_1.resolve)(projectRoot), dir);
118
+ samples.push(...sampleFiles(fullDir, MAX_FILES_PER_FAMILY - samples.length));
119
+ if (samples.length >= MAX_FILES_PER_FAMILY)
120
+ break;
121
+ }
122
+ // For test-only families, sample the test files themselves for richer context
123
+ if (isTestOnly) {
124
+ for (const specDir of family.specDirs) {
125
+ if (samples.length >= MAX_FILES_PER_FAMILY)
126
+ break;
127
+ const fullDir = (0, path_1.join)(resolvedTestsRoot, specDir);
128
+ samples.push(...sampleFiles(fullDir, MAX_FILES_PER_FAMILY - samples.length));
129
+ }
130
+ }
131
+ // Sample spec descriptions
132
+ const specSamples = [];
133
+ for (const specDir of family.specDirs) {
134
+ const fullDir = (0, path_1.join)(resolvedTestsRoot, specDir);
135
+ const specFiles = sampleFiles(fullDir, 5);
136
+ for (const sf of specFiles) {
137
+ const matches = sf.content.match(/(?:test|it|describe)\s*\(\s*['"`]([^'"`]+)/g);
138
+ if (matches) {
139
+ specSamples.push(...matches.map((m) => m.replace(/(?:test|it|describe)\s*\(\s*['"`]/, '')));
140
+ }
141
+ }
142
+ }
143
+ sections.push(`## Family: ${family.id}${isTestOnly ? ' [TEST-ONLY — needs webappPaths/serverPaths]' : ''}
144
+ Routes (guessed): ${JSON.stringify(family.routes)}
145
+ Webapp paths: ${JSON.stringify(family.webappPaths)}
146
+ Server paths: ${JSON.stringify(family.serverPaths)}
147
+ Spec dirs: ${JSON.stringify(family.specDirs)}
148
+ Tags: ${JSON.stringify(family.tags)}
149
+ Features: ${family.features.map((f) => f.id).join(', ') || 'none'}
150
+
151
+ Sample files (${samples.length}):
152
+ ${samples.map((s) => `### ${(0, path_1.relative)(projectRoot, s.path)}\n\`\`\`\n${s.content}\n\`\`\``).join('\n')}
153
+
154
+ Test descriptions:
155
+ ${specSamples.length > 0 ? specSamples.map((d) => `- ${d}`).join('\n') : '(none found)'}
156
+ `);
157
+ }
158
+ // Include source tree listing when we have test-only families
159
+ const sourceTreeSection = hasTestOnlyFamilies
160
+ ? `\n## Source Directory Structure\nUse this to suggest accurate webappPaths and serverPaths for test-only families:\n\`\`\`\n${getSourceTreeListing(projectRoot)}\n\`\`\`\n`
161
+ : '';
162
+ return `You are analyzing a codebase to enrich route-family definitions for an E2E test impact analysis tool.
163
+
164
+ For each family below, provide:
165
+ 1. **priority**: P0 (critical user flow), P1 (important), or P2 (nice-to-have)
166
+ 2. **userFlows**: Array of human-readable flow names (e.g., "Create channel", "Search messages")
167
+ 3. **routes**: Improved URL patterns (e.g., "/{team}/channels/{channel}" instead of "/channels")
168
+ 4. **pageObjects**: Array of page object class names found in the code
169
+ 5. **components**: Array of UI component names relevant to this family
170
+ 6. **webappPaths**: Array of glob patterns for frontend source directories (e.g., "src/components/drafts/**"). REQUIRED for families marked [TEST-ONLY].
171
+ 7. **serverPaths**: Array of glob patterns for backend source directories. REQUIRED for families marked [TEST-ONLY].
172
+
173
+ Respond in JSON format:
174
+ \`\`\`json
175
+ [
176
+ {
177
+ "id": "family_id",
178
+ "priority": "P0",
179
+ "userFlows": ["Flow name 1", "Flow name 2"],
180
+ "routes": ["/improved/route/{param}"],
181
+ "pageObjects": ["PageName"],
182
+ "components": ["ComponentName"],
183
+ "webappPaths": ["src/components/feature_name/**"],
184
+ "serverPaths": ["server/channels/api4/feature.go"]
185
+ }
186
+ ]
187
+ \`\`\`
188
+ ${sourceTreeSection}
189
+ ${sections.join('\n---\n')}`;
190
+ }
191
+ function validateEntries(parsed) {
192
+ const filterStrings = (arr, maxLen) => {
193
+ if (!Array.isArray(arr))
194
+ return undefined;
195
+ const filtered = arr.filter((v) => typeof v === 'string' && v.length < maxLen);
196
+ return filtered.length > 0 ? filtered : undefined;
197
+ };
198
+ return parsed
199
+ .filter((e) => !!e && typeof e.id === 'string')
200
+ .map((entry) => ({
201
+ id: entry.id,
202
+ priority: ['P0', 'P1', 'P2'].includes(entry.priority) ? entry.priority : undefined,
203
+ routes: filterStrings(entry.routes, 200),
204
+ userFlows: filterStrings(entry.userFlows, 500),
205
+ pageObjects: filterStrings(entry.pageObjects, 200),
206
+ components: filterStrings(entry.components, 200),
207
+ webappPaths: filterStrings(entry.webappPaths, 300),
208
+ serverPaths: filterStrings(entry.serverPaths, 300),
209
+ }));
210
+ }
211
+ function parseEnrichResponse(response) {
212
+ // Extract JSON from response (may be wrapped in markdown code block)
213
+ const jsonMatch = response.match(/```(?:json)?\s*([\s\S]*?)```/) || [null, response];
214
+ const jsonStr = jsonMatch[1]?.trim() || response.trim();
215
+ try {
216
+ const parsed = JSON.parse(jsonStr);
217
+ if (Array.isArray(parsed)) {
218
+ return validateEntries(parsed);
219
+ }
220
+ }
221
+ catch {
222
+ // Try to find any JSON array in the response
223
+ const arrayMatch = response.match(/\[[\s\S]*\]/);
224
+ if (arrayMatch) {
225
+ try {
226
+ const parsed = JSON.parse(arrayMatch[0]);
227
+ if (Array.isArray(parsed)) {
228
+ return validateEntries(parsed);
229
+ }
230
+ }
231
+ catch {
232
+ // give up
233
+ }
234
+ }
235
+ }
236
+ return [];
237
+ }
238
+ function applyEnrichment(family, enriched) {
239
+ const result = { ...family };
240
+ if (enriched.priority && !family.priority) {
241
+ result.priority = enriched.priority;
242
+ }
243
+ if (enriched.userFlows && (!family.userFlows || family.userFlows.length === 0)) {
244
+ result.userFlows = enriched.userFlows;
245
+ }
246
+ if (enriched.routes && enriched.routes.length > 0) {
247
+ // Only replace if current routes look like guesses
248
+ if ((0, types_js_1.isGuessedRoute)(family.routes)) {
249
+ result.routes = enriched.routes;
250
+ }
251
+ }
252
+ if (enriched.pageObjects && (!family.pageObjects || family.pageObjects.length === 0)) {
253
+ result.pageObjects = enriched.pageObjects;
254
+ }
255
+ if (enriched.components && (!family.components || family.components.length === 0)) {
256
+ result.components = enriched.components;
257
+ }
258
+ // Only fill source paths when the family has none (test-derived families)
259
+ if (enriched.webappPaths && (!family.webappPaths || family.webappPaths.length === 0)) {
260
+ result.webappPaths = enriched.webappPaths;
261
+ }
262
+ if (enriched.serverPaths && (!family.serverPaths || family.serverPaths.length === 0)) {
263
+ result.serverPaths = enriched.serverPaths;
264
+ }
265
+ return result;
266
+ }
267
+ async function enrichFamilies(families, scanned, projectRoot, provider, budgetUSD, testsRoot) {
268
+ const scannedMap = new Map(scanned.map((s) => [s.id, s]));
269
+ const enriched = [];
270
+ let totalTokens = 0;
271
+ let totalCost = 0;
272
+ let requestCount = 0;
273
+ let totalResponseMs = 0;
274
+ const skipped = [];
275
+ // Process in chunks of 4 families
276
+ const chunkSize = 4;
277
+ for (let i = 0; i < families.length; i += chunkSize) {
278
+ if (totalCost >= budgetUSD) {
279
+ for (let j = i; j < families.length; j++) {
280
+ skipped.push(families[j].id);
281
+ enriched.push(families[j]);
282
+ }
283
+ break;
284
+ }
285
+ const chunk = families.slice(i, i + chunkSize);
286
+ const scannedChunk = chunk
287
+ .map((f) => scannedMap.get(f.id))
288
+ .filter((s) => s !== undefined);
289
+ if (scannedChunk.length === 0) {
290
+ enriched.push(...chunk);
291
+ continue;
292
+ }
293
+ let prompt = buildEnrichPrompt(scannedChunk, projectRoot, testsRoot);
294
+ if (prompt.length > MAX_PROMPT_CHARS) {
295
+ // Truncate at the last complete section boundary to avoid malformed input
296
+ const lastSectionEnd = prompt.lastIndexOf('\n---\n', MAX_PROMPT_CHARS);
297
+ if (lastSectionEnd > 0) {
298
+ logger_js_1.logger.warn(`[train] Prompt truncated from ${prompt.length} chars at section boundary`);
299
+ prompt = prompt.slice(0, lastSectionEnd);
300
+ }
301
+ else {
302
+ logger_js_1.logger.warn(`[train] Prompt truncated from ${prompt.length} to ${MAX_PROMPT_CHARS} chars`);
303
+ prompt = prompt.slice(0, MAX_PROMPT_CHARS);
304
+ }
305
+ }
306
+ let timeoutTimer;
307
+ try {
308
+ const timeoutPromise = new Promise((_, reject) => {
309
+ timeoutTimer = setTimeout(() => reject(new Error('LLM request timed out')), LLM_TIMEOUT_MS);
310
+ });
311
+ const reqStart = performance.now();
312
+ const response = await Promise.race([
313
+ provider.generateText(prompt, { maxTokens: 4096, temperature: 0.3 }),
314
+ timeoutPromise,
315
+ ]);
316
+ totalResponseMs += performance.now() - reqStart;
317
+ requestCount++;
318
+ totalTokens += (response.usage?.inputTokens ?? 0) + (response.usage?.outputTokens ?? 0);
319
+ totalCost += response.cost ?? 0;
320
+ const entries = parseEnrichResponse(response.text);
321
+ const entryMap = new Map(entries.map((e) => [e.id, e]));
322
+ for (const family of chunk) {
323
+ const entry = entryMap.get(family.id);
324
+ if (entry) {
325
+ enriched.push(applyEnrichment(family, entry));
326
+ }
327
+ else {
328
+ enriched.push(family);
329
+ }
330
+ }
331
+ }
332
+ catch (error) {
333
+ // On LLM failure, keep families unchanged
334
+ logger_js_1.logger.warn(`[train] LLM enrichment failed for chunk: ${error instanceof Error ? error.message : String(error)}`);
335
+ enriched.push(...chunk);
336
+ }
337
+ finally {
338
+ if (timeoutTimer)
339
+ clearTimeout(timeoutTimer);
340
+ }
341
+ }
342
+ return {
343
+ enrichedFamilies: enriched,
344
+ tokensUsed: totalTokens,
345
+ costUSD: Math.round(totalCost * 100) / 100,
346
+ skippedFamilies: skipped,
347
+ requestCount,
348
+ avgResponseMs: requestCount > 0 ? Math.round(totalResponseMs / requestCount) : 0,
349
+ };
350
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Converts an Understand-Anything knowledge graph into the same ScanResult
3
+ * format produced by the filesystem scanner. This allows the existing
4
+ * merge/enrich/validate pipeline to work unchanged with KG input.
5
+ */
6
+ import type { KnowledgeGraph } from '../knowledge/kg_types.js';
7
+ import type { ScanResult } from './types.js';
8
+ /**
9
+ * Converts KG nodes/edges into a ScanResult compatible with the filesystem scanner output.
10
+ * Groups nodes by their containing module/directory to form families.
11
+ */
12
+ export declare function scanFromKnowledgeGraph(kg: KnowledgeGraph): ScanResult;
13
+ //# sourceMappingURL=kg_scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg_scanner.d.ts","sourceRoot":"","sources":["../../src/training/kg_scanner.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAS,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAC,UAAU,EAAgC,MAAM,YAAY,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,cAAc,GAAG,UAAU,CA4FrE"}
@@ -0,0 +1,118 @@
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.scanFromKnowledgeGraph = scanFromKnowledgeGraph;
6
+ const cluster_utils_js_1 = require("../knowledge/cluster_utils.js");
7
+ /**
8
+ * Converts KG nodes/edges into a ScanResult compatible with the filesystem scanner output.
9
+ * Groups nodes by their containing module/directory to form families.
10
+ */
11
+ function scanFromKnowledgeGraph(kg) {
12
+ const clusters = new Map();
13
+ // Group nodes into clusters by directory/module
14
+ for (const node of kg.nodes) {
15
+ if (node.layer === 'infra')
16
+ continue; // skip infrastructure nodes
17
+ const clusterId = (0, cluster_utils_js_1.deriveClusterId)(node, cluster_utils_js_1.SKIP_DIRS_WITH_TESTS);
18
+ if (!clusterId)
19
+ continue;
20
+ if (!clusters.has(clusterId)) {
21
+ clusters.set(clusterId, []);
22
+ }
23
+ clusters.get(clusterId).push(node);
24
+ }
25
+ let totalSourceFiles = 0;
26
+ let totalTestFiles = 0;
27
+ const families = [];
28
+ for (const [id, nodes] of clusters) {
29
+ const webappPaths = [];
30
+ const serverPaths = [];
31
+ const specDirs = [];
32
+ const tags = [];
33
+ const seenDirs = new Set();
34
+ for (const node of nodes) {
35
+ if (!node.filePath)
36
+ continue;
37
+ const normalized = node.filePath.replace(/\\/g, '/');
38
+ if (node.layer === 'test') {
39
+ totalTestFiles++;
40
+ const dir = normalized.split('/').slice(0, -1).join('/');
41
+ if (dir && !seenDirs.has(dir)) {
42
+ seenDirs.add(dir);
43
+ specDirs.push(dir + '/');
44
+ }
45
+ continue;
46
+ }
47
+ totalSourceFiles++;
48
+ const glob = buildGlobFromPath(normalized);
49
+ if (node.layer === 'api' || node.layer === 'service' || node.layer === 'data') {
50
+ serverPaths.push(glob);
51
+ }
52
+ else if (node.layer === 'ui') {
53
+ webappPaths.push(glob);
54
+ }
55
+ else {
56
+ // Default assignment based on file path heuristics
57
+ if (isLikelyServerPath(normalized)) {
58
+ serverPaths.push(glob);
59
+ }
60
+ else {
61
+ webappPaths.push(glob);
62
+ }
63
+ }
64
+ // Extract tags from node metadata
65
+ if (node.tags) {
66
+ tags.push(...node.tags);
67
+ }
68
+ }
69
+ if (webappPaths.length === 0 && serverPaths.length === 0 && specDirs.length === 0) {
70
+ continue;
71
+ }
72
+ families.push({
73
+ id,
74
+ routes: [`/${id}`],
75
+ webappPaths: [...new Set(webappPaths)],
76
+ serverPaths: [...new Set(serverPaths)],
77
+ specDirs: [...new Set(specDirs)],
78
+ cypressSpecDirs: [],
79
+ tags: [...new Set(tags)],
80
+ features: [],
81
+ routesGuessed: true,
82
+ });
83
+ }
84
+ return {
85
+ families,
86
+ unmatchedSourceDirs: [],
87
+ unmatchedTestDirs: [],
88
+ stats: {
89
+ totalSourceFiles,
90
+ totalTestFiles,
91
+ familyCount: families.length,
92
+ },
93
+ };
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Internal helpers
97
+ // ---------------------------------------------------------------------------
98
+ // deriveClusterId and deriveClusterIdFromPath imported from cluster_utils.ts
99
+ function buildGlobFromPath(filePath) {
100
+ // Reject paths with traversal or null bytes
101
+ if (filePath.includes('..') || filePath.includes('\0')) {
102
+ return '';
103
+ }
104
+ // Convert a file path to a glob pattern matching the directory
105
+ const dir = filePath.split('/').slice(0, -1).join('/');
106
+ return dir ? `${dir}/*` : `${filePath}*`;
107
+ }
108
+ function isLikelyServerPath(filePath) {
109
+ const lower = filePath.toLowerCase();
110
+ return lower.includes('/server/') ||
111
+ lower.includes('/api/') ||
112
+ lower.includes('/routes/') ||
113
+ lower.includes('/controllers/') ||
114
+ lower.includes('/services/') ||
115
+ lower.includes('/models/') ||
116
+ lower.endsWith('.go') ||
117
+ lower.endsWith('.py');
118
+ }
@@ -0,0 +1,15 @@
1
+ import type { RouteFamilyManifest } from '../knowledge/route_families.js';
2
+ import type { MergeResult, ScannedFamily } from './types.js';
3
+ export declare function mergeFamilies(existing: RouteFamilyManifest | null, scanned: ScannedFamily[]): MergeResult;
4
+ /**
5
+ * Detect families whose paths no longer exist on disk.
6
+ *
7
+ * Paths in the manifest may be relative to different roots:
8
+ * - webappPaths / serverPaths are typically relative to the repo root
9
+ * - specDirs may be relative to the tests root
10
+ *
11
+ * We try each pattern against all provided roots (and the git repo root
12
+ * if discoverable) to avoid false positives from path-prefix mismatches.
13
+ */
14
+ export declare function detectStaleFamilies(manifest: RouteFamilyManifest, projectRoot: string, testsRoot?: string): string[];
15
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/training/merger.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAGrF,OAAO,KAAK,EAAC,WAAW,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAkF3D,wBAAgB,aAAa,CACzB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,OAAO,EAAE,aAAa,EAAE,GACzB,WAAW,CA+Cb;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACnB,MAAM,EAAE,CA6DV"}