@machina.ai/openapi-contract-tester 2.1.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/.env.example +91 -0
- package/README.md +472 -0
- package/dist/ai-engine/assertion-generator.d.ts +48 -0
- package/dist/ai-engine/assertion-generator.d.ts.map +1 -0
- package/dist/ai-engine/assertion-generator.js +166 -0
- package/dist/ai-engine/assertion-generator.js.map +1 -0
- package/dist/ai-engine/context-data-generator.d.ts +38 -0
- package/dist/ai-engine/context-data-generator.d.ts.map +1 -0
- package/dist/ai-engine/context-data-generator.js +146 -0
- package/dist/ai-engine/context-data-generator.js.map +1 -0
- package/dist/ai-engine/dataflow-detector.d.ts +53 -0
- package/dist/ai-engine/dataflow-detector.d.ts.map +1 -0
- package/dist/ai-engine/dataflow-detector.js +217 -0
- package/dist/ai-engine/dataflow-detector.js.map +1 -0
- package/dist/ai-engine/dependency-detector.d.ts +52 -0
- package/dist/ai-engine/dependency-detector.d.ts.map +1 -0
- package/dist/ai-engine/dependency-detector.js +241 -0
- package/dist/ai-engine/dependency-detector.js.map +1 -0
- package/dist/ai-engine/edge-case-suggester.d.ts +63 -0
- package/dist/ai-engine/edge-case-suggester.d.ts.map +1 -0
- package/dist/ai-engine/edge-case-suggester.js +177 -0
- package/dist/ai-engine/edge-case-suggester.js.map +1 -0
- package/dist/ai-engine/index.d.ts +13 -0
- package/dist/ai-engine/index.d.ts.map +1 -0
- package/dist/ai-engine/index.js +13 -0
- package/dist/ai-engine/index.js.map +1 -0
- package/dist/analyzers/ai-failure-analyzer.d.ts +41 -0
- package/dist/analyzers/ai-failure-analyzer.d.ts.map +1 -0
- package/dist/analyzers/ai-failure-analyzer.js +220 -0
- package/dist/analyzers/ai-failure-analyzer.js.map +1 -0
- package/dist/analyzers/comparison-utils.d.ts +31 -0
- package/dist/analyzers/comparison-utils.d.ts.map +1 -0
- package/dist/analyzers/comparison-utils.js +85 -0
- package/dist/analyzers/comparison-utils.js.map +1 -0
- package/dist/analyzers/context-analyzer.d.ts +49 -0
- package/dist/analyzers/context-analyzer.d.ts.map +1 -0
- package/dist/analyzers/context-analyzer.js +292 -0
- package/dist/analyzers/context-analyzer.js.map +1 -0
- package/dist/analyzers/dependency-analyzer.d.ts +44 -0
- package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/analyzers/dependency-analyzer.js +313 -0
- package/dist/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/analyzers/failure-analyzer.d.ts +122 -0
- package/dist/analyzers/failure-analyzer.d.ts.map +1 -0
- package/dist/analyzers/failure-analyzer.js +140 -0
- package/dist/analyzers/failure-analyzer.js.map +1 -0
- package/dist/analyzers/failure-detectors/index.d.ts +33 -0
- package/dist/analyzers/failure-detectors/index.d.ts.map +1 -0
- package/dist/analyzers/failure-detectors/index.js +164 -0
- package/dist/analyzers/failure-detectors/index.js.map +1 -0
- package/dist/analyzers/failure-discrepancy-correlator.d.ts +111 -0
- package/dist/analyzers/failure-discrepancy-correlator.d.ts.map +1 -0
- package/dist/analyzers/failure-discrepancy-correlator.js +202 -0
- package/dist/analyzers/failure-discrepancy-correlator.js.map +1 -0
- package/dist/analyzers/index.d.ts +10 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +10 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/semantic-matcher.d.ts +123 -0
- package/dist/analyzers/semantic-matcher.d.ts.map +1 -0
- package/dist/analyzers/semantic-matcher.js +297 -0
- package/dist/analyzers/semantic-matcher.js.map +1 -0
- package/dist/analyzers/source-comparator.d.ts +177 -0
- package/dist/analyzers/source-comparator.d.ts.map +1 -0
- package/dist/analyzers/source-comparator.js +225 -0
- package/dist/analyzers/source-comparator.js.map +1 -0
- package/dist/business-rules/business-rules-analyzer.d.ts +44 -0
- package/dist/business-rules/business-rules-analyzer.d.ts.map +1 -0
- package/dist/business-rules/business-rules-analyzer.js +363 -0
- package/dist/business-rules/business-rules-analyzer.js.map +1 -0
- package/dist/business-rules/business-rules-generator.d.ts +78 -0
- package/dist/business-rules/business-rules-generator.d.ts.map +1 -0
- package/dist/business-rules/business-rules-generator.js +357 -0
- package/dist/business-rules/business-rules-generator.js.map +1 -0
- package/dist/business-rules/extractors/rule-extractors.d.ts +50 -0
- package/dist/business-rules/extractors/rule-extractors.d.ts.map +1 -0
- package/dist/business-rules/extractors/rule-extractors.js +189 -0
- package/dist/business-rules/extractors/rule-extractors.js.map +1 -0
- package/dist/business-rules/value-generators.d.ts +70 -0
- package/dist/business-rules/value-generators.d.ts.map +1 -0
- package/dist/business-rules/value-generators.js +142 -0
- package/dist/business-rules/value-generators.js.map +1 -0
- package/dist/executor/auth-providers/auth-header-builder.d.ts +16 -0
- package/dist/executor/auth-providers/auth-header-builder.d.ts.map +1 -0
- package/dist/executor/auth-providers/auth-header-builder.js +47 -0
- package/dist/executor/auth-providers/auth-header-builder.js.map +1 -0
- package/dist/executor/auth-providers/oauth2-provider.d.ts +19 -0
- package/dist/executor/auth-providers/oauth2-provider.d.ts.map +1 -0
- package/dist/executor/auth-providers/oauth2-provider.js +114 -0
- package/dist/executor/auth-providers/oauth2-provider.js.map +1 -0
- package/dist/executor/http-client.d.ts +133 -0
- package/dist/executor/http-client.d.ts.map +1 -0
- package/dist/executor/http-client.js +172 -0
- package/dist/executor/http-client.js.map +1 -0
- package/dist/executor/http-request-builder.d.ts +69 -0
- package/dist/executor/http-request-builder.d.ts.map +1 -0
- package/dist/executor/http-request-builder.js +140 -0
- package/dist/executor/http-request-builder.js.map +1 -0
- package/dist/executor/http-response-parser.d.ts +28 -0
- package/dist/executor/http-response-parser.d.ts.map +1 -0
- package/dist/executor/http-response-parser.js +74 -0
- package/dist/executor/http-response-parser.js.map +1 -0
- package/dist/executor/response-handler.d.ts +66 -0
- package/dist/executor/response-handler.d.ts.map +1 -0
- package/dist/executor/response-handler.js +135 -0
- package/dist/executor/response-handler.js.map +1 -0
- package/dist/executor/result-processor.d.ts +27 -0
- package/dist/executor/result-processor.d.ts.map +1 -0
- package/dist/executor/result-processor.js +140 -0
- package/dist/executor/result-processor.js.map +1 -0
- package/dist/executor/result-utils.d.ts +21 -0
- package/dist/executor/result-utils.d.ts.map +1 -0
- package/dist/executor/result-utils.js +29 -0
- package/dist/executor/result-utils.js.map +1 -0
- package/dist/executor/test-executor.d.ts +49 -0
- package/dist/executor/test-executor.d.ts.map +1 -0
- package/dist/executor/test-executor.js +226 -0
- package/dist/executor/test-executor.js.map +1 -0
- package/dist/executor/test-runner.d.ts +85 -0
- package/dist/executor/test-runner.d.ts.map +1 -0
- package/dist/executor/test-runner.js +177 -0
- package/dist/executor/test-runner.js.map +1 -0
- package/dist/executor/token-detector/index.d.ts +7 -0
- package/dist/executor/token-detector/index.d.ts.map +1 -0
- package/dist/executor/token-detector/index.js +7 -0
- package/dist/executor/token-detector/index.js.map +1 -0
- package/dist/executor/token-detector/token-detector.d.ts +64 -0
- package/dist/executor/token-detector/token-detector.d.ts.map +1 -0
- package/dist/executor/token-detector/token-detector.js +140 -0
- package/dist/executor/token-detector/token-detector.js.map +1 -0
- package/dist/generators/business-rule-from-stories-generator.d.ts +30 -0
- package/dist/generators/business-rule-from-stories-generator.d.ts.map +1 -0
- package/dist/generators/business-rule-from-stories-generator.js +227 -0
- package/dist/generators/business-rule-from-stories-generator.js.map +1 -0
- package/dist/generators/data/ai-data-generator.d.ts +23 -0
- package/dist/generators/data/ai-data-generator.d.ts.map +1 -0
- package/dist/generators/data/ai-data-generator.js +41 -0
- package/dist/generators/data/ai-data-generator.js.map +1 -0
- package/dist/generators/data/base-generator.d.ts +121 -0
- package/dist/generators/data/base-generator.d.ts.map +1 -0
- package/dist/generators/data/base-generator.js +200 -0
- package/dist/generators/data/base-generator.js.map +1 -0
- package/dist/generators/data/heuristic-data-generator.d.ts +28 -0
- package/dist/generators/data/heuristic-data-generator.d.ts.map +1 -0
- package/dist/generators/data/heuristic-data-generator.js +49 -0
- package/dist/generators/data/heuristic-data-generator.js.map +1 -0
- package/dist/generators/data/index.d.ts +48 -0
- package/dist/generators/data/index.d.ts.map +1 -0
- package/dist/generators/data/index.js +201 -0
- package/dist/generators/data/index.js.map +1 -0
- package/dist/generators/data/schema-walker.d.ts +45 -0
- package/dist/generators/data/schema-walker.d.ts.map +1 -0
- package/dist/generators/data/schema-walker.js +103 -0
- package/dist/generators/data/schema-walker.js.map +1 -0
- package/dist/generators/data/type-strategies.d.ts +79 -0
- package/dist/generators/data/type-strategies.d.ts.map +1 -0
- package/dist/generators/data/type-strategies.js +394 -0
- package/dist/generators/data/type-strategies.js.map +1 -0
- package/dist/generators/data-generator.d.ts +11 -0
- package/dist/generators/data-generator.d.ts.map +1 -0
- package/dist/generators/data-generator.js +11 -0
- package/dist/generators/data-generator.js.map +1 -0
- package/dist/generators/edge-case-generator.d.ts +55 -0
- package/dist/generators/edge-case-generator.d.ts.map +1 -0
- package/dist/generators/edge-case-generator.js +327 -0
- package/dist/generators/edge-case-generator.js.map +1 -0
- package/dist/generators/edge-cases/boundary-analyzer.d.ts +26 -0
- package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -0
- package/dist/generators/edge-cases/boundary-analyzer.js +95 -0
- package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -0
- package/dist/generators/error-case-generator.d.ts +11 -0
- package/dist/generators/error-case-generator.d.ts.map +1 -0
- package/dist/generators/error-case-generator.js +11 -0
- package/dist/generators/error-case-generator.js.map +1 -0
- package/dist/generators/errors/auth-error-strategy.d.ts +36 -0
- package/dist/generators/errors/auth-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/auth-error-strategy.js +118 -0
- package/dist/generators/errors/auth-error-strategy.js.map +1 -0
- package/dist/generators/errors/business-error-strategy.d.ts +44 -0
- package/dist/generators/errors/business-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/business-error-strategy.js +152 -0
- package/dist/generators/errors/business-error-strategy.js.map +1 -0
- package/dist/generators/errors/error-strategy-factory.d.ts +27 -0
- package/dist/generators/errors/error-strategy-factory.d.ts.map +1 -0
- package/dist/generators/errors/error-strategy-factory.js +47 -0
- package/dist/generators/errors/error-strategy-factory.js.map +1 -0
- package/dist/generators/errors/error-strategy.d.ts +62 -0
- package/dist/generators/errors/error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/error-strategy.js +69 -0
- package/dist/generators/errors/error-strategy.js.map +1 -0
- package/dist/generators/errors/index.d.ts +23 -0
- package/dist/generators/errors/index.d.ts.map +1 -0
- package/dist/generators/errors/index.js +73 -0
- package/dist/generators/errors/index.js.map +1 -0
- package/dist/generators/errors/validation-error-strategy.d.ts +25 -0
- package/dist/generators/errors/validation-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/validation-error-strategy.js +214 -0
- package/dist/generators/errors/validation-error-strategy.js.map +1 -0
- package/dist/generators/happy-path-generator.d.ts +93 -0
- package/dist/generators/happy-path-generator.d.ts.map +1 -0
- package/dist/generators/happy-path-generator.js +275 -0
- package/dist/generators/happy-path-generator.js.map +1 -0
- package/dist/generators/test-enricher.d.ts +44 -0
- package/dist/generators/test-enricher.d.ts.map +1 -0
- package/dist/generators/test-enricher.js +109 -0
- package/dist/generators/test-enricher.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/ai-cache.d.ts +123 -0
- package/dist/llm/ai-cache.d.ts.map +1 -0
- package/dist/llm/ai-cache.js +220 -0
- package/dist/llm/ai-cache.js.map +1 -0
- package/dist/llm/ai-client.d.ts +92 -0
- package/dist/llm/ai-client.d.ts.map +1 -0
- package/dist/llm/ai-client.js +386 -0
- package/dist/llm/ai-client.js.map +1 -0
- package/dist/llm/data-generator-ai.d.ts +84 -0
- package/dist/llm/data-generator-ai.d.ts.map +1 -0
- package/dist/llm/data-generator-ai.js +284 -0
- package/dist/llm/data-generator-ai.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +7 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/handlers/base-handler.d.ts +72 -0
- package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
- package/dist/mcp/handlers/base-handler.js +86 -0
- package/dist/mcp/handlers/base-handler.js.map +1 -0
- package/dist/mcp/handlers/compare-sources.d.ts +91 -0
- package/dist/mcp/handlers/compare-sources.d.ts.map +1 -0
- package/dist/mcp/handlers/compare-sources.js +182 -0
- package/dist/mcp/handlers/compare-sources.js.map +1 -0
- package/dist/mcp/handlers/export-results.d.ts +53 -0
- package/dist/mcp/handlers/export-results.d.ts.map +1 -0
- package/dist/mcp/handlers/export-results.js +132 -0
- package/dist/mcp/handlers/export-results.js.map +1 -0
- package/dist/mcp/handlers/export-to-postman.d.ts +65 -0
- package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -0
- package/dist/mcp/handlers/export-to-postman.js +128 -0
- package/dist/mcp/handlers/export-to-postman.js.map +1 -0
- package/dist/mcp/handlers/generate-tests.d.ts +74 -0
- package/dist/mcp/handlers/generate-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/generate-tests.js +519 -0
- package/dist/mcp/handlers/generate-tests.js.map +1 -0
- package/dist/mcp/handlers/index.d.ts +13 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -0
- package/dist/mcp/handlers/index.js +12 -0
- package/dist/mcp/handlers/index.js.map +1 -0
- package/dist/mcp/handlers/run-tests.d.ts +89 -0
- package/dist/mcp/handlers/run-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/run-tests.js +233 -0
- package/dist/mcp/handlers/run-tests.js.map +1 -0
- package/dist/mcp/handlers/types.d.ts +61 -0
- package/dist/mcp/handlers/types.d.ts.map +1 -0
- package/dist/mcp/handlers/types.js +9 -0
- package/dist/mcp/handlers/types.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +200 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/services/file-service.d.ts +66 -0
- package/dist/mcp/services/file-service.d.ts.map +1 -0
- package/dist/mcp/services/file-service.js +143 -0
- package/dist/mcp/services/file-service.js.map +1 -0
- package/dist/mcp/services/llm-service.d.ts +70 -0
- package/dist/mcp/services/llm-service.d.ts.map +1 -0
- package/dist/mcp/services/llm-service.js +189 -0
- package/dist/mcp/services/llm-service.js.map +1 -0
- package/dist/mcp/services/postman-service.d.ts +128 -0
- package/dist/mcp/services/postman-service.d.ts.map +1 -0
- package/dist/mcp/services/postman-service.js +266 -0
- package/dist/mcp/services/postman-service.js.map +1 -0
- package/dist/mcp/services/report-service.d.ts +81 -0
- package/dist/mcp/services/report-service.d.ts.map +1 -0
- package/dist/mcp/services/report-service.js +210 -0
- package/dist/mcp/services/report-service.js.map +1 -0
- package/dist/mcp/services/spec-service.d.ts +58 -0
- package/dist/mcp/services/spec-service.d.ts.map +1 -0
- package/dist/mcp/services/spec-service.js +140 -0
- package/dist/mcp/services/spec-service.js.map +1 -0
- package/dist/parsers/endpoint-extractor.d.ts +32 -0
- package/dist/parsers/endpoint-extractor.d.ts.map +1 -0
- package/dist/parsers/endpoint-extractor.js +160 -0
- package/dist/parsers/endpoint-extractor.js.map +1 -0
- package/dist/parsers/openapi-parser.d.ts +120 -0
- package/dist/parsers/openapi-parser.d.ts.map +1 -0
- package/dist/parsers/openapi-parser.js +257 -0
- package/dist/parsers/openapi-parser.js.map +1 -0
- package/dist/parsers/visitors/auth-visitor.d.ts +28 -0
- package/dist/parsers/visitors/auth-visitor.d.ts.map +1 -0
- package/dist/parsers/visitors/auth-visitor.js +116 -0
- package/dist/parsers/visitors/auth-visitor.js.map +1 -0
- package/dist/prd/index.d.ts +10 -0
- package/dist/prd/index.d.ts.map +1 -0
- package/dist/prd/index.js +10 -0
- package/dist/prd/index.js.map +1 -0
- package/dist/prd/prd-reader.d.ts +124 -0
- package/dist/prd/prd-reader.d.ts.map +1 -0
- package/dist/prd/prd-reader.js +308 -0
- package/dist/prd/prd-reader.js.map +1 -0
- package/dist/prd/prd-storage.d.ts +232 -0
- package/dist/prd/prd-storage.d.ts.map +1 -0
- package/dist/prd/prd-storage.js +129 -0
- package/dist/prd/prd-storage.js.map +1 -0
- package/dist/repairers/test-auto-repairer.d.ts +61 -0
- package/dist/repairers/test-auto-repairer.d.ts.map +1 -0
- package/dist/repairers/test-auto-repairer.js +213 -0
- package/dist/repairers/test-auto-repairer.js.map +1 -0
- package/dist/reporters/comparison-report-generator.d.ts +58 -0
- package/dist/reporters/comparison-report-generator.d.ts.map +1 -0
- package/dist/reporters/comparison-report-generator.js +369 -0
- package/dist/reporters/comparison-report-generator.js.map +1 -0
- package/dist/reporters/gherkin-formatter.d.ts +34 -0
- package/dist/reporters/gherkin-formatter.d.ts.map +1 -0
- package/dist/reporters/gherkin-formatter.js +231 -0
- package/dist/reporters/gherkin-formatter.js.map +1 -0
- package/dist/reporters/html-report-generator.d.ts +174 -0
- package/dist/reporters/html-report-generator.d.ts.map +1 -0
- package/dist/reporters/html-report-generator.js +194 -0
- package/dist/reporters/html-report-generator.js.map +1 -0
- package/dist/reporters/report-charts.d.ts +23 -0
- package/dist/reporters/report-charts.d.ts.map +1 -0
- package/dist/reporters/report-charts.js +182 -0
- package/dist/reporters/report-charts.js.map +1 -0
- package/dist/reporters/report-sections.d.ts +34 -0
- package/dist/reporters/report-sections.d.ts.map +1 -0
- package/dist/reporters/report-sections.js +481 -0
- package/dist/reporters/report-sections.js.map +1 -0
- package/dist/reporters/report-styles.d.ts +12 -0
- package/dist/reporters/report-styles.d.ts.map +1 -0
- package/dist/reporters/report-styles.js +412 -0
- package/dist/reporters/report-styles.js.map +1 -0
- package/dist/reporters/report-test-details.d.ts +56 -0
- package/dist/reporters/report-test-details.d.ts.map +1 -0
- package/dist/reporters/report-test-details.js +328 -0
- package/dist/reporters/report-test-details.js.map +1 -0
- package/dist/reporters/report-utils.d.ts +40 -0
- package/dist/reporters/report-utils.d.ts.map +1 -0
- package/dist/reporters/report-utils.js +163 -0
- package/dist/reporters/report-utils.js.map +1 -0
- package/dist/types/ai-config.d.ts +63 -0
- package/dist/types/ai-config.d.ts.map +1 -0
- package/dist/types/ai-config.js +79 -0
- package/dist/types/ai-config.js.map +1 -0
- package/dist/types/business-rules.d.ts +235 -0
- package/dist/types/business-rules.d.ts.map +1 -0
- package/dist/types/business-rules.js +6 -0
- package/dist/types/business-rules.js.map +1 -0
- package/dist/types/config.d.ts +106 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/core.d.ts +72 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi.d.ts +139 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +6 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/pact.d.ts +101 -0
- package/dist/types/pact.d.ts.map +1 -0
- package/dist/types/pact.js +6 -0
- package/dist/types/pact.js.map +1 -0
- package/dist/types/reporting.d.ts +93 -0
- package/dist/types/reporting.d.ts.map +1 -0
- package/dist/types/reporting.js +6 -0
- package/dist/types/reporting.js.map +1 -0
- package/dist/types/test-case.d.ts +233 -0
- package/dist/types/test-case.d.ts.map +1 -0
- package/dist/types/test-case.js +6 -0
- package/dist/types/test-case.js.map +1 -0
- package/dist/types/test-execution.d.ts +80 -0
- package/dist/types/test-execution.d.ts.map +1 -0
- package/dist/types/test-execution.js +6 -0
- package/dist/types/test-execution.js.map +1 -0
- package/dist/utils/auth-generator.d.ts +30 -0
- package/dist/utils/auth-generator.d.ts.map +1 -0
- package/dist/utils/auth-generator.js +68 -0
- package/dist/utils/auth-generator.js.map +1 -0
- package/dist/utils/config.d.ts +181 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +141 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/coverage-calculator.d.ts +81 -0
- package/dist/utils/coverage-calculator.d.ts.map +1 -0
- package/dist/utils/coverage-calculator.js +134 -0
- package/dist/utils/coverage-calculator.js.map +1 -0
- package/dist/utils/data-loader.d.ts +52 -0
- package/dist/utils/data-loader.d.ts.map +1 -0
- package/dist/utils/data-loader.js +192 -0
- package/dist/utils/data-loader.js.map +1 -0
- package/dist/utils/errors.d.ts +167 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +257 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +220 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +325 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/openapi-discovery.d.ts +31 -0
- package/dist/utils/openapi-discovery.d.ts.map +1 -0
- package/dist/utils/openapi-discovery.js +322 -0
- package/dist/utils/openapi-discovery.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +101 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +167 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/resilience.d.ts +181 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +269 -0
- package/dist/utils/resilience.js.map +1 -0
- package/dist/validators/openapi-validator.d.ts +198 -0
- package/dist/validators/openapi-validator.d.ts.map +1 -0
- package/dist/validators/openapi-validator.js +349 -0
- package/dist/validators/openapi-validator.js.map +1 -0
- package/dist/validators/response-matcher.d.ts +84 -0
- package/dist/validators/response-matcher.d.ts.map +1 -0
- package/dist/validators/response-matcher.js +234 -0
- package/dist/validators/response-matcher.js.map +1 -0
- package/dist/validators/schema-validator.d.ts +174 -0
- package/dist/validators/schema-validator.d.ts.map +1 -0
- package/dist/validators/schema-validator.js +340 -0
- package/dist/validators/schema-validator.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare Sources Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles the compare-sources tool which compares OpenAPI spec vs Code vs PRD.
|
|
5
|
+
*
|
|
6
|
+
* @module mcp/handlers/compare-sources
|
|
7
|
+
*/
|
|
8
|
+
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
+
import { compareSources } from '../../analyzers/source-comparator.js';
|
|
10
|
+
/**
|
|
11
|
+
* Handler for source comparison tool
|
|
12
|
+
*/
|
|
13
|
+
export class CompareSourcesHandler extends BaseToolHandler {
|
|
14
|
+
specService;
|
|
15
|
+
fileService;
|
|
16
|
+
name = 'compare-sources';
|
|
17
|
+
description = 'STANDALONE TOOL — Compare an OpenAPI specification against actual code endpoints and/or a PRD ' +
|
|
18
|
+
'to find gaps and inconsistencies. ' +
|
|
19
|
+
'Use this when you want to verify that the spec matches what is actually implemented in the code, ' +
|
|
20
|
+
'or that all PRD requirements are covered by the spec. ' +
|
|
21
|
+
'Returns lists of: endpoints in spec but missing from code, endpoints in code but missing from spec, ' +
|
|
22
|
+
'and endpoints that exist in both but differ (method, path, auth requirements). ' +
|
|
23
|
+
'This is independent of generate-tests/run-tests — it does not execute any HTTP requests. ' +
|
|
24
|
+
'Enable enableSemanticAnalysis=true for AI-powered matching that handles renamed or refactored endpoints.';
|
|
25
|
+
inputSchema = {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
specPath: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Path to the OpenAPI specification file (YAML or JSON) to use as the source of truth. ' +
|
|
31
|
+
'Example: "/project/api/openapi.yaml".'
|
|
32
|
+
},
|
|
33
|
+
codeEndpoints: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
description: 'List of endpoints actually implemented in the source code. ' +
|
|
36
|
+
'Each item must have at minimum "method" and "path". ' +
|
|
37
|
+
'Example: [{ "method": "GET", "path": "/users/{id}", "sourceFile": "src/routes/users.ts", "requiresAuth": true }].',
|
|
38
|
+
items: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
method: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'HTTP method in uppercase: GET, POST, PUT, PATCH, DELETE'
|
|
44
|
+
},
|
|
45
|
+
path: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Endpoint path with parameters in curly-brace format, e.g. /users/{id}'
|
|
48
|
+
},
|
|
49
|
+
sourceFile: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Source file where this endpoint is defined (optional, for traceability)'
|
|
52
|
+
},
|
|
53
|
+
handlerName: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Name of the handler function or controller method (optional)'
|
|
56
|
+
},
|
|
57
|
+
requiresAuth: {
|
|
58
|
+
type: 'boolean',
|
|
59
|
+
description: 'Whether the endpoint requires authentication (optional)'
|
|
60
|
+
},
|
|
61
|
+
parameters: {
|
|
62
|
+
type: 'array',
|
|
63
|
+
items: { type: 'string' },
|
|
64
|
+
description: 'Parameter names accepted by this endpoint (optional)'
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
required: ['method', 'path']
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
prdPath: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
description: 'Path to a Product Requirements Document (Markdown, JSON, or YAML). ' +
|
|
73
|
+
'When provided, the comparison also checks whether PRD requirements are covered by the spec. ' +
|
|
74
|
+
'Example: "/project/docs/prd.md".'
|
|
75
|
+
},
|
|
76
|
+
format: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
enum: ['json', 'html'],
|
|
79
|
+
description: 'Output format. ' +
|
|
80
|
+
'json: returns comparison data as structured JSON (default, useful for programmatic use). ' +
|
|
81
|
+
'html: generates an interactive HTML report saved to outputPath.'
|
|
82
|
+
},
|
|
83
|
+
outputPath: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'File path where the HTML report is saved. Required when format="html". ' +
|
|
86
|
+
'Example: "/tmp/comparison-report.html".'
|
|
87
|
+
},
|
|
88
|
+
workingDirectory: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
description: 'Working directory used to resolve relative file paths for specPath and prdPath.'
|
|
91
|
+
},
|
|
92
|
+
enableSemanticAnalysis: {
|
|
93
|
+
type: 'boolean',
|
|
94
|
+
description: 'Enable AI-powered semantic matching (default: false). ' +
|
|
95
|
+
'When true, uses an LLM to match endpoints that differ by name but serve the same purpose ' +
|
|
96
|
+
'(e.g., /user vs /users/{id}). Slower but more accurate for refactored codebases.'
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
required: ['specPath']
|
|
100
|
+
};
|
|
101
|
+
constructor(specService, fileService) {
|
|
102
|
+
super();
|
|
103
|
+
this.specService = specService;
|
|
104
|
+
this.fileService = fileService;
|
|
105
|
+
}
|
|
106
|
+
async handle(args) {
|
|
107
|
+
const params = args;
|
|
108
|
+
const format = params.format || 'json';
|
|
109
|
+
const enableSemanticAnalysis = params.enableSemanticAnalysis || false;
|
|
110
|
+
this.log.info('Comparing sources', {
|
|
111
|
+
specPath: params.specPath,
|
|
112
|
+
hasCodeEndpoints: !!params.codeEndpoints,
|
|
113
|
+
hasPrd: !!params.prdPath,
|
|
114
|
+
format,
|
|
115
|
+
enableSemanticAnalysis
|
|
116
|
+
});
|
|
117
|
+
try {
|
|
118
|
+
// Parse OpenAPI spec
|
|
119
|
+
const specPath = this.fileService.resolveFilePath(params.specPath, params.workingDirectory);
|
|
120
|
+
const spec = await this.specService.parseSpec(specPath);
|
|
121
|
+
const openApiEndpoints = await this.specService.extractEndpoints(spec);
|
|
122
|
+
this.log.info('Extracted OpenAPI endpoints', {
|
|
123
|
+
count: openApiEndpoints.length,
|
|
124
|
+
sample: openApiEndpoints.slice(0, 3).map(e => `${e.method} ${e.path}`)
|
|
125
|
+
});
|
|
126
|
+
// Load PRD if provided
|
|
127
|
+
let prd;
|
|
128
|
+
if (params.prdPath) {
|
|
129
|
+
prd = await this.fileService.loadPrd(params.prdPath, params.workingDirectory);
|
|
130
|
+
}
|
|
131
|
+
// Compare sources
|
|
132
|
+
const result = compareSources(openApiEndpoints, params.codeEndpoints, prd, { normalizePathParams: true, includeInfo: true });
|
|
133
|
+
// Run semantic analysis if enabled and code endpoints available
|
|
134
|
+
let semanticAnalysis;
|
|
135
|
+
if (enableSemanticAnalysis && params.codeEndpoints && params.codeEndpoints.length > 0) {
|
|
136
|
+
this.log.info('Running AI-powered semantic analysis');
|
|
137
|
+
try {
|
|
138
|
+
const { performSemanticAnalysis } = await import('../../analyzers/semantic-matcher.js');
|
|
139
|
+
semanticAnalysis = await performSemanticAnalysis(openApiEndpoints, params.codeEndpoints, prd);
|
|
140
|
+
this.log.info('Semantic analysis complete', {
|
|
141
|
+
semanticMatches: semanticAnalysis.semanticMatches.length,
|
|
142
|
+
semanticMismatches: semanticAnalysis.semanticMismatches.length,
|
|
143
|
+
businessRuleMappings: semanticAnalysis.businessRuleMappings.length
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.log.warn('Semantic analysis failed', { error });
|
|
148
|
+
// Continue without semantic analysis - not fatal
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Add semantic analysis to result
|
|
152
|
+
const enhancedResult = semanticAnalysis
|
|
153
|
+
? { ...result, semanticAnalysis }
|
|
154
|
+
: result;
|
|
155
|
+
// Handle output format
|
|
156
|
+
if (format === 'html') {
|
|
157
|
+
if (!params.outputPath) {
|
|
158
|
+
throw new Error('outputPath is required when format=html');
|
|
159
|
+
}
|
|
160
|
+
const { generateComparisonHtmlReport } = await import('../../reporters/comparison-report-generator.js');
|
|
161
|
+
const htmlContent = generateComparisonHtmlReport(enhancedResult);
|
|
162
|
+
await this.fileService.saveFile(params.outputPath, htmlContent, params.workingDirectory);
|
|
163
|
+
return this.formatResponse({
|
|
164
|
+
success: true,
|
|
165
|
+
format: 'html',
|
|
166
|
+
outputPath: params.outputPath,
|
|
167
|
+
summary: result.summary,
|
|
168
|
+
semanticAnalysisIncluded: !!semanticAnalysis
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Default: JSON format
|
|
172
|
+
return this.formatResponse({
|
|
173
|
+
success: true,
|
|
174
|
+
data: enhancedResult
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return this.formatError(error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=compare-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-sources.js","sourceRoot":"","sources":["../../../src/mcp/handlers/compare-sources.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,cAAc,EAAqB,MAAM,sCAAsC,CAAC;AAGzF;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IA0F9C;IACA;IA1FD,IAAI,GAAG,iBAAiB,CAAC;IACzB,WAAW,GAClB,gGAAgG;QAChG,oCAAoC;QACpC,mGAAmG;QACnG,wDAAwD;QACxD,sGAAsG;QACtG,iFAAiF;QACjF,2FAA2F;QAC3F,0GAA0G,CAAC;IAEpG,WAAW,GAAG;QACrB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uFAAuF;oBAClG,uCAAuC;aAC1C;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,6DAA6D;oBACxE,sDAAsD;oBACtD,mHAAmH;gBACrH,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,yDAAyD;yBACvE;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uEAAuE;yBACrF;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,yEAAyE;yBACvF;wBACD,WAAW,EAAE;4BACX,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,8DAA8D;yBAC5E;wBACD,YAAY,EAAE;4BACZ,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,yDAAyD;yBACvE;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,WAAW,EAAE,sDAAsD;yBACpE;qBACF;oBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;iBAC7B;aACF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qEAAqE;oBAChF,8FAA8F;oBAC9F,kCAAkC;aACrC;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;gBACtB,WAAW,EAAE,iBAAiB;oBAC5B,2FAA2F;oBAC3F,iEAAiE;aACpE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yEAAyE;oBACpF,yCAAyC;aAC5C;YACD,gBAAgB,EAAE;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iFAAiF;aAC/F;YACD,sBAAsB,EAAE;gBACtB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wDAAwD;oBACnE,2FAA2F;oBAC3F,kFAAkF;aACrF;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB,CAAC;IAEF,YACU,WAAwB,EACxB,WAAwB;QAEhC,KAAK,EAAE,CAAC;QAHA,gBAAW,GAAX,WAAW,CAAa;QACxB,gBAAW,GAAX,WAAW,CAAa;IAGlC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAa;QACxB,MAAM,MAAM,GAAG,IAQd,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACvC,MAAM,sBAAsB,GAAG,MAAM,CAAC,sBAAsB,IAAI,KAAK,CAAC;QAEtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa;YACxC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;YACxB,MAAM;YACN,sBAAsB;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC5F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAEvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC3C,KAAK,EAAE,gBAAgB,CAAC,MAAM;gBAC9B,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;aACvE,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,GAA8B,CAAC;YACnC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAChF,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,cAAc,CAC3B,gBAAgB,EAChB,MAAM,CAAC,aAAa,EACpB,GAAG,EACH,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CACjD,CAAC;YAEF,gEAAgE;YAChE,IAAI,gBAAgB,CAAC;YACrB,IAAI,sBAAsB,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBAEtD,IAAI,CAAC;oBACH,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;oBAExF,gBAAgB,GAAG,MAAM,uBAAuB,CAC9C,gBAAgB,EAChB,MAAM,CAAC,aAAa,EACpB,GAAG,CACJ,CAAC;oBAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE;wBAC1C,eAAe,EAAE,gBAAgB,CAAC,eAAe,CAAC,MAAM;wBACxD,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,MAAM;wBAC9D,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,MAAM;qBACnE,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrD,iDAAiD;gBACnD,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,cAAc,GAAG,gBAAgB;gBACrC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE;gBACjC,CAAC,CAAC,MAAM,CAAC;YAEX,uBAAuB;YACvB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;gBAED,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CAAC,gDAAgD,CAAC,CAAC;gBACxG,MAAM,WAAW,GAAG,4BAA4B,CAAC,cAAc,CAAC,CAAC;gBAEjE,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAEzF,OAAO,IAAI,CAAC,cAAc,CAAC;oBACzB,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,wBAAwB,EAAE,CAAC,CAAC,gBAAgB;iBAC7C,CAAC,CAAC;YACL,CAAC;YAED,uBAAuB;YACvB,OAAO,IAAI,CAAC,cAAc,CAAC;gBACzB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Results Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles the export-results tool which formats and exports test results.
|
|
5
|
+
*
|
|
6
|
+
* @module mcp/handlers/export-results
|
|
7
|
+
*/
|
|
8
|
+
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
+
import type { ToolResponse } from './types.js';
|
|
10
|
+
import { ReportService } from '../services/report-service.js';
|
|
11
|
+
import { FileService } from '../services/file-service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Handler for results export tool
|
|
14
|
+
*/
|
|
15
|
+
export declare class ExportResultsHandler extends BaseToolHandler {
|
|
16
|
+
private reportService;
|
|
17
|
+
private fileService;
|
|
18
|
+
readonly name = "export-results";
|
|
19
|
+
readonly description: string;
|
|
20
|
+
readonly inputSchema: {
|
|
21
|
+
type: string;
|
|
22
|
+
properties: {
|
|
23
|
+
results: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
items: {
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
format: {
|
|
31
|
+
type: string;
|
|
32
|
+
enum: string[];
|
|
33
|
+
description: string;
|
|
34
|
+
};
|
|
35
|
+
outputPath: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
includeCharts: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
title: {
|
|
44
|
+
type: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
required: string[];
|
|
49
|
+
};
|
|
50
|
+
constructor(reportService: ReportService, fileService: FileService);
|
|
51
|
+
handle(args: unknown): Promise<ToolResponse>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=export-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-results.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/export-results.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;IAiDrD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,WAAW;IAjDrB,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,SAOiE;IAErF,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmClB;gBAGQ,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW;IAK5B,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;CAgFnD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Results Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles the export-results tool which formats and exports test results.
|
|
5
|
+
*
|
|
6
|
+
* @module mcp/handlers/export-results
|
|
7
|
+
*/
|
|
8
|
+
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
+
import { analyzeFailures } from '../../analyzers/failure-analyzer.js';
|
|
10
|
+
import { analyzeFailuresWithAI } from '../../analyzers/ai-failure-analyzer.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handler for results export tool
|
|
13
|
+
*/
|
|
14
|
+
export class ExportResultsHandler extends BaseToolHandler {
|
|
15
|
+
reportService;
|
|
16
|
+
fileService;
|
|
17
|
+
name = 'export-results';
|
|
18
|
+
description = 'STEP 3 of 3 (optional) — Export test results as a formatted report file. ' +
|
|
19
|
+
'Takes the "results" array from run-tests and produces an HTML dashboard, ' +
|
|
20
|
+
'a Markdown summary, or a raw JSON file. ' +
|
|
21
|
+
'HTML is the richest format: interactive charts, pass/fail breakdown by category, ' +
|
|
22
|
+
'per-endpoint details, and automatic AI failure analysis (if LLM available). ' +
|
|
23
|
+
'Use Markdown for GitHub PRs or documentation. Use JSON for programmatic processing. ' +
|
|
24
|
+
'AI analysis runs automatically when there are failed tests and LLM is available.';
|
|
25
|
+
inputSchema = {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
results: {
|
|
29
|
+
type: 'array',
|
|
30
|
+
description: 'Test results array returned by run-tests. Pass it directly here.',
|
|
31
|
+
items: { type: 'object' }
|
|
32
|
+
},
|
|
33
|
+
format: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
enum: ['html', 'markdown', 'json'],
|
|
36
|
+
description: 'Output format. ' +
|
|
37
|
+
'html: interactive dashboard with charts (best for human review). ' +
|
|
38
|
+
'markdown: plain text summary (good for GitHub PRs or docs). ' +
|
|
39
|
+
'json: raw structured data (good for CI/CD pipelines or further processing). ' +
|
|
40
|
+
'Default: "html".'
|
|
41
|
+
},
|
|
42
|
+
outputPath: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Absolute or relative path where the report file will be saved. ' +
|
|
45
|
+
'The file extension should match the format. ' +
|
|
46
|
+
'Examples: "/tmp/report.html", "./results/report.md", "~/tests/output.json".'
|
|
47
|
+
},
|
|
48
|
+
includeCharts: {
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
description: 'Include interactive Chart.js charts in the HTML report (default: true). ' +
|
|
51
|
+
'Set to false for a lighter report without JavaScript dependencies.'
|
|
52
|
+
},
|
|
53
|
+
title: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Title shown at the top of the report (default: "Test Results"). ' +
|
|
56
|
+
'Example: "User Service API — Sprint 24 Test Report".'
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
required: ['results', 'outputPath']
|
|
60
|
+
};
|
|
61
|
+
constructor(reportService, fileService) {
|
|
62
|
+
super();
|
|
63
|
+
this.reportService = reportService;
|
|
64
|
+
this.fileService = fileService;
|
|
65
|
+
}
|
|
66
|
+
async handle(args) {
|
|
67
|
+
const params = args;
|
|
68
|
+
const format = params.format || 'html';
|
|
69
|
+
this.log.info('Exporting results', {
|
|
70
|
+
resultCount: params.results.length,
|
|
71
|
+
format,
|
|
72
|
+
outputPath: params.outputPath
|
|
73
|
+
});
|
|
74
|
+
try {
|
|
75
|
+
// Auto-detect failed tests and run AI analysis if available
|
|
76
|
+
let failureAnalysis;
|
|
77
|
+
const failedTests = params.results.filter(r => r.status === 'failed');
|
|
78
|
+
if (failedTests.length > 0) {
|
|
79
|
+
this.log.info('Running automatic failure analysis', { failedCount: failedTests.length });
|
|
80
|
+
// Step 1: Heuristic analysis (structured data)
|
|
81
|
+
const structuredAnalysis = analyzeFailures(failedTests);
|
|
82
|
+
// Step 2: AI analysis (human-readable insights) - automatic
|
|
83
|
+
this.log.info('Running AI analysis on failures (automatic)');
|
|
84
|
+
failureAnalysis = await analyzeFailuresWithAI(structuredAnalysis);
|
|
85
|
+
this.log.info('AI analysis complete', {
|
|
86
|
+
recommendationsCount: failureAnalysis.recommendations?.length || 0,
|
|
87
|
+
aiEnabled: failureAnalysis.recommendations && failureAnalysis.recommendations.length > 0
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
let content;
|
|
91
|
+
// Generate report based on format
|
|
92
|
+
if (format === 'html') {
|
|
93
|
+
content = this.reportService.generateHTML(params.results, {
|
|
94
|
+
title: params.title,
|
|
95
|
+
includeCharts: params.includeCharts !== false,
|
|
96
|
+
includeFullDetails: true,
|
|
97
|
+
aiAnalysis: failureAnalysis
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else if (format === 'markdown') {
|
|
101
|
+
content = this.reportService.generateMarkdown(params.results);
|
|
102
|
+
// Add analysis to content for markdown
|
|
103
|
+
if (failureAnalysis) {
|
|
104
|
+
content += `\n\n## Failure Analysis\n\`\`\`json\n${JSON.stringify(failureAnalysis, null, 2)}\n\`\`\``;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
content = this.reportService.generateJSON(params.results);
|
|
109
|
+
}
|
|
110
|
+
// Save file
|
|
111
|
+
await this.fileService.saveFile(params.outputPath, content);
|
|
112
|
+
this.log.info('Results exported successfully', {
|
|
113
|
+
format,
|
|
114
|
+
outputPath: params.outputPath,
|
|
115
|
+
size: content.length
|
|
116
|
+
});
|
|
117
|
+
return this.formatResponse({
|
|
118
|
+
success: true,
|
|
119
|
+
format,
|
|
120
|
+
outputPath: params.outputPath,
|
|
121
|
+
size: content.length,
|
|
122
|
+
summary: this.reportService.calculateSummary(params.results),
|
|
123
|
+
aiAnalysisIncluded: !!failureAnalysis,
|
|
124
|
+
failedTests: failedTests.length
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return this.formatError(error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=export-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-results.js","sourceRoot":"","sources":["../../../src/mcp/handlers/export-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export to Postman Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles the export-to-postman tool which converts test cases to Postman Collection v2.1.
|
|
5
|
+
*
|
|
6
|
+
* @module mcp/handlers/export-to-postman
|
|
7
|
+
*/
|
|
8
|
+
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
+
import type { ToolResponse } from './types.js';
|
|
10
|
+
import { PostmanService } from '../services/postman-service.js';
|
|
11
|
+
import { FileService } from '../services/file-service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Handler for Postman export tool
|
|
14
|
+
*/
|
|
15
|
+
export declare class ExportToPostmanHandler extends BaseToolHandler {
|
|
16
|
+
private postmanService;
|
|
17
|
+
private fileService;
|
|
18
|
+
readonly name = "export-to-postman";
|
|
19
|
+
readonly description: string;
|
|
20
|
+
readonly inputSchema: {
|
|
21
|
+
type: string;
|
|
22
|
+
properties: {
|
|
23
|
+
tests: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
items: {
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
outputPath: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
baseUrl: {
|
|
35
|
+
type: string;
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
collectionName: {
|
|
39
|
+
type: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
includeTests: {
|
|
43
|
+
type: string;
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
groupByCategory: {
|
|
47
|
+
type: string;
|
|
48
|
+
description: string;
|
|
49
|
+
};
|
|
50
|
+
auth: {
|
|
51
|
+
type: string;
|
|
52
|
+
description: string;
|
|
53
|
+
additionalProperties: boolean;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
required: string[];
|
|
57
|
+
};
|
|
58
|
+
constructor(postmanService: PostmanService, fileService: FileService);
|
|
59
|
+
handle(args: unknown): Promise<ToolResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* Counts total requests in the collection (including nested folders)
|
|
62
|
+
*/
|
|
63
|
+
private countRequests;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=export-to-postman.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-to-postman.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/export-to-postman.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;IAsDvD,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,WAAW;IAtDrB,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,SAKwE;IAE5F,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0ClB;gBAGQ,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW;IAK5B,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAuDlD;;OAEG;IACH,OAAO,CAAC,aAAa;CAoBtB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export to Postman Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles the export-to-postman tool which converts test cases to Postman Collection v2.1.
|
|
5
|
+
*
|
|
6
|
+
* @module mcp/handlers/export-to-postman
|
|
7
|
+
*/
|
|
8
|
+
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
+
/**
|
|
10
|
+
* Handler for Postman export tool
|
|
11
|
+
*/
|
|
12
|
+
export class ExportToPostmanHandler extends BaseToolHandler {
|
|
13
|
+
postmanService;
|
|
14
|
+
fileService;
|
|
15
|
+
name = 'export-to-postman';
|
|
16
|
+
description = 'OPTIONAL TOOL — Export test cases as a Postman Collection v2.1 (compatible with Newman). ' +
|
|
17
|
+
'Takes the "tests" array from generate-tests and produces a .postman_collection.json file ' +
|
|
18
|
+
'that can be imported into Postman or executed with Newman CLI. ' +
|
|
19
|
+
'Each test becomes a request in the collection with pre-configured method, URL, headers, body, and tests. ' +
|
|
20
|
+
'Use this to integrate with existing Postman workflows or run tests via Newman in CI/CD.';
|
|
21
|
+
inputSchema = {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
tests: {
|
|
25
|
+
type: 'array',
|
|
26
|
+
description: 'Test cases array returned by generate-tests. Pass it directly here.',
|
|
27
|
+
items: { type: 'object' }
|
|
28
|
+
},
|
|
29
|
+
outputPath: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Path where the Postman collection JSON file will be saved. ' +
|
|
32
|
+
'Example: "./postman-collection.json" or "/tmp/api-tests.postman_collection.json".'
|
|
33
|
+
},
|
|
34
|
+
baseUrl: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Base URL of the API (e.g., "https://api.example.com"). ' +
|
|
37
|
+
'If provided, requests will use this as the base URL. ' +
|
|
38
|
+
'If omitted, uses collection-level variables.'
|
|
39
|
+
},
|
|
40
|
+
collectionName: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'Name for the Postman collection (default: "API Test Collection"). ' +
|
|
43
|
+
'Example: "User Service Tests - v1.0".'
|
|
44
|
+
},
|
|
45
|
+
includeTests: {
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
description: 'Include Postman test scripts that validate status codes and schemas (default: true). ' +
|
|
48
|
+
'When true, each request includes pm.test() assertions.'
|
|
49
|
+
},
|
|
50
|
+
groupByCategory: {
|
|
51
|
+
type: 'boolean',
|
|
52
|
+
description: 'Group requests into folders by category (default: true). ' +
|
|
53
|
+
'Creates folders: Happy Path, Edge Cases, Error Cases, Business Rules.'
|
|
54
|
+
},
|
|
55
|
+
auth: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
description: 'Collection-level authentication configuration. ' +
|
|
58
|
+
'Example: { "type": "bearer", "bearer": [{ "key": "token", "value": "{{API_TOKEN}}" }] }',
|
|
59
|
+
additionalProperties: true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
required: ['tests', 'outputPath']
|
|
63
|
+
};
|
|
64
|
+
constructor(postmanService, fileService) {
|
|
65
|
+
super();
|
|
66
|
+
this.postmanService = postmanService;
|
|
67
|
+
this.fileService = fileService;
|
|
68
|
+
}
|
|
69
|
+
async handle(args) {
|
|
70
|
+
const params = args;
|
|
71
|
+
this.log.info('Exporting to Postman', {
|
|
72
|
+
testCount: params.tests.length,
|
|
73
|
+
outputPath: params.outputPath,
|
|
74
|
+
baseUrl: params.baseUrl,
|
|
75
|
+
groupByCategory: params.groupByCategory !== false
|
|
76
|
+
});
|
|
77
|
+
try {
|
|
78
|
+
// Generate Postman Collection
|
|
79
|
+
const collection = this.postmanService.generateCollection(params.tests, {
|
|
80
|
+
name: params.collectionName || 'API Test Collection',
|
|
81
|
+
baseUrl: params.baseUrl,
|
|
82
|
+
includeTests: params.includeTests !== false,
|
|
83
|
+
groupByCategory: params.groupByCategory !== false,
|
|
84
|
+
auth: params.auth
|
|
85
|
+
});
|
|
86
|
+
// Convert to JSON
|
|
87
|
+
const collectionJson = collection.toJSON();
|
|
88
|
+
// Save file
|
|
89
|
+
await this.fileService.saveFile(params.outputPath, JSON.stringify(collectionJson, null, 2));
|
|
90
|
+
this.log.info('Postman collection exported successfully', {
|
|
91
|
+
outputPath: params.outputPath,
|
|
92
|
+
requestCount: this.countRequests(collectionJson),
|
|
93
|
+
size: JSON.stringify(collectionJson).length
|
|
94
|
+
});
|
|
95
|
+
return this.formatResponse({
|
|
96
|
+
success: true,
|
|
97
|
+
outputPath: params.outputPath,
|
|
98
|
+
collectionName: collectionJson.info?.name || params.collectionName || 'API Test Collection',
|
|
99
|
+
requestCount: this.countRequests(collectionJson),
|
|
100
|
+
newmanCommand: `newman run ${params.outputPath}${params.baseUrl ? ` --env-var "baseUrl=${params.baseUrl}"` : ''}`
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return this.formatError(error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Counts total requests in the collection (including nested folders)
|
|
109
|
+
*/
|
|
110
|
+
countRequests(collectionJson) {
|
|
111
|
+
let count = 0;
|
|
112
|
+
function countItems(items) {
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
if (item.request) {
|
|
115
|
+
count++;
|
|
116
|
+
}
|
|
117
|
+
if (item.item && Array.isArray(item.item)) {
|
|
118
|
+
countItems(item.item);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (collectionJson.item) {
|
|
123
|
+
countItems(collectionJson.item);
|
|
124
|
+
}
|
|
125
|
+
return count;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=export-to-postman.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-to-postman.js","sourceRoot":"","sources":["../../../src/mcp/handlers/export-to-postman.ts"],"names":[],"mappings":"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"}
|