@skyramp/mcp 0.4.1 → 0.4.2-rc.1
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/build/adapters/jestAdapter.js +23 -5
- package/build/adapters/mochaAdapter.js +7 -1
- package/build/adapters/playwrightAdapter.js +3 -1
- package/build/adapters/pytestAdapter.js +14 -3
- package/build/commands/localDevTestChangesCommand.js +1 -0
- package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
- package/build/commands/testThisEndpointCommand.js +16 -4
- package/build/index.js +34 -4
- package/build/playwright/blueprintDigest.js +28 -7
- package/build/playwright/registerPlaywrightTools.js +33 -28
- package/build/playwright/traceRecordingPrompt.js +9 -2
- package/build/prompts/code-reuse.js +95 -29
- package/build/prompts/fix-error-prompt.d.ts +9 -1
- package/build/prompts/fix-error-prompt.js +31 -28
- package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
- package/build/prompts/local-dev/local-dev-plan.js +3 -1
- package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
- package/build/prompts/local-dev/local-dev-prompts.js +30 -3
- package/build/prompts/modularization/integration-test-modularization.js +13 -6
- package/build/prompts/modularization/ui-test-modularization.js +1 -1
- package/build/prompts/personas.js +1 -1
- package/build/prompts/pom-aware-code-reuse.js +7 -9
- package/build/prompts/reuse-hand-off.d.ts +64 -0
- package/build/prompts/reuse-hand-off.js +130 -0
- package/build/prompts/shared-helper-policy.d.ts +88 -2
- package/build/prompts/shared-helper-policy.js +145 -11
- package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
- package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
- package/build/prompts/sut-setup/shared.d.ts +4 -1
- package/build/prompts/sut-setup/shared.js +2 -2
- package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
- package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
- package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
- package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
- package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
- package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
- package/build/prompts/test-recommendation/recommendationSections.js +19 -8
- package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
- package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
- package/build/prompts/testbot/testbot-prompts.js +123 -55
- package/build/recommendation/answers.js +18 -9
- package/build/recommendation/pullRequestText.js +1 -1
- package/build/recommendation/registerPlan.js +31 -17
- package/build/recommendation/subjectStep.d.ts +8 -10
- package/build/recommendation/subjectStep.js +17 -16
- package/build/recommendation/types.d.ts +71 -17
- package/build/recommendation/types.js +9 -15
- package/build/recommendation/verifierContracts.d.ts +7 -3
- package/build/recommendation/verifierContracts.js +8 -4
- package/build/recommendation/verifiers/changedFile.js +11 -13
- package/build/recommendation/verifiers/citedPath.d.ts +8 -0
- package/build/recommendation/verifiers/citedPath.js +16 -2
- package/build/recommendation/verifiers/coverage.d.ts +2 -2
- package/build/recommendation/verifiers/coverage.js +190 -134
- package/build/recommendation/verifiers/defects.js +56 -16
- package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
- package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
- package/build/recommendation/verifiers/endpointGrounded.js +14 -8
- package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
- package/build/recommendation/verifiers/existingCoverage.js +30 -21
- package/build/recommendation/verifiers/expectedOutcome.js +17 -8
- package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
- package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
- package/build/recommendation/verifiers/issueTraceability.js +64 -7
- package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
- package/build/recommendation/verifiers/reportedCategory.js +9 -4
- package/build/recommendation/verifiers/requirementSourced.js +34 -21
- package/build/recommendation/verifiers/screenRoute.js +15 -10
- package/build/recommendation/verifiers/statedDifference.js +15 -8
- package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
- package/build/resources/analysisResources.js +7 -3
- package/build/resources/progressResource.js +4 -2
- package/build/resources/sutSetupResource.js +20 -2
- package/build/resources/testbotResource.js +19 -1
- package/build/services/AnalyticsService.js +3 -1
- package/build/services/ScenarioGenerationService.js +5 -5
- package/build/services/TestDiscoveryService.js +21 -5
- package/build/services/TestExecutionService.js +63 -21
- package/build/services/TestGenerationService.d.ts +1 -1
- package/build/services/TestGenerationService.js +43 -24
- package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
- package/build/skills/enhanceAssertionsSkill.js +103 -0
- package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
- package/build/skills/fixTestImportErrorsSkill.js +2 -2
- package/build/skills/skillFiles.d.ts +38 -0
- package/build/skills/skillFiles.js +94 -0
- package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
- package/build/skills/validateAssertionAlignmentSkill.js +59 -0
- package/build/tool-phases.js +4 -0
- package/build/tools/auth/loginTool.js +3 -1
- package/build/tools/auth/logoutTool.js +3 -1
- package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
- package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
- package/build/tools/code-refactor/assertion-state.d.ts +1 -1
- package/build/tools/code-refactor/assertion-state.js +1 -1
- package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
- package/build/tools/code-refactor/assertionOperations.js +82 -0
- package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
- package/build/tools/code-refactor/assertionSkillTools.js +86 -0
- package/build/tools/code-refactor/codeReuseTool.js +27 -3
- package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
- package/build/tools/code-refactor/gate-markers.d.ts +51 -0
- package/build/tools/code-refactor/gate-markers.js +95 -0
- package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
- package/build/tools/code-refactor/retrofit-state.js +44 -2
- package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
- package/build/tools/code-refactor/reuse-outcome.js +36 -13
- package/build/tools/code-refactor/reuse-state.d.ts +90 -16
- package/build/tools/code-refactor/reuse-state.js +191 -61
- package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
- package/build/tools/code-refactor/utils-verify-gates.js +252 -27
- package/build/tools/code-refactor/verify-gates.d.ts +15 -1
- package/build/tools/code-refactor/verify-gates.js +36 -4
- package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
- package/build/tools/enrichTestWithMocksTool.js +9 -5
- package/build/tools/executeSkyrampTestTool.d.ts +22 -1
- package/build/tools/executeSkyrampTestTool.js +571 -271
- package/build/tools/execution-video-state.js +1 -1
- package/build/tools/fixErrorTool.js +5 -6
- package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
- package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
- package/build/tools/generate-tests/generateContractRestTool.js +34 -16
- package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
- package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
- package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
- package/build/tools/generate-tests/generateMockRestTool.js +3 -1
- package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
- package/build/tools/generate-tests/generateUIRestTool.js +11 -2
- package/build/tools/generate-tests/loadTestSchema.js +1 -3
- package/build/tools/generate-tests/planGuard.js +6 -3
- package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
- package/build/tools/generate-tests/scenarioLint.js +17 -5
- package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
- package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
- package/build/tools/one-click/oneClickTool.js +3 -1
- package/build/tools/preflightMockCheckTool.js +23 -7
- package/build/tools/runExistingTestsTool.d.ts +1 -1
- package/build/tools/runExistingTestsTool.js +43 -21
- package/build/tools/submitReportTool.d.ts +51 -12
- package/build/tools/submitReportTool.js +860 -161
- package/build/tools/test-management/actionsTool.js +210 -51
- package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
- package/build/tools/test-management/analyzeChangesTool.js +127 -68
- package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
- package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
- package/build/tools/test-management/registerTestPlanTool.js +255 -111
- package/build/tools/test-management/resolveScreenTool.js +33 -9
- package/build/tools/trace/startTraceCollectionTool.js +3 -1
- package/build/tools/trace/stopTraceCollectionTool.js +41 -5
- package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
- package/build/tools/verifyTestDependenciesTool.js +54 -0
- package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
- package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
- package/build/types/AssertionOutcome.d.ts +1 -1
- package/build/types/EnhanceType.d.ts +6 -0
- package/build/types/EnhanceType.js +1 -0
- package/build/types/ExternalTestExecution.d.ts +2 -2
- package/build/types/RepositoryAnalysis.d.ts +0 -40
- package/build/types/ReuseOutcome.d.ts +96 -4
- package/build/types/ReuseOutcome.js +16 -0
- package/build/types/StepMethod.js +20 -6
- package/build/types/TestAnalysis.d.ts +10 -2
- package/build/types/TestExecution.d.ts +45 -0
- package/build/types/TestRecommendation.d.ts +1 -1
- package/build/types/TestRecommendation.js +4 -1
- package/build/types/TestTypes.d.ts +13 -0
- package/build/types/TestTypes.js +34 -3
- package/build/types/TestbotPromptOptions.d.ts +9 -1
- package/build/types/TestbotReport.d.ts +45 -9
- package/build/utils/AnalysisStateManager.d.ts +137 -27
- package/build/utils/AnalysisStateManager.js +227 -43
- package/build/utils/assertion-verify/api-shared-lints.js +34 -16
- package/build/utils/assertion-verify/metrics.js +39 -6
- package/build/utils/assertion-verify/ui-lints.js +4 -2
- package/build/utils/branchDiff.js +47 -12
- package/build/utils/canonicalJson.js +3 -1
- package/build/utils/dartRouteExtractor.js +36 -7
- package/build/utils/fixAttempts.d.ts +26 -0
- package/build/utils/fixAttempts.js +109 -0
- package/build/utils/frontendSelectors.js +23 -4
- package/build/utils/generatedTestRecord.d.ts +19 -0
- package/build/utils/generatedTestRecord.js +61 -0
- package/build/utils/gitStaging.js +7 -2
- package/build/utils/initAgent.js +26 -6
- package/build/utils/language-helper.js +39 -45
- package/build/utils/pathMatching.js +2 -1
- package/build/utils/pathSignatures.js +6 -2
- package/build/utils/planMatchKeys.d.ts +2 -2
- package/build/utils/planMatchKeys.js +20 -14
- package/build/utils/pom-catalog-parse.js +7 -2
- package/build/utils/pom-scope/import-expansion.js +6 -1
- package/build/utils/pom-scope/index.js +50 -12
- package/build/utils/pom-scope/scoring.js +13 -3
- package/build/utils/pom-scope/selector-extractor.js +16 -3
- package/build/utils/pom-scope/strip.d.ts +8 -0
- package/build/utils/pom-scope/strip.js +238 -0
- package/build/utils/pom-scope/testIdDiscovery.js +14 -2
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
- package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
- package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
- package/build/utils/pom-verify/bindings.js +5 -1
- package/build/utils/pom-verify/calls.js +9 -2
- package/build/utils/pom-verify/verify.js +27 -5
- package/build/utils/pr-comment-parser.js +20 -7
- package/build/utils/proxy-terminal.d.ts +19 -1
- package/build/utils/proxy-terminal.js +346 -21
- package/build/utils/removedUiElements.js +1 -1
- package/build/utils/reportLanguage.js +35 -7
- package/build/utils/reportVerification.d.ts +14 -8
- package/build/utils/reportVerification.js +19 -19
- package/build/utils/repositorySlug.d.ts +32 -0
- package/build/utils/repositorySlug.js +77 -0
- package/build/utils/reuseRouting.js +6 -2
- package/build/utils/runSerialized.d.ts +3 -0
- package/build/utils/runSerialized.js +39 -0
- package/build/utils/screenRoutes.js +74 -18
- package/build/utils/sourceRouteExtractor.js +13 -6
- package/build/utils/telemetry.d.ts +1 -0
- package/build/utils/telemetry.js +8 -5
- package/build/utils/testDependencyPolicy.d.ts +9 -0
- package/build/utils/testDependencyPolicy.js +788 -0
- package/build/utils/testExecutionRecord.d.ts +90 -0
- package/build/utils/testExecutionRecord.js +267 -0
- package/build/utils/testFileClassification.js +3 -1
- package/build/utils/trace-parser.js +62 -14
- package/build/utils/urlPath.js +3 -1
- package/build/utils/utils-verify/action-key.d.ts +4 -0
- package/build/utils/utils-verify/action-key.js +2 -2
- package/build/utils/utils-verify/allow.d.ts +122 -3
- package/build/utils/utils-verify/allow.js +146 -21
- package/build/utils/utils-verify/body-reach.d.ts +120 -0
- package/build/utils/utils-verify/body-reach.js +335 -0
- package/build/utils/utils-verify/call-sites.d.ts +6 -1
- package/build/utils/utils-verify/call-sites.js +72 -8
- package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
- package/build/utils/utils-verify/delivered-imports.js +84 -0
- package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
- package/build/utils/utils-verify/fixed-sleep.js +461 -0
- package/build/utils/utils-verify/in-house.d.ts +93 -0
- package/build/utils/utils-verify/in-house.js +719 -0
- package/build/utils/utils-verify/incumbent.d.ts +3 -0
- package/build/utils/utils-verify/incumbent.js +75 -0
- package/build/utils/utils-verify/index.d.ts +1 -0
- package/build/utils/utils-verify/index.js +1 -0
- package/build/utils/utils-verify/language-spec.d.ts +26 -10
- package/build/utils/utils-verify/language-spec.js +217 -20
- package/build/utils/utils-verify/locate.d.ts +26 -0
- package/build/utils/utils-verify/locate.js +125 -23
- package/build/utils/utils-verify/module-name.d.ts +40 -0
- package/build/utils/utils-verify/module-name.js +98 -0
- package/build/utils/utils-verify/parse.d.ts +46 -6
- package/build/utils/utils-verify/parse.js +176 -38
- package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
- package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
- package/build/utils/utils-verify/stage.d.ts +5 -0
- package/build/utils/utils-verify/stage.js +47 -2
- package/build/utils/utils-verify/status-once.d.ts +62 -0
- package/build/utils/utils-verify/status-once.js +207 -0
- package/build/utils/utils-verify/typecheck.d.ts +61 -0
- package/build/utils/utils-verify/typecheck.js +338 -0
- package/build/utils/utils-verify/verify.d.ts +76 -1
- package/build/utils/utils-verify/verify.js +516 -44
- package/build/utils/versions.d.ts +3 -3
- package/build/utils/versions.js +1 -1
- package/build/utils/workspaceAuth.js +107 -37
- package/build/workspace/queryParamResolution.js +11 -4
- package/build/workspace/workspace.js +7 -7
- package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
- package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
- package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
- package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
- package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
- package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
- package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
- package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
- package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
- package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
- package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
- package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
- package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
- package/node_modules/playwright/package.json +2 -2
- package/package.json +7 -6
- package/plugin/prompts/code-reuse/hand-off.md +30 -0
- package/plugin/prompts/generate-tests/generation.md +1 -1
- package/plugin/prompts/plan-tests.md +14 -14
- package/plugin/prompts/testbot-task1.md +4 -2
- package/plugin/skills/enhance-assertions/SKILL.md +25 -0
- package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
- package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
- package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
- package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
- package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
- package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
- package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
- package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
- package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { allChangedFiles } from "../types.js";
|
|
1
|
+
import { allChangedFiles, } from "../types.js";
|
|
2
2
|
import { canonicalJson } from "../../utils/canonicalJson.js";
|
|
3
|
-
import {
|
|
3
|
+
import { LOCKFILE, NOT_A_ROUTE_FILE, NOT_SOURCE_DIR, } from "./endpointGrounded.js";
|
|
4
4
|
import { isTestPath } from "../../utils/testFileClassification.js";
|
|
5
|
-
import { normalizeCitedPath } from "./citedPath.js";
|
|
5
|
+
import { maintainedFileIsInItsRepository, normalizeCitedPath, } from "./citedPath.js";
|
|
6
6
|
import { COVERAGE_CONTRACT, fillPlaceholders } from "../verifierContracts.js";
|
|
7
7
|
import { isUIPlannedTest, stateRouteKey, subjectStep } from "../subjectStep.js";
|
|
8
8
|
/** Whether a path can be product code at all, by the deny list route grounding
|
|
@@ -12,32 +12,32 @@ function couldBeProductCode(file) {
|
|
|
12
12
|
const path = file.trim();
|
|
13
13
|
if (!path)
|
|
14
14
|
return false;
|
|
15
|
-
return !(isTestPath(path) ||
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
return !(isTestPath(path) ||
|
|
16
|
+
NOT_SOURCE_DIR.test(path) ||
|
|
17
|
+
LOCKFILE.test(path) ||
|
|
18
|
+
NOT_A_ROUTE_FILE.test(path));
|
|
19
|
+
}
|
|
20
|
+
/** The files one planned test cites, in normalised spelling. THREE fields, all
|
|
21
|
+
* name-level: `changedFile`, `routes[].file` and `screenEvidence.file` — citing a
|
|
22
|
+
* changed file through any of them is being about that file. Coverage by citation
|
|
23
|
+
* reads names alone, where an anchor search needed the diff text. */
|
|
24
|
+
function citedPaths(plannedTest) {
|
|
25
|
+
const cited = [];
|
|
23
26
|
const add = (value) => {
|
|
24
27
|
const path = normalizeCitedPath(value);
|
|
25
28
|
if (path)
|
|
26
|
-
cited.
|
|
29
|
+
cited.push(path);
|
|
27
30
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// path. A throw here would reach the agent as `:crashed`, hiding the real
|
|
33
|
-
// objection instead of raising it.
|
|
34
|
-
const evidence = plannedTest?.declarations?.routes;
|
|
35
|
-
if (Array.isArray(evidence))
|
|
36
|
-
for (const entry of evidence)
|
|
37
|
-
add(entry?.file);
|
|
38
|
-
}
|
|
31
|
+
add(plannedTest.declarations.changedFile);
|
|
32
|
+
add(plannedTest.declarations.screenEvidence?.file);
|
|
33
|
+
for (const entry of plannedTest.declarations.routes ?? [])
|
|
34
|
+
add(entry.file);
|
|
39
35
|
return cited;
|
|
40
36
|
}
|
|
37
|
+
/** Every file some planned test cites. */
|
|
38
|
+
function citedFiles(plannedTests) {
|
|
39
|
+
return new Set(plannedTests.flatMap(citedPaths));
|
|
40
|
+
}
|
|
41
41
|
/** The behaviour ids the plan cites, trimmed — from its planned tests AND from the
|
|
42
42
|
* existing tests it maintains. A change covered by a spec this run edits is tested;
|
|
43
43
|
* counting only planned tests made `coverage:change:` unanswerable for a correct
|
|
@@ -45,34 +45,25 @@ function citedFiles(plannedTests) {
|
|
|
45
45
|
* nothing stopped the run.
|
|
46
46
|
*
|
|
47
47
|
* A maintenance entry credits its ids only when the file it names RESOLVES in the
|
|
48
|
-
*
|
|
48
|
+
* repository the entry names. `existingCoverage` objects about an unresolvable one, but that objection
|
|
49
49
|
* takes prose, so crediting first would have handed `coverage:change:` — the one
|
|
50
50
|
* class a sentence cannot close, and the reason `BLOCKER_ONLY_PREFIX` exists — a
|
|
51
51
|
* route out through a file name nobody can open. */
|
|
52
|
-
function citedBehaviors(plannedTests, maintains = [],
|
|
52
|
+
function citedBehaviors(plannedTests, maintains = [], entryResolves = () => false) {
|
|
53
53
|
const cited = new Set();
|
|
54
|
-
|
|
55
|
-
const ids = entry?.changes;
|
|
56
|
-
if (!Array.isArray(ids))
|
|
57
|
-
continue;
|
|
58
|
-
if (!fileResolves(String(entry?.file ?? "").trim()))
|
|
59
|
-
continue;
|
|
54
|
+
const add = (ids) => {
|
|
60
55
|
for (const id of ids) {
|
|
61
|
-
const trimmed =
|
|
62
|
-
if (trimmed)
|
|
63
|
-
cited.add(trimmed);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
for (const plannedTest of plannedTests) {
|
|
67
|
-
const declared = plannedTest?.declarations?.changes;
|
|
68
|
-
if (!Array.isArray(declared))
|
|
69
|
-
continue;
|
|
70
|
-
for (const id of declared) {
|
|
71
|
-
const trimmed = String(id ?? "").trim();
|
|
56
|
+
const trimmed = id.trim();
|
|
72
57
|
if (trimmed)
|
|
73
58
|
cited.add(trimmed);
|
|
74
59
|
}
|
|
60
|
+
};
|
|
61
|
+
for (const entry of maintains) {
|
|
62
|
+
if (entryResolves(entry))
|
|
63
|
+
add(entry.changes);
|
|
75
64
|
}
|
|
65
|
+
for (const plannedTest of plannedTests)
|
|
66
|
+
add(plannedTest.declarations.changes ?? []);
|
|
76
67
|
return cited;
|
|
77
68
|
}
|
|
78
69
|
/** Every declared behaviour needs a planned test citing it, or an answer. Coverage per
|
|
@@ -82,8 +73,8 @@ function citedBehaviors(plannedTests, maintains = [], fileResolves = () => false
|
|
|
82
73
|
* Checked whether or not the run has a diff: the agent declared these itself, so
|
|
83
74
|
* there is always something to hold it to. */
|
|
84
75
|
function claimObjections(registration, ctx) {
|
|
85
|
-
const changes =
|
|
86
|
-
const plannedTests = registration.plannedTests
|
|
76
|
+
const changes = registration.changes;
|
|
77
|
+
const plannedTests = registration.plannedTests;
|
|
87
78
|
const objections = [];
|
|
88
79
|
if (changes.length === 0) {
|
|
89
80
|
return [
|
|
@@ -98,15 +89,17 @@ function claimObjections(registration, ctx) {
|
|
|
98
89
|
}
|
|
99
90
|
const declared = new Set();
|
|
100
91
|
for (const change of changes) {
|
|
101
|
-
const id = String(change
|
|
92
|
+
const id = String(change.id ?? "").trim();
|
|
102
93
|
if (id)
|
|
103
94
|
declared.add(id);
|
|
104
95
|
}
|
|
105
|
-
const maintains = Array.isArray(registration.maintains)
|
|
106
|
-
|
|
96
|
+
const maintains = Array.isArray(registration.maintains)
|
|
97
|
+
? registration.maintains
|
|
98
|
+
: [];
|
|
99
|
+
const cited = citedBehaviors(plannedTests, maintains, (entry) => maintainedFileIsInItsRepository(entry, ctx));
|
|
107
100
|
const seen = new Set();
|
|
108
101
|
for (const change of changes) {
|
|
109
|
-
const id = String(change
|
|
102
|
+
const id = String(change.id ?? "").trim();
|
|
110
103
|
if (!id || seen.has(id))
|
|
111
104
|
continue;
|
|
112
105
|
seen.add(id);
|
|
@@ -116,17 +109,19 @@ function claimObjections(registration, ctx) {
|
|
|
116
109
|
objectionId: `coverage:change:${id}`,
|
|
117
110
|
verifier: "coverage",
|
|
118
111
|
message: COVERAGE_CONTRACT.objections.change.message,
|
|
119
|
-
evidence: `"${String(change
|
|
112
|
+
evidence: `"${String(change.text ?? "").trim()}" (${String(change.source ?? "").trim()}): no planned test cites behaviour ${id}.`,
|
|
120
113
|
suggestion: COVERAGE_CONTRACT.objections.change.suggestion,
|
|
121
114
|
});
|
|
122
115
|
}
|
|
123
116
|
// One objection per planned test, not per id: a planned test with three unknown ids
|
|
124
117
|
// has one mistake to fix, and three objections would need three answers.
|
|
125
118
|
for (const plannedTest of plannedTests) {
|
|
126
|
-
const claimIds = plannedTest
|
|
119
|
+
const claimIds = plannedTest.declarations.changes;
|
|
127
120
|
if (!Array.isArray(claimIds))
|
|
128
121
|
continue;
|
|
129
|
-
const unknown = [
|
|
122
|
+
const unknown = [
|
|
123
|
+
...new Set(claimIds.map((id) => String(id ?? "").trim())),
|
|
124
|
+
].filter((id) => id && !declared.has(id));
|
|
130
125
|
if (unknown.length === 0)
|
|
131
126
|
continue;
|
|
132
127
|
objections.push({
|
|
@@ -144,12 +139,17 @@ function claimObjections(registration, ctx) {
|
|
|
144
139
|
/** The methods that write. A GET reads what is already there, so what the record
|
|
145
140
|
* held before the call decides nothing; these four run new code against a value
|
|
146
141
|
* the change did not write, which is where a latent bug sits. */
|
|
147
|
-
const MUTATING_METHODS = new Set([
|
|
142
|
+
const MUTATING_METHODS = new Set([
|
|
143
|
+
"POST",
|
|
144
|
+
"PUT",
|
|
145
|
+
"PATCH",
|
|
146
|
+
"DELETE",
|
|
147
|
+
]);
|
|
148
148
|
/** Whether a planned test names the state its starting record is in. Presence is all
|
|
149
149
|
* that is checked: no two repositories describe a record's state the same way, and
|
|
150
150
|
* the test puts the record in that state itself rather than reading it from a file. */
|
|
151
151
|
function declaresStartState(plannedTest) {
|
|
152
|
-
return String(plannedTest
|
|
152
|
+
return String(plannedTest.declarations.startState ?? "").trim().length > 0;
|
|
153
153
|
}
|
|
154
154
|
/** The route a planned test's test mutates, by SHAPE — `stateRouteKey`, so the id a
|
|
155
155
|
* step happened to write does not split one route in two. UI planned tests are OUT:
|
|
@@ -159,7 +159,9 @@ function mutatedRoute(plannedTest) {
|
|
|
159
159
|
if (isUIPlannedTest(plannedTest))
|
|
160
160
|
return undefined;
|
|
161
161
|
const step = subjectStep(plannedTest);
|
|
162
|
-
if (!MUTATING_METHODS.has(String(step?.method ?? "")
|
|
162
|
+
if (!MUTATING_METHODS.has(String(step?.method ?? "")
|
|
163
|
+
.trim()
|
|
164
|
+
.toUpperCase()))
|
|
163
165
|
return undefined;
|
|
164
166
|
return stateRouteKey(step);
|
|
165
167
|
}
|
|
@@ -184,7 +186,7 @@ function routesTestedFromNonDefaultState(plannedTests) {
|
|
|
184
186
|
* half — the agent declared the mutation itself, so a run with no diff has
|
|
185
187
|
* something to hold it to. */
|
|
186
188
|
function stateTestObjections(registration) {
|
|
187
|
-
const plannedTests = registration.plannedTests
|
|
189
|
+
const plannedTests = registration.plannedTests;
|
|
188
190
|
const covered = routesTestedFromNonDefaultState(plannedTests);
|
|
189
191
|
const objections = [];
|
|
190
192
|
const seen = new Set();
|
|
@@ -205,7 +207,7 @@ function stateTestObjections(registration) {
|
|
|
205
207
|
}
|
|
206
208
|
return objections;
|
|
207
209
|
}
|
|
208
|
-
// ── The declared cases
|
|
210
|
+
// ── The declared test cases ─────────────────────────────────────────────────
|
|
209
211
|
/** One number, from a value a step sends or a case declares. A parameter is as
|
|
210
212
|
* often a string as a number, so `"100"` and `100` are one value. Anything else
|
|
211
213
|
* is no number at all: `Number("")` is 0, which would read as a value that was
|
|
@@ -241,7 +243,9 @@ function sameValue(sent, declared) {
|
|
|
241
243
|
if (sentIsStructure || declaredIsStructure) {
|
|
242
244
|
// Both sides are non-null objects by the guard above, so neither call can be
|
|
243
245
|
// the `undefined` the helper returns for a value JSON renders as nothing.
|
|
244
|
-
return sentIsStructure &&
|
|
246
|
+
return (sentIsStructure &&
|
|
247
|
+
declaredIsStructure &&
|
|
248
|
+
canonicalJson(sent) === canonicalJson(declared));
|
|
245
249
|
}
|
|
246
250
|
const sentNumber = asNumber(sent);
|
|
247
251
|
const declaredNumber = asNumber(declared);
|
|
@@ -315,11 +319,16 @@ function valuesSent(step, param) {
|
|
|
315
319
|
const found = [];
|
|
316
320
|
// A query parameter is flat and its own name can hold a dot, so the query answers
|
|
317
321
|
// the parameter as written. Only the body is read as a path.
|
|
318
|
-
const query = String(step?.path ?? "")
|
|
322
|
+
const query = String(step?.path ?? "")
|
|
323
|
+
.split("?")
|
|
324
|
+
.slice(1)
|
|
325
|
+
.join("?");
|
|
319
326
|
if (query)
|
|
320
327
|
found.push(...new URLSearchParams(query).getAll(param));
|
|
321
328
|
const queryParams = step?.queryParams;
|
|
322
|
-
if (queryParams &&
|
|
329
|
+
if (queryParams &&
|
|
330
|
+
typeof queryParams === "object" &&
|
|
331
|
+
!Array.isArray(queryParams)) {
|
|
323
332
|
const fields = queryParams;
|
|
324
333
|
if (param in fields)
|
|
325
334
|
found.push(fields[param]);
|
|
@@ -333,7 +342,10 @@ const METHOD_PARAM = "method";
|
|
|
333
342
|
const PLACEHOLDER_SEGMENT = /^(?:\{(.+)\}|:(.+)|\[(.+)\])$/;
|
|
334
343
|
/** A step's path segments, with any query string dropped. */
|
|
335
344
|
function pathSegments(step) {
|
|
336
|
-
return String(step?.path ?? "")
|
|
345
|
+
return String(step?.path ?? "")
|
|
346
|
+
.split("?")[0]
|
|
347
|
+
.trim()
|
|
348
|
+
.split("/");
|
|
337
349
|
}
|
|
338
350
|
/** The parameter a placeholder segment names, or undefined for a literal one. */
|
|
339
351
|
function placeholderName(segment) {
|
|
@@ -345,7 +357,7 @@ function placeholderName(segment) {
|
|
|
345
357
|
/** Where `param` sits in a path, according to the steps that write it as a
|
|
346
358
|
* placeholder. Only the plan says this: no route template is inferred from a
|
|
347
359
|
* concrete path, so a plan whose steps are all concrete yields no slot and its
|
|
348
|
-
* path cases read as not sent. */
|
|
360
|
+
* path test cases read as not sent. */
|
|
349
361
|
function pathSlots(steps, param) {
|
|
350
362
|
const slots = [];
|
|
351
363
|
for (const step of steps) {
|
|
@@ -363,9 +375,9 @@ function pathSlots(steps, param) {
|
|
|
363
375
|
* parameter, so its inner name counts as a name for `param` as well. The plan is
|
|
364
376
|
* still the only source: the names come from what it declares, never from a
|
|
365
377
|
* concrete path. */
|
|
366
|
-
function pathSlotNames(
|
|
378
|
+
function pathSlotNames(testCases, param) {
|
|
367
379
|
const names = new Set([param]);
|
|
368
|
-
for (const declared of
|
|
380
|
+
for (const declared of testCases ?? []) {
|
|
369
381
|
if (String(declared?.param ?? "").trim() !== param)
|
|
370
382
|
continue;
|
|
371
383
|
if (declared?.expect !== "accept" || declared?.absent === true)
|
|
@@ -395,8 +407,8 @@ function soleSlots(steps) {
|
|
|
395
407
|
return slots;
|
|
396
408
|
}
|
|
397
409
|
/** Where `param` sits in a path, under any of the names it wears. */
|
|
398
|
-
function pathSlotsFor(steps,
|
|
399
|
-
const named = pathSlotNames(
|
|
410
|
+
function pathSlotsFor(steps, testCases, param) {
|
|
411
|
+
const named = pathSlotNames(testCases, param).flatMap((name) => pathSlots(steps, name));
|
|
400
412
|
return ID_PARAM.test(param) ? [...named, ...soleSlots(steps)] : named;
|
|
401
413
|
}
|
|
402
414
|
/** Whether a step carries `value` in the segment `param` occupies. Every other
|
|
@@ -417,7 +429,9 @@ function sendsInPath(step, slot, value) {
|
|
|
417
429
|
* used when the parameter has no slot at all: where the plan does say where the
|
|
418
430
|
* parameter sits, the slot rule stands. */
|
|
419
431
|
function sendsAsPathSegment(step, value) {
|
|
420
|
-
if (value === undefined ||
|
|
432
|
+
if (value === undefined ||
|
|
433
|
+
value === null ||
|
|
434
|
+
String(value).trim().length === 0)
|
|
421
435
|
return false;
|
|
422
436
|
return pathSegments(step).some((segment) => sameValue(segment.trim(), value));
|
|
423
437
|
}
|
|
@@ -440,18 +454,17 @@ function omittedBy(step, param) {
|
|
|
440
454
|
/** One declared case as the objection spells it.
|
|
441
455
|
*
|
|
442
456
|
* Exported: `expectedValueSourced` keys its objections on the same rendering, so
|
|
443
|
-
* two cases on one parameter are two objections there too. */
|
|
444
|
-
export function
|
|
457
|
+
* two test cases on one parameter are two objections there too. */
|
|
458
|
+
export function renderTestCase(declared) {
|
|
445
459
|
const param = String(declared.param).trim();
|
|
446
460
|
const sent = declared.absent === true ? "absent" : `=${JSON.stringify(declared.value)}`;
|
|
447
461
|
return `${param}${declared.absent === true ? " " : ""}${sent} (${declared.expect})`;
|
|
448
462
|
}
|
|
449
463
|
/** Whether a planned test cites one change by id. */
|
|
450
464
|
function citesChange(plannedTest, id) {
|
|
451
|
-
const declared = plannedTest
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
return declared.some((cited) => String(cited ?? "").trim() === id);
|
|
465
|
+
const declared = plannedTest.declarations.changes;
|
|
466
|
+
return (Array.isArray(declared) &&
|
|
467
|
+
declared.some((cited) => String(cited ?? "").trim() === id));
|
|
455
468
|
}
|
|
456
469
|
/** Every declared case needs a step of a citing test that sends it. The agent says
|
|
457
470
|
* what proves the change; the server reads whether the plan sends it. Nothing here
|
|
@@ -466,18 +479,18 @@ function citesChange(plannedTest, id) {
|
|
|
466
479
|
* parameter says nothing, so the omission has to be stated to be checked.
|
|
467
480
|
*
|
|
468
481
|
* A case names a query parameter, a body field, a path segment, or the verb. Run
|
|
469
|
-
* 34078857176 declared five cases the plan did send — two ids in a path segment,
|
|
482
|
+
* 34078857176 declared five test cases the plan did send — two ids in a path segment,
|
|
470
483
|
* two rejected methods — and drew an objection for each, because only the query
|
|
471
484
|
* string and the body were read. */
|
|
472
|
-
function
|
|
473
|
-
const changes =
|
|
474
|
-
const plannedTests = registration.plannedTests
|
|
485
|
+
function testCaseObjections(registration) {
|
|
486
|
+
const changes = registration.changes;
|
|
487
|
+
const plannedTests = registration.plannedTests;
|
|
475
488
|
const objections = [];
|
|
476
489
|
const seen = new Set();
|
|
477
490
|
for (const change of changes) {
|
|
478
|
-
const id = String(change
|
|
479
|
-
const
|
|
480
|
-
if (!id || !
|
|
491
|
+
const id = String(change.id ?? "").trim();
|
|
492
|
+
const testCases = change.testCases;
|
|
493
|
+
if (!id || !testCases || seen.has(id))
|
|
481
494
|
continue;
|
|
482
495
|
// A change nothing cites already draws `coverage:change:<id>`. A second
|
|
483
496
|
// objection about the same gap would need a second answer for one fix.
|
|
@@ -486,39 +499,42 @@ function caseObjections(registration) {
|
|
|
486
499
|
continue;
|
|
487
500
|
seen.add(id);
|
|
488
501
|
const citingSteps = citing.flatMap((plannedTest) => {
|
|
489
|
-
const steps = plannedTest
|
|
502
|
+
const steps = plannedTest.scenario.steps;
|
|
490
503
|
return Array.isArray(steps) ? steps : [];
|
|
491
504
|
});
|
|
492
505
|
const writesAnyPlaceholder = citingSteps.some((step) => pathSegments(step).some((segment) => placeholderName(segment) !== undefined));
|
|
493
|
-
const missing =
|
|
506
|
+
const missing = testCases.filter((declared) => {
|
|
494
507
|
const param = String(declared?.param ?? "").trim();
|
|
495
508
|
if (!param)
|
|
496
509
|
return false;
|
|
497
510
|
if (declared.absent === true)
|
|
498
511
|
return !citingSteps.some((step) => omittedBy(step, param));
|
|
499
|
-
const slots = pathSlotsFor(citingSteps,
|
|
512
|
+
const slots = pathSlotsFor(citingSteps, testCases, param);
|
|
500
513
|
const isMethod = param.toLowerCase() === METHOD_PARAM;
|
|
501
514
|
// Only for a plan that wrote NO template at all, and only for a parameter that
|
|
502
515
|
// names a record. Wider than that, the URL answered everything: a `quantity=5`
|
|
503
516
|
// case passed on `GET /api/v1/orders/5`.
|
|
504
|
-
const byValueInPath = slots.length === 0 &&
|
|
517
|
+
const byValueInPath = slots.length === 0 &&
|
|
518
|
+
!writesAnyPlaceholder &&
|
|
519
|
+
ID_PARAM.test(param) &&
|
|
520
|
+
!isMethod;
|
|
505
521
|
return !citingSteps.some((step) => valuesSent(step, param).some((sent) => sameValue(sent, declared.value)) ||
|
|
506
522
|
(isMethod && sendsAsMethod(step, declared.value)) ||
|
|
507
523
|
slots.some((slot) => sendsInPath(step, slot, declared.value)) ||
|
|
508
524
|
(byValueInPath && sendsAsPathSegment(step, declared.value)));
|
|
509
525
|
});
|
|
510
|
-
// One objection per case. A single objection listing three
|
|
526
|
+
// One objection per test case. A single objection listing three of them took one
|
|
511
527
|
// answer that addressed two of them and closed: run 34167252679 answered
|
|
512
528
|
// patch-highlight-guards for id="abc" and id=999999, and the third case, a
|
|
513
529
|
// second user's id no step ever sent, went with it. The id carries the
|
|
514
530
|
// rendered case, so it is the same string on the next registration whatever
|
|
515
|
-
// order the cases arrive in, and each one needs its own answer.
|
|
531
|
+
// order the test cases arrive in, and each one needs its own answer.
|
|
516
532
|
for (const declared of missing) {
|
|
517
|
-
const rendered =
|
|
533
|
+
const rendered = renderTestCase(declared);
|
|
518
534
|
objections.push({
|
|
519
|
-
objectionId: `coverage:
|
|
535
|
+
objectionId: `coverage:testCases:${id}:${rendered}`,
|
|
520
536
|
verifier: "coverage",
|
|
521
|
-
message: fillPlaceholders(COVERAGE_CONTRACT.objections.
|
|
537
|
+
message: fillPlaceholders(COVERAGE_CONTRACT.objections.testCases.message, { missing: rendered }),
|
|
522
538
|
evidence: `${citing.map((plannedTest) => plannedTest.plannedTestId).join(", ")} cite ${id}; no step of theirs sends ${rendered}.` +
|
|
523
539
|
// Which spelling WOULD have matched, or the agent re-sends the same plan.
|
|
524
540
|
// Id parameters only: it asked for `{quantity}` in a route otherwise.
|
|
@@ -526,7 +542,7 @@ function caseObjections(registration) {
|
|
|
526
542
|
citingSteps.some((step) => sendsAsPathSegment(step, declared.value))
|
|
527
543
|
? ` A step's path carries that value, in a segment this plan's own placeholders do not name \`${String(declared?.param ?? "").trim()}\`; write the route as a template, with \`{${String(declared?.param ?? "").trim()}}\` where it sits.`
|
|
528
544
|
: ""),
|
|
529
|
-
suggestion: COVERAGE_CONTRACT.objections.
|
|
545
|
+
suggestion: COVERAGE_CONTRACT.objections.testCases.suggestion,
|
|
530
546
|
});
|
|
531
547
|
}
|
|
532
548
|
}
|
|
@@ -550,11 +566,13 @@ function isPlaceholderValue(value) {
|
|
|
550
566
|
function paramsWithValuedReject(changes) {
|
|
551
567
|
const rejected = new Set();
|
|
552
568
|
for (const change of changes) {
|
|
553
|
-
const
|
|
554
|
-
if (!
|
|
569
|
+
const testCases = change.testCases;
|
|
570
|
+
if (!testCases)
|
|
555
571
|
continue;
|
|
556
|
-
for (const declared of
|
|
557
|
-
if (declared?.expect !== "reject" ||
|
|
572
|
+
for (const declared of testCases) {
|
|
573
|
+
if (declared?.expect !== "reject" ||
|
|
574
|
+
declared?.absent === true ||
|
|
575
|
+
declared?.value === undefined)
|
|
558
576
|
continue;
|
|
559
577
|
const param = String(declared?.param ?? "").trim();
|
|
560
578
|
if (param)
|
|
@@ -573,15 +591,15 @@ function paramsWithValuedReject(changes) {
|
|
|
573
591
|
* placeholder names a record an earlier step created, and the parameter is an id
|
|
574
592
|
* either by its name or because a citing test sends it as a path segment. */
|
|
575
593
|
function rejectObjections(registration) {
|
|
576
|
-
const changes =
|
|
577
|
-
const plannedTests = registration.plannedTests
|
|
594
|
+
const changes = registration.changes;
|
|
595
|
+
const plannedTests = registration.plannedTests;
|
|
578
596
|
const rejected = paramsWithValuedReject(changes);
|
|
579
597
|
const objections = [];
|
|
580
598
|
const seen = new Set();
|
|
581
599
|
for (const change of changes) {
|
|
582
|
-
const id = String(change
|
|
583
|
-
const
|
|
584
|
-
if (!id || !
|
|
600
|
+
const id = String(change.id ?? "").trim();
|
|
601
|
+
const testCases = change.testCases;
|
|
602
|
+
if (!id || !testCases || seen.has(id))
|
|
585
603
|
continue;
|
|
586
604
|
// A change nothing cites already draws `coverage:change:<id>`, as above.
|
|
587
605
|
const citing = plannedTests.filter((plannedTest) => citesChange(plannedTest, id));
|
|
@@ -589,10 +607,10 @@ function rejectObjections(registration) {
|
|
|
589
607
|
continue;
|
|
590
608
|
seen.add(id);
|
|
591
609
|
const citingSteps = citing.flatMap((plannedTest) => {
|
|
592
|
-
const steps = plannedTest
|
|
610
|
+
const steps = plannedTest.scenario.steps;
|
|
593
611
|
return Array.isArray(steps) ? steps : [];
|
|
594
612
|
});
|
|
595
|
-
const unsatisfied =
|
|
613
|
+
const unsatisfied = testCases.find((declared) => {
|
|
596
614
|
const param = String(declared?.param ?? "").trim();
|
|
597
615
|
if (!param || param.toLowerCase() === METHOD_PARAM)
|
|
598
616
|
return false;
|
|
@@ -600,7 +618,8 @@ function rejectObjections(registration) {
|
|
|
600
618
|
return false;
|
|
601
619
|
if (!isPlaceholderValue(declared?.value))
|
|
602
620
|
return false;
|
|
603
|
-
if (!ID_PARAM.test(param) &&
|
|
621
|
+
if (!ID_PARAM.test(param) &&
|
|
622
|
+
pathSlotsFor(citingSteps, testCases, param).length === 0)
|
|
604
623
|
return false;
|
|
605
624
|
return !rejected.has(param);
|
|
606
625
|
});
|
|
@@ -611,7 +630,10 @@ function rejectObjections(registration) {
|
|
|
611
630
|
objections.push({
|
|
612
631
|
objectionId: `coverage:reject:${id}`,
|
|
613
632
|
verifier: "coverage",
|
|
614
|
-
message: fillPlaceholders(COVERAGE_CONTRACT.objections.reject.message, {
|
|
633
|
+
message: fillPlaceholders(COVERAGE_CONTRACT.objections.reject.message, {
|
|
634
|
+
param,
|
|
635
|
+
value,
|
|
636
|
+
}),
|
|
615
637
|
evidence: `${id} declares ${param}=${value} (accept); no change in this plan declares a reject case on ${param} with a value.`,
|
|
616
638
|
suggestion: fillPlaceholders(COVERAGE_CONTRACT.objections.reject.suggestion, { param }),
|
|
617
639
|
});
|
|
@@ -622,15 +644,21 @@ function rejectObjections(registration) {
|
|
|
622
644
|
/** The test types that reach each surface. An `e2e` test drives the page AND the
|
|
623
645
|
* requests behind it, so it counts for both. */
|
|
624
646
|
const TEST_TYPES_FOR = {
|
|
625
|
-
api: {
|
|
647
|
+
api: {
|
|
648
|
+
types: new Set(["contract", "integration", "e2e"]),
|
|
649
|
+
kind: "contract, integration or e2e",
|
|
650
|
+
name: "API",
|
|
651
|
+
},
|
|
626
652
|
page: { types: new Set(["ui", "e2e"]), kind: "ui or e2e", name: "page" },
|
|
627
653
|
};
|
|
628
654
|
/** Every surface a change states, without repeats and without a name nothing maps. */
|
|
629
655
|
function declaredSurfaces(change) {
|
|
630
|
-
const named = change
|
|
656
|
+
const named = change.surfaces;
|
|
631
657
|
if (!Array.isArray(named))
|
|
632
658
|
return [];
|
|
633
|
-
return [
|
|
659
|
+
return [
|
|
660
|
+
...new Set(named.map((surface) => String(surface ?? "").trim())),
|
|
661
|
+
].filter((surface) => surface in TEST_TYPES_FOR);
|
|
634
662
|
}
|
|
635
663
|
/** A change on a page needs a test that opens the page, and a change on the API
|
|
636
664
|
* needs one that calls it. Run 34065056830 cited a page change from an API test
|
|
@@ -638,12 +666,12 @@ function declaredSurfaces(change) {
|
|
|
638
666
|
*
|
|
639
667
|
* Read off the PLAN alone, like the other two halves. */
|
|
640
668
|
function surfaceObjections(registration) {
|
|
641
|
-
const changes =
|
|
642
|
-
const plannedTests = registration.plannedTests
|
|
669
|
+
const changes = registration.changes;
|
|
670
|
+
const plannedTests = registration.plannedTests;
|
|
643
671
|
const objections = [];
|
|
644
672
|
const seen = new Set();
|
|
645
673
|
for (const change of changes) {
|
|
646
|
-
const id = String(change
|
|
674
|
+
const id = String(change.id ?? "").trim();
|
|
647
675
|
if (!id)
|
|
648
676
|
continue;
|
|
649
677
|
// A change nothing cites already draws `coverage:change:<id>`. A second
|
|
@@ -656,7 +684,7 @@ function surfaceObjections(registration) {
|
|
|
656
684
|
const objectionId = `coverage:surface:${id}:${surface}`;
|
|
657
685
|
if (seen.has(objectionId))
|
|
658
686
|
continue;
|
|
659
|
-
if (citing.some((plannedTest) => types.has(
|
|
687
|
+
if (citing.some((plannedTest) => types.has(plannedTest.scenario.testType.toLowerCase())))
|
|
660
688
|
continue;
|
|
661
689
|
seen.add(objectionId);
|
|
662
690
|
objections.push({
|
|
@@ -672,24 +700,50 @@ function surfaceObjections(registration) {
|
|
|
672
700
|
}
|
|
673
701
|
/** One repository's changed files, and the name to attribute uncovered ones to.
|
|
674
702
|
* Keying the objection id on the path alone let two repositories that each change
|
|
675
|
-
* `src/App.tsx` share one id
|
|
676
|
-
* ids, which is the id it produced before there was a second one. */
|
|
703
|
+
* `src/App.tsx` share one id, so every id names its repository. */
|
|
677
704
|
function repositoryPartitions(ctx) {
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
}
|
|
683
|
-
/**
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
705
|
+
return Object.entries(ctx.changedFiles ?? {}).map(([repository, changedFiles]) => ({
|
|
706
|
+
repository,
|
|
707
|
+
changedFiles: changedFiles ?? [],
|
|
708
|
+
}));
|
|
709
|
+
}
|
|
710
|
+
/** Which repositories changed each path, in normalised spelling. */
|
|
711
|
+
function changedIn(partitions) {
|
|
712
|
+
const owners = new Map();
|
|
713
|
+
for (const { repository, changedFiles } of partitions) {
|
|
714
|
+
if (!repository)
|
|
715
|
+
continue;
|
|
716
|
+
for (const entry of changedFiles) {
|
|
717
|
+
const path = normalizeCitedPath(entry.path);
|
|
718
|
+
if (!path)
|
|
719
|
+
continue;
|
|
720
|
+
if (!owners.has(path))
|
|
721
|
+
owners.set(path, new Set());
|
|
722
|
+
owners.get(path)?.add(repository);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
return owners;
|
|
726
|
+
}
|
|
727
|
+
/** The files some planned test cites that count for ONE repository of a
|
|
728
|
+
* multi-repository run. A cited path counts for the repository whose diff holds
|
|
729
|
+
* it, whatever repository the test names: a frontend test cites the backend route
|
|
730
|
+
* file its click reaches (run 34423191795 named the frontend and cited
|
|
731
|
+
* `routes/record.js`), and that covers the backend's change. Only when two
|
|
732
|
+
* repositories changed the same path does the test's own name decide, which the
|
|
733
|
+
* schema guarantees it carries. */
|
|
734
|
+
function citedFilesFor(plannedTests, repository, owners) {
|
|
735
|
+
const cited = new Set();
|
|
736
|
+
for (const plannedTest of plannedTests) {
|
|
737
|
+
const named = plannedTest.repository;
|
|
738
|
+
for (const path of citedPaths(plannedTest)) {
|
|
739
|
+
const repositories = owners.get(path);
|
|
740
|
+
if (!repositories?.has(repository))
|
|
741
|
+
continue;
|
|
742
|
+
if (repositories.size === 1 || named === repository)
|
|
743
|
+
cited.add(path);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return cited;
|
|
693
747
|
}
|
|
694
748
|
/** The completeness check, over three surfaces: every declared behaviour, every
|
|
695
749
|
* mutated route, and every changed file needs a test in the plan. More is
|
|
@@ -702,21 +756,25 @@ export const coverage = {
|
|
|
702
756
|
const objections = [
|
|
703
757
|
...claimObjections(registration, ctx),
|
|
704
758
|
...stateTestObjections(registration),
|
|
705
|
-
...
|
|
759
|
+
...testCaseObjections(registration),
|
|
706
760
|
...rejectObjections(registration),
|
|
707
761
|
...surfaceObjections(registration),
|
|
708
762
|
];
|
|
709
763
|
if (allChangedFiles(ctx).length === 0)
|
|
710
764
|
return objections;
|
|
711
765
|
const all = registration.plannedTests ?? [];
|
|
712
|
-
|
|
713
|
-
|
|
766
|
+
const partitions = repositoryPartitions(ctx);
|
|
767
|
+
const owners = changedIn(partitions);
|
|
768
|
+
for (const { repository, changedFiles } of partitions) {
|
|
769
|
+
const cited = repository
|
|
770
|
+
? citedFilesFor(all, repository, owners)
|
|
771
|
+
: citedFiles(all);
|
|
714
772
|
const seen = new Set();
|
|
715
773
|
for (const entry of changedFiles) {
|
|
716
774
|
// Compared in the normalised spelling the citations are reduced to. The
|
|
717
775
|
// objection quotes the path as `--name-status` gave it, which for a
|
|
718
776
|
// non-ASCII name is the unquoted form, not the escaped one the diff shows.
|
|
719
|
-
const file = entry
|
|
777
|
+
const file = entry.path ?? "";
|
|
720
778
|
const path = normalizeCitedPath(file);
|
|
721
779
|
if (!path || !couldBeProductCode(path) || seen.has(path))
|
|
722
780
|
continue;
|
|
@@ -724,12 +782,10 @@ export const coverage = {
|
|
|
724
782
|
if (cited.has(path))
|
|
725
783
|
continue;
|
|
726
784
|
objections.push({
|
|
727
|
-
objectionId: repository
|
|
728
|
-
? `coverage:${repository}/${file}`
|
|
729
|
-
: `coverage:${file}`,
|
|
785
|
+
objectionId: `coverage:${repository}/${file}`,
|
|
730
786
|
verifier: "coverage",
|
|
731
787
|
message: COVERAGE_CONTRACT.objections.file.message,
|
|
732
|
-
evidence: `${repository
|
|
788
|
+
evidence: `${repository} ${file}${entry.deleted ? " (removed by this change)" : ""}: no planned test cites it in changedFile, routes or screenEvidence.`,
|
|
733
789
|
suggestion: COVERAGE_CONTRACT.objections.file.suggestion,
|
|
734
790
|
});
|
|
735
791
|
}
|