@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,117 @@
|
|
|
1
|
+
import type { RouteFamily, RouteFamilyManifest } from '../knowledge/route_families.js';
|
|
2
|
+
/** A source directory discovered by the scanner */
|
|
3
|
+
export interface DiscoveredDir {
|
|
4
|
+
/** Absolute path to the directory */
|
|
5
|
+
path: string;
|
|
6
|
+
/** Relative path from project root */
|
|
7
|
+
relativePath: string;
|
|
8
|
+
/** Category: frontend source, backend source, or test */
|
|
9
|
+
category: 'webapp' | 'server' | 'test' | 'cypress';
|
|
10
|
+
/** Deepest meaningful directory name (e.g., 'channels' from 'src/channels/') */
|
|
11
|
+
familyHint: string;
|
|
12
|
+
}
|
|
13
|
+
/** A family proposed by the deterministic scanner */
|
|
14
|
+
export interface ScannedFamily {
|
|
15
|
+
id: string;
|
|
16
|
+
routes: string[];
|
|
17
|
+
webappPaths: string[];
|
|
18
|
+
serverPaths: string[];
|
|
19
|
+
specDirs: string[];
|
|
20
|
+
cypressSpecDirs: string[];
|
|
21
|
+
tags: string[];
|
|
22
|
+
features: ScannedFeature[];
|
|
23
|
+
/** True if routes are guesses (directory-name-based) */
|
|
24
|
+
routesGuessed: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** A nested feature proposed by the scanner */
|
|
27
|
+
export interface ScannedFeature {
|
|
28
|
+
id: string;
|
|
29
|
+
webappPaths: string[];
|
|
30
|
+
serverPaths: string[];
|
|
31
|
+
specDirs: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Output of the deterministic scanner */
|
|
34
|
+
export interface ScanResult {
|
|
35
|
+
families: ScannedFamily[];
|
|
36
|
+
unmatchedSourceDirs: DiscoveredDir[];
|
|
37
|
+
unmatchedTestDirs: DiscoveredDir[];
|
|
38
|
+
stats: {
|
|
39
|
+
totalSourceFiles: number;
|
|
40
|
+
totalTestFiles: number;
|
|
41
|
+
familyCount: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Output of LLM enrichment */
|
|
45
|
+
export interface EnrichmentResult {
|
|
46
|
+
enrichedFamilies: RouteFamily[];
|
|
47
|
+
tokensUsed: number;
|
|
48
|
+
costUSD: number;
|
|
49
|
+
skippedFamilies: string[];
|
|
50
|
+
/** Number of LLM requests made */
|
|
51
|
+
requestCount?: number;
|
|
52
|
+
/** Average response time per LLM request in ms */
|
|
53
|
+
avgResponseMs?: number;
|
|
54
|
+
}
|
|
55
|
+
/** A single commit's validation result */
|
|
56
|
+
export interface CommitValidation {
|
|
57
|
+
hash: string;
|
|
58
|
+
message: string;
|
|
59
|
+
changedFiles: string[];
|
|
60
|
+
boundFiles: number;
|
|
61
|
+
unboundFiles: string[];
|
|
62
|
+
familiesHit: string[];
|
|
63
|
+
}
|
|
64
|
+
/** Output of validation mode */
|
|
65
|
+
export interface ValidationReport {
|
|
66
|
+
totalCommits: number;
|
|
67
|
+
totalFiles: number;
|
|
68
|
+
boundFiles: number;
|
|
69
|
+
unboundFiles: number;
|
|
70
|
+
coveragePercent: number;
|
|
71
|
+
commits: CommitValidation[];
|
|
72
|
+
familyHits: Record<string, number>;
|
|
73
|
+
neverHitFamilies: string[];
|
|
74
|
+
unboundFileClusters: Array<{
|
|
75
|
+
pattern: string;
|
|
76
|
+
count: number;
|
|
77
|
+
suggestedFamily: string;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/** Output of smart merge */
|
|
81
|
+
export interface MergeResult {
|
|
82
|
+
manifest: RouteFamilyManifest;
|
|
83
|
+
newFamilies: string[];
|
|
84
|
+
updatedFamilies: string[];
|
|
85
|
+
staleFamilies: string[];
|
|
86
|
+
summary: string;
|
|
87
|
+
}
|
|
88
|
+
/** Options for the train command */
|
|
89
|
+
export interface TrainOptions {
|
|
90
|
+
/** Path to the application root */
|
|
91
|
+
appPath: string;
|
|
92
|
+
/** Path to tests root (may differ from appPath) */
|
|
93
|
+
testsRoot: string;
|
|
94
|
+
/** Path to server/backend root (may differ from appPath) */
|
|
95
|
+
serverRoot?: string;
|
|
96
|
+
/** Git repo root for monorepo-aware validation */
|
|
97
|
+
gitRepoRoot?: string;
|
|
98
|
+
/** Enable LLM enrichment (default: true) */
|
|
99
|
+
enrich: boolean;
|
|
100
|
+
/** Run validation against git history */
|
|
101
|
+
validate: boolean;
|
|
102
|
+
/** Git ref for validation (e.g., 'HEAD~20') */
|
|
103
|
+
since: string;
|
|
104
|
+
/** GitHub PR number for validation */
|
|
105
|
+
pr?: number;
|
|
106
|
+
/** Output path for route-families.json */
|
|
107
|
+
outputPath: string;
|
|
108
|
+
/** Dry run — print without writing */
|
|
109
|
+
dryRun: boolean;
|
|
110
|
+
/** Non-interactive mode */
|
|
111
|
+
yes: boolean;
|
|
112
|
+
/** Max LLM spend in USD */
|
|
113
|
+
budgetUSD: number;
|
|
114
|
+
}
|
|
115
|
+
/** Routes that look like bare "/<id>" are scanner-generated guesses */
|
|
116
|
+
export declare function isGuessedRoute(routes: string[]): boolean;
|
|
117
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/training/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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.isGuessedRoute = isGuessedRoute;
|
|
6
|
+
/** Routes that look like bare "/<id>" are scanner-generated guesses */
|
|
7
|
+
function isGuessedRoute(routes) {
|
|
8
|
+
return routes.every((r) => /^\/[a-z][a-z0-9_]*$/.test(r));
|
|
9
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RouteFamilyManifest } from '../knowledge/route_families.js';
|
|
2
|
+
import type { CommitValidation, ValidationReport } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a file path matches any infrastructure glob pattern.
|
|
5
|
+
* Uses simple string matching — no external glob library needed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isInfraFile(filePath: string): boolean;
|
|
8
|
+
export declare function parseGitLog(log: string): Array<{
|
|
9
|
+
hash: string;
|
|
10
|
+
message: string;
|
|
11
|
+
files: string[];
|
|
12
|
+
}>;
|
|
13
|
+
export declare function getCommitFiles(projectRoot: string, since: string): Array<{
|
|
14
|
+
hash: string;
|
|
15
|
+
message: string;
|
|
16
|
+
files: string[];
|
|
17
|
+
}>;
|
|
18
|
+
export declare function validateCommit(manifest: RouteFamilyManifest, files: string[], hash: string, message: string, pathPrefixes?: string[]): CommitValidation;
|
|
19
|
+
export declare function buildValidationReport(commits: CommitValidation[], manifest: RouteFamilyManifest): ValidationReport;
|
|
20
|
+
export declare function formatValidationReport(report: ValidationReport): string;
|
|
21
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/training/validator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAExE,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,YAAY,CAAC;AAoBnE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CA6BrD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CA6BhG;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CAgB1H;AA+CD,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EAAE,GACxB,gBAAgB,CA+BlB;AAED,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,mBAAmB,GAC9B,gBAAgB,CAkDlB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgCvE"}
|
|
@@ -0,0 +1,262 @@
|
|
|
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.isInfraFile = isInfraFile;
|
|
6
|
+
exports.parseGitLog = parseGitLog;
|
|
7
|
+
exports.getCommitFiles = getCommitFiles;
|
|
8
|
+
exports.validateCommit = validateCommit;
|
|
9
|
+
exports.buildValidationReport = buildValidationReport;
|
|
10
|
+
exports.formatValidationReport = formatValidationReport;
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const logger_js_1 = require("../logger.js");
|
|
14
|
+
const route_families_js_1 = require("../knowledge/route_families.js");
|
|
15
|
+
/**
|
|
16
|
+
* Glob-style patterns for infrastructure / cross-cutting files that will never
|
|
17
|
+
* belong to a single route family. Excluded from coverage calculations.
|
|
18
|
+
*/
|
|
19
|
+
const INFRA_GLOBS = [
|
|
20
|
+
'Makefile', 'go.mod', 'go.sum',
|
|
21
|
+
'*.lock',
|
|
22
|
+
'**/mocks/*', '**/storetest/*', '**/testlib/*',
|
|
23
|
+
'**/i18n/*',
|
|
24
|
+
'**/.github/*', '**/.ci/*', '**/scripts/*',
|
|
25
|
+
'**/docker-compose*',
|
|
26
|
+
'**/__fixtures__/*', '**/test_templates/*',
|
|
27
|
+
'**/__snapshots__/*', '**/retrylayer/*', '**/timerlayer/*',
|
|
28
|
+
'**/cmd/mmctl/*',
|
|
29
|
+
'**/mattermost-redux/src/reducers/*',
|
|
30
|
+
'playwright.config.ts', 'global-setup.ts',
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Check if a file path matches any infrastructure glob pattern.
|
|
34
|
+
* Uses simple string matching — no external glob library needed.
|
|
35
|
+
*/
|
|
36
|
+
function isInfraFile(filePath) {
|
|
37
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
38
|
+
for (const pattern of INFRA_GLOBS) {
|
|
39
|
+
if (pattern.startsWith('**/')) {
|
|
40
|
+
// Match anywhere in the path
|
|
41
|
+
const suffix = pattern.slice(3);
|
|
42
|
+
if (suffix.endsWith('/*')) {
|
|
43
|
+
// Directory match: **/mocks/* → any segment named "mocks" with a child
|
|
44
|
+
const dirName = suffix.slice(0, -2);
|
|
45
|
+
if (normalized.includes(`/${dirName}/`) || normalized.startsWith(`${dirName}/`))
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
else if (suffix.endsWith('*')) {
|
|
49
|
+
// Prefix match: **/docker-compose* → file starting with docker-compose
|
|
50
|
+
const prefix = suffix.slice(0, -1);
|
|
51
|
+
const base = normalized.split('/').pop() || '';
|
|
52
|
+
if (base.startsWith(prefix))
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
if (normalized.endsWith(`/${suffix}`) || normalized === suffix)
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (pattern.startsWith('*.')) {
|
|
61
|
+
// Extension match: *.lock
|
|
62
|
+
const ext = pattern.slice(1);
|
|
63
|
+
if (normalized.endsWith(ext))
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Exact basename match: Makefile, go.mod, go.sum
|
|
68
|
+
const base = normalized.split('/').pop() || '';
|
|
69
|
+
if (base === pattern)
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
function parseGitLog(log) {
|
|
76
|
+
const commits = [];
|
|
77
|
+
let current = null;
|
|
78
|
+
for (const line of log.split('\n')) {
|
|
79
|
+
const trimmed = line.trim();
|
|
80
|
+
if (!trimmed) {
|
|
81
|
+
if (current) {
|
|
82
|
+
commits.push(current);
|
|
83
|
+
current = null;
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (trimmed.includes('|') && /^[0-9a-f]{7,40}\|/.test(trimmed)) {
|
|
88
|
+
if (current) {
|
|
89
|
+
commits.push(current);
|
|
90
|
+
}
|
|
91
|
+
const [hash, ...rest] = trimmed.split('|');
|
|
92
|
+
current = { hash, message: rest.join('|'), files: [] };
|
|
93
|
+
}
|
|
94
|
+
else if (current) {
|
|
95
|
+
current.files.push(trimmed);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (current) {
|
|
99
|
+
commits.push(current);
|
|
100
|
+
}
|
|
101
|
+
return commits;
|
|
102
|
+
}
|
|
103
|
+
function getCommitFiles(projectRoot, since) {
|
|
104
|
+
const resolved = (0, path_1.resolve)(projectRoot);
|
|
105
|
+
let log;
|
|
106
|
+
try {
|
|
107
|
+
log = (0, child_process_1.execFileSync)('git', ['log', '--name-only', '--pretty=format:%H|%s', `${since}..HEAD`], {
|
|
108
|
+
cwd: resolved,
|
|
109
|
+
encoding: 'utf-8',
|
|
110
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
111
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger_js_1.logger.warn(`[train] git log failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
return parseGitLog(log);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* For each file, try matching both the original path and any prefix-stripped
|
|
122
|
+
* variant against the manifest. Returns one FileBinding per original file.
|
|
123
|
+
*/
|
|
124
|
+
function bindWithPrefixes(files, manifest, prefixes) {
|
|
125
|
+
if (prefixes.length === 0) {
|
|
126
|
+
return (0, route_families_js_1.bindFilesToFamilies)(files, manifest);
|
|
127
|
+
}
|
|
128
|
+
// Build candidate variants for each file
|
|
129
|
+
const variants = files.map((f) => {
|
|
130
|
+
const normalized = f.replace(/\\/g, '/');
|
|
131
|
+
const candidates = [normalized];
|
|
132
|
+
for (const prefix of prefixes) {
|
|
133
|
+
if (normalized.startsWith(prefix)) {
|
|
134
|
+
candidates.push(normalized.slice(prefix.length));
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return candidates;
|
|
139
|
+
});
|
|
140
|
+
// Bind all variants and merge results per original file
|
|
141
|
+
return files.map((f, i) => {
|
|
142
|
+
const normalized = f.replace(/\\/g, '/');
|
|
143
|
+
const allBindings = [];
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
for (const variant of variants[i]) {
|
|
146
|
+
const [result] = (0, route_families_js_1.bindFilesToFamilies)([variant], manifest);
|
|
147
|
+
for (const b of result.bindings) {
|
|
148
|
+
const key = `${b.family}:${b.feature || ''}`;
|
|
149
|
+
if (!seen.has(key)) {
|
|
150
|
+
seen.add(key);
|
|
151
|
+
allBindings.push(b);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { file: normalized, bindings: allBindings };
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function validateCommit(manifest, files, hash, message, pathPrefixes) {
|
|
159
|
+
// Filter out non-source files and infrastructure files
|
|
160
|
+
const sourceFiles = files.filter((f) => {
|
|
161
|
+
return !f.endsWith('.md') && !f.endsWith('.json') && !f.endsWith('.yml') && !f.endsWith('.yaml') &&
|
|
162
|
+
!f.startsWith('.') && !f.includes('node_modules/') && !isInfraFile(f);
|
|
163
|
+
});
|
|
164
|
+
if (sourceFiles.length === 0) {
|
|
165
|
+
return { hash, message, changedFiles: [], boundFiles: 0, unboundFiles: [], familiesHit: [] };
|
|
166
|
+
}
|
|
167
|
+
const bindings = pathPrefixes
|
|
168
|
+
? bindWithPrefixes(sourceFiles, manifest, pathPrefixes)
|
|
169
|
+
: (0, route_families_js_1.bindFilesToFamilies)(sourceFiles, manifest);
|
|
170
|
+
const bound = bindings.filter((b) => b.bindings.length > 0);
|
|
171
|
+
const unbound = bindings.filter((b) => b.bindings.length === 0);
|
|
172
|
+
const familiesHit = new Set();
|
|
173
|
+
for (const b of bound) {
|
|
174
|
+
for (const binding of b.bindings) {
|
|
175
|
+
familiesHit.add(binding.family);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
hash,
|
|
180
|
+
message,
|
|
181
|
+
changedFiles: sourceFiles,
|
|
182
|
+
boundFiles: bound.length,
|
|
183
|
+
unboundFiles: unbound.map((b) => b.file),
|
|
184
|
+
familiesHit: Array.from(familiesHit),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function buildValidationReport(commits, manifest) {
|
|
188
|
+
let totalFiles = 0;
|
|
189
|
+
let boundFiles = 0;
|
|
190
|
+
let unboundFiles = 0;
|
|
191
|
+
const familyHits = {};
|
|
192
|
+
const unboundCounts = {};
|
|
193
|
+
for (const commit of commits) {
|
|
194
|
+
totalFiles += commit.changedFiles.length;
|
|
195
|
+
boundFiles += commit.boundFiles;
|
|
196
|
+
unboundFiles += commit.unboundFiles.length;
|
|
197
|
+
for (const fam of commit.familiesHit) {
|
|
198
|
+
familyHits[fam] = (familyHits[fam] || 0) + 1;
|
|
199
|
+
}
|
|
200
|
+
for (const uf of commit.unboundFiles) {
|
|
201
|
+
unboundCounts[uf] = (unboundCounts[uf] || 0) + 1;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const allFamilyIds = manifest.families.map((f) => f.id);
|
|
205
|
+
const hitFamilyIds = new Set(Object.keys(familyHits));
|
|
206
|
+
const neverHitFamilies = allFamilyIds.filter((id) => !hitFamilyIds.has(id));
|
|
207
|
+
// Cluster unbound files by directory
|
|
208
|
+
const dirCounts = {};
|
|
209
|
+
for (const [file, count] of Object.entries(unboundCounts)) {
|
|
210
|
+
const dir = file.split('/').slice(0, -1).join('/');
|
|
211
|
+
dirCounts[dir] = (dirCounts[dir] || 0) + count;
|
|
212
|
+
}
|
|
213
|
+
const unboundFileClusters = Object.entries(dirCounts)
|
|
214
|
+
.sort(([, a], [, b]) => b - a)
|
|
215
|
+
.slice(0, 20)
|
|
216
|
+
.map(([pattern, count]) => ({
|
|
217
|
+
pattern: `${pattern}/*`,
|
|
218
|
+
count,
|
|
219
|
+
suggestedFamily: pattern.split('/').pop() || 'unknown',
|
|
220
|
+
}));
|
|
221
|
+
return {
|
|
222
|
+
totalCommits: commits.length,
|
|
223
|
+
totalFiles,
|
|
224
|
+
boundFiles,
|
|
225
|
+
unboundFiles,
|
|
226
|
+
coveragePercent: totalFiles > 0 ? Math.round((boundFiles / totalFiles) * 100) : 100,
|
|
227
|
+
commits,
|
|
228
|
+
familyHits,
|
|
229
|
+
neverHitFamilies,
|
|
230
|
+
unboundFileClusters,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function formatValidationReport(report) {
|
|
234
|
+
const lines = [];
|
|
235
|
+
lines.push(`Validated against ${report.totalCommits} commits`);
|
|
236
|
+
lines.push('');
|
|
237
|
+
lines.push(`Coverage: ${report.coveragePercent}% of files bound (${report.boundFiles}/${report.totalFiles})`);
|
|
238
|
+
lines.push('');
|
|
239
|
+
// Family hit distribution
|
|
240
|
+
const sorted = Object.entries(report.familyHits).sort(([, a], [, b]) => b - a);
|
|
241
|
+
if (sorted.length > 0) {
|
|
242
|
+
lines.push('Family hit distribution:');
|
|
243
|
+
const maxHits = sorted[0][1];
|
|
244
|
+
for (const [family, hits] of sorted) {
|
|
245
|
+
const bar = '\u2588'.repeat(Math.max(1, Math.round((hits / maxHits) * 12)));
|
|
246
|
+
lines.push(` ${family.padEnd(20)} ${bar} ${hits} commits`);
|
|
247
|
+
}
|
|
248
|
+
if (report.neverHitFamilies.length > 0) {
|
|
249
|
+
lines.push(` (never hit)${' '.repeat(8)}${report.neverHitFamilies.join(', ')}`);
|
|
250
|
+
}
|
|
251
|
+
lines.push('');
|
|
252
|
+
}
|
|
253
|
+
// Unbound file clusters
|
|
254
|
+
if (report.unboundFileClusters.length > 0) {
|
|
255
|
+
lines.push(`Unbound files (${report.unboundFiles} files across ${report.totalCommits} commits):`);
|
|
256
|
+
for (const cluster of report.unboundFileClusters.slice(0, 10)) {
|
|
257
|
+
lines.push(` ${cluster.pattern.padEnd(50)} — ${cluster.count} commits (suggest: ${cluster.suggestedFamily})`);
|
|
258
|
+
}
|
|
259
|
+
lines.push('');
|
|
260
|
+
}
|
|
261
|
+
return lines.join('\n');
|
|
262
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RouteFamilyManifest } from '../knowledge/route_families.js';
|
|
2
|
+
export interface EvidenceCheck {
|
|
3
|
+
hasRouteFamily: boolean;
|
|
4
|
+
hasSpecificRoute: boolean;
|
|
5
|
+
hasPageObject: boolean;
|
|
6
|
+
hasUserAction: boolean;
|
|
7
|
+
hasExistingSpecCited: boolean;
|
|
8
|
+
/** Historical failure correlation boost (0-20) from failure_history */
|
|
9
|
+
historyBoost?: number;
|
|
10
|
+
}
|
|
11
|
+
export type ConfidenceClass = 'high' | 'medium' | 'low';
|
|
12
|
+
export declare const EVIDENCE_THRESHOLDS: {
|
|
13
|
+
readonly minConfidenceForAction: 40;
|
|
14
|
+
readonly minConfidenceForGeneration: 60;
|
|
15
|
+
readonly cannotDetermineBelow: 30;
|
|
16
|
+
readonly highConfidenceAbove: 75;
|
|
17
|
+
};
|
|
18
|
+
export declare function computeConfidence(check: EvidenceCheck): number;
|
|
19
|
+
export declare function classifyConfidence(confidence: number): ConfidenceClass;
|
|
20
|
+
export declare function shouldForceCannotDetermine(confidence: number): boolean;
|
|
21
|
+
export declare function validateRouteAgainstManifest(route: string, familyId: string, manifest: RouteFamilyManifest): boolean;
|
|
22
|
+
export declare function computeCannotDetermineRatio(decisions: Array<{
|
|
23
|
+
action: string;
|
|
24
|
+
}>): number;
|
|
25
|
+
export declare function computeOverallConfidence(decisions: Array<{
|
|
26
|
+
confidence: number;
|
|
27
|
+
action: string;
|
|
28
|
+
}>): ConfidenceClass;
|
|
29
|
+
export type { CompileCheckResult, SmokeRunResult } from '../pipeline/spec_verifier.js';
|
|
30
|
+
export { compileCheckSpec, smokeRunSpec } from '../pipeline/spec_verifier.js';
|
|
31
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/validation/guardrails.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAExE,MAAM,WAAW,aAAa;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExD,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAuB9D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAQtE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,mBAAmB,GAC9B,OAAO,CAwBT;AAeD,wBAAgB,2BAA2B,CACvC,SAAS,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,GACnC,MAAM,CAMR;AAED,wBAAgB,wBAAwB,CACpC,SAAS,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,GACvD,eAAe,CAUjB;AAGD,YAAY,EAAC,kBAAkB,EAAE,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAC,gBAAgB,EAAE,YAAY,EAAC,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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.smokeRunSpec = exports.compileCheckSpec = exports.EVIDENCE_THRESHOLDS = void 0;
|
|
6
|
+
exports.computeConfidence = computeConfidence;
|
|
7
|
+
exports.classifyConfidence = classifyConfidence;
|
|
8
|
+
exports.shouldForceCannotDetermine = shouldForceCannotDetermine;
|
|
9
|
+
exports.validateRouteAgainstManifest = validateRouteAgainstManifest;
|
|
10
|
+
exports.computeCannotDetermineRatio = computeCannotDetermineRatio;
|
|
11
|
+
exports.computeOverallConfidence = computeOverallConfidence;
|
|
12
|
+
exports.EVIDENCE_THRESHOLDS = {
|
|
13
|
+
minConfidenceForAction: 40,
|
|
14
|
+
minConfidenceForGeneration: 60,
|
|
15
|
+
cannotDetermineBelow: 30,
|
|
16
|
+
highConfidenceAbove: 75,
|
|
17
|
+
};
|
|
18
|
+
function computeConfidence(check) {
|
|
19
|
+
let score = 0;
|
|
20
|
+
if (check.hasRouteFamily) {
|
|
21
|
+
score += 25;
|
|
22
|
+
}
|
|
23
|
+
if (check.hasSpecificRoute) {
|
|
24
|
+
score += 15;
|
|
25
|
+
}
|
|
26
|
+
if (check.hasPageObject) {
|
|
27
|
+
score += 20;
|
|
28
|
+
}
|
|
29
|
+
if (check.hasUserAction) {
|
|
30
|
+
score += 25;
|
|
31
|
+
}
|
|
32
|
+
if (check.hasExistingSpecCited) {
|
|
33
|
+
score += 15;
|
|
34
|
+
}
|
|
35
|
+
// Historical failure correlation: if this file historically causes test failures,
|
|
36
|
+
// we're more confident it needs testing now
|
|
37
|
+
if (check.historyBoost) {
|
|
38
|
+
score += check.historyBoost;
|
|
39
|
+
}
|
|
40
|
+
return Math.min(100, score);
|
|
41
|
+
}
|
|
42
|
+
function classifyConfidence(confidence) {
|
|
43
|
+
if (confidence >= exports.EVIDENCE_THRESHOLDS.highConfidenceAbove) {
|
|
44
|
+
return 'high';
|
|
45
|
+
}
|
|
46
|
+
if (confidence >= exports.EVIDENCE_THRESHOLDS.minConfidenceForAction) {
|
|
47
|
+
return 'medium';
|
|
48
|
+
}
|
|
49
|
+
return 'low';
|
|
50
|
+
}
|
|
51
|
+
function shouldForceCannotDetermine(confidence) {
|
|
52
|
+
return confidence < exports.EVIDENCE_THRESHOLDS.cannotDetermineBelow;
|
|
53
|
+
}
|
|
54
|
+
function validateRouteAgainstManifest(route, familyId, manifest) {
|
|
55
|
+
const family = manifest.families.find((f) => f.id === familyId);
|
|
56
|
+
if (!family) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Check family-level routes
|
|
60
|
+
for (const pattern of family.routes) {
|
|
61
|
+
if (routeMatchesPattern(route, pattern)) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Check feature-level routes
|
|
66
|
+
if (family.features) {
|
|
67
|
+
for (const feature of family.features) {
|
|
68
|
+
if (feature.routes) {
|
|
69
|
+
for (const pattern of feature.routes) {
|
|
70
|
+
if (routeMatchesPattern(route, pattern)) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
function routeMatchesPattern(route, pattern) {
|
|
80
|
+
// Convert route pattern like /{team}/channels/{channel} to regex
|
|
81
|
+
const regexStr = pattern
|
|
82
|
+
.replace(/\{[^}]+\}/g, '[^/]+')
|
|
83
|
+
.replace(/\//g, '\\/');
|
|
84
|
+
try {
|
|
85
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
86
|
+
return regex.test(route);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return route === pattern || route.startsWith(pattern);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function computeCannotDetermineRatio(decisions) {
|
|
93
|
+
if (decisions.length === 0) {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
const cannotDetermineCount = decisions.filter((d) => d.action === 'cannot_determine').length;
|
|
97
|
+
return cannotDetermineCount / decisions.length;
|
|
98
|
+
}
|
|
99
|
+
function computeOverallConfidence(decisions) {
|
|
100
|
+
if (decisions.length === 0) {
|
|
101
|
+
return 'low';
|
|
102
|
+
}
|
|
103
|
+
const actionable = decisions.filter((d) => d.action !== 'cannot_determine');
|
|
104
|
+
if (actionable.length === 0) {
|
|
105
|
+
return 'low';
|
|
106
|
+
}
|
|
107
|
+
const avgConfidence = actionable.reduce((sum, d) => sum + d.confidence, 0) / actionable.length;
|
|
108
|
+
return classifyConfidence(avgConfidence);
|
|
109
|
+
}
|
|
110
|
+
var spec_verifier_js_1 = require("../pipeline/spec_verifier.js");
|
|
111
|
+
Object.defineProperty(exports, "compileCheckSpec", { enumerable: true, get: function () { return spec_verifier_js_1.compileCheckSpec; } });
|
|
112
|
+
Object.defineProperty(exports, "smokeRunSpec", { enumerable: true, get: function () { return spec_verifier_js_1.smokeRunSpec; } });
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type FlowAction = 'run_existing' | 'add_scenarios' | 'create_spec' | 'cannot_determine';
|
|
2
|
+
export type EvidenceSource = 'ai' | 'catalog' | 'traceability' | 'deterministic';
|
|
3
|
+
export type FlowPriority = 'P0' | 'P1' | 'P2';
|
|
4
|
+
export type ConfidenceClass = 'high' | 'medium' | 'low';
|
|
5
|
+
export type CoverageLevel = 'full' | 'partial' | 'none';
|
|
6
|
+
export interface ExistingSpecCoverage {
|
|
7
|
+
path: string;
|
|
8
|
+
testTitles: string[];
|
|
9
|
+
coverageLevel: CoverageLevel;
|
|
10
|
+
missingScenarios?: string[];
|
|
11
|
+
}
|
|
12
|
+
export type { AssertionPattern } from '../knowledge/route_families.js';
|
|
13
|
+
import type { AssertionPattern } from '../knowledge/route_families.js';
|
|
14
|
+
export interface FlowDecision {
|
|
15
|
+
flowId: string;
|
|
16
|
+
flowName: string;
|
|
17
|
+
routeFamily: string;
|
|
18
|
+
featureId?: string;
|
|
19
|
+
specificRoute?: string;
|
|
20
|
+
changedFiles: string[];
|
|
21
|
+
evidence: string;
|
|
22
|
+
evidenceSource: EvidenceSource;
|
|
23
|
+
confidence: number;
|
|
24
|
+
existingSpecs: ExistingSpecCoverage[];
|
|
25
|
+
action: FlowAction;
|
|
26
|
+
targetSpec?: string;
|
|
27
|
+
newSpecPath?: string;
|
|
28
|
+
scenariosToAdd?: string[];
|
|
29
|
+
blockingReason?: string;
|
|
30
|
+
priority: FlowPriority;
|
|
31
|
+
userActions: string[];
|
|
32
|
+
assertionPatterns?: AssertionPattern[];
|
|
33
|
+
}
|
|
34
|
+
export interface FlowDecisionSummary {
|
|
35
|
+
changedFiles: number;
|
|
36
|
+
routeFamiliesImpacted: string[];
|
|
37
|
+
flowsIdentified: number;
|
|
38
|
+
flowsCovered: number;
|
|
39
|
+
flowsPartial: number;
|
|
40
|
+
flowsUncovered: number;
|
|
41
|
+
actionsRequired: {
|
|
42
|
+
run_existing: number;
|
|
43
|
+
add_scenarios: number;
|
|
44
|
+
create_spec: number;
|
|
45
|
+
cannot_determine: number;
|
|
46
|
+
};
|
|
47
|
+
overallConfidence: ConfidenceClass;
|
|
48
|
+
}
|
|
49
|
+
export interface FlowDecisionReport {
|
|
50
|
+
runId: string;
|
|
51
|
+
timestamp: string;
|
|
52
|
+
gitRef: string;
|
|
53
|
+
summary: FlowDecisionSummary;
|
|
54
|
+
decisions: FlowDecision[];
|
|
55
|
+
warnings: string[];
|
|
56
|
+
model: {
|
|
57
|
+
impactAgent?: string;
|
|
58
|
+
coverageAgent?: string;
|
|
59
|
+
generationAgent?: string;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export declare function validateFlowDecision(decision: unknown): {
|
|
63
|
+
valid: boolean;
|
|
64
|
+
errors: string[];
|
|
65
|
+
};
|
|
66
|
+
export declare function buildSummary(decisions: FlowDecision[]): FlowDecisionSummary;
|
|
67
|
+
//# sourceMappingURL=output_schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output_schema.d.ts","sourceRoot":"","sources":["../../src/validation/output_schema.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAC/F,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;AACjF,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,YAAY,EAAC,gBAAgB,EAAC,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,gCAAgC,CAAC;AAErE,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,iBAAiB,EAAE,eAAe,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACL;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CA0C1F;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAmC3E"}
|