@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,388 @@
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.loadKnowledgeGraph = loadKnowledgeGraph;
6
+ exports.classifyProjectType = classifyProjectType;
7
+ exports.transformKGToFamilies = transformKGToFamilies;
8
+ exports.loadDiffOverlay = loadDiffOverlay;
9
+ exports.diffOverlayToChangedFiles = diffOverlayToChangedFiles;
10
+ /**
11
+ * Bridge between Understand-Anything's knowledge graph and impact-gate' route families.
12
+ * Transforms KG nodes/edges into RouteFamilyManifest so existing pipeline works unchanged.
13
+ */
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const logger_js_1 = require("../logger.js");
17
+ const cluster_utils_js_1 = require("./cluster_utils.js");
18
+ const UA_DIR = '.understand-anything';
19
+ const KG_FILE = 'knowledge-graph.json';
20
+ const DIFF_FILE = 'diff-overlay.json';
21
+ const FRONTEND_FRAMEWORKS = new Set([
22
+ 'react', 'vue', 'angular', 'svelte', 'next', 'nextjs', 'next.js',
23
+ 'nuxt', 'nuxtjs', 'gatsby', 'remix', 'astro', 'solid', 'solidjs',
24
+ 'preact', 'lit', 'stencil', 'qwik',
25
+ ]);
26
+ const BACKEND_FRAMEWORKS = new Set([
27
+ 'express', 'fastify', 'koa', 'hapi', 'nest', 'nestjs',
28
+ 'django', 'flask', 'fastapi', 'rails', 'spring', 'gin', 'echo', 'fiber',
29
+ 'actix', 'axum', 'rocket', 'phoenix', 'laravel',
30
+ ]);
31
+ /**
32
+ * Loads the knowledge graph from .understand-anything/knowledge-graph.json
33
+ * or from a custom path when provided.
34
+ */
35
+ function loadKnowledgeGraph(projectRoot, customPath) {
36
+ const kgPath = customPath || (0, path_1.join)(projectRoot, UA_DIR, KG_FILE);
37
+ if (!(0, fs_1.existsSync)(kgPath)) {
38
+ return null;
39
+ }
40
+ try {
41
+ const raw = JSON.parse((0, fs_1.readFileSync)(kgPath, 'utf-8'));
42
+ if (!raw.nodes || !Array.isArray(raw.nodes) || !raw.edges || !Array.isArray(raw.edges)) {
43
+ logger_js_1.logger.warn('Knowledge graph missing required nodes/edges arrays');
44
+ return null;
45
+ }
46
+ if (!raw.project) {
47
+ logger_js_1.logger.warn('Knowledge graph missing project metadata');
48
+ return null;
49
+ }
50
+ // Field-level validation: filter out invalid nodes rather than rejecting the whole graph
51
+ const MAX_STRING_LEN = 1000;
52
+ const validNodes = raw.nodes.filter((node) => {
53
+ if (typeof node.id !== 'string' || typeof node.name !== 'string') {
54
+ logger_js_1.logger.warn(`Dropping KG node with missing/invalid id or name: ${JSON.stringify(node).slice(0, 200)}`);
55
+ return false;
56
+ }
57
+ if (node.filePath !== undefined) {
58
+ if (typeof node.filePath !== 'string') {
59
+ logger_js_1.logger.warn(`Dropping KG node "${node.id}": filePath is not a string`);
60
+ return false;
61
+ }
62
+ if (node.filePath.startsWith('/')) {
63
+ logger_js_1.logger.warn(`Dropping KG node "${node.id}": absolute filePath rejected`);
64
+ return false;
65
+ }
66
+ if (node.filePath.includes('..')) {
67
+ logger_js_1.logger.warn(`Dropping KG node "${node.id}": path traversal in filePath rejected`);
68
+ return false;
69
+ }
70
+ if (node.filePath.includes('\0')) {
71
+ logger_js_1.logger.warn(`Dropping KG node "${node.id}": null byte in filePath rejected`);
72
+ return false;
73
+ }
74
+ }
75
+ return true;
76
+ });
77
+ // Truncate excessively long strings
78
+ for (const node of validNodes) {
79
+ if (node.name.length > MAX_STRING_LEN) {
80
+ node.name = node.name.slice(0, MAX_STRING_LEN);
81
+ }
82
+ if (node.description && node.description.length > MAX_STRING_LEN) {
83
+ node.description = node.description.slice(0, MAX_STRING_LEN);
84
+ }
85
+ }
86
+ raw.nodes = validNodes;
87
+ return raw;
88
+ }
89
+ catch (error) {
90
+ logger_js_1.logger.warn(`Failed to load knowledge graph: ${error instanceof Error ? error.message : String(error)}`);
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Classifies project type based on KG framework metadata.
96
+ */
97
+ function classifyProjectType(kg) {
98
+ const frameworks = kg.project.frameworks.map((f) => f.toLowerCase());
99
+ const hasFrontend = frameworks.some((f) => FRONTEND_FRAMEWORKS.has(f));
100
+ const hasBackend = frameworks.some((f) => BACKEND_FRAMEWORKS.has(f));
101
+ if (hasFrontend && hasBackend)
102
+ return 'fullstack';
103
+ if (hasBackend)
104
+ return 'backend';
105
+ return 'frontend';
106
+ }
107
+ /**
108
+ * Core bridge: transforms KG into a RouteFamilyManifest.
109
+ *
110
+ * Strategy:
111
+ * - Frontend: cluster UI-layer nodes into families by module/component groups
112
+ * - Backend: cluster API-layer nodes, follow calls edges into Service→Data layers
113
+ * - Priority: P0 = high fan-in nodes, P1 = moderate, P2 = leaf/utility
114
+ * - userFlows: derived from KG tour steps referencing family nodes
115
+ */
116
+ function transformKGToFamilies(kg) {
117
+ const projectType = classifyProjectType(kg);
118
+ const nodeMap = new Map(kg.nodes.map((n) => [n.id, n]));
119
+ const edgesByTarget = groupEdges(kg.edges, 'target');
120
+ // Build clusters based on project type
121
+ const clusters = buildClusters(kg, projectType, nodeMap);
122
+ // Transform clusters into route families
123
+ const families = [];
124
+ for (const [clusterId, nodeIds] of clusters) {
125
+ const nodes = nodeIds.map((id) => nodeMap.get(id)).filter((n) => n !== undefined);
126
+ if (nodes.length === 0)
127
+ continue;
128
+ const family = buildFamilyFromCluster(clusterId, nodes, projectType, nodeMap, edgesByTarget);
129
+ if (family) {
130
+ families.push(family);
131
+ }
132
+ }
133
+ // Derive userFlows from KG tour steps
134
+ if (kg.tour && kg.tour.length > 0) {
135
+ assignTourFlows(families, kg.tour, nodeMap);
136
+ }
137
+ // Sort by priority (P0 first) then alphabetically
138
+ families.sort((a, b) => {
139
+ const pOrder = { P0: 0, P1: 1, P2: 2 };
140
+ const pa = pOrder[a.priority || 'P2'];
141
+ const pb = pOrder[b.priority || 'P2'];
142
+ if (pa !== pb)
143
+ return pa - pb;
144
+ return a.id.localeCompare(b.id);
145
+ });
146
+ return {
147
+ families,
148
+ source: 'knowledge-graph',
149
+ };
150
+ }
151
+ /**
152
+ * Loads the diff overlay from .understand-anything/diff-overlay.json
153
+ */
154
+ function loadDiffOverlay(projectRoot) {
155
+ const overlayPath = (0, path_1.join)(projectRoot, UA_DIR, DIFF_FILE);
156
+ if (!(0, fs_1.existsSync)(overlayPath)) {
157
+ return null;
158
+ }
159
+ try {
160
+ const raw = JSON.parse((0, fs_1.readFileSync)(overlayPath, 'utf-8'));
161
+ if (!raw.changes || !Array.isArray(raw.changes)) {
162
+ return null;
163
+ }
164
+ return raw;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ /**
171
+ * Maps diff overlay changes to file paths using KG node resolution.
172
+ */
173
+ function diffOverlayToChangedFiles(overlay, kg) {
174
+ const nodeMap = new Map(kg.nodes.map((n) => [n.id, n]));
175
+ const files = new Set();
176
+ for (const change of overlay.changes) {
177
+ // Use filePath from change if available
178
+ if (change.filePath) {
179
+ files.add(change.filePath);
180
+ continue;
181
+ }
182
+ // Fall back to KG node's filePath
183
+ const node = nodeMap.get(change.nodeId);
184
+ if (node?.filePath) {
185
+ files.add(node.filePath);
186
+ }
187
+ }
188
+ return [...files];
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // Internal helpers
192
+ // ---------------------------------------------------------------------------
193
+ function groupEdges(edges, key) {
194
+ const map = new Map();
195
+ for (const edge of edges) {
196
+ const val = edge[key];
197
+ if (!map.has(val))
198
+ map.set(val, []);
199
+ map.get(val).push(edge);
200
+ }
201
+ return map;
202
+ }
203
+ /**
204
+ * Build clusters of related nodes to become families.
205
+ * Frontend: group by route/page/component modules
206
+ * Backend: group by API endpoint handlers + their service dependencies
207
+ */
208
+ function buildClusters(kg, projectType, nodeMap) {
209
+ const clusters = new Map();
210
+ // Strategy 1: Use KG layers to find anchor nodes
211
+ const layerMap = new Map();
212
+ if (kg.layers) {
213
+ for (const layer of kg.layers) {
214
+ layerMap.set(layer.name, new Set(layer.nodeIds));
215
+ }
216
+ }
217
+ // Strategy 2: Group by module/component/route nodes
218
+ const anchorKinds = projectType === 'backend'
219
+ ? new Set(['module', 'route', 'class', 'function'])
220
+ : new Set(['component', 'route', 'module', 'class']);
221
+ const anchorLayers = projectType === 'backend'
222
+ ? new Set(['api', 'service'])
223
+ : new Set(['ui']);
224
+ for (const node of kg.nodes) {
225
+ // Skip test/infra nodes as cluster anchors
226
+ if (node.layer === 'test' || node.layer === 'infra')
227
+ continue;
228
+ const isAnchorKind = anchorKinds.has(node.kind);
229
+ const isAnchorLayer = !node.layer || anchorLayers.has(node.layer);
230
+ if (!isAnchorKind || !isAnchorLayer)
231
+ continue;
232
+ // Derive cluster ID from node path or name
233
+ const clusterId = (0, cluster_utils_js_1.deriveClusterId)(node);
234
+ if (!clusterId)
235
+ continue;
236
+ if (!clusters.has(clusterId)) {
237
+ clusters.set(clusterId, []);
238
+ }
239
+ clusters.get(clusterId).push(node.id);
240
+ }
241
+ // If no clusters found, fall back to file-based grouping
242
+ if (clusters.size === 0) {
243
+ for (const node of kg.nodes) {
244
+ if (!node.filePath || node.layer === 'test' || node.layer === 'infra')
245
+ continue;
246
+ const clusterId = (0, cluster_utils_js_1.deriveClusterIdFromPath)(node.filePath);
247
+ if (!clusterId)
248
+ continue;
249
+ if (!clusters.has(clusterId)) {
250
+ clusters.set(clusterId, []);
251
+ }
252
+ clusters.get(clusterId).push(node.id);
253
+ }
254
+ }
255
+ return clusters;
256
+ }
257
+ // deriveClusterId and deriveClusterIdFromPath imported from cluster_utils.ts
258
+ function computePriority(nodes) {
259
+ const maxFanIn = Math.max(...nodes.map((n) => n.fanIn || 0));
260
+ if (maxFanIn >= 10)
261
+ return 'P0';
262
+ if (maxFanIn >= 4)
263
+ return 'P1';
264
+ return 'P2';
265
+ }
266
+ function buildFamilyFromCluster(clusterId, nodes, projectType, nodeMap, edgesByTarget) {
267
+ const webappPaths = new Set();
268
+ const serverPaths = new Set();
269
+ const routes = [];
270
+ const apiEndpoints = [];
271
+ for (const node of nodes) {
272
+ if (!node.filePath)
273
+ continue;
274
+ const layer = node.layer;
275
+ if (layer === 'api' || layer === 'service' || layer === 'data') {
276
+ serverPaths.add(`${node.filePath}*`);
277
+ }
278
+ else if (layer === 'ui') {
279
+ webappPaths.add(`${node.filePath}*`);
280
+ }
281
+ else {
282
+ // Auto-assign based on project type
283
+ if (projectType === 'backend') {
284
+ serverPaths.add(`${node.filePath}*`);
285
+ }
286
+ else {
287
+ webappPaths.add(`${node.filePath}*`);
288
+ }
289
+ }
290
+ // Extract routes from route nodes
291
+ if (node.kind === 'route') {
292
+ const routePath = node.metadata?.path;
293
+ if (routePath) {
294
+ routes.push(routePath);
295
+ // Extract API endpoint info
296
+ const method = node.metadata?.method || 'GET';
297
+ apiEndpoints.push({ method: method.toUpperCase(), path: routePath, description: node.description });
298
+ }
299
+ else {
300
+ routes.push(`/${clusterId}`);
301
+ }
302
+ }
303
+ }
304
+ // If no routes extracted, generate a default
305
+ if (routes.length === 0) {
306
+ routes.push(`/${clusterId}`);
307
+ }
308
+ // Collect related test file paths by following 'tests' edges
309
+ const specDirs = new Set();
310
+ for (const node of nodes) {
311
+ const testEdges = (edgesByTarget.get(node.id) || []).filter((e) => e.type === 'tests');
312
+ for (const edge of testEdges) {
313
+ const testNode = nodeMap.get(edge.source);
314
+ if (testNode?.filePath) {
315
+ // Use directory of test file
316
+ const dir = testNode.filePath.replace(/\\/g, '/').split('/').slice(0, -1).join('/');
317
+ if (dir)
318
+ specDirs.add(`${dir}/*`);
319
+ }
320
+ }
321
+ }
322
+ const priority = computePriority(nodes);
323
+ // Determine test type based on content
324
+ let testType;
325
+ if (webappPaths.size > 0 && serverPaths.size > 0) {
326
+ testType = 'both';
327
+ }
328
+ else if (serverPaths.size > 0 && apiEndpoints.length > 0) {
329
+ testType = 'api';
330
+ }
331
+ else if (webappPaths.size > 0) {
332
+ testType = 'ui';
333
+ }
334
+ const family = {
335
+ id: clusterId,
336
+ routes: [...new Set(routes)],
337
+ priority,
338
+ };
339
+ if (webappPaths.size > 0)
340
+ family.webappPaths = [...webappPaths];
341
+ if (serverPaths.size > 0)
342
+ family.serverPaths = [...serverPaths];
343
+ if (specDirs.size > 0)
344
+ family.specDirs = [...specDirs];
345
+ if (apiEndpoints.length > 0)
346
+ family.apiEndpoints = apiEndpoints;
347
+ if (testType)
348
+ family.testType = testType;
349
+ return family;
350
+ }
351
+ function assignTourFlows(families, tour, nodeMap) {
352
+ if (!tour)
353
+ return;
354
+ // Build a map of nodeId → family for quick lookup
355
+ const nodeToFamily = new Map();
356
+ for (const family of families) {
357
+ // Resolve family nodes from paths
358
+ for (const [nodeId, node] of nodeMap) {
359
+ if (!node.filePath)
360
+ continue;
361
+ const matchesPaths = [
362
+ ...(family.webappPaths || []),
363
+ ...(family.serverPaths || []),
364
+ ];
365
+ for (const pattern of matchesPaths) {
366
+ const prefix = pattern.replace(/\*$/, '');
367
+ if (node.filePath.startsWith(prefix)) {
368
+ nodeToFamily.set(nodeId, family);
369
+ break;
370
+ }
371
+ }
372
+ }
373
+ }
374
+ // Assign tour steps as user flows
375
+ for (const step of tour.sort((a, b) => a.order - b.order)) {
376
+ for (const nodeId of step.nodeIds) {
377
+ const family = nodeToFamily.get(nodeId);
378
+ if (family) {
379
+ if (!family.userFlows)
380
+ family.userFlows = [];
381
+ const flowDesc = `${step.title}: ${step.description}`;
382
+ if (!family.userFlows.includes(flowDesc)) {
383
+ family.userFlows.push(flowDesc);
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * TypeScript interfaces matching Understand-Anything's knowledge-graph.json schema.
3
+ * These types enable the bridge between UA's knowledge graph and impact-gate' route families.
4
+ */
5
+ export type KGNodeKind = 'file' | 'function' | 'class' | 'module' | 'concept' | 'component' | 'route' | 'hook' | 'type' | 'variable';
6
+ export type KGEdgeType = 'imports' | 'exports' | 'calls' | 'implements' | 'extends' | 'uses' | 'renders' | 'routes_to' | 'provides' | 'consumes' | 'tests' | 'configures' | 'depends_on' | 'contains' | 'composed_of' | 'handles' | 'emits' | 'listens_to';
7
+ export type KGLayerName = 'ui' | 'api' | 'service' | 'data' | 'config' | 'test' | 'infra' | 'shared';
8
+ export interface KGNode {
9
+ id: string;
10
+ kind: KGNodeKind;
11
+ name: string;
12
+ filePath?: string;
13
+ layer?: KGLayerName;
14
+ description?: string;
15
+ tags?: string[];
16
+ /** Fan-in: number of other nodes referencing this one */
17
+ fanIn?: number;
18
+ /** Fan-out: number of nodes this one references */
19
+ fanOut?: number;
20
+ metadata?: Record<string, unknown>;
21
+ }
22
+ export interface KGEdge {
23
+ source: string;
24
+ target: string;
25
+ type: KGEdgeType;
26
+ weight?: number;
27
+ metadata?: Record<string, unknown>;
28
+ }
29
+ export interface KGLayer {
30
+ name: KGLayerName;
31
+ nodeIds: string[];
32
+ description?: string;
33
+ }
34
+ export interface KGTourStep {
35
+ id: string;
36
+ title: string;
37
+ description: string;
38
+ nodeIds: string[];
39
+ order: number;
40
+ }
41
+ export interface KGProject {
42
+ name: string;
43
+ description?: string;
44
+ frameworks: string[];
45
+ languages: string[];
46
+ entryPoints?: string[];
47
+ rootDir?: string;
48
+ }
49
+ export interface KnowledgeGraph {
50
+ version: string;
51
+ project: KGProject;
52
+ nodes: KGNode[];
53
+ edges: KGEdge[];
54
+ layers?: KGLayer[];
55
+ tour?: KGTourStep[];
56
+ }
57
+ export interface DiffOverlayChange {
58
+ nodeId: string;
59
+ changeType: 'added' | 'modified' | 'removed';
60
+ filePath?: string;
61
+ description?: string;
62
+ }
63
+ export interface DiffOverlay {
64
+ version: string;
65
+ baseSha?: string;
66
+ headSha?: string;
67
+ changes: DiffOverlayChange[];
68
+ affectedEdges?: Array<{
69
+ source: string;
70
+ target: string;
71
+ type: KGEdgeType;
72
+ impact: 'added' | 'modified' | 'removed';
73
+ }>;
74
+ }
75
+ //# sourceMappingURL=kg_types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg_types.d.ts","sourceRoot":"","sources":["../../src/knowledge/kg_types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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 });
@@ -0,0 +1,98 @@
1
+ export type FeaturePriority = 'P0' | 'P1' | 'P2';
2
+ export type AssertionType = 'state-change' | 'cross-user' | 'persistence' | 'negative' | 'permission' | 'data-integrity' | 'error-handling';
3
+ export interface AssertionPattern {
4
+ type: AssertionType;
5
+ pattern: string;
6
+ }
7
+ export interface RouteFeature {
8
+ id: string;
9
+ routes?: string[];
10
+ webappPaths?: string[];
11
+ serverPaths?: string[];
12
+ specDirs?: string[];
13
+ cypressSpecDirs?: string[];
14
+ tags?: string[];
15
+ priority?: FeaturePriority;
16
+ userFlows?: string[];
17
+ assertionPatterns?: AssertionPattern[];
18
+ }
19
+ export interface ApiEndpoint {
20
+ method: string;
21
+ path: string;
22
+ description?: string;
23
+ }
24
+ export type TestType = 'ui' | 'api' | 'both';
25
+ export interface RouteFamily {
26
+ id: string;
27
+ routes: string[];
28
+ pageObjects?: string[];
29
+ components?: string[];
30
+ webappPaths?: string[];
31
+ serverPaths?: string[];
32
+ specDirs?: string[];
33
+ cypressSpecDirs?: string[];
34
+ tags?: string[];
35
+ priority?: FeaturePriority;
36
+ userFlows?: string[];
37
+ features?: RouteFeature[];
38
+ apiEndpoints?: ApiEndpoint[];
39
+ testType?: TestType;
40
+ assertionPatterns?: AssertionPattern[];
41
+ }
42
+ export interface RouteFamilyManifest {
43
+ families: RouteFamily[];
44
+ source: string;
45
+ }
46
+ export interface FileBinding {
47
+ file: string;
48
+ bindings: Array<{
49
+ family: string;
50
+ feature?: string;
51
+ }>;
52
+ }
53
+ export interface RouteFamilyConfig {
54
+ manifestPath?: string;
55
+ strict?: boolean;
56
+ }
57
+ export declare function matchesGlob(filePath: string, pattern: string): boolean;
58
+ export declare function matchesAnyPattern(filePath: string, patterns: string[]): boolean;
59
+ export declare function loadRouteFamilyManifest(testsRoot: string, config?: RouteFamilyConfig): RouteFamilyManifest | null;
60
+ export declare function bindFilesToFamilies(changedFiles: string[], manifest: RouteFamilyManifest): FileBinding[];
61
+ export declare function getFamilyById(manifest: RouteFamilyManifest, familyId: string): RouteFamily | undefined;
62
+ export declare function getFeatureById(family: RouteFamily, featureId: string): RouteFeature | undefined;
63
+ export declare function getSpecDirsForBinding(manifest: RouteFamilyManifest, binding: {
64
+ family: string;
65
+ feature?: string;
66
+ }): string[];
67
+ export declare function getCypressSpecDirsForBinding(manifest: RouteFamilyManifest, binding: {
68
+ family: string;
69
+ feature?: string;
70
+ }): string[];
71
+ export declare function getPriorityForBinding(manifest: RouteFamilyManifest, binding: {
72
+ family: string;
73
+ feature?: string;
74
+ }): FeaturePriority;
75
+ export declare function getUserFlowsForBinding(manifest: RouteFamilyManifest, binding: {
76
+ family: string;
77
+ feature?: string;
78
+ }): string[];
79
+ export declare function getRoutesForBinding(manifest: RouteFamilyManifest, binding: {
80
+ family: string;
81
+ feature?: string;
82
+ }): string[];
83
+ export declare function getAssertionPatternsForBinding(manifest: RouteFamilyManifest, binding: {
84
+ family: string;
85
+ feature?: string;
86
+ }): AssertionPattern[];
87
+ export declare function clearManifestCache(): void;
88
+ /**
89
+ * Build heuristic route families from changed files when no manifest exists.
90
+ * Groups files by their top-level directory to create rough family groupings.
91
+ * Results are lower confidence but allow analysis to proceed without training.
92
+ */
93
+ export declare function buildHeuristicFamilies(changedFiles: string[], testsRoot: string): RouteFamilyManifest;
94
+ /**
95
+ * Serialize a RouteFamilyManifest to clean JSON, stripping empty optional fields.
96
+ */
97
+ export declare function serializeManifest(manifest: RouteFamilyManifest): string;
98
+ //# sourceMappingURL=route_families.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route_families.d.ts","sourceRoot":"","sources":["../../src/knowledge/route_families.ts"],"names":[],"mappings":"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"}