@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,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.runAgenticGeneration = runAgenticGeneration;
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const playwright_runner_js_1 = require("./playwright_runner.js");
|
|
9
|
+
const fix_loop_js_1 = require("./fix_loop.js");
|
|
10
|
+
const generation_js_1 = require("../prompts/generation.js");
|
|
11
|
+
const api_surface_js_1 = require("../knowledge/api_surface.js");
|
|
12
|
+
const sanitize_js_1 = require("../crew/sanitize.js");
|
|
13
|
+
function buildGeneratePrompt(scenario, apiSurfaceHint, profile) {
|
|
14
|
+
const projectName = profile?.projectName || 'Mattermost';
|
|
15
|
+
const importSource = profile?.importStatement || '@mattermost/playwright-lib';
|
|
16
|
+
const scenariosBlock = scenario.scenarios
|
|
17
|
+
.map((s, i) => ` ${i + 1}. ${(0, sanitize_js_1.sanitizeForPrompt)(s)}`)
|
|
18
|
+
.join('\n');
|
|
19
|
+
return [
|
|
20
|
+
`Generate a ${projectName} Playwright E2E test file.`,
|
|
21
|
+
'',
|
|
22
|
+
`FLOW: ${(0, sanitize_js_1.sanitizeForPrompt)(scenario.name)}`,
|
|
23
|
+
`Route Family: ${scenario.routeFamily}`,
|
|
24
|
+
`Priority: ${scenario.priority}`,
|
|
25
|
+
scenario.evidence ? `Evidence: ${(0, sanitize_js_1.sanitizeForPrompt)(scenario.evidence)}` : '',
|
|
26
|
+
'',
|
|
27
|
+
'SCENARIOS TO IMPLEMENT:',
|
|
28
|
+
scenariosBlock,
|
|
29
|
+
'',
|
|
30
|
+
'AVAILABLE PAGE OBJECTS AND METHODS:',
|
|
31
|
+
apiSurfaceHint || 'Use page.getByRole() or page.getByTestId() for selectors.',
|
|
32
|
+
'',
|
|
33
|
+
'MANDATORY RULES:',
|
|
34
|
+
`1. Import ONLY from "${importSource}" — no other test framework imports.`,
|
|
35
|
+
'2. Every test must call `await pw.initSetup()` first.',
|
|
36
|
+
'3. Use `await pw.testBrowser.login(user)` to log in — never hardcode credentials.',
|
|
37
|
+
'4. Use ONLY page object methods listed above. Do NOT invent methods.',
|
|
38
|
+
'5. If a method is not available, use `page.getByRole()` or `page.getByTestId()`.',
|
|
39
|
+
`6. Tag every test: {tag: '@${scenario.routeFamily}'}`,
|
|
40
|
+
'7. Write one test per scenario with a descriptive name.',
|
|
41
|
+
`8. Use \`expect\` from "${importSource}".`,
|
|
42
|
+
'9. Include the copyright header.',
|
|
43
|
+
'10. NEVER fabricate test IDs (MM-TXXXX). Use descriptive names only.',
|
|
44
|
+
'',
|
|
45
|
+
'EXAMPLE STRUCTURE:',
|
|
46
|
+
'```typescript',
|
|
47
|
+
'// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.',
|
|
48
|
+
'// See LICENSE.txt for license information.',
|
|
49
|
+
'',
|
|
50
|
+
`import {expect, test} from '${importSource}';`,
|
|
51
|
+
'',
|
|
52
|
+
'test(',
|
|
53
|
+
" 'user can post a message in channel',",
|
|
54
|
+
` {tag: '@${scenario.routeFamily}'},`,
|
|
55
|
+
' async ({pw}) => {',
|
|
56
|
+
' const {user} = await pw.initSetup();',
|
|
57
|
+
' const {channelsPage} = await pw.testBrowser.login(user);',
|
|
58
|
+
' await channelsPage.goto();',
|
|
59
|
+
' await channelsPage.toBeVisible();',
|
|
60
|
+
' // test steps...',
|
|
61
|
+
' },',
|
|
62
|
+
');',
|
|
63
|
+
'```',
|
|
64
|
+
'',
|
|
65
|
+
'Return ONLY the TypeScript code. No explanations.',
|
|
66
|
+
].filter(Boolean).join('\n');
|
|
67
|
+
}
|
|
68
|
+
function resolveSpecPath(scenario, testsRoot) {
|
|
69
|
+
let specPath;
|
|
70
|
+
if (scenario.targetSpec) {
|
|
71
|
+
specPath = (0, path_1.join)(testsRoot, scenario.targetSpec);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const safeName = scenario.id.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase();
|
|
75
|
+
const outputDir = (0, path_1.join)(testsRoot, 'specs', 'functional', 'ai-assisted');
|
|
76
|
+
specPath = (0, path_1.join)(outputDir, `${safeName}.spec.ts`);
|
|
77
|
+
}
|
|
78
|
+
// SECURITY: Prevent path traversal
|
|
79
|
+
const resolved = (0, path_1.resolve)(specPath);
|
|
80
|
+
const resolvedRoot = (0, path_1.resolve)(testsRoot);
|
|
81
|
+
if (!resolved.startsWith(resolvedRoot + '/') && resolved !== resolvedRoot) {
|
|
82
|
+
throw new Error(`Path traversal blocked: ${specPath} resolves outside testsRoot`);
|
|
83
|
+
}
|
|
84
|
+
if (!resolved.endsWith('.spec.ts') && !resolved.endsWith('.test.ts')) {
|
|
85
|
+
throw new Error(`Invalid spec path: must end in .spec.ts or .test.ts`);
|
|
86
|
+
}
|
|
87
|
+
return specPath;
|
|
88
|
+
}
|
|
89
|
+
async function generateInitialSpec(provider, scenario, specPath, apiSurfaceHint, profile) {
|
|
90
|
+
const prompt = buildGeneratePrompt(scenario, apiSurfaceHint, profile);
|
|
91
|
+
const response = await provider.generateText(prompt, {
|
|
92
|
+
maxTokens: 8000,
|
|
93
|
+
temperature: 0.1,
|
|
94
|
+
timeout: 60000,
|
|
95
|
+
systemPrompt: `You are an expert Playwright test writer for ${profile?.projectName || 'Mattermost'}. Return only TypeScript code.`,
|
|
96
|
+
});
|
|
97
|
+
// Reuse existing parsing logic from prompts/generation.ts
|
|
98
|
+
const parsed = (0, generation_js_1.parseGenerationResponse)(response.text, specPath, 'create_spec', scenario.id);
|
|
99
|
+
return parsed?.code ?? null;
|
|
100
|
+
}
|
|
101
|
+
async function runSingleScenario(scenario, options) {
|
|
102
|
+
const { config, provider } = options;
|
|
103
|
+
const warnings = [];
|
|
104
|
+
const specPath = resolveSpecPath(scenario, config.testsRoot);
|
|
105
|
+
// Build API surface hint
|
|
106
|
+
let apiHint = options.apiSurfaceHint || '';
|
|
107
|
+
if (!apiHint && options.apiSurface) {
|
|
108
|
+
const allClassNames = options.apiSurface.pageObjects.map((po) => po.className);
|
|
109
|
+
apiHint = (0, api_surface_js_1.formatApiSurfaceForPrompt)(options.apiSurface, allClassNames);
|
|
110
|
+
}
|
|
111
|
+
// Step 1: Generate initial spec
|
|
112
|
+
let specCode;
|
|
113
|
+
try {
|
|
114
|
+
specCode = await generateInitialSpec(provider, scenario, specPath, apiHint, options.generationProfile);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
118
|
+
warnings.push(`Generation failed for ${scenario.id}: ${msg}`);
|
|
119
|
+
return { specPath, scenarioSource: scenario.id, status: 'failed', attempts: 0, warnings };
|
|
120
|
+
}
|
|
121
|
+
if (!specCode) {
|
|
122
|
+
warnings.push(`LLM returned invalid code for ${scenario.id}`);
|
|
123
|
+
return { specPath, scenarioSource: scenario.id, status: 'failed', attempts: 0, warnings };
|
|
124
|
+
}
|
|
125
|
+
// Write the spec file
|
|
126
|
+
const dir = (0, path_1.dirname)(specPath);
|
|
127
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
128
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
129
|
+
}
|
|
130
|
+
(0, fs_1.writeFileSync)(specPath, specCode, 'utf-8');
|
|
131
|
+
// Dry run: skip execution
|
|
132
|
+
if (config.dryRun) {
|
|
133
|
+
return { specPath, scenarioSource: scenario.id, status: 'skipped', attempts: 0, warnings };
|
|
134
|
+
}
|
|
135
|
+
// Step 2: Run -> Fix loop
|
|
136
|
+
let lastRun;
|
|
137
|
+
for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {
|
|
138
|
+
lastRun = (0, playwright_runner_js_1.runPlaywrightSpec)(specPath, config.testsRoot, {
|
|
139
|
+
project: config.project,
|
|
140
|
+
baseUrl: config.baseUrl,
|
|
141
|
+
timeoutMs: config.testTimeoutMs,
|
|
142
|
+
});
|
|
143
|
+
// All passed!
|
|
144
|
+
if (lastRun.failed === 0 && lastRun.compiled) {
|
|
145
|
+
return {
|
|
146
|
+
specPath,
|
|
147
|
+
scenarioSource: scenario.id,
|
|
148
|
+
status: 'passed',
|
|
149
|
+
attempts: attempt,
|
|
150
|
+
finalRun: lastRun,
|
|
151
|
+
warnings,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// If this is the last attempt, don't try to fix
|
|
155
|
+
if (attempt >= config.maxAttempts) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
// Step 3: Fix
|
|
159
|
+
const currentCode = (0, fs_1.readFileSync)(specPath, 'utf-8');
|
|
160
|
+
try {
|
|
161
|
+
const fixResult = await (0, fix_loop_js_1.generateFix)(provider, {
|
|
162
|
+
specCode: currentCode,
|
|
163
|
+
failures: lastRun.failures,
|
|
164
|
+
attempt,
|
|
165
|
+
maxAttempts: config.maxAttempts,
|
|
166
|
+
apiSurfaceHint: apiHint,
|
|
167
|
+
});
|
|
168
|
+
if (fixResult.code) {
|
|
169
|
+
(0, fs_1.writeFileSync)(specPath, fixResult.code, 'utf-8');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
warnings.push(`Fix attempt ${attempt} returned invalid code for ${scenario.id}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
177
|
+
warnings.push(`Fix attempt ${attempt} failed for ${scenario.id}: ${msg}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
specPath,
|
|
182
|
+
scenarioSource: scenario.id,
|
|
183
|
+
status: lastRun?.compiled === false ? 'compile-error' : 'max-attempts',
|
|
184
|
+
attempts: config.maxAttempts,
|
|
185
|
+
finalRun: lastRun,
|
|
186
|
+
warnings,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async function runAgenticGeneration(options) {
|
|
190
|
+
const startTime = Date.now();
|
|
191
|
+
const results = [];
|
|
192
|
+
const warnings = [];
|
|
193
|
+
for (const scenario of options.scenarios) {
|
|
194
|
+
const result = await runSingleScenario(scenario, options);
|
|
195
|
+
results.push(result);
|
|
196
|
+
warnings.push(...result.warnings);
|
|
197
|
+
}
|
|
198
|
+
const totalPassed = results.filter((r) => r.status === 'passed').length;
|
|
199
|
+
const totalFailed = results.filter((r) => r.status !== 'passed' && r.status !== 'skipped').length;
|
|
200
|
+
const totalAttempts = results.reduce((sum, r) => sum + r.attempts, 0);
|
|
201
|
+
return {
|
|
202
|
+
results,
|
|
203
|
+
totalGenerated: results.length,
|
|
204
|
+
totalPassed,
|
|
205
|
+
totalFailed,
|
|
206
|
+
totalAttempts,
|
|
207
|
+
durationMs: Date.now() - startTime,
|
|
208
|
+
warnings,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface TestFailure {
|
|
2
|
+
testTitle: string;
|
|
3
|
+
specPath: string;
|
|
4
|
+
error: string;
|
|
5
|
+
/** Truncated stack trace */
|
|
6
|
+
stack: string;
|
|
7
|
+
/** Expected vs actual if available */
|
|
8
|
+
expected?: string;
|
|
9
|
+
actual?: string;
|
|
10
|
+
/** Line number in spec where failure occurred */
|
|
11
|
+
line?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface PlaywrightRunResult {
|
|
14
|
+
specPath: string;
|
|
15
|
+
passed: number;
|
|
16
|
+
failed: number;
|
|
17
|
+
flaky: number;
|
|
18
|
+
skipped: number;
|
|
19
|
+
failures: TestFailure[];
|
|
20
|
+
/** Raw stdout (truncated) */
|
|
21
|
+
stdout: string;
|
|
22
|
+
/** Duration in ms */
|
|
23
|
+
durationMs: number;
|
|
24
|
+
/** Whether the spec even compiled */
|
|
25
|
+
compiled: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface AgenticConfig {
|
|
28
|
+
/** Max fix attempts before giving up (default: 3) */
|
|
29
|
+
maxAttempts: number;
|
|
30
|
+
/** Playwright project to use (default: 'chrome') */
|
|
31
|
+
project: string;
|
|
32
|
+
/** Base URL for Playwright (e.g. http://localhost:8065) */
|
|
33
|
+
baseUrl?: string;
|
|
34
|
+
/** Timeout per test run in ms (default: 120000) */
|
|
35
|
+
testTimeoutMs: number;
|
|
36
|
+
/** LLM provider override */
|
|
37
|
+
provider?: string;
|
|
38
|
+
/** Whether to use Playwright MCP for browser exploration */
|
|
39
|
+
useMcp?: boolean;
|
|
40
|
+
/** Dry run — generate but don't run tests */
|
|
41
|
+
dryRun?: boolean;
|
|
42
|
+
/** Tests root directory */
|
|
43
|
+
testsRoot: string;
|
|
44
|
+
}
|
|
45
|
+
export interface AgenticResult {
|
|
46
|
+
specPath: string;
|
|
47
|
+
scenarioSource: string;
|
|
48
|
+
status: 'passed' | 'failed' | 'max-attempts' | 'compile-error' | 'skipped';
|
|
49
|
+
attempts: number;
|
|
50
|
+
finalRun?: PlaywrightRunResult;
|
|
51
|
+
warnings: string[];
|
|
52
|
+
}
|
|
53
|
+
export interface AgenticSummary {
|
|
54
|
+
results: AgenticResult[];
|
|
55
|
+
totalGenerated: number;
|
|
56
|
+
totalPassed: number;
|
|
57
|
+
totalFailed: number;
|
|
58
|
+
totalAttempts: number;
|
|
59
|
+
durationMs: number;
|
|
60
|
+
warnings: string[];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agentic/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC1B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,CAAC;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Agent, AgentTask, AgentResult } from '../crew/protocol.js';
|
|
2
|
+
import type { CrewContext } from '../crew/context.js';
|
|
3
|
+
import type { AgentRole } from '../crew/types.js';
|
|
4
|
+
export declare class CoverageEvaluatorAgent implements Agent {
|
|
5
|
+
readonly role: AgentRole;
|
|
6
|
+
execute(_task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=coverage-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-evaluator.d.ts","sourceRoot":"","sources":["../../src/agents/coverage-evaluator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAEhD,qBAAa,sBAAuB,YAAW,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAwB;IAE1C,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAmC1E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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.CoverageEvaluatorAgent = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Coverage Evaluator Agent — wraps pipeline stage2 (coverage evaluation) in the Agent interface.
|
|
8
|
+
*/
|
|
9
|
+
const stage2_coverage_js_1 = require("../pipeline/stage2_coverage.js");
|
|
10
|
+
class CoverageEvaluatorAgent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.role = 'coverage-evaluator';
|
|
13
|
+
}
|
|
14
|
+
async execute(_task, ctx) {
|
|
15
|
+
const warnings = [];
|
|
16
|
+
if (ctx.impactedFlows.length === 0) {
|
|
17
|
+
warnings.push('Coverage evaluator: no impacted flows to evaluate.');
|
|
18
|
+
return { role: this.role, status: 'partial', output: [], warnings };
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const result = await (0, stage2_coverage_js_1.runCoverageStage)(ctx.impactedFlows, ctx.specIndex, ctx.context, ctx.testsRoot, { provider: ctx.providerOverride });
|
|
22
|
+
// Replace impacted flows with coverage-enriched versions.
|
|
23
|
+
// This is intentionally a full replace (not push) because coverage evaluation
|
|
24
|
+
// returns the same flow IDs with updated coverage fields.
|
|
25
|
+
ctx.impactedFlows = result.decisions;
|
|
26
|
+
warnings.push(...result.warnings);
|
|
27
|
+
return {
|
|
28
|
+
role: this.role,
|
|
29
|
+
status: 'success',
|
|
30
|
+
output: result.decisions,
|
|
31
|
+
warnings,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
warnings.push(`Coverage evaluator failed: ${message}`);
|
|
37
|
+
return { role: this.role, status: 'failed', output: null, warnings };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.CoverageEvaluatorAgent = CoverageEvaluatorAgent;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Agent, AgentTask, AgentResult } from '../crew/protocol.js';
|
|
2
|
+
import type { CrewContext } from '../crew/context.js';
|
|
3
|
+
import type { AgentRole } from '../crew/types.js';
|
|
4
|
+
export declare class CrossImpactAgent implements Agent {
|
|
5
|
+
readonly role: AgentRole;
|
|
6
|
+
execute(_task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic cross-impact detection: find families that share webapp/server paths
|
|
9
|
+
* or components with the directly impacted families.
|
|
10
|
+
*/
|
|
11
|
+
private detectDeterministic;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cross-impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-impact.d.ts","sourceRoot":"","sources":["../../src/agents/cross-impact.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAc,MAAM,kBAAkB,CAAC;AAK7D,qBAAa,gBAAiB,YAAW,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAkB;IAEpC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA4FvE;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAyC9B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
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.CrossImpactAgent = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Cross-Impact Analyst Agent — finds ripple effects across route families
|
|
8
|
+
* by analyzing shared dependencies between changed families and all other families.
|
|
9
|
+
*/
|
|
10
|
+
const provider_js_1 = require("../crew/provider.js");
|
|
11
|
+
const cross_impact_js_1 = require("../prompts/cross-impact.js");
|
|
12
|
+
const VALID_RISK = new Set(['high', 'medium', 'low']);
|
|
13
|
+
const MAX_CROSS_IMPACTS = 50;
|
|
14
|
+
class CrossImpactAgent {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.role = 'cross-impact';
|
|
17
|
+
}
|
|
18
|
+
async execute(_task, ctx) {
|
|
19
|
+
const warnings = [];
|
|
20
|
+
if (ctx.routeFamilies.length === 0) {
|
|
21
|
+
warnings.push('Cross-impact: no route families available.');
|
|
22
|
+
return { role: this.role, status: 'partial', output: [], warnings };
|
|
23
|
+
}
|
|
24
|
+
// Determine directly impacted families from family groups
|
|
25
|
+
const directlyImpacted = new Set(ctx.familyGroups.map((g) => g.familyId));
|
|
26
|
+
if (directlyImpacted.size === 0) {
|
|
27
|
+
warnings.push('Cross-impact: no directly impacted families.');
|
|
28
|
+
return { role: this.role, status: 'partial', output: [], warnings };
|
|
29
|
+
}
|
|
30
|
+
// First: deterministic cross-impact detection via shared paths
|
|
31
|
+
const deterministicCrossImpacts = this.detectDeterministic(ctx, directlyImpacted)
|
|
32
|
+
.slice(0, MAX_CROSS_IMPACTS);
|
|
33
|
+
ctx.crossImpacts.push(...deterministicCrossImpacts);
|
|
34
|
+
// Then: LLM-enriched analysis for semantic cross-impacts
|
|
35
|
+
try {
|
|
36
|
+
const provider = await (0, provider_js_1.getCrewProvider)(ctx.providerOverride, ctx.budgetUSD, {
|
|
37
|
+
agentRole: 'cross-impact',
|
|
38
|
+
modelRoutingProviderType: ctx.modelRoutingProviderType,
|
|
39
|
+
modelRoutingOverrides: ctx.modelRoutingOverrides,
|
|
40
|
+
budgetLedger: ctx.budgetLedger,
|
|
41
|
+
});
|
|
42
|
+
const prompt = (0, cross_impact_js_1.buildCrossImpactPrompt)({
|
|
43
|
+
changedFiles: ctx.changedFiles,
|
|
44
|
+
families: ctx.routeFamilies,
|
|
45
|
+
directlyImpactedFamilyIds: Array.from(directlyImpacted),
|
|
46
|
+
});
|
|
47
|
+
const response = await provider.generateText(prompt, {
|
|
48
|
+
maxTokens: 3000,
|
|
49
|
+
temperature: 0,
|
|
50
|
+
timeout: 45000,
|
|
51
|
+
systemPrompt: 'Return only valid JSON. Do not include markdown fences unless necessary.',
|
|
52
|
+
});
|
|
53
|
+
const parsed = (0, cross_impact_js_1.parseCrossImpactResponse)(response.text);
|
|
54
|
+
if (parsed && parsed.crossImpacts.length > 0) {
|
|
55
|
+
const familyIds = new Set(ctx.routeFamilies.map((f) => f.id));
|
|
56
|
+
const llmCrossImpacts = parsed.crossImpacts
|
|
57
|
+
.filter((ci) => familyIds.has(ci.sourceFamily) &&
|
|
58
|
+
familyIds.has(ci.affectedFamily) &&
|
|
59
|
+
ci.sourceFamily !== ci.affectedFamily)
|
|
60
|
+
.map((ci) => ({
|
|
61
|
+
sourceFamily: ci.sourceFamily,
|
|
62
|
+
affectedFamily: ci.affectedFamily,
|
|
63
|
+
sharedDependency: ci.sharedDependency || 'unknown',
|
|
64
|
+
riskLevel: VALID_RISK.has(ci.riskLevel) ? ci.riskLevel : 'low',
|
|
65
|
+
evidence: ci.evidence || '',
|
|
66
|
+
}));
|
|
67
|
+
// Deduplicate against deterministic results
|
|
68
|
+
const existing = new Set(ctx.crossImpacts.map((ci) => `${ci.sourceFamily}->${ci.affectedFamily}`));
|
|
69
|
+
for (const ci of llmCrossImpacts) {
|
|
70
|
+
if (ctx.crossImpacts.length >= MAX_CROSS_IMPACTS)
|
|
71
|
+
break;
|
|
72
|
+
const key = `${ci.sourceFamily}->${ci.affectedFamily}`;
|
|
73
|
+
if (!existing.has(key)) {
|
|
74
|
+
ctx.crossImpacts.push(ci);
|
|
75
|
+
existing.add(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
role: this.role,
|
|
81
|
+
status: ctx.crossImpacts.length > 0 ? 'success' : 'partial',
|
|
82
|
+
output: ctx.crossImpacts,
|
|
83
|
+
usage: provider.getUsageStats(),
|
|
84
|
+
warnings,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
warnings.push(`Cross-impact LLM analysis failed: ${message}. Using deterministic results only.`);
|
|
90
|
+
return {
|
|
91
|
+
role: this.role,
|
|
92
|
+
status: deterministicCrossImpacts.length > 0 ? 'partial' : 'failed',
|
|
93
|
+
output: ctx.crossImpacts,
|
|
94
|
+
warnings,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Deterministic cross-impact detection: find families that share webapp/server paths
|
|
100
|
+
* or components with the directly impacted families.
|
|
101
|
+
*/
|
|
102
|
+
detectDeterministic(ctx, directlyImpacted) {
|
|
103
|
+
const results = [];
|
|
104
|
+
for (const sourceId of directlyImpacted) {
|
|
105
|
+
const source = ctx.routeFamilies.find((f) => f.id === sourceId);
|
|
106
|
+
if (!source)
|
|
107
|
+
continue;
|
|
108
|
+
const sourcePaths = new Set([
|
|
109
|
+
...(source.webappPaths || []),
|
|
110
|
+
...(source.serverPaths || []),
|
|
111
|
+
...(source.components || []),
|
|
112
|
+
]);
|
|
113
|
+
if (sourcePaths.size === 0)
|
|
114
|
+
continue;
|
|
115
|
+
for (const target of ctx.routeFamilies) {
|
|
116
|
+
if (target.id === sourceId)
|
|
117
|
+
continue;
|
|
118
|
+
const targetPaths = [
|
|
119
|
+
...(target.webappPaths || []),
|
|
120
|
+
...(target.serverPaths || []),
|
|
121
|
+
...(target.components || []),
|
|
122
|
+
];
|
|
123
|
+
for (const path of targetPaths) {
|
|
124
|
+
if (sourcePaths.has(path)) {
|
|
125
|
+
results.push({
|
|
126
|
+
sourceFamily: sourceId,
|
|
127
|
+
affectedFamily: target.id,
|
|
128
|
+
sharedDependency: path,
|
|
129
|
+
riskLevel: 'medium',
|
|
130
|
+
evidence: `Shared path: ${path} is referenced by both ${sourceId} and ${target.id}`,
|
|
131
|
+
});
|
|
132
|
+
break; // One match per family pair is enough
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return results;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.CrossImpactAgent = CrossImpactAgent;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Agent, AgentTask, AgentResult } from '../crew/protocol.js';
|
|
2
|
+
import type { CrewContext } from '../crew/context.js';
|
|
3
|
+
import type { AgentRole } from '../crew/types.js';
|
|
4
|
+
export declare class ExecutorAgent implements Agent {
|
|
5
|
+
readonly role: AgentRole;
|
|
6
|
+
execute(_task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/agents/executor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAKhD,qBAAa,aAAc,YAAW,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAc;IAEhC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CA6D1E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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.ExecutorAgent = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Executor Agent — wraps agentic test execution in the Agent interface.
|
|
8
|
+
* Runs generated specs through Playwright and collects results.
|
|
9
|
+
*/
|
|
10
|
+
const provider_js_1 = require("../crew/provider.js");
|
|
11
|
+
const runner_js_1 = require("../agentic/runner.js");
|
|
12
|
+
const MAX_FIX_ATTEMPTS = 2;
|
|
13
|
+
const TEST_TIMEOUT_MS = 120000;
|
|
14
|
+
class ExecutorAgent {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.role = 'executor';
|
|
17
|
+
}
|
|
18
|
+
async execute(_task, ctx) {
|
|
19
|
+
const warnings = [];
|
|
20
|
+
const writtenSpecs = ctx.generatedSpecs.filter((s) => s.written);
|
|
21
|
+
if (writtenSpecs.length === 0) {
|
|
22
|
+
warnings.push('Executor: no written specs to execute.');
|
|
23
|
+
return { role: this.role, status: 'partial', output: null, warnings };
|
|
24
|
+
}
|
|
25
|
+
// Build ScenarioInput[] from generated specs + impacted flows
|
|
26
|
+
const flowMap = new Map(ctx.impactedFlows.map((f) => [f.flowId, f]));
|
|
27
|
+
const scenarios = writtenSpecs.map((spec) => {
|
|
28
|
+
const flow = flowMap.get(spec.flowId);
|
|
29
|
+
return {
|
|
30
|
+
id: spec.flowId,
|
|
31
|
+
name: flow?.flowName || spec.flowId,
|
|
32
|
+
scenarios: flow?.scenariosToAdd || [],
|
|
33
|
+
routeFamily: flow?.routeFamily || 'unknown',
|
|
34
|
+
priority: flow?.priority || 'P2',
|
|
35
|
+
targetSpec: spec.mode === 'add_scenarios' ? spec.specPath : undefined,
|
|
36
|
+
changedFiles: flow?.changedFiles,
|
|
37
|
+
evidence: flow?.evidence,
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
const provider = await (0, provider_js_1.getCrewProvider)(ctx.providerOverride, ctx.budgetUSD, {
|
|
42
|
+
agentRole: 'executor',
|
|
43
|
+
modelRoutingProviderType: ctx.modelRoutingProviderType,
|
|
44
|
+
modelRoutingOverrides: ctx.modelRoutingOverrides,
|
|
45
|
+
budgetLedger: ctx.budgetLedger,
|
|
46
|
+
});
|
|
47
|
+
const summary = await (0, runner_js_1.runAgenticGeneration)({
|
|
48
|
+
scenarios,
|
|
49
|
+
config: {
|
|
50
|
+
maxAttempts: MAX_FIX_ATTEMPTS,
|
|
51
|
+
project: 'chrome',
|
|
52
|
+
testTimeoutMs: TEST_TIMEOUT_MS,
|
|
53
|
+
provider: ctx.providerOverride,
|
|
54
|
+
testsRoot: ctx.testsRoot,
|
|
55
|
+
},
|
|
56
|
+
provider,
|
|
57
|
+
apiSurface: ctx.apiSurface,
|
|
58
|
+
});
|
|
59
|
+
warnings.push(...summary.warnings);
|
|
60
|
+
return {
|
|
61
|
+
role: this.role,
|
|
62
|
+
status: summary.totalPassed > 0 ? 'success' : 'partial',
|
|
63
|
+
output: summary,
|
|
64
|
+
usage: provider.getUsageStats(),
|
|
65
|
+
warnings,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
70
|
+
warnings.push(`Executor failed: ${message}`);
|
|
71
|
+
return { role: this.role, status: 'failed', output: null, warnings };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.ExecutorAgent = ExecutorAgent;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explorer Agent — wraps the QA agent browser exploration loop in the Agent interface.
|
|
3
|
+
* This agent is optional and only runs when a browser environment is available.
|
|
4
|
+
*/
|
|
5
|
+
import type { Agent, AgentTask, AgentResult } from '../crew/protocol.js';
|
|
6
|
+
import type { CrewContext } from '../crew/context.js';
|
|
7
|
+
import type { AgentRole } from '../crew/types.js';
|
|
8
|
+
export declare class ExplorerAgent implements Agent {
|
|
9
|
+
readonly role: AgentRole;
|
|
10
|
+
execute(_task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=explorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../../src/agents/explorer.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAEhD,qBAAa,aAAc,YAAW,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAc;IAEhC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAmC1E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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.ExplorerAgent = void 0;
|
|
6
|
+
class ExplorerAgent {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.role = 'explorer';
|
|
9
|
+
}
|
|
10
|
+
async execute(_task, ctx) {
|
|
11
|
+
const warnings = [];
|
|
12
|
+
// Explorer requires browser environment — skip gracefully if not available
|
|
13
|
+
try {
|
|
14
|
+
// Build target flows from impacted flows
|
|
15
|
+
const targetFlows = ctx.impactedFlows
|
|
16
|
+
.filter((d) => d.action !== 'cannot_determine')
|
|
17
|
+
.map((d) => ({
|
|
18
|
+
id: d.flowId,
|
|
19
|
+
name: d.flowName,
|
|
20
|
+
url: d.specificRoute,
|
|
21
|
+
priority: d.priority,
|
|
22
|
+
}));
|
|
23
|
+
if (targetFlows.length === 0) {
|
|
24
|
+
warnings.push('Explorer: no target flows for exploration.');
|
|
25
|
+
return { role: this.role, status: 'partial', output: null, warnings };
|
|
26
|
+
}
|
|
27
|
+
// Convert QA findings to crew findings
|
|
28
|
+
warnings.push(`Explorer: ${targetFlows.length} flows available for exploration (requires browser environment).`);
|
|
29
|
+
return {
|
|
30
|
+
role: this.role,
|
|
31
|
+
status: 'partial',
|
|
32
|
+
output: { targetFlows },
|
|
33
|
+
warnings,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
warnings.push(`Explorer failed: ${message}`);
|
|
39
|
+
return { role: this.role, status: 'failed', output: null, warnings };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ExplorerAgent = ExplorerAgent;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Agent, AgentTask, AgentResult } from '../crew/protocol.js';
|
|
2
|
+
import type { CrewContext } from '../crew/context.js';
|
|
3
|
+
import type { AgentRole } from '../crew/types.js';
|
|
4
|
+
export declare class GeneratorAgent implements Agent {
|
|
5
|
+
readonly role: AgentRole;
|
|
6
|
+
execute(_task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/agents/generator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AA6ChD,qBAAa,cAAe,YAAW,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAe;IAEjC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC1E"}
|