@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
package/dist/index.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
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 = exports.getSpecsForFamily = exports.buildSpecIndex = exports.loadOrBuildApiSurface = exports.buildApiSurface = exports.getUserFlowsForBinding = exports.getPriorityForBinding = exports.getCypressSpecDirsForBinding = exports.bindFilesToFamilies = exports.loadRouteFamilyManifest = exports.buildQualityFixPrompt = exports.buildHealPrompt = exports.renderHealMarkdown = exports.resolveHealTargets = exports.healFromReport = exports.runHealStage = exports.detectHallucinatedMethods = exports.parseGenerationResponse = exports.buildGenerationPrompt = exports.runGenerationStage = exports.runPipeline = exports.captureTraceabilityInput = exports.ingestTraceabilityInput = exports.finalizeGeneratedTests = exports.getAdaptiveThresholds = exports.readFlakyTests = exports.readCalibration = exports.appendFeedbackAndRecompute = exports.buildPlanFromImpact = exports.extractScenarios = exports.getPartialGaps = exports.getGapsWithSuppressed = exports.getGaps = exports.analyzeImpactV2 = exports.captureTraceability = exports.ingestTraceability = exports.handoffGeneratedTests = exports.recommendTestsDeterministic = exports.analyzeImpactDeterministic = exports.validateProviderSetup = exports.LLMProviderFactory = exports.CustomProvider = exports.checkOpenAISetup = exports.OpenAIProvider = exports.checkOllamaSetup = exports.OllamaProvider = exports.checkAnthropicSetup = exports.AnthropicProvider = exports.UnsupportedCapabilityError = exports.LLMProviderError = void 0;
|
|
6
|
+
exports.serializeManifest = exports.detectTestMode = exports.detectFramework = exports.isMattermostProfile = exports.resolveGenerationProfile = exports.scanFromKnowledgeGraph = exports.loadDiffOverlay = exports.transformKGToFamilies = exports.classifyProjectType = exports.loadKnowledgeGraph = exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = exports.EXIT_CODES = exports.classifyError = exports.CliError = exports.sanitizeObject = exports.containsSecrets = exports.sanitizeSecrets = exports.PrometheusMetrics = exports.CircuitBreaker = exports.withRetry = exports.ModelRouter = exports.BudgetLedger = exports.BudgetExceededError = exports.BaseProvider = exports.RegressionAdvisorAgent = exports.CrossImpactAgent = exports.TestDesignerAgent = exports.StrategistAgent = exports.ExplorerAgent = exports.HealerAgent = exports.ExecutorAgent = exports.GeneratorAgent = exports.CoverageEvaluatorAgent = exports.ImpactAnalystAgent = exports.WORKFLOWS = exports.CrewOrchestrator = void 0;
|
|
7
|
+
var provider_interface_js_1 = require("./provider_interface.js");
|
|
8
|
+
Object.defineProperty(exports, "LLMProviderError", { enumerable: true, get: function () { return provider_interface_js_1.LLMProviderError; } });
|
|
9
|
+
Object.defineProperty(exports, "UnsupportedCapabilityError", { enumerable: true, get: function () { return provider_interface_js_1.UnsupportedCapabilityError; } });
|
|
10
|
+
// Provider implementations
|
|
11
|
+
var anthropic_provider_js_1 = require("./anthropic_provider.js");
|
|
12
|
+
Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_provider_js_1.AnthropicProvider; } });
|
|
13
|
+
Object.defineProperty(exports, "checkAnthropicSetup", { enumerable: true, get: function () { return anthropic_provider_js_1.checkAnthropicSetup; } });
|
|
14
|
+
var ollama_provider_js_1 = require("./ollama_provider.js");
|
|
15
|
+
Object.defineProperty(exports, "OllamaProvider", { enumerable: true, get: function () { return ollama_provider_js_1.OllamaProvider; } });
|
|
16
|
+
Object.defineProperty(exports, "checkOllamaSetup", { enumerable: true, get: function () { return ollama_provider_js_1.checkOllamaSetup; } });
|
|
17
|
+
var openai_provider_js_1 = require("./openai_provider.js");
|
|
18
|
+
Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_provider_js_1.OpenAIProvider; } });
|
|
19
|
+
Object.defineProperty(exports, "checkOpenAISetup", { enumerable: true, get: function () { return openai_provider_js_1.checkOpenAISetup; } });
|
|
20
|
+
var custom_provider_js_1 = require("./custom_provider.js");
|
|
21
|
+
Object.defineProperty(exports, "CustomProvider", { enumerable: true, get: function () { return custom_provider_js_1.CustomProvider; } });
|
|
22
|
+
// Factory
|
|
23
|
+
var provider_factory_js_1 = require("./provider_factory.js");
|
|
24
|
+
Object.defineProperty(exports, "LLMProviderFactory", { enumerable: true, get: function () { return provider_factory_js_1.LLMProviderFactory; } });
|
|
25
|
+
Object.defineProperty(exports, "validateProviderSetup", { enumerable: true, get: function () { return provider_factory_js_1.validateProviderSetup; } });
|
|
26
|
+
// Agent API (deterministic impact + plan, traceability)
|
|
27
|
+
var api_js_1 = require("./api.js");
|
|
28
|
+
Object.defineProperty(exports, "analyzeImpactDeterministic", { enumerable: true, get: function () { return api_js_1.analyzeImpactDeterministic; } });
|
|
29
|
+
Object.defineProperty(exports, "recommendTestsDeterministic", { enumerable: true, get: function () { return api_js_1.recommendTestsDeterministic; } });
|
|
30
|
+
Object.defineProperty(exports, "handoffGeneratedTests", { enumerable: true, get: function () { return api_js_1.handoffGeneratedTests; } });
|
|
31
|
+
Object.defineProperty(exports, "ingestTraceability", { enumerable: true, get: function () { return api_js_1.ingestTraceability; } });
|
|
32
|
+
Object.defineProperty(exports, "captureTraceability", { enumerable: true, get: function () { return api_js_1.captureTraceability; } });
|
|
33
|
+
// V2 Engine (deterministic impact + plan)
|
|
34
|
+
var impact_engine_js_1 = require("./engine/impact_engine.js");
|
|
35
|
+
Object.defineProperty(exports, "analyzeImpactV2", { enumerable: true, get: function () { return impact_engine_js_1.analyzeImpact; } });
|
|
36
|
+
Object.defineProperty(exports, "getGaps", { enumerable: true, get: function () { return impact_engine_js_1.getGaps; } });
|
|
37
|
+
Object.defineProperty(exports, "getGapsWithSuppressed", { enumerable: true, get: function () { return impact_engine_js_1.getGapsWithSuppressed; } });
|
|
38
|
+
Object.defineProperty(exports, "getPartialGaps", { enumerable: true, get: function () { return impact_engine_js_1.getPartialGaps; } });
|
|
39
|
+
var impact_engine_js_2 = require("./engine/impact_engine.js");
|
|
40
|
+
Object.defineProperty(exports, "extractScenarios", { enumerable: true, get: function () { return impact_engine_js_2.extractScenarios; } });
|
|
41
|
+
var plan_builder_js_1 = require("./engine/plan_builder.js");
|
|
42
|
+
Object.defineProperty(exports, "buildPlanFromImpact", { enumerable: true, get: function () { return plan_builder_js_1.buildPlanFromImpact; } });
|
|
43
|
+
var feedback_js_1 = require("./agent/feedback.js");
|
|
44
|
+
Object.defineProperty(exports, "appendFeedbackAndRecompute", { enumerable: true, get: function () { return feedback_js_1.appendFeedbackAndRecompute; } });
|
|
45
|
+
Object.defineProperty(exports, "readCalibration", { enumerable: true, get: function () { return feedback_js_1.readCalibration; } });
|
|
46
|
+
Object.defineProperty(exports, "readFlakyTests", { enumerable: true, get: function () { return feedback_js_1.readFlakyTests; } });
|
|
47
|
+
Object.defineProperty(exports, "getAdaptiveThresholds", { enumerable: true, get: function () { return feedback_js_1.getAdaptiveThresholds; } });
|
|
48
|
+
var handoff_js_1 = require("./agent/handoff.js");
|
|
49
|
+
Object.defineProperty(exports, "finalizeGeneratedTests", { enumerable: true, get: function () { return handoff_js_1.finalizeGeneratedTests; } });
|
|
50
|
+
var traceability_ingest_js_1 = require("./agent/traceability_ingest.js");
|
|
51
|
+
Object.defineProperty(exports, "ingestTraceabilityInput", { enumerable: true, get: function () { return traceability_ingest_js_1.ingestTraceabilityInput; } });
|
|
52
|
+
var traceability_capture_js_1 = require("./agent/traceability_capture.js");
|
|
53
|
+
Object.defineProperty(exports, "captureTraceabilityInput", { enumerable: true, get: function () { return traceability_capture_js_1.captureTraceabilityInput; } });
|
|
54
|
+
// Pipeline API (route-family-bound impact analysis)
|
|
55
|
+
var orchestrator_js_1 = require("./pipeline/orchestrator.js");
|
|
56
|
+
Object.defineProperty(exports, "runPipeline", { enumerable: true, get: function () { return orchestrator_js_1.runPipeline; } });
|
|
57
|
+
var stage3_generation_js_1 = require("./pipeline/stage3_generation.js");
|
|
58
|
+
Object.defineProperty(exports, "runGenerationStage", { enumerable: true, get: function () { return stage3_generation_js_1.runGenerationStage; } });
|
|
59
|
+
var generation_js_1 = require("./prompts/generation.js");
|
|
60
|
+
Object.defineProperty(exports, "buildGenerationPrompt", { enumerable: true, get: function () { return generation_js_1.buildGenerationPrompt; } });
|
|
61
|
+
Object.defineProperty(exports, "parseGenerationResponse", { enumerable: true, get: function () { return generation_js_1.parseGenerationResponse; } });
|
|
62
|
+
Object.defineProperty(exports, "detectHallucinatedMethods", { enumerable: true, get: function () { return generation_js_1.detectHallucinatedMethods; } });
|
|
63
|
+
var stage4_heal_js_1 = require("./pipeline/stage4_heal.js");
|
|
64
|
+
Object.defineProperty(exports, "runHealStage", { enumerable: true, get: function () { return stage4_heal_js_1.runHealStage; } });
|
|
65
|
+
Object.defineProperty(exports, "healFromReport", { enumerable: true, get: function () { return stage4_heal_js_1.healFromReport; } });
|
|
66
|
+
Object.defineProperty(exports, "resolveHealTargets", { enumerable: true, get: function () { return stage4_heal_js_1.resolveHealTargets; } });
|
|
67
|
+
Object.defineProperty(exports, "renderHealMarkdown", { enumerable: true, get: function () { return stage4_heal_js_1.renderHealMarkdown; } });
|
|
68
|
+
var heal_js_1 = require("./prompts/heal.js");
|
|
69
|
+
Object.defineProperty(exports, "buildHealPrompt", { enumerable: true, get: function () { return heal_js_1.buildHealPrompt; } });
|
|
70
|
+
Object.defineProperty(exports, "buildQualityFixPrompt", { enumerable: true, get: function () { return heal_js_1.buildQualityFixPrompt; } });
|
|
71
|
+
// Knowledge modules
|
|
72
|
+
var route_families_js_1 = require("./knowledge/route_families.js");
|
|
73
|
+
Object.defineProperty(exports, "loadRouteFamilyManifest", { enumerable: true, get: function () { return route_families_js_1.loadRouteFamilyManifest; } });
|
|
74
|
+
Object.defineProperty(exports, "bindFilesToFamilies", { enumerable: true, get: function () { return route_families_js_1.bindFilesToFamilies; } });
|
|
75
|
+
Object.defineProperty(exports, "getCypressSpecDirsForBinding", { enumerable: true, get: function () { return route_families_js_1.getCypressSpecDirsForBinding; } });
|
|
76
|
+
Object.defineProperty(exports, "getPriorityForBinding", { enumerable: true, get: function () { return route_families_js_1.getPriorityForBinding; } });
|
|
77
|
+
Object.defineProperty(exports, "getUserFlowsForBinding", { enumerable: true, get: function () { return route_families_js_1.getUserFlowsForBinding; } });
|
|
78
|
+
var api_surface_js_1 = require("./knowledge/api_surface.js");
|
|
79
|
+
Object.defineProperty(exports, "buildApiSurface", { enumerable: true, get: function () { return api_surface_js_1.buildApiSurface; } });
|
|
80
|
+
Object.defineProperty(exports, "loadOrBuildApiSurface", { enumerable: true, get: function () { return api_surface_js_1.loadOrBuildApiSurface; } });
|
|
81
|
+
var spec_index_js_1 = require("./knowledge/spec_index.js");
|
|
82
|
+
Object.defineProperty(exports, "buildSpecIndex", { enumerable: true, get: function () { return spec_index_js_1.buildSpecIndex; } });
|
|
83
|
+
Object.defineProperty(exports, "getSpecsForFamily", { enumerable: true, get: function () { return spec_index_js_1.getSpecsForFamily; } });
|
|
84
|
+
// Agentic generation
|
|
85
|
+
var runner_js_1 = require("./agentic/runner.js");
|
|
86
|
+
Object.defineProperty(exports, "runAgenticGeneration", { enumerable: true, get: function () { return runner_js_1.runAgenticGeneration; } });
|
|
87
|
+
// Crew (multi-agent QA workflows)
|
|
88
|
+
var orchestrator_js_2 = require("./crew/orchestrator.js");
|
|
89
|
+
Object.defineProperty(exports, "CrewOrchestrator", { enumerable: true, get: function () { return orchestrator_js_2.CrewOrchestrator; } });
|
|
90
|
+
var workflows_js_1 = require("./crew/workflows.js");
|
|
91
|
+
Object.defineProperty(exports, "WORKFLOWS", { enumerable: true, get: function () { return workflows_js_1.WORKFLOWS; } });
|
|
92
|
+
// Crew agents
|
|
93
|
+
var impact_analyst_js_1 = require("./agents/impact-analyst.js");
|
|
94
|
+
Object.defineProperty(exports, "ImpactAnalystAgent", { enumerable: true, get: function () { return impact_analyst_js_1.ImpactAnalystAgent; } });
|
|
95
|
+
var coverage_evaluator_js_1 = require("./agents/coverage-evaluator.js");
|
|
96
|
+
Object.defineProperty(exports, "CoverageEvaluatorAgent", { enumerable: true, get: function () { return coverage_evaluator_js_1.CoverageEvaluatorAgent; } });
|
|
97
|
+
var generator_js_1 = require("./agents/generator.js");
|
|
98
|
+
Object.defineProperty(exports, "GeneratorAgent", { enumerable: true, get: function () { return generator_js_1.GeneratorAgent; } });
|
|
99
|
+
var executor_js_1 = require("./agents/executor.js");
|
|
100
|
+
Object.defineProperty(exports, "ExecutorAgent", { enumerable: true, get: function () { return executor_js_1.ExecutorAgent; } });
|
|
101
|
+
var healer_js_1 = require("./agents/healer.js");
|
|
102
|
+
Object.defineProperty(exports, "HealerAgent", { enumerable: true, get: function () { return healer_js_1.HealerAgent; } });
|
|
103
|
+
var explorer_js_1 = require("./agents/explorer.js");
|
|
104
|
+
Object.defineProperty(exports, "ExplorerAgent", { enumerable: true, get: function () { return explorer_js_1.ExplorerAgent; } });
|
|
105
|
+
var strategist_js_1 = require("./agents/strategist.js");
|
|
106
|
+
Object.defineProperty(exports, "StrategistAgent", { enumerable: true, get: function () { return strategist_js_1.StrategistAgent; } });
|
|
107
|
+
var test_designer_js_1 = require("./agents/test-designer.js");
|
|
108
|
+
Object.defineProperty(exports, "TestDesignerAgent", { enumerable: true, get: function () { return test_designer_js_1.TestDesignerAgent; } });
|
|
109
|
+
var cross_impact_js_1 = require("./agents/cross-impact.js");
|
|
110
|
+
Object.defineProperty(exports, "CrossImpactAgent", { enumerable: true, get: function () { return cross_impact_js_1.CrossImpactAgent; } });
|
|
111
|
+
var regression_advisor_js_1 = require("./agents/regression-advisor.js");
|
|
112
|
+
Object.defineProperty(exports, "RegressionAdvisorAgent", { enumerable: true, get: function () { return regression_advisor_js_1.RegressionAdvisorAgent; } });
|
|
113
|
+
// Base provider (for extending with custom providers)
|
|
114
|
+
var base_provider_js_1 = require("./base_provider.js");
|
|
115
|
+
Object.defineProperty(exports, "BaseProvider", { enumerable: true, get: function () { return base_provider_js_1.BaseProvider; } });
|
|
116
|
+
Object.defineProperty(exports, "BudgetExceededError", { enumerable: true, get: function () { return base_provider_js_1.BudgetExceededError; } });
|
|
117
|
+
// Budget tracking
|
|
118
|
+
var budget_ledger_js_1 = require("./budget_ledger.js");
|
|
119
|
+
Object.defineProperty(exports, "BudgetLedger", { enumerable: true, get: function () { return budget_ledger_js_1.BudgetLedger; } });
|
|
120
|
+
// Model routing
|
|
121
|
+
var model_router_js_1 = require("./model_router.js");
|
|
122
|
+
Object.defineProperty(exports, "ModelRouter", { enumerable: true, get: function () { return model_router_js_1.ModelRouter; } });
|
|
123
|
+
// Resilience
|
|
124
|
+
var retry_js_1 = require("./resilience/retry.js");
|
|
125
|
+
Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_js_1.withRetry; } });
|
|
126
|
+
var circuit_breaker_js_1 = require("./resilience/circuit_breaker.js");
|
|
127
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_js_1.CircuitBreaker; } });
|
|
128
|
+
// Metrics
|
|
129
|
+
var prometheus_js_1 = require("./metrics/prometheus.js");
|
|
130
|
+
Object.defineProperty(exports, "PrometheusMetrics", { enumerable: true, get: function () { return prometheus_js_1.PrometheusMetrics; } });
|
|
131
|
+
// Secret scanning
|
|
132
|
+
var sanitize_js_1 = require("./sanitize.js");
|
|
133
|
+
Object.defineProperty(exports, "sanitizeSecrets", { enumerable: true, get: function () { return sanitize_js_1.sanitizeSecrets; } });
|
|
134
|
+
Object.defineProperty(exports, "containsSecrets", { enumerable: true, get: function () { return sanitize_js_1.containsSecrets; } });
|
|
135
|
+
Object.defineProperty(exports, "sanitizeObject", { enumerable: true, get: function () { return sanitize_js_1.sanitizeObject; } });
|
|
136
|
+
// CLI errors
|
|
137
|
+
var errors_js_1 = require("./cli/errors.js");
|
|
138
|
+
Object.defineProperty(exports, "CliError", { enumerable: true, get: function () { return errors_js_1.CliError; } });
|
|
139
|
+
Object.defineProperty(exports, "classifyError", { enumerable: true, get: function () { return errors_js_1.classifyError; } });
|
|
140
|
+
Object.defineProperty(exports, "EXIT_CODES", { enumerable: true, get: function () { return errors_js_1.EXIT_CODES; } });
|
|
141
|
+
// Training (route-families bootstrap and maintenance)
|
|
142
|
+
var scanner_js_1 = require("./training/scanner.js");
|
|
143
|
+
Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_js_1.scanProject; } });
|
|
144
|
+
var merger_js_1 = require("./training/merger.js");
|
|
145
|
+
Object.defineProperty(exports, "mergeFamilies", { enumerable: true, get: function () { return merger_js_1.mergeFamilies; } });
|
|
146
|
+
Object.defineProperty(exports, "detectStaleFamilies", { enumerable: true, get: function () { return merger_js_1.detectStaleFamilies; } });
|
|
147
|
+
var enricher_js_1 = require("./training/enricher.js");
|
|
148
|
+
Object.defineProperty(exports, "enrichFamilies", { enumerable: true, get: function () { return enricher_js_1.enrichFamilies; } });
|
|
149
|
+
var validator_js_1 = require("./training/validator.js");
|
|
150
|
+
Object.defineProperty(exports, "getCommitFiles", { enumerable: true, get: function () { return validator_js_1.getCommitFiles; } });
|
|
151
|
+
Object.defineProperty(exports, "validateCommit", { enumerable: true, get: function () { return validator_js_1.validateCommit; } });
|
|
152
|
+
Object.defineProperty(exports, "buildValidationReport", { enumerable: true, get: function () { return validator_js_1.buildValidationReport; } });
|
|
153
|
+
Object.defineProperty(exports, "formatValidationReport", { enumerable: true, get: function () { return validator_js_1.formatValidationReport; } });
|
|
154
|
+
var kg_bridge_js_1 = require("./knowledge/kg_bridge.js");
|
|
155
|
+
Object.defineProperty(exports, "loadKnowledgeGraph", { enumerable: true, get: function () { return kg_bridge_js_1.loadKnowledgeGraph; } });
|
|
156
|
+
Object.defineProperty(exports, "classifyProjectType", { enumerable: true, get: function () { return kg_bridge_js_1.classifyProjectType; } });
|
|
157
|
+
Object.defineProperty(exports, "transformKGToFamilies", { enumerable: true, get: function () { return kg_bridge_js_1.transformKGToFamilies; } });
|
|
158
|
+
Object.defineProperty(exports, "loadDiffOverlay", { enumerable: true, get: function () { return kg_bridge_js_1.loadDiffOverlay; } });
|
|
159
|
+
var kg_scanner_js_1 = require("./training/kg_scanner.js");
|
|
160
|
+
Object.defineProperty(exports, "scanFromKnowledgeGraph", { enumerable: true, get: function () { return kg_scanner_js_1.scanFromKnowledgeGraph; } });
|
|
161
|
+
var generation_profile_js_1 = require("./prompts/generation_profile.js");
|
|
162
|
+
Object.defineProperty(exports, "resolveGenerationProfile", { enumerable: true, get: function () { return generation_profile_js_1.resolveGenerationProfile; } });
|
|
163
|
+
Object.defineProperty(exports, "isMattermostProfile", { enumerable: true, get: function () { return generation_profile_js_1.isMattermostProfile; } });
|
|
164
|
+
var framework_adapter_js_1 = require("./adapters/framework_adapter.js");
|
|
165
|
+
Object.defineProperty(exports, "detectFramework", { enumerable: true, get: function () { return framework_adapter_js_1.detectFramework; } });
|
|
166
|
+
Object.defineProperty(exports, "detectTestMode", { enumerable: true, get: function () { return framework_adapter_js_1.detectTestMode; } });
|
|
167
|
+
// Route families (additional)
|
|
168
|
+
var route_families_js_2 = require("./knowledge/route_families.js");
|
|
169
|
+
Object.defineProperty(exports, "serializeManifest", { enumerable: true, get: function () { return route_families_js_2.serializeManifest; } });
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface MethodParam {
|
|
2
|
+
name: string;
|
|
3
|
+
type?: string;
|
|
4
|
+
optional?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface MethodSignature {
|
|
7
|
+
name: string;
|
|
8
|
+
kind: 'method' | 'property' | 'getter';
|
|
9
|
+
params?: MethodParam[];
|
|
10
|
+
returnType?: string;
|
|
11
|
+
async?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface PageObjectSurface {
|
|
14
|
+
className: string;
|
|
15
|
+
file: string;
|
|
16
|
+
methods: MethodSignature[];
|
|
17
|
+
/** Base class name if the class extends another */
|
|
18
|
+
extends?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ApiSurfaceCatalog {
|
|
21
|
+
pageObjects: PageObjectSurface[];
|
|
22
|
+
generatedAt: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ApiSurfaceConfig {
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
pageObjectsDir?: string;
|
|
27
|
+
componentsDir?: string;
|
|
28
|
+
cachePath?: string;
|
|
29
|
+
/** Use fast regex extraction instead of TypeScript AST (fallback mode) */
|
|
30
|
+
useRegexFallback?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function buildApiSurface(testsRoot: string, config?: ApiSurfaceConfig): ApiSurfaceCatalog;
|
|
33
|
+
export declare function loadOrBuildApiSurface(testsRoot: string, config?: ApiSurfaceConfig): ApiSurfaceCatalog;
|
|
34
|
+
export declare function getMethodsForPageObject(catalog: ApiSurfaceCatalog, className: string): MethodSignature[];
|
|
35
|
+
export declare function validateMethodCall(catalog: ApiSurfaceCatalog, className: string, methodName: string): boolean;
|
|
36
|
+
export declare function formatApiSurfaceForPrompt(catalog: ApiSurfaceCatalog, classNames: string[]): string;
|
|
37
|
+
//# sourceMappingURL=api_surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api_surface.d.ts","sourceRoot":"","sources":["../../src/knowledge/api_surface.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAgVD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAqC/F;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAgCrG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAGxG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG7G;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BlG"}
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.buildApiSurface = buildApiSurface;
|
|
9
|
+
exports.loadOrBuildApiSurface = loadOrBuildApiSurface;
|
|
10
|
+
exports.getMethodsForPageObject = getMethodsForPageObject;
|
|
11
|
+
exports.validateMethodCall = validateMethodCall;
|
|
12
|
+
exports.formatApiSurfaceForPrompt = formatApiSurfaceForPrompt;
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
16
|
+
// ── TypeScript AST-based extraction ────────────────────────
|
|
17
|
+
function extractMethodsFromAST(sourceFile, checker) {
|
|
18
|
+
const surfaces = [];
|
|
19
|
+
typescript_1.default.forEachChild(sourceFile, (node) => {
|
|
20
|
+
if (!typescript_1.default.isClassDeclaration(node) || !node.name) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const className = node.name.text;
|
|
24
|
+
const methods = [];
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
// Get base class name if extends
|
|
27
|
+
let extendsName;
|
|
28
|
+
if (node.heritageClauses) {
|
|
29
|
+
for (const clause of node.heritageClauses) {
|
|
30
|
+
if (clause.token === typescript_1.default.SyntaxKind.ExtendsKeyword && clause.types.length > 0) {
|
|
31
|
+
const expr = clause.types[0].expression;
|
|
32
|
+
if (typescript_1.default.isIdentifier(expr)) {
|
|
33
|
+
extendsName = expr.text;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const member of node.members) {
|
|
39
|
+
// Skip constructor
|
|
40
|
+
if (typescript_1.default.isConstructorDeclaration(member)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// Skip private/protected members
|
|
44
|
+
const modifiers = typescript_1.default.canHaveModifiers(member) ? typescript_1.default.getModifiers(member) : undefined;
|
|
45
|
+
if (modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.PrivateKeyword || m.kind === typescript_1.default.SyntaxKind.ProtectedKeyword)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const name = member.name && typescript_1.default.isIdentifier(member.name) ? member.name.text : null;
|
|
49
|
+
if (!name || name.startsWith('_') || seen.has(name)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
seen.add(name);
|
|
53
|
+
if (typescript_1.default.isMethodDeclaration(member)) {
|
|
54
|
+
const isAsync = modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.AsyncKeyword) ?? false;
|
|
55
|
+
const params = extractParams(member.parameters, checker);
|
|
56
|
+
const returnType = extractReturnType(member, checker);
|
|
57
|
+
methods.push({
|
|
58
|
+
name,
|
|
59
|
+
kind: 'method',
|
|
60
|
+
async: isAsync ? true : undefined,
|
|
61
|
+
params: params.length > 0 ? params : undefined,
|
|
62
|
+
returnType: returnType || undefined,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (typescript_1.default.isGetAccessorDeclaration(member)) {
|
|
66
|
+
methods.push({ name, kind: 'getter' });
|
|
67
|
+
}
|
|
68
|
+
else if (typescript_1.default.isPropertyDeclaration(member)) {
|
|
69
|
+
// Check if it's an arrow function property (e.g., name = async () => {})
|
|
70
|
+
if (member.initializer && (typescript_1.default.isArrowFunction(member.initializer) || typescript_1.default.isFunctionExpression(member.initializer))) {
|
|
71
|
+
const fn = member.initializer;
|
|
72
|
+
const fnModifiers = typescript_1.default.canHaveModifiers(fn) ? typescript_1.default.getModifiers(fn) : undefined;
|
|
73
|
+
const isAsync = fnModifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.AsyncKeyword) ?? false;
|
|
74
|
+
const params = extractParams(fn.parameters, checker);
|
|
75
|
+
methods.push({
|
|
76
|
+
name,
|
|
77
|
+
kind: 'method',
|
|
78
|
+
async: isAsync ? true : undefined,
|
|
79
|
+
params: params.length > 0 ? params : undefined,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
methods.push({ name, kind: 'property' });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (methods.length > 0) {
|
|
88
|
+
surfaces.push({
|
|
89
|
+
className,
|
|
90
|
+
file: sourceFile.fileName,
|
|
91
|
+
methods,
|
|
92
|
+
extends: extendsName,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return surfaces;
|
|
97
|
+
}
|
|
98
|
+
function extractParams(params, checker) {
|
|
99
|
+
return params.map((p) => {
|
|
100
|
+
const name = typescript_1.default.isIdentifier(p.name) ? p.name.text : p.name.getText();
|
|
101
|
+
const optional = p.questionToken !== undefined || p.initializer !== undefined;
|
|
102
|
+
let type;
|
|
103
|
+
if (p.type) {
|
|
104
|
+
type = p.type.getText();
|
|
105
|
+
}
|
|
106
|
+
else if (checker) {
|
|
107
|
+
try {
|
|
108
|
+
const symbol = checker.getSymbolAtLocation(p.name);
|
|
109
|
+
if (symbol) {
|
|
110
|
+
const t = checker.getTypeOfSymbolAtLocation(symbol, p);
|
|
111
|
+
type = checker.typeToString(t);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Type inference failure is non-fatal
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { name, type, optional: optional || undefined };
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function extractReturnType(method, checker) {
|
|
122
|
+
if (method.type) {
|
|
123
|
+
return method.type.getText();
|
|
124
|
+
}
|
|
125
|
+
if (checker) {
|
|
126
|
+
try {
|
|
127
|
+
const signature = checker.getSignatureFromDeclaration(method);
|
|
128
|
+
if (signature) {
|
|
129
|
+
const returnType = checker.getReturnTypeOfSignature(signature);
|
|
130
|
+
const typeStr = checker.typeToString(returnType);
|
|
131
|
+
// Skip overly verbose inferred types
|
|
132
|
+
if (typeStr.length < 100) {
|
|
133
|
+
return typeStr;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Type inference failure is non-fatal
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extract page objects using the TypeScript Compiler API.
|
|
145
|
+
* Falls back to regex if compilation fails.
|
|
146
|
+
*/
|
|
147
|
+
function extractWithAST(files) {
|
|
148
|
+
if (files.length === 0) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
// Find the nearest tsconfig.json
|
|
152
|
+
const firstDir = (0, path_1.join)(files[0], '..');
|
|
153
|
+
const tsconfigPath = typescript_1.default.findConfigFile(firstDir, typescript_1.default.sys.fileExists, 'tsconfig.json');
|
|
154
|
+
let program;
|
|
155
|
+
if (tsconfigPath) {
|
|
156
|
+
const configFile = typescript_1.default.readConfigFile(tsconfigPath, typescript_1.default.sys.readFile);
|
|
157
|
+
const parsedConfig = typescript_1.default.parseJsonConfigFileContent(configFile.config, typescript_1.default.sys, (0, path_1.join)(tsconfigPath, '..'));
|
|
158
|
+
// Only compile the files we care about, using the config's compiler options
|
|
159
|
+
program = typescript_1.default.createProgram(files, parsedConfig.options);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
program = typescript_1.default.createProgram(files, {
|
|
163
|
+
target: typescript_1.default.ScriptTarget.ES2022,
|
|
164
|
+
module: typescript_1.default.ModuleKind.ESNext,
|
|
165
|
+
moduleResolution: typescript_1.default.ModuleResolutionKind.Bundler,
|
|
166
|
+
strict: true,
|
|
167
|
+
allowJs: false,
|
|
168
|
+
noEmit: true,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const checker = program.getTypeChecker();
|
|
172
|
+
const surfaces = [];
|
|
173
|
+
for (const filePath of files) {
|
|
174
|
+
const sourceFile = program.getSourceFile(filePath);
|
|
175
|
+
if (!sourceFile) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
surfaces.push(...extractMethodsFromAST(sourceFile, checker));
|
|
179
|
+
}
|
|
180
|
+
// Resolve inherited methods: if class extends another class in the catalog,
|
|
181
|
+
// merge parent methods that the child doesn't override
|
|
182
|
+
resolveInheritance(surfaces);
|
|
183
|
+
return surfaces;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Merge parent class methods into child classes that extend them.
|
|
187
|
+
*/
|
|
188
|
+
function resolveInheritance(surfaces) {
|
|
189
|
+
const byName = new Map(surfaces.map((s) => [s.className, s]));
|
|
190
|
+
for (const surface of surfaces) {
|
|
191
|
+
if (!surface.extends) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const parent = byName.get(surface.extends);
|
|
195
|
+
if (!parent) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const childMethodNames = new Set(surface.methods.map((m) => m.name));
|
|
199
|
+
for (const parentMethod of parent.methods) {
|
|
200
|
+
if (!childMethodNames.has(parentMethod.name)) {
|
|
201
|
+
surface.methods.push({ ...parentMethod });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ── Regex-based extraction (fallback) ──────────────────────
|
|
207
|
+
const RESERVED_WORDS = new Set([
|
|
208
|
+
'private', 'protected', 'static', 'abstract', 'override',
|
|
209
|
+
'if', 'for', 'while', 'switch', 'return',
|
|
210
|
+
'const', 'let', 'var', 'import', 'export',
|
|
211
|
+
'class', 'type', 'interface', 'constructor',
|
|
212
|
+
]);
|
|
213
|
+
function extractMethodsFromRegex(content) {
|
|
214
|
+
const methods = [];
|
|
215
|
+
const seen = new Set();
|
|
216
|
+
const asyncMethodRe = /(?:async\s+)([a-zA-Z_]\w*)\s*\(/g;
|
|
217
|
+
let match;
|
|
218
|
+
while ((match = asyncMethodRe.exec(content)) !== null) {
|
|
219
|
+
const name = match[1];
|
|
220
|
+
if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
|
|
221
|
+
seen.add(name);
|
|
222
|
+
methods.push({ name, kind: 'method', async: true });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const methodRe = /^\s+(?:readonly\s+)?([a-zA-Z_]\w*)\s*(?:\(|=\s*(?:async\s*)?\()/gm;
|
|
226
|
+
while ((match = methodRe.exec(content)) !== null) {
|
|
227
|
+
const name = match[1];
|
|
228
|
+
if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
|
|
229
|
+
seen.add(name);
|
|
230
|
+
const isAsync = match[0].includes('async');
|
|
231
|
+
methods.push({ name, kind: 'method', async: isAsync ? true : undefined });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const arrowRe = /^\s+([a-zA-Z_]\w*)\s*=\s*(async\s+)?(?:\([^)]*\)|[a-zA-Z_]\w*)\s*=>/gm;
|
|
235
|
+
while ((match = arrowRe.exec(content)) !== null) {
|
|
236
|
+
const name = match[1];
|
|
237
|
+
if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
|
|
238
|
+
seen.add(name);
|
|
239
|
+
methods.push({ name, kind: 'method', async: match[2] ? true : undefined });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const getterRe = /\bget\s+([a-zA-Z_]\w*)\s*\(\)/g;
|
|
243
|
+
while ((match = getterRe.exec(content)) !== null) {
|
|
244
|
+
const name = match[1];
|
|
245
|
+
if (!seen.has(name)) {
|
|
246
|
+
seen.add(name);
|
|
247
|
+
methods.push({ name, kind: 'getter' });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const propRe = /^\s+(?:readonly\s+)?([a-zA-Z_]\w*)\s*[:=]/gm;
|
|
251
|
+
while ((match = propRe.exec(content)) !== null) {
|
|
252
|
+
const name = match[1];
|
|
253
|
+
if (!RESERVED_WORDS.has(name) && !seen.has(name)) {
|
|
254
|
+
seen.add(name);
|
|
255
|
+
methods.push({ name, kind: 'property' });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return methods;
|
|
259
|
+
}
|
|
260
|
+
function extractClassName(content) {
|
|
261
|
+
const match = content.match(/(?:export\s+)?class\s+(\w+)/);
|
|
262
|
+
return match ? match[1] : null;
|
|
263
|
+
}
|
|
264
|
+
// ── Directory scanning ─────────────────────────────────────
|
|
265
|
+
function collectTypeScriptFiles(dir) {
|
|
266
|
+
const files = [];
|
|
267
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
268
|
+
return files;
|
|
269
|
+
}
|
|
270
|
+
const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
271
|
+
for (const entry of entries) {
|
|
272
|
+
const fullPath = (0, path_1.join)(dir, entry.name);
|
|
273
|
+
if (entry.isDirectory()) {
|
|
274
|
+
files.push(...collectTypeScriptFiles(fullPath));
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const ext = (0, path_1.extname)(entry.name);
|
|
278
|
+
if (ext === '.ts' || ext === '.tsx') {
|
|
279
|
+
files.push(fullPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return files;
|
|
283
|
+
}
|
|
284
|
+
function scanDirectoryWithRegex(dir) {
|
|
285
|
+
const surfaces = [];
|
|
286
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
287
|
+
return surfaces;
|
|
288
|
+
}
|
|
289
|
+
const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
290
|
+
for (const entry of entries) {
|
|
291
|
+
const fullPath = (0, path_1.join)(dir, entry.name);
|
|
292
|
+
if (entry.isDirectory()) {
|
|
293
|
+
surfaces.push(...scanDirectoryWithRegex(fullPath));
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const ext = (0, path_1.extname)(entry.name);
|
|
297
|
+
if (ext !== '.ts' && ext !== '.tsx') {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
302
|
+
const className = extractClassName(content);
|
|
303
|
+
if (!className) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const extractedMethods = extractMethodsFromRegex(content);
|
|
307
|
+
if (extractedMethods.length > 0) {
|
|
308
|
+
surfaces.push({ className, file: fullPath, methods: extractedMethods });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return surfaces;
|
|
316
|
+
}
|
|
317
|
+
// ── Public API ──────────────────────────────────────────────
|
|
318
|
+
function buildApiSurface(testsRoot, config) {
|
|
319
|
+
const pageObjectsDir = config?.pageObjectsDir
|
|
320
|
+
? (0, path_1.join)(testsRoot, config.pageObjectsDir)
|
|
321
|
+
: (0, path_1.join)(testsRoot, 'lib', 'src', 'ui', 'pages');
|
|
322
|
+
const componentsDir = config?.componentsDir
|
|
323
|
+
? (0, path_1.join)(testsRoot, config.componentsDir)
|
|
324
|
+
: (0, path_1.join)(testsRoot, 'lib', 'src', 'ui', 'components');
|
|
325
|
+
let pageObjects;
|
|
326
|
+
if (config?.useRegexFallback) {
|
|
327
|
+
pageObjects = [
|
|
328
|
+
...scanDirectoryWithRegex(pageObjectsDir),
|
|
329
|
+
...scanDirectoryWithRegex(componentsDir),
|
|
330
|
+
];
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Use TypeScript AST — full type info, inheritance, params
|
|
334
|
+
const allFiles = [
|
|
335
|
+
...collectTypeScriptFiles(pageObjectsDir),
|
|
336
|
+
...collectTypeScriptFiles(componentsDir),
|
|
337
|
+
];
|
|
338
|
+
try {
|
|
339
|
+
pageObjects = extractWithAST(allFiles);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// Fall back to regex if AST extraction fails
|
|
343
|
+
pageObjects = [
|
|
344
|
+
...scanDirectoryWithRegex(pageObjectsDir),
|
|
345
|
+
...scanDirectoryWithRegex(componentsDir),
|
|
346
|
+
];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return {
|
|
350
|
+
pageObjects,
|
|
351
|
+
generatedAt: new Date().toISOString(),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function loadOrBuildApiSurface(testsRoot, config) {
|
|
355
|
+
if (!config?.enabled) {
|
|
356
|
+
return { pageObjects: [], generatedAt: new Date().toISOString() };
|
|
357
|
+
}
|
|
358
|
+
const cachePath = config.cachePath
|
|
359
|
+
? (0, path_1.join)(testsRoot, config.cachePath)
|
|
360
|
+
: (0, path_1.join)(testsRoot, '.e2e-ai-agents', 'api-surface.json');
|
|
361
|
+
if ((0, fs_1.existsSync)(cachePath)) {
|
|
362
|
+
try {
|
|
363
|
+
const cached = JSON.parse((0, fs_1.readFileSync)(cachePath, 'utf-8'));
|
|
364
|
+
if (cached.pageObjects && Array.isArray(cached.pageObjects)) {
|
|
365
|
+
return cached;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// Rebuild if cache is corrupt
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const catalog = buildApiSurface(testsRoot, config);
|
|
373
|
+
try {
|
|
374
|
+
const dir = (0, path_1.join)(cachePath, '..');
|
|
375
|
+
if ((0, fs_1.existsSync)(dir)) {
|
|
376
|
+
(0, fs_1.writeFileSync)(cachePath, JSON.stringify(catalog, null, 2), 'utf-8');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// Cache write failure is non-fatal
|
|
381
|
+
}
|
|
382
|
+
return catalog;
|
|
383
|
+
}
|
|
384
|
+
function getMethodsForPageObject(catalog, className) {
|
|
385
|
+
const surface = catalog.pageObjects.find((po) => po.className === className);
|
|
386
|
+
return surface?.methods || [];
|
|
387
|
+
}
|
|
388
|
+
function validateMethodCall(catalog, className, methodName) {
|
|
389
|
+
const methods = getMethodsForPageObject(catalog, className);
|
|
390
|
+
return methods.some((m) => m.name === methodName);
|
|
391
|
+
}
|
|
392
|
+
function formatApiSurfaceForPrompt(catalog, classNames) {
|
|
393
|
+
const sections = [];
|
|
394
|
+
for (const name of classNames) {
|
|
395
|
+
const surface = catalog.pageObjects.find((po) => po.className === name);
|
|
396
|
+
if (!surface) {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const methodList = surface.methods
|
|
400
|
+
.map((m) => {
|
|
401
|
+
if (m.kind === 'property') {
|
|
402
|
+
return ` ${m.name} (property)`;
|
|
403
|
+
}
|
|
404
|
+
if (m.kind === 'getter') {
|
|
405
|
+
return ` get ${m.name}()`;
|
|
406
|
+
}
|
|
407
|
+
const prefix = m.async ? 'async ' : '';
|
|
408
|
+
const paramStr = m.params
|
|
409
|
+
? m.params.map((p) => `${p.name}${p.optional ? '?' : ''}${p.type ? `: ${p.type}` : ''}`).join(', ')
|
|
410
|
+
: '';
|
|
411
|
+
const retStr = m.returnType ? `: ${m.returnType}` : '';
|
|
412
|
+
return ` ${prefix}${m.name}(${paramStr})${retStr}`;
|
|
413
|
+
})
|
|
414
|
+
.join('\n');
|
|
415
|
+
sections.push(`${name}:\n${methodList}`);
|
|
416
|
+
}
|
|
417
|
+
return sections.join('\n\n');
|
|
418
|
+
}
|