@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.
- package/LICENSE +168 -0
- package/README.md +520 -0
- package/dist/adapters/cypress.d.ts +10 -0
- package/dist/adapters/cypress.d.ts.map +1 -0
- package/dist/adapters/cypress.js +86 -0
- package/dist/adapters/framework_adapter.d.ts +41 -0
- package/dist/adapters/framework_adapter.d.ts.map +1 -0
- package/dist/adapters/framework_adapter.js +152 -0
- package/dist/adapters/playwright.d.ts +10 -0
- package/dist/adapters/playwright.d.ts.map +1 -0
- package/dist/adapters/playwright.js +86 -0
- package/dist/adapters/pytest.d.ts +10 -0
- package/dist/adapters/pytest.d.ts.map +1 -0
- package/dist/adapters/pytest.js +96 -0
- package/dist/adapters/supertest.d.ts +12 -0
- package/dist/adapters/supertest.d.ts.map +1 -0
- package/dist/adapters/supertest.js +85 -0
- package/dist/agent/api_catalog.d.ts +11 -0
- package/dist/agent/api_catalog.d.ts.map +1 -0
- package/dist/agent/api_catalog.js +210 -0
- package/dist/agent/config.d.ts +193 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +875 -0
- package/dist/agent/feedback.d.ts +91 -0
- package/dist/agent/feedback.d.ts.map +1 -0
- package/dist/agent/feedback.js +323 -0
- package/dist/agent/git.d.ts +19 -0
- package/dist/agent/git.d.ts.map +1 -0
- package/dist/agent/git.js +257 -0
- package/dist/agent/handoff.d.ts +22 -0
- package/dist/agent/handoff.d.ts.map +1 -0
- package/dist/agent/handoff.js +180 -0
- package/dist/agent/llm_agents_flow.d.ts +15 -0
- package/dist/agent/llm_agents_flow.d.ts.map +1 -0
- package/dist/agent/llm_agents_flow.js +434 -0
- package/dist/agent/native_flow.d.ts +6 -0
- package/dist/agent/native_flow.d.ts.map +1 -0
- package/dist/agent/native_flow.js +179 -0
- package/dist/agent/pipeline.d.ts +7 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +260 -0
- package/dist/agent/pipeline_types.d.ts +54 -0
- package/dist/agent/pipeline_types.d.ts.map +1 -0
- package/dist/agent/pipeline_types.js +4 -0
- package/dist/agent/pipeline_utils.d.ts +12 -0
- package/dist/agent/pipeline_utils.d.ts.map +1 -0
- package/dist/agent/pipeline_utils.js +156 -0
- package/dist/agent/plan.d.ts +170 -0
- package/dist/agent/plan.d.ts.map +1 -0
- package/dist/agent/plan.js +86 -0
- package/dist/agent/playwright_report.d.ts +8 -0
- package/dist/agent/playwright_report.d.ts.map +1 -0
- package/dist/agent/playwright_report.js +126 -0
- package/dist/agent/process_runner.d.ts +10 -0
- package/dist/agent/process_runner.d.ts.map +1 -0
- package/dist/agent/process_runner.js +92 -0
- package/dist/agent/spec_generator.d.ts +5 -0
- package/dist/agent/spec_generator.d.ts.map +1 -0
- package/dist/agent/spec_generator.js +253 -0
- package/dist/agent/test_path.d.ts +2 -0
- package/dist/agent/test_path.d.ts.map +1 -0
- package/dist/agent/test_path.js +23 -0
- package/dist/agent/traceability_capture.d.ts +18 -0
- package/dist/agent/traceability_capture.d.ts.map +1 -0
- package/dist/agent/traceability_capture.js +313 -0
- package/dist/agent/traceability_ingest.d.ts +21 -0
- package/dist/agent/traceability_ingest.d.ts.map +1 -0
- package/dist/agent/traceability_ingest.js +237 -0
- package/dist/agent/types.d.ts +42 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +4 -0
- package/dist/agent/utils.d.ts +13 -0
- package/dist/agent/utils.d.ts.map +1 -0
- package/dist/agent/utils.js +152 -0
- package/dist/agent/validation_runner.d.ts +5 -0
- package/dist/agent/validation_runner.d.ts.map +1 -0
- package/dist/agent/validation_runner.js +77 -0
- package/dist/agentic/fix_loop.d.ts +26 -0
- package/dist/agentic/fix_loop.d.ts.map +1 -0
- package/dist/agentic/fix_loop.js +96 -0
- package/dist/agentic/playwright_runner.d.ts +43 -0
- package/dist/agentic/playwright_runner.d.ts.map +1 -0
- package/dist/agentic/playwright_runner.js +165 -0
- package/dist/agentic/runner.d.ts +27 -0
- package/dist/agentic/runner.d.ts.map +1 -0
- package/dist/agentic/runner.js +210 -0
- package/dist/agentic/types.d.ts +62 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +4 -0
- package/dist/agents/coverage-evaluator.d.ts +8 -0
- package/dist/agents/coverage-evaluator.d.ts.map +1 -0
- package/dist/agents/coverage-evaluator.js +41 -0
- package/dist/agents/cross-impact.d.ts +13 -0
- package/dist/agents/cross-impact.d.ts.map +1 -0
- package/dist/agents/cross-impact.js +140 -0
- package/dist/agents/executor.d.ts +8 -0
- package/dist/agents/executor.d.ts.map +1 -0
- package/dist/agents/executor.js +75 -0
- package/dist/agents/explorer.d.ts +12 -0
- package/dist/agents/explorer.d.ts.map +1 -0
- package/dist/agents/explorer.js +43 -0
- package/dist/agents/generator.d.ts +8 -0
- package/dist/agents/generator.d.ts.map +1 -0
- package/dist/agents/generator.js +77 -0
- package/dist/agents/healer.d.ts +8 -0
- package/dist/agents/healer.d.ts.map +1 -0
- package/dist/agents/healer.js +31 -0
- package/dist/agents/impact-analyst.d.ts +8 -0
- package/dist/agents/impact-analyst.d.ts.map +1 -0
- package/dist/agents/impact-analyst.js +38 -0
- package/dist/agents/regression-advisor.d.ts +8 -0
- package/dist/agents/regression-advisor.d.ts.map +1 -0
- package/dist/agents/regression-advisor.js +116 -0
- package/dist/agents/strategist.d.ts +9 -0
- package/dist/agents/strategist.d.ts.map +1 -0
- package/dist/agents/strategist.js +92 -0
- package/dist/agents/test-designer.d.ts +8 -0
- package/dist/agents/test-designer.d.ts.map +1 -0
- package/dist/agents/test-designer.js +111 -0
- package/dist/anthropic_provider.d.ts +65 -0
- package/dist/anthropic_provider.d.ts.map +1 -0
- package/dist/anthropic_provider.js +334 -0
- package/dist/api.d.ts +48 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +151 -0
- package/dist/base_provider.d.ts +109 -0
- package/dist/base_provider.d.ts.map +1 -0
- package/dist/base_provider.js +203 -0
- package/dist/budget_ledger.d.ts +28 -0
- package/dist/budget_ledger.d.ts.map +1 -0
- package/dist/budget_ledger.js +62 -0
- package/dist/cache/cached_provider.d.ts +49 -0
- package/dist/cache/cached_provider.d.ts.map +1 -0
- package/dist/cache/cached_provider.js +91 -0
- package/dist/cache/response_cache.d.ts +79 -0
- package/dist/cache/response_cache.d.ts.map +1 -0
- package/dist/cache/response_cache.js +177 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +77 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.d.ts.map +1 -0
- package/dist/cli/commands/bootstrap.js +109 -0
- package/dist/cli/commands/cost_report.d.ts +3 -0
- package/dist/cli/commands/cost_report.d.ts.map +1 -0
- package/dist/cli/commands/cost_report.js +115 -0
- package/dist/cli/commands/crew.d.ts +3 -0
- package/dist/cli/commands/crew.d.ts.map +1 -0
- package/dist/cli/commands/crew.js +255 -0
- package/dist/cli/commands/feedback.d.ts +3 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -0
- package/dist/cli/commands/feedback.js +39 -0
- package/dist/cli/commands/finalize.d.ts +3 -0
- package/dist/cli/commands/finalize.d.ts.map +1 -0
- package/dist/cli/commands/finalize.js +41 -0
- package/dist/cli/commands/gate.d.ts +3 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +89 -0
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +108 -0
- package/dist/cli/commands/heal.d.ts +3 -0
- package/dist/cli/commands/heal.d.ts.map +1 -0
- package/dist/cli/commands/heal.js +60 -0
- package/dist/cli/commands/impact.d.ts +4 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +33 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +169 -0
- package/dist/cli/commands/llm_health.d.ts +2 -0
- package/dist/cli/commands/llm_health.d.ts.map +1 -0
- package/dist/cli/commands/llm_health.js +22 -0
- package/dist/cli/commands/plan.d.ts +4 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +120 -0
- package/dist/cli/commands/plan_crew.d.ts +17 -0
- package/dist/cli/commands/plan_crew.d.ts.map +1 -0
- package/dist/cli/commands/plan_crew.js +316 -0
- package/dist/cli/commands/traceability.d.ts +4 -0
- package/dist/cli/commands/traceability.d.ts.map +1 -0
- package/dist/cli/commands/traceability.js +77 -0
- package/dist/cli/commands/train.d.ts +3 -0
- package/dist/cli/commands/train.d.ts.map +1 -0
- package/dist/cli/commands/train.js +391 -0
- package/dist/cli/defaults.d.ts +35 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +172 -0
- package/dist/cli/errors.d.ts +27 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +57 -0
- package/dist/cli/parse_args.d.ts +6 -0
- package/dist/cli/parse_args.d.ts.map +1 -0
- package/dist/cli/parse_args.js +257 -0
- package/dist/cli/types.d.ts +87 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +4 -0
- package/dist/cli/usage.d.ts +2 -0
- package/dist/cli/usage.d.ts.map +1 -0
- package/dist/cli/usage.js +109 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +194 -0
- package/dist/crew/context.d.ts +55 -0
- package/dist/crew/context.d.ts.map +1 -0
- package/dist/crew/context.js +36 -0
- package/dist/crew/orchestrator.d.ts +50 -0
- package/dist/crew/orchestrator.d.ts.map +1 -0
- package/dist/crew/orchestrator.js +329 -0
- package/dist/crew/protocol.d.ts +46 -0
- package/dist/crew/protocol.d.ts.map +1 -0
- package/dist/crew/protocol.js +4 -0
- package/dist/crew/provider.d.ts +17 -0
- package/dist/crew/provider.d.ts.map +1 -0
- package/dist/crew/provider.js +36 -0
- package/dist/crew/sanitize.d.ts +3 -0
- package/dist/crew/sanitize.d.ts.map +1 -0
- package/dist/crew/sanitize.js +31 -0
- package/dist/crew/types.d.ts +52 -0
- package/dist/crew/types.d.ts.map +1 -0
- package/dist/crew/types.js +4 -0
- package/dist/crew/workflows.d.ts +52 -0
- package/dist/crew/workflows.d.ts.map +1 -0
- package/dist/crew/workflows.js +36 -0
- package/dist/custom_provider.d.ts +20 -0
- package/dist/custom_provider.d.ts.map +1 -0
- package/dist/custom_provider.js +277 -0
- package/dist/engine/ai_enrichment.d.ts +44 -0
- package/dist/engine/ai_enrichment.d.ts.map +1 -0
- package/dist/engine/ai_enrichment.js +267 -0
- package/dist/engine/diff_loader.d.ts +11 -0
- package/dist/engine/diff_loader.d.ts.map +1 -0
- package/dist/engine/diff_loader.js +63 -0
- package/dist/engine/impact_engine.d.ts +72 -0
- package/dist/engine/impact_engine.d.ts.map +1 -0
- package/dist/engine/impact_engine.js +298 -0
- package/dist/engine/plan_builder.d.ts +11 -0
- package/dist/engine/plan_builder.d.ts.map +1 -0
- package/dist/engine/plan_builder.js +599 -0
- package/dist/esm/adapters/cypress.js +49 -0
- package/dist/esm/adapters/framework_adapter.js +114 -0
- package/dist/esm/adapters/playwright.js +49 -0
- package/dist/esm/adapters/pytest.js +59 -0
- package/dist/esm/adapters/supertest.js +48 -0
- package/dist/esm/agent/api_catalog.js +199 -0
- package/dist/esm/agent/config.js +872 -0
- package/dist/esm/agent/feedback.js +317 -0
- package/dist/esm/agent/git.js +252 -0
- package/dist/esm/agent/handoff.js +177 -0
- package/dist/esm/agent/llm_agents_flow.js +421 -0
- package/dist/esm/agent/native_flow.js +175 -0
- package/dist/esm/agent/pipeline.js +256 -0
- package/dist/esm/agent/pipeline_types.js +3 -0
- package/dist/esm/agent/pipeline_utils.js +146 -0
- package/dist/esm/agent/plan.js +83 -0
- package/dist/esm/agent/playwright_report.js +123 -0
- package/dist/esm/agent/process_runner.js +83 -0
- package/dist/esm/agent/spec_generator.js +249 -0
- package/dist/esm/agent/test_path.js +20 -0
- package/dist/esm/agent/traceability_capture.js +310 -0
- package/dist/esm/agent/traceability_ingest.js +234 -0
- package/dist/esm/agent/types.js +3 -0
- package/dist/esm/agent/utils.js +138 -0
- package/dist/esm/agent/validation_runner.js +73 -0
- package/dist/esm/agentic/fix_loop.js +91 -0
- package/dist/esm/agentic/playwright_runner.js +161 -0
- package/dist/esm/agentic/runner.js +207 -0
- package/dist/esm/agentic/types.js +3 -0
- package/dist/esm/agents/coverage-evaluator.js +37 -0
- package/dist/esm/agents/cross-impact.js +136 -0
- package/dist/esm/agents/executor.js +71 -0
- package/dist/esm/agents/explorer.js +39 -0
- package/dist/esm/agents/generator.js +73 -0
- package/dist/esm/agents/healer.js +27 -0
- package/dist/esm/agents/impact-analyst.js +34 -0
- package/dist/esm/agents/regression-advisor.js +112 -0
- package/dist/esm/agents/strategist.js +88 -0
- package/dist/esm/agents/test-designer.js +107 -0
- package/dist/esm/anthropic_provider.js +326 -0
- package/dist/esm/api.js +143 -0
- package/dist/esm/base_provider.js +198 -0
- package/dist/esm/budget_ledger.js +58 -0
- package/dist/esm/cache/cached_provider.js +85 -0
- package/dist/esm/cache/response_cache.js +140 -0
- package/dist/esm/cli/commands/analyze.js +74 -0
- package/dist/esm/cli/commands/bootstrap.js +106 -0
- package/dist/esm/cli/commands/cost_report.js +112 -0
- package/dist/esm/cli/commands/crew.js +252 -0
- package/dist/esm/cli/commands/feedback.js +36 -0
- package/dist/esm/cli/commands/finalize.js +38 -0
- package/dist/esm/cli/commands/gate.js +86 -0
- package/dist/esm/cli/commands/generate.js +105 -0
- package/dist/esm/cli/commands/heal.js +57 -0
- package/dist/esm/cli/commands/impact.js +30 -0
- package/dist/esm/cli/commands/init.js +133 -0
- package/dist/esm/cli/commands/llm_health.js +19 -0
- package/dist/esm/cli/commands/plan.js +117 -0
- package/dist/esm/cli/commands/plan_crew.js +309 -0
- package/dist/esm/cli/commands/traceability.js +73 -0
- package/dist/esm/cli/commands/train.js +355 -0
- package/dist/esm/cli/defaults.js +165 -0
- package/dist/esm/cli/errors.js +52 -0
- package/dist/esm/cli/parse_args.js +251 -0
- package/dist/esm/cli/types.js +3 -0
- package/dist/esm/cli/usage.js +106 -0
- package/dist/esm/cli.js +192 -0
- package/dist/esm/crew/context.js +32 -0
- package/dist/esm/crew/orchestrator.js +325 -0
- package/dist/esm/crew/protocol.js +3 -0
- package/dist/esm/crew/provider.js +33 -0
- package/dist/esm/crew/sanitize.js +27 -0
- package/dist/esm/crew/types.js +3 -0
- package/dist/esm/crew/workflows.js +33 -0
- package/dist/esm/custom_provider.js +273 -0
- package/dist/esm/engine/ai_enrichment.js +264 -0
- package/dist/esm/engine/diff_loader.js +59 -0
- package/dist/esm/engine/impact_engine.js +291 -0
- package/dist/esm/engine/plan_builder.js +593 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/knowledge/api_surface.js +408 -0
- package/dist/esm/knowledge/cluster_utils.js +60 -0
- package/dist/esm/knowledge/context_loader.js +85 -0
- package/dist/esm/knowledge/failure_history.js +121 -0
- package/dist/esm/knowledge/kg_bridge.js +381 -0
- package/dist/esm/knowledge/kg_types.js +3 -0
- package/dist/esm/knowledge/route_families.js +393 -0
- package/dist/esm/knowledge/spec_index.js +122 -0
- package/dist/esm/logger.js +115 -0
- package/dist/esm/mcp-server.js +621 -0
- package/dist/esm/metrics/prometheus.js +149 -0
- package/dist/esm/model_router.js +59 -0
- package/dist/esm/ollama_provider.js +301 -0
- package/dist/esm/openai_provider.js +243 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/pipeline/orchestrator.js +228 -0
- package/dist/esm/pipeline/spec_verifier.js +75 -0
- package/dist/esm/pipeline/stage0_preprocess.js +102 -0
- package/dist/esm/pipeline/stage1_impact.js +140 -0
- package/dist/esm/pipeline/stage2_coverage.js +153 -0
- package/dist/esm/pipeline/stage3_generation.js +284 -0
- package/dist/esm/pipeline/stage4_heal.js +288 -0
- package/dist/esm/progress.js +112 -0
- package/dist/esm/prompts/coverage.js +57 -0
- package/dist/esm/prompts/cross-impact.js +53 -0
- package/dist/esm/prompts/generation.js +297 -0
- package/dist/esm/prompts/generation_profile.js +147 -0
- package/dist/esm/prompts/heal.js +91 -0
- package/dist/esm/prompts/impact.js +63 -0
- package/dist/esm/prompts/json_extract.js +36 -0
- package/dist/esm/prompts/strategist.js +61 -0
- package/dist/esm/prompts/test-designer.js +92 -0
- package/dist/esm/provider_factory.js +366 -0
- package/dist/esm/provider_interface.js +23 -0
- package/dist/esm/provider_utils.js +96 -0
- package/dist/esm/qa-agent/cli.js +205 -0
- package/dist/esm/qa-agent/orchestrator.js +120 -0
- package/dist/esm/qa-agent/phase1/runner.js +139 -0
- package/dist/esm/qa-agent/phase1/scope.js +126 -0
- package/dist/esm/qa-agent/phase2/agent_browser.js +95 -0
- package/dist/esm/qa-agent/phase2/agent_loop.js +351 -0
- package/dist/esm/qa-agent/phase2/exploration_state.js +97 -0
- package/dist/esm/qa-agent/phase2/tools.js +386 -0
- package/dist/esm/qa-agent/phase2/vision.js +75 -0
- package/dist/esm/qa-agent/phase3/feedback.js +34 -0
- package/dist/esm/qa-agent/phase3/reporter.js +145 -0
- package/dist/esm/qa-agent/phase3/spec_generator.js +62 -0
- package/dist/esm/qa-agent/phase3/verdict.js +66 -0
- package/dist/esm/qa-agent/safe_env.js +23 -0
- package/dist/esm/qa-agent/types.js +3 -0
- package/dist/esm/reporters/junit.js +86 -0
- package/dist/esm/reporters/reporter.js +3 -0
- package/dist/esm/reporters/sarif.js +132 -0
- package/dist/esm/resilience/circuit_breaker.js +78 -0
- package/dist/esm/resilience/retry.js +56 -0
- package/dist/esm/sanitize.js +66 -0
- package/dist/esm/training/enricher.js +345 -0
- package/dist/esm/training/kg_scanner.js +115 -0
- package/dist/esm/training/merger.js +204 -0
- package/dist/esm/training/scanner.js +923 -0
- package/dist/esm/training/types.js +6 -0
- package/dist/esm/training/validator.js +254 -0
- package/dist/esm/validation/guardrails.js +101 -0
- package/dist/esm/validation/output_schema.js +80 -0
- package/dist/esm/version.js +33 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/knowledge/api_surface.d.ts +37 -0
- package/dist/knowledge/api_surface.d.ts.map +1 -0
- package/dist/knowledge/api_surface.js +418 -0
- package/dist/knowledge/cluster_utils.d.ts +28 -0
- package/dist/knowledge/cluster_utils.d.ts.map +1 -0
- package/dist/knowledge/cluster_utils.js +67 -0
- package/dist/knowledge/context_loader.d.ts +13 -0
- package/dist/knowledge/context_loader.d.ts.map +1 -0
- package/dist/knowledge/context_loader.js +90 -0
- package/dist/knowledge/failure_history.d.ts +39 -0
- package/dist/knowledge/failure_history.d.ts.map +1 -0
- package/dist/knowledge/failure_history.js +128 -0
- package/dist/knowledge/kg_bridge.d.ts +31 -0
- package/dist/knowledge/kg_bridge.d.ts.map +1 -0
- package/dist/knowledge/kg_bridge.js +388 -0
- package/dist/knowledge/kg_types.d.ts +75 -0
- package/dist/knowledge/kg_types.d.ts.map +1 -0
- package/dist/knowledge/kg_types.js +4 -0
- package/dist/knowledge/route_families.d.ts +98 -0
- package/dist/knowledge/route_families.d.ts.map +1 -0
- package/dist/knowledge/route_families.js +410 -0
- package/dist/knowledge/spec_index.d.ts +18 -0
- package/dist/knowledge/spec_index.d.ts.map +1 -0
- package/dist/knowledge/spec_index.js +128 -0
- package/dist/logger.d.ts +31 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +119 -0
- package/dist/mcp-server.d.ts +68 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +629 -0
- package/dist/metrics/prometheus.d.ts +37 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +153 -0
- package/dist/model_router.d.ts +28 -0
- package/dist/model_router.d.ts.map +1 -0
- package/dist/model_router.js +63 -0
- package/dist/ollama_provider.d.ts +65 -0
- package/dist/ollama_provider.d.ts.map +1 -0
- package/dist/ollama_provider.js +309 -0
- package/dist/openai_provider.d.ts +23 -0
- package/dist/openai_provider.d.ts.map +1 -0
- package/dist/openai_provider.js +251 -0
- package/dist/pipeline/orchestrator.d.ts +33 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +231 -0
- package/dist/pipeline/spec_verifier.d.ts +20 -0
- package/dist/pipeline/spec_verifier.d.ts.map +1 -0
- package/dist/pipeline/spec_verifier.js +79 -0
- package/dist/pipeline/stage0_preprocess.d.ts +31 -0
- package/dist/pipeline/stage0_preprocess.d.ts.map +1 -0
- package/dist/pipeline/stage0_preprocess.js +105 -0
- package/dist/pipeline/stage1_impact.d.ts +19 -0
- package/dist/pipeline/stage1_impact.d.ts.map +1 -0
- package/dist/pipeline/stage1_impact.js +143 -0
- package/dist/pipeline/stage2_coverage.d.ts +19 -0
- package/dist/pipeline/stage2_coverage.d.ts.map +1 -0
- package/dist/pipeline/stage2_coverage.js +156 -0
- package/dist/pipeline/stage3_generation.d.ts +43 -0
- package/dist/pipeline/stage3_generation.d.ts.map +1 -0
- package/dist/pipeline/stage3_generation.js +287 -0
- package/dist/pipeline/stage4_heal.d.ts +62 -0
- package/dist/pipeline/stage4_heal.d.ts.map +1 -0
- package/dist/pipeline/stage4_heal.js +294 -0
- package/dist/progress.d.ts +22 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +116 -0
- package/dist/prompts/coverage.d.ts +39 -0
- package/dist/prompts/coverage.d.ts.map +1 -0
- package/dist/prompts/coverage.js +61 -0
- package/dist/prompts/cross-impact.d.ts +23 -0
- package/dist/prompts/cross-impact.d.ts.map +1 -0
- package/dist/prompts/cross-impact.js +57 -0
- package/dist/prompts/generation.d.ts +25 -0
- package/dist/prompts/generation.d.ts.map +1 -0
- package/dist/prompts/generation.js +302 -0
- package/dist/prompts/generation_profile.d.ts +29 -0
- package/dist/prompts/generation_profile.d.ts.map +1 -0
- package/dist/prompts/generation_profile.js +151 -0
- package/dist/prompts/heal.d.ts +23 -0
- package/dist/prompts/heal.d.ts.map +1 -0
- package/dist/prompts/heal.js +95 -0
- package/dist/prompts/impact.d.ts +31 -0
- package/dist/prompts/impact.d.ts.map +1 -0
- package/dist/prompts/impact.js +67 -0
- package/dist/prompts/json_extract.d.ts +14 -0
- package/dist/prompts/json_extract.d.ts.map +1 -0
- package/dist/prompts/json_extract.js +39 -0
- package/dist/prompts/strategist.d.ts +25 -0
- package/dist/prompts/strategist.d.ts.map +1 -0
- package/dist/prompts/strategist.js +65 -0
- package/dist/prompts/test-designer.d.ts +35 -0
- package/dist/prompts/test-designer.d.ts.map +1 -0
- package/dist/prompts/test-designer.js +96 -0
- package/dist/provider_factory.d.ts +104 -0
- package/dist/provider_factory.d.ts.map +1 -0
- package/dist/provider_factory.js +371 -0
- package/dist/provider_interface.d.ts +365 -0
- package/dist/provider_interface.d.ts.map +1 -0
- package/dist/provider_interface.js +28 -0
- package/dist/provider_utils.d.ts +39 -0
- package/dist/provider_utils.d.ts.map +1 -0
- package/dist/provider_utils.js +103 -0
- package/dist/qa-agent/cli.d.ts +3 -0
- package/dist/qa-agent/cli.d.ts.map +1 -0
- package/dist/qa-agent/cli.js +207 -0
- package/dist/qa-agent/orchestrator.d.ts +3 -0
- package/dist/qa-agent/orchestrator.d.ts.map +1 -0
- package/dist/qa-agent/orchestrator.js +123 -0
- package/dist/qa-agent/phase1/runner.d.ts +3 -0
- package/dist/qa-agent/phase1/runner.d.ts.map +1 -0
- package/dist/qa-agent/phase1/runner.js +142 -0
- package/dist/qa-agent/phase1/scope.d.ts +6 -0
- package/dist/qa-agent/phase1/scope.d.ts.map +1 -0
- package/dist/qa-agent/phase1/scope.js +129 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts +35 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_browser.js +99 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts +3 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_loop.js +357 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts +12 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts.map +1 -0
- package/dist/qa-agent/phase2/exploration_state.js +109 -0
- package/dist/qa-agent/phase2/tools.d.ts +28 -0
- package/dist/qa-agent/phase2/tools.d.ts.map +1 -0
- package/dist/qa-agent/phase2/tools.js +390 -0
- package/dist/qa-agent/phase2/vision.d.ts +3 -0
- package/dist/qa-agent/phase2/vision.d.ts.map +1 -0
- package/dist/qa-agent/phase2/vision.js +78 -0
- package/dist/qa-agent/phase3/feedback.d.ts +3 -0
- package/dist/qa-agent/phase3/feedback.d.ts.map +1 -0
- package/dist/qa-agent/phase3/feedback.js +37 -0
- package/dist/qa-agent/phase3/reporter.d.ts +3 -0
- package/dist/qa-agent/phase3/reporter.d.ts.map +1 -0
- package/dist/qa-agent/phase3/reporter.js +148 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts +3 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts.map +1 -0
- package/dist/qa-agent/phase3/spec_generator.js +65 -0
- package/dist/qa-agent/phase3/verdict.d.ts +3 -0
- package/dist/qa-agent/phase3/verdict.d.ts.map +1 -0
- package/dist/qa-agent/phase3/verdict.js +69 -0
- package/dist/qa-agent/safe_env.d.ts +3 -0
- package/dist/qa-agent/safe_env.d.ts.map +1 -0
- package/dist/qa-agent/safe_env.js +26 -0
- package/dist/qa-agent/types.d.ts +130 -0
- package/dist/qa-agent/types.d.ts.map +1 -0
- package/dist/qa-agent/types.js +4 -0
- package/dist/reporters/junit.d.ts +6 -0
- package/dist/reporters/junit.d.ts.map +1 -0
- package/dist/reporters/junit.js +89 -0
- package/dist/reporters/reporter.d.ts +42 -0
- package/dist/reporters/reporter.d.ts.map +1 -0
- package/dist/reporters/reporter.js +4 -0
- package/dist/reporters/sarif.d.ts +7 -0
- package/dist/reporters/sarif.d.ts.map +1 -0
- package/dist/reporters/sarif.js +135 -0
- package/dist/resilience/circuit_breaker.d.ts +36 -0
- package/dist/resilience/circuit_breaker.d.ts.map +1 -0
- package/dist/resilience/circuit_breaker.js +82 -0
- package/dist/resilience/retry.d.ts +11 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +59 -0
- package/dist/sanitize.d.ts +15 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +71 -0
- package/dist/training/enricher.d.ts +17 -0
- package/dist/training/enricher.d.ts.map +1 -0
- package/dist/training/enricher.js +350 -0
- package/dist/training/kg_scanner.d.ts +13 -0
- package/dist/training/kg_scanner.d.ts.map +1 -0
- package/dist/training/kg_scanner.js +118 -0
- package/dist/training/merger.d.ts +15 -0
- package/dist/training/merger.d.ts.map +1 -0
- package/dist/training/merger.js +208 -0
- package/dist/training/scanner.d.ts +36 -0
- package/dist/training/scanner.d.ts.map +1 -0
- package/dist/training/scanner.js +932 -0
- package/dist/training/types.d.ts +117 -0
- package/dist/training/types.d.ts.map +1 -0
- package/dist/training/types.js +9 -0
- package/dist/training/validator.d.ts +21 -0
- package/dist/training/validator.d.ts.map +1 -0
- package/dist/training/validator.js +262 -0
- package/dist/validation/guardrails.d.ts +31 -0
- package/dist/validation/guardrails.d.ts.map +1 -0
- package/dist/validation/guardrails.js +112 -0
- package/dist/validation/output_schema.d.ts +67 -0
- package/dist/validation/output_schema.d.ts.map +1 -0
- package/dist/validation/output_schema.js +84 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +36 -0
- package/package.json +126 -0
- package/schemas/flow-decision.schema.json +83 -0
- package/schemas/gap.schema.json +18 -0
- package/schemas/impact.schema.json +455 -0
- package/schemas/plan.schema.json +491 -0
- package/schemas/route-families.schema.json +137 -0
- package/schemas/subsystem-risk-map.schema.json +62 -0
- package/schemas/traceability-input.schema.json +122 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
/** Routes that look like bare "/<id>" are scanner-generated guesses */
|
|
4
|
+
export function isGuessedRoute(routes) {
|
|
5
|
+
return routes.every((r) => /^\/[a-z][a-z0-9_]*$/.test(r));
|
|
6
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
import { execFileSync } from 'child_process';
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
import { logger } from '../logger.js';
|
|
6
|
+
import { bindFilesToFamilies } from '../knowledge/route_families.js';
|
|
7
|
+
/**
|
|
8
|
+
* Glob-style patterns for infrastructure / cross-cutting files that will never
|
|
9
|
+
* belong to a single route family. Excluded from coverage calculations.
|
|
10
|
+
*/
|
|
11
|
+
const INFRA_GLOBS = [
|
|
12
|
+
'Makefile', 'go.mod', 'go.sum',
|
|
13
|
+
'*.lock',
|
|
14
|
+
'**/mocks/*', '**/storetest/*', '**/testlib/*',
|
|
15
|
+
'**/i18n/*',
|
|
16
|
+
'**/.github/*', '**/.ci/*', '**/scripts/*',
|
|
17
|
+
'**/docker-compose*',
|
|
18
|
+
'**/__fixtures__/*', '**/test_templates/*',
|
|
19
|
+
'**/__snapshots__/*', '**/retrylayer/*', '**/timerlayer/*',
|
|
20
|
+
'**/cmd/mmctl/*',
|
|
21
|
+
'**/mattermost-redux/src/reducers/*',
|
|
22
|
+
'playwright.config.ts', 'global-setup.ts',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Check if a file path matches any infrastructure glob pattern.
|
|
26
|
+
* Uses simple string matching — no external glob library needed.
|
|
27
|
+
*/
|
|
28
|
+
export function isInfraFile(filePath) {
|
|
29
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
30
|
+
for (const pattern of INFRA_GLOBS) {
|
|
31
|
+
if (pattern.startsWith('**/')) {
|
|
32
|
+
// Match anywhere in the path
|
|
33
|
+
const suffix = pattern.slice(3);
|
|
34
|
+
if (suffix.endsWith('/*')) {
|
|
35
|
+
// Directory match: **/mocks/* → any segment named "mocks" with a child
|
|
36
|
+
const dirName = suffix.slice(0, -2);
|
|
37
|
+
if (normalized.includes(`/${dirName}/`) || normalized.startsWith(`${dirName}/`))
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
else if (suffix.endsWith('*')) {
|
|
41
|
+
// Prefix match: **/docker-compose* → file starting with docker-compose
|
|
42
|
+
const prefix = suffix.slice(0, -1);
|
|
43
|
+
const base = normalized.split('/').pop() || '';
|
|
44
|
+
if (base.startsWith(prefix))
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (normalized.endsWith(`/${suffix}`) || normalized === suffix)
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (pattern.startsWith('*.')) {
|
|
53
|
+
// Extension match: *.lock
|
|
54
|
+
const ext = pattern.slice(1);
|
|
55
|
+
if (normalized.endsWith(ext))
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Exact basename match: Makefile, go.mod, go.sum
|
|
60
|
+
const base = normalized.split('/').pop() || '';
|
|
61
|
+
if (base === pattern)
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
export function parseGitLog(log) {
|
|
68
|
+
const commits = [];
|
|
69
|
+
let current = null;
|
|
70
|
+
for (const line of log.split('\n')) {
|
|
71
|
+
const trimmed = line.trim();
|
|
72
|
+
if (!trimmed) {
|
|
73
|
+
if (current) {
|
|
74
|
+
commits.push(current);
|
|
75
|
+
current = null;
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (trimmed.includes('|') && /^[0-9a-f]{7,40}\|/.test(trimmed)) {
|
|
80
|
+
if (current) {
|
|
81
|
+
commits.push(current);
|
|
82
|
+
}
|
|
83
|
+
const [hash, ...rest] = trimmed.split('|');
|
|
84
|
+
current = { hash, message: rest.join('|'), files: [] };
|
|
85
|
+
}
|
|
86
|
+
else if (current) {
|
|
87
|
+
current.files.push(trimmed);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (current) {
|
|
91
|
+
commits.push(current);
|
|
92
|
+
}
|
|
93
|
+
return commits;
|
|
94
|
+
}
|
|
95
|
+
export function getCommitFiles(projectRoot, since) {
|
|
96
|
+
const resolved = resolve(projectRoot);
|
|
97
|
+
let log;
|
|
98
|
+
try {
|
|
99
|
+
log = execFileSync('git', ['log', '--name-only', '--pretty=format:%H|%s', `${since}..HEAD`], {
|
|
100
|
+
cwd: resolved,
|
|
101
|
+
encoding: 'utf-8',
|
|
102
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
103
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
logger.warn(`[train] git log failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
return parseGitLog(log);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* For each file, try matching both the original path and any prefix-stripped
|
|
114
|
+
* variant against the manifest. Returns one FileBinding per original file.
|
|
115
|
+
*/
|
|
116
|
+
function bindWithPrefixes(files, manifest, prefixes) {
|
|
117
|
+
if (prefixes.length === 0) {
|
|
118
|
+
return bindFilesToFamilies(files, manifest);
|
|
119
|
+
}
|
|
120
|
+
// Build candidate variants for each file
|
|
121
|
+
const variants = files.map((f) => {
|
|
122
|
+
const normalized = f.replace(/\\/g, '/');
|
|
123
|
+
const candidates = [normalized];
|
|
124
|
+
for (const prefix of prefixes) {
|
|
125
|
+
if (normalized.startsWith(prefix)) {
|
|
126
|
+
candidates.push(normalized.slice(prefix.length));
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return candidates;
|
|
131
|
+
});
|
|
132
|
+
// Bind all variants and merge results per original file
|
|
133
|
+
return files.map((f, i) => {
|
|
134
|
+
const normalized = f.replace(/\\/g, '/');
|
|
135
|
+
const allBindings = [];
|
|
136
|
+
const seen = new Set();
|
|
137
|
+
for (const variant of variants[i]) {
|
|
138
|
+
const [result] = bindFilesToFamilies([variant], manifest);
|
|
139
|
+
for (const b of result.bindings) {
|
|
140
|
+
const key = `${b.family}:${b.feature || ''}`;
|
|
141
|
+
if (!seen.has(key)) {
|
|
142
|
+
seen.add(key);
|
|
143
|
+
allBindings.push(b);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { file: normalized, bindings: allBindings };
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export function validateCommit(manifest, files, hash, message, pathPrefixes) {
|
|
151
|
+
// Filter out non-source files and infrastructure files
|
|
152
|
+
const sourceFiles = files.filter((f) => {
|
|
153
|
+
return !f.endsWith('.md') && !f.endsWith('.json') && !f.endsWith('.yml') && !f.endsWith('.yaml') &&
|
|
154
|
+
!f.startsWith('.') && !f.includes('node_modules/') && !isInfraFile(f);
|
|
155
|
+
});
|
|
156
|
+
if (sourceFiles.length === 0) {
|
|
157
|
+
return { hash, message, changedFiles: [], boundFiles: 0, unboundFiles: [], familiesHit: [] };
|
|
158
|
+
}
|
|
159
|
+
const bindings = pathPrefixes
|
|
160
|
+
? bindWithPrefixes(sourceFiles, manifest, pathPrefixes)
|
|
161
|
+
: bindFilesToFamilies(sourceFiles, manifest);
|
|
162
|
+
const bound = bindings.filter((b) => b.bindings.length > 0);
|
|
163
|
+
const unbound = bindings.filter((b) => b.bindings.length === 0);
|
|
164
|
+
const familiesHit = new Set();
|
|
165
|
+
for (const b of bound) {
|
|
166
|
+
for (const binding of b.bindings) {
|
|
167
|
+
familiesHit.add(binding.family);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
hash,
|
|
172
|
+
message,
|
|
173
|
+
changedFiles: sourceFiles,
|
|
174
|
+
boundFiles: bound.length,
|
|
175
|
+
unboundFiles: unbound.map((b) => b.file),
|
|
176
|
+
familiesHit: Array.from(familiesHit),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function buildValidationReport(commits, manifest) {
|
|
180
|
+
let totalFiles = 0;
|
|
181
|
+
let boundFiles = 0;
|
|
182
|
+
let unboundFiles = 0;
|
|
183
|
+
const familyHits = {};
|
|
184
|
+
const unboundCounts = {};
|
|
185
|
+
for (const commit of commits) {
|
|
186
|
+
totalFiles += commit.changedFiles.length;
|
|
187
|
+
boundFiles += commit.boundFiles;
|
|
188
|
+
unboundFiles += commit.unboundFiles.length;
|
|
189
|
+
for (const fam of commit.familiesHit) {
|
|
190
|
+
familyHits[fam] = (familyHits[fam] || 0) + 1;
|
|
191
|
+
}
|
|
192
|
+
for (const uf of commit.unboundFiles) {
|
|
193
|
+
unboundCounts[uf] = (unboundCounts[uf] || 0) + 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const allFamilyIds = manifest.families.map((f) => f.id);
|
|
197
|
+
const hitFamilyIds = new Set(Object.keys(familyHits));
|
|
198
|
+
const neverHitFamilies = allFamilyIds.filter((id) => !hitFamilyIds.has(id));
|
|
199
|
+
// Cluster unbound files by directory
|
|
200
|
+
const dirCounts = {};
|
|
201
|
+
for (const [file, count] of Object.entries(unboundCounts)) {
|
|
202
|
+
const dir = file.split('/').slice(0, -1).join('/');
|
|
203
|
+
dirCounts[dir] = (dirCounts[dir] || 0) + count;
|
|
204
|
+
}
|
|
205
|
+
const unboundFileClusters = Object.entries(dirCounts)
|
|
206
|
+
.sort(([, a], [, b]) => b - a)
|
|
207
|
+
.slice(0, 20)
|
|
208
|
+
.map(([pattern, count]) => ({
|
|
209
|
+
pattern: `${pattern}/*`,
|
|
210
|
+
count,
|
|
211
|
+
suggestedFamily: pattern.split('/').pop() || 'unknown',
|
|
212
|
+
}));
|
|
213
|
+
return {
|
|
214
|
+
totalCommits: commits.length,
|
|
215
|
+
totalFiles,
|
|
216
|
+
boundFiles,
|
|
217
|
+
unboundFiles,
|
|
218
|
+
coveragePercent: totalFiles > 0 ? Math.round((boundFiles / totalFiles) * 100) : 100,
|
|
219
|
+
commits,
|
|
220
|
+
familyHits,
|
|
221
|
+
neverHitFamilies,
|
|
222
|
+
unboundFileClusters,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
export function formatValidationReport(report) {
|
|
226
|
+
const lines = [];
|
|
227
|
+
lines.push(`Validated against ${report.totalCommits} commits`);
|
|
228
|
+
lines.push('');
|
|
229
|
+
lines.push(`Coverage: ${report.coveragePercent}% of files bound (${report.boundFiles}/${report.totalFiles})`);
|
|
230
|
+
lines.push('');
|
|
231
|
+
// Family hit distribution
|
|
232
|
+
const sorted = Object.entries(report.familyHits).sort(([, a], [, b]) => b - a);
|
|
233
|
+
if (sorted.length > 0) {
|
|
234
|
+
lines.push('Family hit distribution:');
|
|
235
|
+
const maxHits = sorted[0][1];
|
|
236
|
+
for (const [family, hits] of sorted) {
|
|
237
|
+
const bar = '\u2588'.repeat(Math.max(1, Math.round((hits / maxHits) * 12)));
|
|
238
|
+
lines.push(` ${family.padEnd(20)} ${bar} ${hits} commits`);
|
|
239
|
+
}
|
|
240
|
+
if (report.neverHitFamilies.length > 0) {
|
|
241
|
+
lines.push(` (never hit)${' '.repeat(8)}${report.neverHitFamilies.join(', ')}`);
|
|
242
|
+
}
|
|
243
|
+
lines.push('');
|
|
244
|
+
}
|
|
245
|
+
// Unbound file clusters
|
|
246
|
+
if (report.unboundFileClusters.length > 0) {
|
|
247
|
+
lines.push(`Unbound files (${report.unboundFiles} files across ${report.totalCommits} commits):`);
|
|
248
|
+
for (const cluster of report.unboundFileClusters.slice(0, 10)) {
|
|
249
|
+
lines.push(` ${cluster.pattern.padEnd(50)} — ${cluster.count} commits (suggest: ${cluster.suggestedFamily})`);
|
|
250
|
+
}
|
|
251
|
+
lines.push('');
|
|
252
|
+
}
|
|
253
|
+
return lines.join('\n');
|
|
254
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
export const EVIDENCE_THRESHOLDS = {
|
|
4
|
+
minConfidenceForAction: 40,
|
|
5
|
+
minConfidenceForGeneration: 60,
|
|
6
|
+
cannotDetermineBelow: 30,
|
|
7
|
+
highConfidenceAbove: 75,
|
|
8
|
+
};
|
|
9
|
+
export function computeConfidence(check) {
|
|
10
|
+
let score = 0;
|
|
11
|
+
if (check.hasRouteFamily) {
|
|
12
|
+
score += 25;
|
|
13
|
+
}
|
|
14
|
+
if (check.hasSpecificRoute) {
|
|
15
|
+
score += 15;
|
|
16
|
+
}
|
|
17
|
+
if (check.hasPageObject) {
|
|
18
|
+
score += 20;
|
|
19
|
+
}
|
|
20
|
+
if (check.hasUserAction) {
|
|
21
|
+
score += 25;
|
|
22
|
+
}
|
|
23
|
+
if (check.hasExistingSpecCited) {
|
|
24
|
+
score += 15;
|
|
25
|
+
}
|
|
26
|
+
// Historical failure correlation: if this file historically causes test failures,
|
|
27
|
+
// we're more confident it needs testing now
|
|
28
|
+
if (check.historyBoost) {
|
|
29
|
+
score += check.historyBoost;
|
|
30
|
+
}
|
|
31
|
+
return Math.min(100, score);
|
|
32
|
+
}
|
|
33
|
+
export function classifyConfidence(confidence) {
|
|
34
|
+
if (confidence >= EVIDENCE_THRESHOLDS.highConfidenceAbove) {
|
|
35
|
+
return 'high';
|
|
36
|
+
}
|
|
37
|
+
if (confidence >= EVIDENCE_THRESHOLDS.minConfidenceForAction) {
|
|
38
|
+
return 'medium';
|
|
39
|
+
}
|
|
40
|
+
return 'low';
|
|
41
|
+
}
|
|
42
|
+
export function shouldForceCannotDetermine(confidence) {
|
|
43
|
+
return confidence < EVIDENCE_THRESHOLDS.cannotDetermineBelow;
|
|
44
|
+
}
|
|
45
|
+
export function validateRouteAgainstManifest(route, familyId, manifest) {
|
|
46
|
+
const family = manifest.families.find((f) => f.id === familyId);
|
|
47
|
+
if (!family) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Check family-level routes
|
|
51
|
+
for (const pattern of family.routes) {
|
|
52
|
+
if (routeMatchesPattern(route, pattern)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Check feature-level routes
|
|
57
|
+
if (family.features) {
|
|
58
|
+
for (const feature of family.features) {
|
|
59
|
+
if (feature.routes) {
|
|
60
|
+
for (const pattern of feature.routes) {
|
|
61
|
+
if (routeMatchesPattern(route, pattern)) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
function routeMatchesPattern(route, pattern) {
|
|
71
|
+
// Convert route pattern like /{team}/channels/{channel} to regex
|
|
72
|
+
const regexStr = pattern
|
|
73
|
+
.replace(/\{[^}]+\}/g, '[^/]+')
|
|
74
|
+
.replace(/\//g, '\\/');
|
|
75
|
+
try {
|
|
76
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
77
|
+
return regex.test(route);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return route === pattern || route.startsWith(pattern);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function computeCannotDetermineRatio(decisions) {
|
|
84
|
+
if (decisions.length === 0) {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
const cannotDetermineCount = decisions.filter((d) => d.action === 'cannot_determine').length;
|
|
88
|
+
return cannotDetermineCount / decisions.length;
|
|
89
|
+
}
|
|
90
|
+
export function computeOverallConfidence(decisions) {
|
|
91
|
+
if (decisions.length === 0) {
|
|
92
|
+
return 'low';
|
|
93
|
+
}
|
|
94
|
+
const actionable = decisions.filter((d) => d.action !== 'cannot_determine');
|
|
95
|
+
if (actionable.length === 0) {
|
|
96
|
+
return 'low';
|
|
97
|
+
}
|
|
98
|
+
const avgConfidence = actionable.reduce((sum, d) => sum + d.confidence, 0) / actionable.length;
|
|
99
|
+
return classifyConfidence(avgConfidence);
|
|
100
|
+
}
|
|
101
|
+
export { compileCheckSpec, smokeRunSpec } from '../pipeline/spec_verifier.js';
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
const VALID_ACTIONS = ['run_existing', 'add_scenarios', 'create_spec', 'cannot_determine'];
|
|
4
|
+
const VALID_PRIORITIES = ['P0', 'P1', 'P2'];
|
|
5
|
+
const VALID_SOURCES = ['ai', 'catalog', 'traceability', 'deterministic'];
|
|
6
|
+
export function validateFlowDecision(decision) {
|
|
7
|
+
const errors = [];
|
|
8
|
+
if (!decision || typeof decision !== 'object') {
|
|
9
|
+
return { valid: false, errors: ['Decision must be a non-null object'] };
|
|
10
|
+
}
|
|
11
|
+
const d = decision;
|
|
12
|
+
if (typeof d.flowId !== 'string' || !d.flowId) {
|
|
13
|
+
errors.push('flowId is required');
|
|
14
|
+
}
|
|
15
|
+
if (typeof d.flowName !== 'string' || !d.flowName) {
|
|
16
|
+
errors.push('flowName is required');
|
|
17
|
+
}
|
|
18
|
+
if (typeof d.routeFamily !== 'string' || !d.routeFamily) {
|
|
19
|
+
errors.push('routeFamily is required');
|
|
20
|
+
}
|
|
21
|
+
if (!Array.isArray(d.changedFiles)) {
|
|
22
|
+
errors.push('changedFiles must be an array');
|
|
23
|
+
}
|
|
24
|
+
if (typeof d.evidence !== 'string') {
|
|
25
|
+
errors.push('evidence is required');
|
|
26
|
+
}
|
|
27
|
+
if (!VALID_SOURCES.includes(d.evidenceSource)) {
|
|
28
|
+
errors.push(`evidenceSource must be one of: ${VALID_SOURCES.join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
if (typeof d.confidence !== 'number' || d.confidence < 0 || d.confidence > 100) {
|
|
31
|
+
errors.push('confidence must be a number between 0 and 100');
|
|
32
|
+
}
|
|
33
|
+
if (!VALID_ACTIONS.includes(d.action)) {
|
|
34
|
+
errors.push(`action must be one of: ${VALID_ACTIONS.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
if (!VALID_PRIORITIES.includes(d.priority)) {
|
|
37
|
+
errors.push(`priority must be one of: ${VALID_PRIORITIES.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
if (d.action === 'cannot_determine' && (typeof d.blockingReason !== 'string' || !d.blockingReason)) {
|
|
40
|
+
errors.push('blockingReason is required when action is cannot_determine');
|
|
41
|
+
}
|
|
42
|
+
if (d.action === 'add_scenarios' && (!Array.isArray(d.scenariosToAdd) || d.scenariosToAdd.length === 0)) {
|
|
43
|
+
errors.push('scenariosToAdd is required when action is add_scenarios');
|
|
44
|
+
}
|
|
45
|
+
return { valid: errors.length === 0, errors };
|
|
46
|
+
}
|
|
47
|
+
export function buildSummary(decisions) {
|
|
48
|
+
const families = new Set();
|
|
49
|
+
const actions = { run_existing: 0, add_scenarios: 0, create_spec: 0, cannot_determine: 0 };
|
|
50
|
+
let covered = 0;
|
|
51
|
+
let partial = 0;
|
|
52
|
+
let uncovered = 0;
|
|
53
|
+
for (const d of decisions) {
|
|
54
|
+
families.add(d.routeFamily);
|
|
55
|
+
actions[d.action]++;
|
|
56
|
+
if (d.action === 'run_existing') {
|
|
57
|
+
covered++;
|
|
58
|
+
}
|
|
59
|
+
else if (d.action === 'add_scenarios') {
|
|
60
|
+
partial++;
|
|
61
|
+
}
|
|
62
|
+
else if (d.action === 'create_spec') {
|
|
63
|
+
uncovered++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const actionable = decisions.filter((d) => d.action !== 'cannot_determine');
|
|
67
|
+
const avgConfidence = actionable.length > 0
|
|
68
|
+
? actionable.reduce((sum, d) => sum + d.confidence, 0) / actionable.length
|
|
69
|
+
: 0;
|
|
70
|
+
return {
|
|
71
|
+
changedFiles: new Set(decisions.flatMap((d) => d.changedFiles)).size,
|
|
72
|
+
routeFamiliesImpacted: Array.from(families).sort(),
|
|
73
|
+
flowsIdentified: decisions.length,
|
|
74
|
+
flowsCovered: covered,
|
|
75
|
+
flowsPartial: partial,
|
|
76
|
+
flowsUncovered: uncovered,
|
|
77
|
+
actionsRequired: actions,
|
|
78
|
+
overallConfidence: avgConfidence >= 75 ? 'high' : avgConfidence >= 40 ? 'medium' : 'low',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
+
// See LICENSE.txt for license information.
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
|
+
let _version;
|
|
6
|
+
/**
|
|
7
|
+
* Returns the package version by reading the nearest package.json.
|
|
8
|
+
* Cached after first call.
|
|
9
|
+
*/
|
|
10
|
+
export function getVersion() {
|
|
11
|
+
if (_version)
|
|
12
|
+
return _version;
|
|
13
|
+
try {
|
|
14
|
+
// Walk up from this file's compiled location to find package.json
|
|
15
|
+
for (let d = __dirname, prev = ''; d !== prev; prev = d, d = dirname(d)) {
|
|
16
|
+
try {
|
|
17
|
+
const pkg = JSON.parse(readFileSync(join(d, 'package.json'), 'utf-8'));
|
|
18
|
+
if ((pkg.name === '@yasserkhanorg/impact-gate' || pkg.name === '@yasserkhanorg/e2e-agents') && pkg.version) {
|
|
19
|
+
_version = pkg.version;
|
|
20
|
+
return _version;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// keep walking up
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// fallback
|
|
30
|
+
}
|
|
31
|
+
_version = 'unknown';
|
|
32
|
+
return _version;
|
|
33
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Module
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic library for working with Large Language Models.
|
|
5
|
+
* Pluggable architecture supports multiple providers:
|
|
6
|
+
* - Anthropic Claude (premium, vision support)
|
|
7
|
+
* - Ollama (free, local)
|
|
8
|
+
* - OpenAI (official API)
|
|
9
|
+
* - Custom providers
|
|
10
|
+
*
|
|
11
|
+
* Switch between providers seamlessly without changing application code.
|
|
12
|
+
*/
|
|
13
|
+
export type { LLMProvider, GenerateOptions, ImageInput, LLMResponse, TokenUsage, ProviderCapabilities, ProviderUsageStats, ProviderConfig, AnthropicConfig, OllamaConfig, OpenAIConfig, CustomConfig, } from './provider_interface.js';
|
|
14
|
+
export { LLMProviderError, UnsupportedCapabilityError } from './provider_interface.js';
|
|
15
|
+
export { AnthropicProvider, checkAnthropicSetup } from './anthropic_provider.js';
|
|
16
|
+
export { OllamaProvider, checkOllamaSetup } from './ollama_provider.js';
|
|
17
|
+
export { OpenAIProvider, checkOpenAISetup } from './openai_provider.js';
|
|
18
|
+
export { CustomProvider } from './custom_provider.js';
|
|
19
|
+
export { LLMProviderFactory, validateProviderSetup } from './provider_factory.js';
|
|
20
|
+
export type { HybridConfig } from './provider_factory.js';
|
|
21
|
+
export { analyzeImpactDeterministic, recommendTestsDeterministic, handoffGeneratedTests, ingestTraceability, captureTraceability } from './api.js';
|
|
22
|
+
export type { AgentApiOptions, RecommendTestsV2Result, TraceabilityIngestApiOptions, TraceabilityCaptureApiOptions, } from './api.js';
|
|
23
|
+
export { analyzeImpact as analyzeImpactV2, getGaps, getGapsWithSuppressed, getPartialGaps } from './engine/impact_engine.js';
|
|
24
|
+
export type { ImpactResult, ImpactedFeature, CoverageStatus, ImpactEngineOptions, SpecWithScenarios, PrTestFile, PrTestFileType, GapResult } from './engine/impact_engine.js';
|
|
25
|
+
export { extractScenarios } from './engine/impact_engine.js';
|
|
26
|
+
export { buildPlanFromImpact } from './engine/plan_builder.js';
|
|
27
|
+
export { appendFeedbackAndRecompute, readCalibration, readFlakyTests, getAdaptiveThresholds } from './agent/feedback.js';
|
|
28
|
+
export type { RecommendationFeedbackEntry, CalibrationSummary, FlakySummary, AdaptiveThresholds } from './agent/feedback.js';
|
|
29
|
+
export { finalizeGeneratedTests } from './agent/handoff.js';
|
|
30
|
+
export type { FinalizeGeneratedTestsOptions, FinalizeGeneratedTestsResult } from './agent/handoff.js';
|
|
31
|
+
export { ingestTraceabilityInput } from './agent/traceability_ingest.js';
|
|
32
|
+
export type { TraceabilityIngestOptions, TraceabilityIngestResult, TraceabilityIngestEntry } from './agent/traceability_ingest.js';
|
|
33
|
+
export { captureTraceabilityInput } from './agent/traceability_capture.js';
|
|
34
|
+
export type { TraceabilityCaptureOptions, TraceabilityCaptureResult } from './agent/traceability_capture.js';
|
|
35
|
+
export { runPipeline } from './pipeline/orchestrator.js';
|
|
36
|
+
export type { PipelineConfig, PipelineResult } from './pipeline/orchestrator.js';
|
|
37
|
+
export type { FlowDecision, FlowDecisionReport, FlowDecisionSummary, FlowAction, EvidenceSource } from './validation/output_schema.js';
|
|
38
|
+
export { runGenerationStage } from './pipeline/stage3_generation.js';
|
|
39
|
+
export type { GenerationConfig, GenerationResult, GeneratedSpec } from './pipeline/stage3_generation.js';
|
|
40
|
+
export { buildGenerationPrompt, parseGenerationResponse, detectHallucinatedMethods } from './prompts/generation.js';
|
|
41
|
+
export type { GenerationPromptContext, GenerationAgentResponse } from './prompts/generation.js';
|
|
42
|
+
export { runHealStage, healFromReport, resolveHealTargets, renderHealMarkdown } from './pipeline/stage4_heal.js';
|
|
43
|
+
export type { HealConfig, HealTarget, HealResult } from './pipeline/stage4_heal.js';
|
|
44
|
+
export { buildHealPrompt, buildQualityFixPrompt } from './prompts/heal.js';
|
|
45
|
+
export type { HealPromptContext } from './prompts/heal.js';
|
|
46
|
+
export { loadRouteFamilyManifest, bindFilesToFamilies, getCypressSpecDirsForBinding, getPriorityForBinding, getUserFlowsForBinding } from './knowledge/route_families.js';
|
|
47
|
+
export type { RouteFamily, RouteFeature, RouteFamilyManifest, FileBinding, FeaturePriority } from './knowledge/route_families.js';
|
|
48
|
+
export { buildApiSurface, loadOrBuildApiSurface } from './knowledge/api_surface.js';
|
|
49
|
+
export type { ApiSurfaceCatalog, PageObjectSurface } from './knowledge/api_surface.js';
|
|
50
|
+
export { buildSpecIndex, getSpecsForFamily } from './knowledge/spec_index.js';
|
|
51
|
+
export type { SpecIndex, SpecEntry } from './knowledge/spec_index.js';
|
|
52
|
+
export type { FlowImpact, FlowPriority, FlowCoverage, FlagHit, BlastRadius } from './agent/types.js';
|
|
53
|
+
export type { PlanReport } from './agent/plan.js';
|
|
54
|
+
export { runAgenticGeneration } from './agentic/runner.js';
|
|
55
|
+
export type { ScenarioInput, AgenticRunOptions } from './agentic/runner.js';
|
|
56
|
+
export type { AgenticConfig, AgenticResult, AgenticSummary, PlaywrightRunResult, TestFailure } from './agentic/types.js';
|
|
57
|
+
export { CrewOrchestrator } from './crew/orchestrator.js';
|
|
58
|
+
export type { CrewConfig, CrewResult } from './crew/orchestrator.js';
|
|
59
|
+
export type { CrewContext } from './crew/context.js';
|
|
60
|
+
export type { Agent, AgentPlugin, AgentTask, AgentResult, AgentMessage } from './crew/protocol.js';
|
|
61
|
+
export type { AgentRole, TestCaseType, TestCase, TestDesign, CrossImpact, Finding, RegressionRisk, StrategyEntry, } from './crew/types.js';
|
|
62
|
+
export type { WorkflowDef, WorkflowName } from './crew/workflows.js';
|
|
63
|
+
export { WORKFLOWS } from './crew/workflows.js';
|
|
64
|
+
export { ImpactAnalystAgent } from './agents/impact-analyst.js';
|
|
65
|
+
export { CoverageEvaluatorAgent } from './agents/coverage-evaluator.js';
|
|
66
|
+
export { GeneratorAgent } from './agents/generator.js';
|
|
67
|
+
export { ExecutorAgent } from './agents/executor.js';
|
|
68
|
+
export { HealerAgent } from './agents/healer.js';
|
|
69
|
+
export { ExplorerAgent } from './agents/explorer.js';
|
|
70
|
+
export { StrategistAgent } from './agents/strategist.js';
|
|
71
|
+
export { TestDesignerAgent } from './agents/test-designer.js';
|
|
72
|
+
export { CrossImpactAgent } from './agents/cross-impact.js';
|
|
73
|
+
export { RegressionAdvisorAgent } from './agents/regression-advisor.js';
|
|
74
|
+
export { BaseProvider, BudgetExceededError } from './base_provider.js';
|
|
75
|
+
export { BudgetLedger } from './budget_ledger.js';
|
|
76
|
+
export { ModelRouter } from './model_router.js';
|
|
77
|
+
export type { TaskComplexity, ModelRoutingConfig } from './model_router.js';
|
|
78
|
+
export { withRetry } from './resilience/retry.js';
|
|
79
|
+
export type { RetryConfig } from './resilience/retry.js';
|
|
80
|
+
export { CircuitBreaker } from './resilience/circuit_breaker.js';
|
|
81
|
+
export type { CircuitBreakerConfig } from './resilience/circuit_breaker.js';
|
|
82
|
+
export { PrometheusMetrics } from './metrics/prometheus.js';
|
|
83
|
+
export { sanitizeSecrets, containsSecrets, sanitizeObject } from './sanitize.js';
|
|
84
|
+
export { CliError, classifyError, EXIT_CODES } from './cli/errors.js';
|
|
85
|
+
export type { ExitCode } from './cli/errors.js';
|
|
86
|
+
export { scanProject } from './training/scanner.js';
|
|
87
|
+
export { mergeFamilies, detectStaleFamilies } from './training/merger.js';
|
|
88
|
+
export { enrichFamilies } from './training/enricher.js';
|
|
89
|
+
export { getCommitFiles, validateCommit, buildValidationReport, formatValidationReport } from './training/validator.js';
|
|
90
|
+
export type { ScanResult, ScannedFamily, ScannedFeature, DiscoveredDir, EnrichmentResult, ValidationReport, CommitValidation, MergeResult, TrainOptions, } from './training/types.js';
|
|
91
|
+
export type { KnowledgeGraph, KGNode, KGEdge, KGProject } from './knowledge/kg_types.js';
|
|
92
|
+
export { loadKnowledgeGraph, classifyProjectType, transformKGToFamilies, loadDiffOverlay } from './knowledge/kg_bridge.js';
|
|
93
|
+
export { scanFromKnowledgeGraph } from './training/kg_scanner.js';
|
|
94
|
+
export type { GenerationProfile } from './prompts/generation_profile.js';
|
|
95
|
+
export { resolveGenerationProfile, isMattermostProfile } from './prompts/generation_profile.js';
|
|
96
|
+
export type { RunCommand } from './adapters/framework_adapter.js';
|
|
97
|
+
export { detectFramework, detectTestMode } from './adapters/framework_adapter.js';
|
|
98
|
+
export { serializeManifest } from './knowledge/route_families.js';
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|