@skyramp/mcp 0.4.1 → 0.4.2-rc.2
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/commands/localDevTestChangesCommand.js +2 -1
- package/build/commands/recommendTestsAndExecuteCommand.js +15 -7
- package/build/commands/testThisEndpointCommand.js +35 -6
- package/build/execution/wrapperConfig.d.ts +56 -0
- package/build/execution/wrapperConfig.js +155 -0
- package/build/index.js +40 -10
- package/build/playwright/blueprintDigest.js +28 -7
- package/build/playwright/registerPlaywrightTools.js +47 -28
- package/build/playwright/traceExportStore.d.ts +22 -0
- package/build/playwright/traceExportStore.js +81 -0
- package/build/playwright/traceRecordingPrompt.js +11 -3
- package/build/prompts/code-reuse.js +118 -49
- 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 +8 -23
- package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
- package/build/prompts/local-dev/local-dev-prompts.js +31 -4
- 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 +124 -2
- package/build/prompts/shared-helper-policy.js +178 -12
- package/build/prompts/startTraceCollectionPrompts.js +1 -1
- package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +7 -8
- 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 +6 -4
- 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.d.ts +16 -8
- package/build/prompts/test-maintenance/drift-analysis-prompt.js +93 -38
- 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 +8 -5
- package/build/prompts/test-recommendation/recommendationSections.js +19 -8
- package/build/prompts/test-recommendation/recommendationShared.d.ts +1 -1
- package/build/prompts/test-recommendation/recommendationShared.js +0 -1
- 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 +133 -63
- 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 +53 -9
- 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/runTestSkill.d.ts +6 -0
- package/build/skills/runTestSkill.js +17 -0
- 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 -1
- package/build/tools/auth/loginTool.js +3 -1
- package/build/tools/auth/logoutTool.js +3 -1
- package/build/tools/budgetExcuse.d.ts +15 -0
- package/build/tools/budgetExcuse.js +113 -0
- 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 +269 -30
- 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 +118 -48
- package/build/tools/executeSkyrampTestTool.js +998 -372
- 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/submitReportTool.d.ts +51 -12
- package/build/tools/submitReportTool.js +988 -161
- package/build/tools/test-management/actionsTool.js +241 -51
- package/build/tools/test-management/analyzeChangesTool.d.ts +8 -9
- package/build/tools/test-management/analyzeChangesTool.js +127 -68
- package/build/tools/test-management/analyzeTestHealthTool.d.ts +0 -11
- package/build/tools/test-management/analyzeTestHealthTool.js +42 -76
- 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/test-management/testsOwedBeforeRun.d.ts +28 -0
- package/build/tools/test-management/testsOwedBeforeRun.js +53 -0
- package/build/tools/trace/startTraceCollectionTool.js +3 -1
- package/build/tools/trace/stopTraceCollectionTool.js +42 -6
- 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/RepositoryAnalysis.d.ts +32 -72
- package/build/types/ReuseOutcome.d.ts +100 -7
- 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 +16 -0
- package/build/types/TestTypes.js +40 -3
- package/build/types/TestbotPromptOptions.d.ts +9 -1
- package/build/types/TestbotReport.d.ts +45 -9
- package/build/utils/AnalysisStateManager.d.ts +137 -34
- package/build/utils/AnalysisStateManager.js +228 -44
- 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/connectionErrors.d.ts +10 -0
- package/build/utils/connectionErrors.js +10 -0
- 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 +60 -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/progress.d.ts +1 -1
- package/build/utils/progress.js +1 -1
- package/build/utils/proxy-terminal.d.ts +19 -1
- package/build/utils/proxy-terminal.js +346 -21
- package/build/utils/rebaselineSnapshots.d.ts +1 -1
- package/build/utils/rebaselineSnapshots.js +6 -16
- 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.d.ts +10 -0
- package/build/utils/reuseRouting.js +21 -2
- package/build/utils/runContextGauge.d.ts +27 -0
- package/build/utils/runContextGauge.js +181 -0
- 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/skyrampMdContent.d.ts +1 -1
- package/build/utils/skyrampMdContent.js +1 -1
- package/build/utils/skyrampSdkVersion.d.ts +9 -0
- package/build/utils/skyrampSdkVersion.js +16 -0
- 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 +809 -0
- package/build/utils/testExecutionRecord.d.ts +94 -0
- package/build/utils/testExecutionRecord.js +269 -0
- package/build/utils/testFileClassification.d.ts +8 -0
- package/build/utils/testFileClassification.js +39 -4
- package/build/utils/trace-parser.js +62 -14
- package/build/utils/urlPath.js +3 -1
- package/build/utils/utils-verify/action-key.d.ts +46 -0
- package/build/utils/utils-verify/action-key.js +120 -38
- package/build/utils/utils-verify/action-sites.d.ts +32 -0
- package/build/utils/utils-verify/action-sites.js +202 -0
- 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 +333 -0
- package/build/utils/utils-verify/call-sites.d.ts +31 -7
- package/build/utils/utils-verify/call-sites.js +80 -13
- 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 +2 -0
- package/build/utils/utils-verify/index.js +2 -0
- package/build/utils/utils-verify/language-spec.d.ts +51 -10
- package/build/utils/utils-verify/language-spec.js +232 -21
- 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 +56 -7
- package/build/utils/utils-verify/parse.js +195 -40
- 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 +79 -3
- package/build/utils/utils-verify/verify.js +531 -61
- 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.d.ts +72 -52
- package/build/workspace/workspace.js +19 -15
- 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 +2 -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 +45 -50
- package/plugin/skills/run-test/SKILL.md +16 -0
- 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/adapters/jestAdapter.d.ts +0 -14
- package/build/adapters/jestAdapter.js +0 -113
- package/build/adapters/mochaAdapter.d.ts +0 -13
- package/build/adapters/mochaAdapter.js +0 -87
- package/build/adapters/playwrightAdapter.d.ts +0 -17
- package/build/adapters/playwrightAdapter.js +0 -182
- package/build/adapters/pytestAdapter.d.ts +0 -15
- package/build/adapters/pytestAdapter.js +0 -108
- 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/build/tools/runExistingTestsTool.d.ts +0 -138
- package/build/tools/runExistingTestsTool.js +0 -644
- package/build/types/ExternalTestExecution.d.ts +0 -67
- package/build/types/ExternalTestExecution.js +0 -8
- package/build/workspace/testSuites.d.ts +0 -20
- package/build/workspace/testSuites.js +0 -17
- package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
|
@@ -4,36 +4,48 @@ import * as path from "path";
|
|
|
4
4
|
import { TOOL_REGISTER_TEST_PLAN } from "../../toolNames.js";
|
|
5
5
|
import { logger } from "../../utils/logger.js";
|
|
6
6
|
import { canonicalJson, isPlainObject } from "../../utils/canonicalJson.js";
|
|
7
|
-
import { StateManager,
|
|
7
|
+
import { StateManager, resolveOwnRunStatePath, } from "../../utils/AnalysisStateManager.js";
|
|
8
8
|
import { toolError } from "../../utils/utils.js";
|
|
9
|
-
import {
|
|
10
|
-
import { changedFileNames, computeBranchDiff } from "../../utils/branchDiff.js";
|
|
11
|
-
import { LOCKFILE, NOT_SOURCE_DIR } from "../../recommendation/verifiers/endpointGrounded.js";
|
|
12
|
-
import { hasUITestTypeLabel, isHTTPStep } from "../../recommendation/subjectStep.js";
|
|
13
|
-
import { STEP_METHOD_DESCRIPTION, normalizeStepMethod, stepMethodSchema } from "../../types/StepMethod.js";
|
|
9
|
+
import { TESTBOT_SUPPORTED_TEST_TYPES } from "../../types/TestTypes.js";
|
|
10
|
+
import { changedFileNames, computeBranchDiff, } from "../../utils/branchDiff.js";
|
|
11
|
+
import { LOCKFILE, NOT_SOURCE_DIR, } from "../../recommendation/verifiers/endpointGrounded.js";
|
|
12
|
+
import { hasUITestTypeLabel, isHTTPStep, } from "../../recommendation/subjectStep.js";
|
|
13
|
+
import { STEP_METHOD_DESCRIPTION, isUiStepVerb, normalizeStepMethod, stepMethodSchema, } from "../../types/StepMethod.js";
|
|
14
14
|
import { registerPlan } from "../../recommendation/registerPlan.js";
|
|
15
15
|
import { targetElementSchema } from "../submitReportTool.js";
|
|
16
16
|
import { capturedBlueprintDigests } from "../../playwright/blueprintDigestStore.js";
|
|
17
17
|
import { pullRequestText } from "../../recommendation/pullRequestText.js";
|
|
18
18
|
import { fileExistsWithinRoot } from "../../utils/containedPath.js";
|
|
19
19
|
import { createScreenRouteResolver } from "../../utils/screenRoutes.js";
|
|
20
|
-
import { categoryMenu, SCENARIO_CATEGORIES } from "../../types/TestRecommendation.js";
|
|
20
|
+
import { categoryMenu, SCENARIO_CATEGORIES, } from "../../types/TestRecommendation.js";
|
|
21
21
|
const TOOL_NAME = TOOL_REGISTER_TEST_PLAN;
|
|
22
22
|
// ── Zod schema ──────────────────────────────────────────────────────────────
|
|
23
23
|
/** One sentence, shared by the step fields that carry a value and by the case
|
|
24
24
|
* that names one, so the two sides state the same convention. A plan that spells
|
|
25
25
|
* the same created value two different ways reads as a case no step sends. */
|
|
26
26
|
const CREATED_VALUE_PLACEHOLDER = "Write a value an earlier step creates as a placeholder in braces, and use the same name wherever else the test names it.";
|
|
27
|
-
const registerStepSchema = z
|
|
28
|
-
|
|
27
|
+
const registerStepSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
order: z
|
|
30
|
+
.number()
|
|
31
|
+
.int()
|
|
32
|
+
.positive()
|
|
33
|
+
.describe("This step's position in the scenario, from 1. `stepUnderTest` and `routes` name a step by this number."),
|
|
29
34
|
method: stepMethodSchema.describe(`${STEP_METHOD_DESCRIPTION} A \`ui\` or \`e2e\` step is a page interaction.`),
|
|
30
35
|
path: z
|
|
31
36
|
.string()
|
|
32
|
-
.refine((value) => value.trim().length > 0, {
|
|
37
|
+
.refine((value) => value.trim().length > 0, {
|
|
38
|
+
message: "path must not be blank",
|
|
39
|
+
})
|
|
33
40
|
.describe("Request path as the running service serves it, mount prefix included — `/ghost/api/admin/site/stats`, not the `/site/stats` the router file declares. For a page interaction, its target instead (`checkout button`); for an `OPERATION` step, the operation's name."),
|
|
34
|
-
description: z
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
description: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("What this step does, in one line."),
|
|
45
|
+
requestBody: z
|
|
46
|
+
.unknown()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe(`Request payload for this step, when it sends one. ${CREATED_VALUE_PLACEHOLDER}`),
|
|
37
49
|
queryParams: z
|
|
38
50
|
.unknown()
|
|
39
51
|
.optional()
|
|
@@ -43,7 +55,11 @@ const registerStepSchema = z.object({
|
|
|
43
55
|
.min(1)
|
|
44
56
|
.optional()
|
|
45
57
|
.describe("Parameters this step leaves out on purpose."),
|
|
46
|
-
expectedStatusCode: z
|
|
58
|
+
expectedStatusCode: z
|
|
59
|
+
.number()
|
|
60
|
+
.int()
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Status code this step expects."),
|
|
47
63
|
})
|
|
48
64
|
// A `navigate` step's path is the screen the runner opens, so it has to be a
|
|
49
65
|
// thing a browser can be pointed at. Runs have written "the login page" there,
|
|
@@ -53,7 +69,67 @@ const registerStepSchema = z.object({
|
|
|
53
69
|
return true;
|
|
54
70
|
const target = step.path.trim().toLowerCase();
|
|
55
71
|
return target.startsWith("/") || target.startsWith("http");
|
|
56
|
-
}, {
|
|
72
|
+
}, {
|
|
73
|
+
message: "a navigate step's path is a URL path such as /login",
|
|
74
|
+
path: ["path"],
|
|
75
|
+
})
|
|
76
|
+
// A page interaction sends no request, so these four describe one that is not
|
|
77
|
+
// there. Accepting them let a step read as an asserted response while the runner
|
|
78
|
+
// only clicked. `OPERATION` is untouched: it calls the app without an HTTP verb.
|
|
79
|
+
.superRefine((step, ctx) => {
|
|
80
|
+
if (!isUiStepVerb(step.method))
|
|
81
|
+
return;
|
|
82
|
+
for (const field of [
|
|
83
|
+
"requestBody",
|
|
84
|
+
"queryParams",
|
|
85
|
+
"omits",
|
|
86
|
+
"expectedStatusCode",
|
|
87
|
+
]) {
|
|
88
|
+
if (step[field] === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
ctx.addIssue({
|
|
91
|
+
code: z.ZodIssueCode.custom,
|
|
92
|
+
path: [field],
|
|
93
|
+
message: `\`${field}\` belongs to a step that sends a request; \`${step.method}\` is a page interaction, which sends none. Assert the page through \`declarations.elements\`, or write the request as its own step.`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
/** The `owner/repo` a plan entry names. The SHAPE is checked, not just "not blank":
|
|
98
|
+
* a run keys each repository by the slug read off its origin remote. */
|
|
99
|
+
function repositorySlugField(subject, purpose) {
|
|
100
|
+
return z
|
|
101
|
+
.string()
|
|
102
|
+
.trim()
|
|
103
|
+
.regex(/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/, {
|
|
104
|
+
message: `${subject}'s repository must be an \`owner/repo\` slug`,
|
|
105
|
+
})
|
|
106
|
+
.describe(`The github repository slug, \`owner/repo\`, ${purpose}.`);
|
|
107
|
+
}
|
|
108
|
+
/** The `changes` and `defects` id lists a plan entry cites, written once. The two
|
|
109
|
+
* copies drifted whenever either was edited. */
|
|
110
|
+
function citationFields({ changesSubject, defectsSubject, changesExtra = "", defectsExtra = "", }) {
|
|
111
|
+
const cite = (list, subject, extra) => `The ids of the declared ${list} this ${subject}, spelled as your own \`${list}\` list gives them.${extra}`;
|
|
112
|
+
return {
|
|
113
|
+
// BOTH required as returned. A planned test relaxes each with `.optional()`; a
|
|
114
|
+
// `maintains` entry states both, and either list may be empty.
|
|
115
|
+
changes: z
|
|
116
|
+
.array(z.string())
|
|
117
|
+
.describe(cite("changes", changesSubject, changesExtra)),
|
|
118
|
+
defects: z
|
|
119
|
+
.array(z.string())
|
|
120
|
+
.describe(cite("defects", defectsSubject, defectsExtra)),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const maintainedCitations = citationFields({
|
|
124
|
+
changesSubject: "maintenance covers",
|
|
125
|
+
defectsSubject: "maintained test proves",
|
|
126
|
+
});
|
|
127
|
+
const plannedTestCitations = citationFields({
|
|
128
|
+
changesSubject: "test proves",
|
|
129
|
+
defectsSubject: "test proves",
|
|
130
|
+
changesExtra: " This test proves one behaviour: list the id of every change that the behaviour covers. The server checks that each declared change has a planned test that cites it, or an answer. The server does not check that the test exercises the change. CHECKED on a `requirement_conflict` test: at least one cited change must have been read from the pull request or a requirements file, never only from the diff.",
|
|
131
|
+
defectsExtra: " The server checks that each declared defect has a planned test that cites it and expects to fail, or a blocker naming what stopped the test. The server does not check that the test reaches the defect. CHECKED on a `requirement_conflict` test: it must cite at least one defect.",
|
|
132
|
+
});
|
|
57
133
|
// The fields `declarations` accepts. Named on its own so one list of them can be
|
|
58
134
|
// derived from it — a hand-written second copy had already fallen behind.
|
|
59
135
|
export const declarationFieldsSchema = z.object({
|
|
@@ -61,17 +137,12 @@ export const declarationFieldsSchema = z.object({
|
|
|
61
137
|
.string()
|
|
62
138
|
.optional()
|
|
63
139
|
.describe("The changed file this test is about, repository-relative and spelled as the diff spells it — `src/routes/orders.ts`, not `./src/routes/orders.ts`. Checked: the name is one this pull request changed. Not checked: which line, so name the changed line in `description`."),
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
defects:
|
|
69
|
-
|
|
70
|
-
.optional()
|
|
71
|
-
.describe("The ids of the defects that this test proves. Take the ids from your `defects` list. The server checks that each declared defect has a planned test that cites it and expects to fail, or a blocker naming what stopped the test. The server does not check that the test reaches the defect. CHECKED on a `requirement_conflict` test: it must cite at least one defect."),
|
|
72
|
-
asserts: z
|
|
73
|
-
.string()
|
|
74
|
-
.describe("What this test checks."),
|
|
140
|
+
// A planned test may cite no change and no defect. A `maintains` entry always
|
|
141
|
+
// states `changes`, and the list may be EMPTY: an entry that only proves defects
|
|
142
|
+
// covers no change.
|
|
143
|
+
changes: plannedTestCitations.changes.optional(),
|
|
144
|
+
defects: plannedTestCitations.defects.optional(),
|
|
145
|
+
asserts: z.string().describe("What this test checks."),
|
|
75
146
|
stepUnderTest: z
|
|
76
147
|
.number()
|
|
77
148
|
.int()
|
|
@@ -89,17 +160,27 @@ export const declarationFieldsSchema = z.object({
|
|
|
89
160
|
.strict()
|
|
90
161
|
.describe("What this test does against the app as it stands, and why."),
|
|
91
162
|
differsFrom: z
|
|
92
|
-
.array(z
|
|
93
|
-
|
|
163
|
+
.array(z
|
|
164
|
+
.object({
|
|
165
|
+
plannedTestId: z
|
|
166
|
+
.string()
|
|
167
|
+
.describe("The other planned test this one is distinct from, named by its `scenarioName`."),
|
|
94
168
|
difference: z.string().describe("How the two differ."),
|
|
95
|
-
})
|
|
169
|
+
})
|
|
170
|
+
.strict())
|
|
96
171
|
.optional()
|
|
97
172
|
.describe("For another planned test in THIS plan whose subject step calls the same method and path, what this one asserts that it does not."),
|
|
98
173
|
existingTests: z
|
|
99
|
-
.array(z
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
174
|
+
.array(z
|
|
175
|
+
.object({
|
|
176
|
+
file: z
|
|
177
|
+
.string()
|
|
178
|
+
.describe("Repository-relative path of an existing test you read that exercises this change."),
|
|
179
|
+
differsBy: z
|
|
180
|
+
.string()
|
|
181
|
+
.describe("What this planned test checks that the existing test does not."),
|
|
182
|
+
})
|
|
183
|
+
.strict())
|
|
103
184
|
.optional()
|
|
104
185
|
.describe("The existing tests you read on this change. Naming none is an answer. Checked: each file named is in the checkout. Not checked: what the file contains."),
|
|
105
186
|
startState: z
|
|
@@ -107,15 +188,24 @@ export const declarationFieldsSchema = z.object({
|
|
|
107
188
|
.optional()
|
|
108
189
|
.describe("The state the record this test mutates is in when the mutation runs, in one sentence. A record with no rows yet is a state. The test puts the record in that state itself. Checked: present. Not checked: the sentence."),
|
|
109
190
|
routes: z
|
|
110
|
-
.array(z
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
191
|
+
.array(z
|
|
192
|
+
.object({
|
|
193
|
+
step: z
|
|
194
|
+
.number()
|
|
195
|
+
.int()
|
|
196
|
+
.describe("The `order` of the step this file declares."),
|
|
197
|
+
file: z
|
|
198
|
+
.string()
|
|
199
|
+
.describe("Repository-relative path of the file that declares what that step calls."),
|
|
200
|
+
})
|
|
201
|
+
.strict())
|
|
114
202
|
.optional()
|
|
115
203
|
.describe("One entry per step that calls the app, naming the repository file that declares what it calls. Checked: the file is in the checkout. Not checked: whether the route appears in it — frameworks build paths from scopes and prefixes, so it often does not."),
|
|
116
204
|
screenEvidence: z
|
|
117
205
|
.object({
|
|
118
|
-
file: z
|
|
206
|
+
file: z
|
|
207
|
+
.string()
|
|
208
|
+
.describe("Repository-relative path of the changed file that renders this screen."),
|
|
119
209
|
})
|
|
120
210
|
.strict()
|
|
121
211
|
.optional()
|
|
@@ -147,7 +237,11 @@ const declarationsSchema = declarationFieldsSchema
|
|
|
147
237
|
if (!Array.isArray(items))
|
|
148
238
|
return;
|
|
149
239
|
items.forEach((element, index) => {
|
|
150
|
-
const identifies = [
|
|
240
|
+
const identifies = [
|
|
241
|
+
element.accessibleName,
|
|
242
|
+
element.testId,
|
|
243
|
+
element.stableId,
|
|
244
|
+
].some((value) => typeof value === "string" && value.trim().length > 0);
|
|
151
245
|
if (identifies)
|
|
152
246
|
return;
|
|
153
247
|
ctx.addIssue({
|
|
@@ -157,8 +251,6 @@ const declarationsSchema = declarationFieldsSchema
|
|
|
157
251
|
});
|
|
158
252
|
});
|
|
159
253
|
});
|
|
160
|
-
// A plan drafts only these four; `TestType`'s others are maintenance outcomes.
|
|
161
|
-
const PLAN_TEST_TYPES = [TestType.CONTRACT, TestType.INTEGRATION, TestType.E2E, TestType.UI];
|
|
162
254
|
/** Whether an `elements.pageUrl` names a screen `uiElementGrounded` can look up: a
|
|
163
255
|
* route path or an absolute http URL. Constrained here and never on the shared
|
|
164
256
|
* `pageContextSchema`, which the report fills from a capture carrying any url. */
|
|
@@ -189,7 +281,9 @@ export function hoistDeclarationFields(value) {
|
|
|
189
281
|
if (value.declarations !== undefined && !isPlainObject(value.declarations))
|
|
190
282
|
return value;
|
|
191
283
|
const plannedTest = { ...value };
|
|
192
|
-
const original = isPlainObject(plannedTest.declarations)
|
|
284
|
+
const original = isPlainObject(plannedTest.declarations)
|
|
285
|
+
? plannedTest.declarations
|
|
286
|
+
: undefined;
|
|
193
287
|
const declarations = { ...(original ?? {}) };
|
|
194
288
|
let hoisted = false;
|
|
195
289
|
for (const field of DECLARATION_FIELDS) {
|
|
@@ -211,21 +305,23 @@ export function hoistDeclarationFields(value) {
|
|
|
211
305
|
plannedTest.declarations = declarations;
|
|
212
306
|
return plannedTest;
|
|
213
307
|
}
|
|
214
|
-
const registerPlannedTestSchema = z.preprocess(hoistDeclarationFields, z
|
|
308
|
+
const registerPlannedTestSchema = z.preprocess(hoistDeclarationFields, z
|
|
309
|
+
.object({
|
|
215
310
|
scenarioName: z
|
|
216
311
|
.string()
|
|
217
|
-
.refine((value) => value.trim().length > 0, {
|
|
312
|
+
.refine((value) => value.trim().length > 0, {
|
|
313
|
+
message: "scenarioName must not be blank",
|
|
314
|
+
})
|
|
218
315
|
.describe("Short name for this test, and its id: objections name it, `differsFrom` refers to it, and the report joins delivered tests on it. Keep it stable across registrations."),
|
|
219
|
-
repository:
|
|
316
|
+
repository: repositorySlugField("a planned test", "which has the change this test is targeting"),
|
|
317
|
+
description: z
|
|
220
318
|
.string()
|
|
221
|
-
.
|
|
222
|
-
.describe("On a multi-repo run, the `owner/repo` this test is for — the same value you passed to `skyramp_analyze_changes`."),
|
|
223
|
-
description: z.string().describe("What this test does, in one or two lines."),
|
|
319
|
+
.describe("What this test does, in one or two lines."),
|
|
224
320
|
category: z
|
|
225
321
|
.enum(SCENARIO_CATEGORIES)
|
|
226
322
|
.describe(`What kind of test this is. Write one of:\n${categoryMenu()}`),
|
|
227
323
|
testType: z
|
|
228
|
-
.enum(
|
|
324
|
+
.enum(TESTBOT_SUPPORTED_TEST_TYPES)
|
|
229
325
|
.describe("contract, integration, e2e or ui."),
|
|
230
326
|
steps: z
|
|
231
327
|
.array(registerStepSchema)
|
|
@@ -275,9 +371,11 @@ const registerPlannedTestSchema = z.preprocess(hoistDeclarationFields, z.object(
|
|
|
275
371
|
const registerTestPlanSchema = {
|
|
276
372
|
stateFile: z
|
|
277
373
|
.string()
|
|
278
|
-
.refine((p) => path.isAbsolute(p), {
|
|
374
|
+
.refine((p) => path.isAbsolute(p), {
|
|
375
|
+
message: "stateFile must be an absolute path",
|
|
376
|
+
})
|
|
279
377
|
.optional()
|
|
280
|
-
.describe("Optional
|
|
378
|
+
.describe("Optional, and a Testbot run leaves it out: the run finds its own state file. A path is accepted only when it names that same file — one from another run holds another run's analysis and plan, and the call is refused."),
|
|
281
379
|
// `.default([])`, where `plannedTests` is required: an empty list here cannot pass
|
|
282
380
|
// in silence the way an empty planned test list did. It raises `coverage:noChanges`,
|
|
283
381
|
// which is exactly the objection a plan that states no change should draw.
|
|
@@ -286,9 +384,13 @@ const registerTestPlanSchema = {
|
|
|
286
384
|
.object({
|
|
287
385
|
id: z
|
|
288
386
|
.string()
|
|
289
|
-
.refine((value) => value.trim().length > 0, {
|
|
387
|
+
.refine((value) => value.trim().length > 0, {
|
|
388
|
+
message: "a change id must not be blank",
|
|
389
|
+
})
|
|
290
390
|
.describe("Short slug for this change. A planned test cites it by this id."),
|
|
291
|
-
text: z
|
|
391
|
+
text: z
|
|
392
|
+
.string()
|
|
393
|
+
.describe("The change in one sentence, as the pull request must make it."),
|
|
292
394
|
quote: z
|
|
293
395
|
.string()
|
|
294
396
|
.optional()
|
|
@@ -303,7 +405,7 @@ const registerTestPlanSchema = {
|
|
|
303
405
|
.array(z.enum(["api", "page"]))
|
|
304
406
|
.min(1)
|
|
305
407
|
.describe("Where a user or caller meets this change: `api` for a request and response, `page` for something rendered, both when both."),
|
|
306
|
-
|
|
408
|
+
testCases: z
|
|
307
409
|
.array(z
|
|
308
410
|
.object({
|
|
309
411
|
param: z.string().describe("The parameter this case sets."),
|
|
@@ -311,7 +413,10 @@ const registerTestPlanSchema = {
|
|
|
311
413
|
.union([z.string(), z.number(), z.boolean(), z.null()])
|
|
312
414
|
.optional()
|
|
313
415
|
.describe(`The value a test sends for that parameter. ${CREATED_VALUE_PLACEHOLDER}`),
|
|
314
|
-
absent: z
|
|
416
|
+
absent: z
|
|
417
|
+
.literal(true)
|
|
418
|
+
.optional()
|
|
419
|
+
.describe("The parameter is left out of the request."),
|
|
315
420
|
expect: z
|
|
316
421
|
.enum(["accept", "reject"])
|
|
317
422
|
.describe("Whether the route must accept this value or reject it."),
|
|
@@ -337,11 +442,14 @@ const registerTestPlanSchema = {
|
|
|
337
442
|
})
|
|
338
443
|
// The description called them alternatives and the schema took both,
|
|
339
444
|
// which left generation told to pin a number AND to compute it.
|
|
340
|
-
.refine((entry) => entry.expectedValue === undefined ||
|
|
445
|
+
.refine((entry) => entry.expectedValue === undefined ||
|
|
446
|
+
String(entry.derived ?? "").trim().length === 0, {
|
|
341
447
|
message: "a case states either `expectedValue` or `derived`, never both: `derived` is the case saying no source writes the value",
|
|
342
448
|
path: ["derived"],
|
|
343
449
|
}))
|
|
344
|
-
.min(1, {
|
|
450
|
+
.min(1, {
|
|
451
|
+
message: "a `testCases` list with no entry states no input — leave it out instead",
|
|
452
|
+
})
|
|
345
453
|
.optional()
|
|
346
454
|
.describe("The inputs that prove this change: for each parameter the change constrains, the values the route must accept and the values it must reject. A range gives the last accepted value and the first rejected one at each end; a set gives each allowed value and one outside it; a required field gives the field left out. A case names a query parameter, a body field, a path segment, or `method` for the HTTP verb; the steps of the test that cites this change say which route it is, and a rejection that depends on who calls belongs in the change text instead."),
|
|
347
455
|
})
|
|
@@ -373,10 +481,19 @@ const registerTestPlanSchema = {
|
|
|
373
481
|
.object({
|
|
374
482
|
id: z
|
|
375
483
|
.string()
|
|
376
|
-
.refine((value) => value.trim().length > 0, {
|
|
484
|
+
.refine((value) => value.trim().length > 0, {
|
|
485
|
+
message: "a defect id must not be blank",
|
|
486
|
+
})
|
|
377
487
|
.describe("Short id for this defect, such as `D1`. A planned test cites it by this id, and the report's `issuesFound` entry names it as `defectId`."),
|
|
378
|
-
file: z
|
|
379
|
-
|
|
488
|
+
file: z
|
|
489
|
+
.string()
|
|
490
|
+
.describe("Repository-relative path of the file that holds the defect, spelled as the diff spells it."),
|
|
491
|
+
line: z
|
|
492
|
+
.number()
|
|
493
|
+
.int()
|
|
494
|
+
.positive()
|
|
495
|
+
.optional()
|
|
496
|
+
.describe("1-based line of the wrong statement. Advisory; nothing checks it."),
|
|
380
497
|
description: z.string().describe("What is wrong, in one line."),
|
|
381
498
|
severity: z
|
|
382
499
|
.enum(["critical", "high", "medium", "low"])
|
|
@@ -402,7 +519,7 @@ const registerTestPlanSchema = {
|
|
|
402
519
|
});
|
|
403
520
|
})
|
|
404
521
|
.default([])
|
|
405
|
-
.describe("The defects your code review found in the code that serves each change, whether or not the diff contains the line. Every defect
|
|
522
|
+
.describe("The defects your code review found in the code that serves each change, whether or not the diff contains the line. Every defect closes one of three ways: a planned test that cites it in `defects` and expects to fail, a `maintains` entry that cites it because your edit to an existing test covers it, or a blocker naming what stopped the test. A pre-existing defect in a file this pull request touches belongs on this list. An empty list says the review found none; the check asks you to confirm that in one line. A requirement conflict is a defect: list it here, and the `requirement_conflict` test cites it."),
|
|
406
523
|
// REQUIRED, not `.default([])`. The MCP SDK wraps this shape in a plain
|
|
407
524
|
// `z.object`, which STRIPS an undeclared top-level key, so with a default
|
|
408
525
|
// `planned test:` for `planned tests:` stored an EMPTY plan and counted the
|
|
@@ -437,26 +554,34 @@ const registerTestPlanSchema = {
|
|
|
437
554
|
maintains: z
|
|
438
555
|
.array(z
|
|
439
556
|
.object({
|
|
557
|
+
repository: repositorySlugField("a maintenance entry", "which holds the test this run edits"),
|
|
440
558
|
file: z
|
|
441
559
|
.string()
|
|
442
|
-
.describe("Repository-relative path of the existing test this run edits. It has to resolve in the
|
|
443
|
-
differsBy: z
|
|
444
|
-
|
|
445
|
-
.
|
|
446
|
-
|
|
560
|
+
.describe("Repository-relative path of the existing test this run edits. It has to resolve in the repository named above: a change is credited as covered only when it does, and `existingCoverage` objects when it does not."),
|
|
561
|
+
differsBy: z
|
|
562
|
+
.string()
|
|
563
|
+
.describe("What your edit changes in that test, in one sentence."),
|
|
564
|
+
changes: maintainedCitations.changes,
|
|
565
|
+
defects: maintainedCitations.defects,
|
|
447
566
|
})
|
|
448
567
|
.strict())
|
|
449
568
|
.optional()
|
|
450
|
-
.describe("Existing tests this run edits instead of planning new ones. Coverage counts the changes these cite, so a change already covered by a spec you are updating needs no planned test — and a duplicate spec beside the one you edited is the mistake. Declare maintenance here even when the plan holds no planned tests at all: a maintenance-only plan is a complete plan."),
|
|
569
|
+
.describe("Existing tests this run edits instead of planning new ones. Coverage counts the changes these cite, and the defect check counts the defects they cite, so a change or a defect already covered by a spec you are updating needs no planned test — and a duplicate spec beside the one you edited is the mistake. Declare maintenance here even when the plan holds no planned tests at all: a maintenance-only plan is a complete plan."),
|
|
451
570
|
answers: z
|
|
452
|
-
.array(z
|
|
453
|
-
|
|
454
|
-
|
|
571
|
+
.array(z
|
|
572
|
+
.object({
|
|
573
|
+
objectionId: z
|
|
574
|
+
.string()
|
|
575
|
+
.describe("The objection's id, exactly as this tool reported it. Answers are matched by id, never by position."),
|
|
576
|
+
answer: z
|
|
577
|
+
.string()
|
|
578
|
+
.describe("Why the objection does not apply, or what you decided instead."),
|
|
455
579
|
blocker: z
|
|
456
580
|
.string()
|
|
457
581
|
.optional()
|
|
458
582
|
.describe("What stopped this run from writing the test: a service that is not running, a paired branch that no longer exists, the one credential the run holds. An objection about a change or a defect with no test closes only with this. A reason the change is not worth testing is not a blocker."),
|
|
459
|
-
})
|
|
583
|
+
})
|
|
584
|
+
.strict())
|
|
460
585
|
.default([])
|
|
461
586
|
.describe("One answer per objection from your previous registration that you do not intend to fix. There is no registration limit."),
|
|
462
587
|
};
|
|
@@ -487,14 +612,18 @@ export function buildRegistration(params, registrationNumber) {
|
|
|
487
612
|
// TRIMMED: the report side joins on `plannedTestId.trim()`.
|
|
488
613
|
plannedTestId: input.scenarioName.trim(),
|
|
489
614
|
scenario,
|
|
490
|
-
|
|
615
|
+
repository: input.repository,
|
|
491
616
|
// Passed through, never rebuilt field by field: a field the schema accepts
|
|
492
617
|
// and this function forgot to copy was dead once. Absent stays absent, so
|
|
493
618
|
// a field the agent did not write reads back as missing, not as a default
|
|
494
619
|
// the checks would then judge. `elements: null` is the model's "not
|
|
495
620
|
// applicable" habit and is dropped; `elements.items: null` MEANS capture
|
|
496
621
|
// failed and is kept.
|
|
497
|
-
declarations: {
|
|
622
|
+
declarations: {
|
|
623
|
+
...rest,
|
|
624
|
+
asserts: declared?.asserts ?? "",
|
|
625
|
+
...(elements ? { elements } : {}),
|
|
626
|
+
},
|
|
498
627
|
};
|
|
499
628
|
}),
|
|
500
629
|
};
|
|
@@ -504,7 +633,11 @@ function repoSections(state) {
|
|
|
504
633
|
if (!state)
|
|
505
634
|
return [];
|
|
506
635
|
return [
|
|
507
|
-
{
|
|
636
|
+
{
|
|
637
|
+
repo: state.metadata.repository,
|
|
638
|
+
repositoryPath: state.metadata?.repositoryPath,
|
|
639
|
+
data: state,
|
|
640
|
+
},
|
|
508
641
|
...Object.entries(state.relatedRepos ?? {}).map(([repo, section]) => ({
|
|
509
642
|
repo,
|
|
510
643
|
repositoryPath: section?.repositoryPath,
|
|
@@ -526,61 +659,61 @@ function repoSections(state) {
|
|
|
526
659
|
* case-sensitive one, so that is the answer a real run gets.
|
|
527
660
|
*/
|
|
528
661
|
export function makeCitedFileCheck(state) {
|
|
529
|
-
|
|
662
|
+
// Keyed by `owner/repo`, like `makeScreenRouteResolver`: two repositories can hold
|
|
663
|
+
// the same relative path.
|
|
664
|
+
const rootsByRepo = new Map();
|
|
530
665
|
for (const section of repoSections(state)) {
|
|
531
666
|
// The literal "unknown" means unresolved; resolving against it would read
|
|
532
667
|
// the process working directory instead of a checkout.
|
|
533
668
|
if (!section.repositoryPath || section.repositoryPath === "unknown")
|
|
534
669
|
continue;
|
|
535
670
|
try {
|
|
536
|
-
|
|
537
|
-
if (!roots.includes(real))
|
|
538
|
-
roots.push(real);
|
|
671
|
+
rootsByRepo.set(section.repo, fs.realpathSync(section.repositoryPath));
|
|
539
672
|
}
|
|
540
673
|
catch {
|
|
541
674
|
// A repository path that no longer resolves holds no readable file.
|
|
542
675
|
}
|
|
543
676
|
}
|
|
544
|
-
return (relativePath) => {
|
|
677
|
+
return (relativePath, repository) => {
|
|
545
678
|
if (typeof relativePath !== "string")
|
|
546
679
|
return false;
|
|
547
680
|
const cited = relativePath.trim();
|
|
548
681
|
if (!cited)
|
|
549
682
|
return false;
|
|
550
|
-
|
|
683
|
+
const named = String(repository ?? "").trim();
|
|
684
|
+
if (named) {
|
|
685
|
+
const root = rootsByRepo.get(named);
|
|
686
|
+
return root !== undefined && fileExistsWithinRoot(root, cited);
|
|
687
|
+
}
|
|
688
|
+
return [...new Set(rootsByRepo.values())].some((root) => fileExistsWithinRoot(root, cited));
|
|
551
689
|
};
|
|
552
690
|
}
|
|
553
691
|
/**
|
|
554
692
|
* The route patterns that render a changed frontend file, across every repository
|
|
555
693
|
* of the run.
|
|
556
694
|
*
|
|
557
|
-
*
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
* ten UI tests reads a repository once.
|
|
695
|
+
* One resolver per checkout, keyed by repository, and only the named repository is
|
|
696
|
+
* asked. The scan is lazy inside each resolver and reused across planned tests, so
|
|
697
|
+
* a plan with ten UI tests reads a repository once.
|
|
561
698
|
*
|
|
562
|
-
*
|
|
563
|
-
*
|
|
564
|
-
*
|
|
565
|
-
*
|
|
699
|
+
* KEYED, not asked in turn, for the reason {@link changedFilesFor} is: two
|
|
700
|
+
* repositories can hold the same relative file, and answering from whichever was
|
|
701
|
+
* scanned first checked a planned test against another repository's routes.
|
|
702
|
+
*
|
|
703
|
+
* A repository this run does not know answers `undefined`, so the check stays
|
|
704
|
+
* silent — `changedFile:unknownRepository` is what objects to the name. There is no
|
|
705
|
+
* fallback for a single-repository run: every run keys its repositories by the
|
|
706
|
+
* `owner/repo` read off the origin remote, so the name is always matchable.
|
|
566
707
|
*/
|
|
567
708
|
export function makeScreenRouteResolver(state) {
|
|
568
|
-
const resolvers = repoSections(state)
|
|
709
|
+
const resolvers = new Map(repoSections(state)
|
|
569
710
|
.filter((section) => section.repositoryPath && section.repositoryPath !== "unknown")
|
|
570
|
-
.map((section) =>
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
continue;
|
|
577
|
-
// A non-empty answer is a fact about a real mount; an empty one is only the
|
|
578
|
-
// answer when no repository found a mount at all.
|
|
579
|
-
if (routes.length > 0)
|
|
580
|
-
return routes;
|
|
581
|
-
unmounted = routes;
|
|
582
|
-
}
|
|
583
|
-
return unmounted;
|
|
711
|
+
.map((section) => [
|
|
712
|
+
section.repo,
|
|
713
|
+
createScreenRouteResolver(section.repositoryPath),
|
|
714
|
+
]));
|
|
715
|
+
return (relativePath, repository) => {
|
|
716
|
+
return resolvers.get(String(repository ?? "").trim())?.(relativePath);
|
|
584
717
|
};
|
|
585
718
|
}
|
|
586
719
|
/** Which files each repository's branch diff changed. NAMES ONLY, never persisted.
|
|
@@ -620,12 +753,13 @@ function recordedPullRequest() {
|
|
|
620
753
|
export async function buildVerifyContext(state) {
|
|
621
754
|
const sections = repoSections(state);
|
|
622
755
|
const listings = await Promise.all(sections.map((section) => changedFilesForVerification(section)));
|
|
623
|
-
// Per repository, so a planned test
|
|
624
|
-
//
|
|
625
|
-
// single-repository run.
|
|
756
|
+
// Per repository, so a planned test is checked against the one it names. Every
|
|
757
|
+
// planned test names one; a single-repository run names that one repository.
|
|
626
758
|
return {
|
|
627
759
|
changedFiles: Object.fromEntries(sections.map((section, i) => [section.repo, listings[i] ?? []])),
|
|
628
|
-
reposWithoutDiff: sections
|
|
760
|
+
reposWithoutDiff: sections
|
|
761
|
+
.filter((_s, i) => !listings[i]?.length)
|
|
762
|
+
.map((s) => s.repo),
|
|
629
763
|
// From the process, not the state file: the browser tools and this one are
|
|
630
764
|
// registered on the same server, so captures and reader share a process.
|
|
631
765
|
uiCaptures: capturedBlueprintDigests(),
|
|
@@ -721,7 +855,7 @@ export function registerRegisterTestPlanTool(server) {
|
|
|
721
855
|
description: "Register your complete test plan for this run, with the changes that make each planned test checkable. " +
|
|
722
856
|
"The planning procedure in your prompt says how to decide and declare the plan. " +
|
|
723
857
|
"Every registration the schema accepts is stored, and no check ever refuses one. " +
|
|
724
|
-
"The schema refuses the whole call
|
|
858
|
+
"The schema refuses the whole call, and names the field and the rule that refused it. " +
|
|
725
859
|
"An undeclared key is refused by name on a planned test and on `declarations`, so a declaration written one level too high is corrected rather than dropped in silence. " +
|
|
726
860
|
"Checks run against the stored plan and return objections. Fix one and register it again as often as you like, or answer it by id through `answers`. " +
|
|
727
861
|
"There is no fallback plan: if you never register, this run has no plan.",
|
|
@@ -729,7 +863,9 @@ export function registerRegisterTestPlanTool(server) {
|
|
|
729
863
|
}, async (params) => {
|
|
730
864
|
// The run's own state file, unless the agent named one. Outside a run there
|
|
731
865
|
// is no path to fall back to, and no analysis to check a plan against.
|
|
732
|
-
const stateFile =
|
|
866
|
+
const { path: stateFile, refusal } = resolveOwnRunStatePath(params.stateFile);
|
|
867
|
+
if (refusal)
|
|
868
|
+
return toolError(refusal);
|
|
733
869
|
if (!stateFile) {
|
|
734
870
|
return toolError("This run has no state file. Call skyramp_analyze_changes first — it writes the state file this plan is checked against.");
|
|
735
871
|
}
|
|
@@ -749,13 +885,21 @@ export function registerRegisterTestPlanTool(server) {
|
|
|
749
885
|
const result = registerPlan(registration, await buildVerifyContext(fullState), fullState.plan);
|
|
750
886
|
try {
|
|
751
887
|
const { metadata: _metadata, relatedRepos: _sections, ...rootData } = fullState;
|
|
752
|
-
await stateManager.
|
|
888
|
+
await stateManager.appendData({
|
|
889
|
+
...rootData,
|
|
890
|
+
plan: result.plan,
|
|
891
|
+
registrationCount: registrationNumber,
|
|
892
|
+
}, { step: TOOL_NAME });
|
|
753
893
|
}
|
|
754
894
|
catch (error) {
|
|
755
895
|
return toolError(`Failed to persist the test plan to the state file: ${error.message}. Retry this call.`);
|
|
756
896
|
}
|
|
757
897
|
logger.info(`${TOOL_NAME}: registration ${registrationNumber}, ${result.plan.plannedTests.length} planned test(s), ${result.objections.length} objection(s)`);
|
|
758
|
-
return {
|
|
898
|
+
return {
|
|
899
|
+
content: [
|
|
900
|
+
{ type: "text", text: renderPlanResult(result) },
|
|
901
|
+
],
|
|
902
|
+
};
|
|
759
903
|
}
|
|
760
904
|
catch (error) {
|
|
761
905
|
return toolError(`${TOOL_NAME} failed: ${error?.message ?? String(error)}`);
|