@skyramp/mcp 0.0.63 → 0.0.64-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/index.js +23 -6
- package/build/playwright/PlaywrightTraceService.js +74 -0
- package/build/playwright/index.js +3 -0
- package/build/playwright/registerPlaywrightTools.js +117 -0
- package/build/playwright/traceRecordingPrompt.js +54 -0
- package/build/prompts/startTraceCollectionPrompts.js +4 -2
- package/build/prompts/test-recommendation/recommendationSections.js +88 -212
- package/build/prompts/test-recommendation/test-recommendation-prompt.js +336 -85
- package/build/prompts/test-recommendation/test-recommendation-prompt.test.js +58 -15
- package/build/prompts/testGenerationPrompt.js +1 -1
- package/build/prompts/testbot/testbot-prompts.js +44 -22
- package/build/services/ModularizationService.js +1 -1
- package/build/services/TestExecutionService.js +1 -1
- package/build/services/TestGenerationService.js +8 -1
- package/build/services/TestGenerationService.test.js +11 -11
- package/build/tools/code-refactor/modularizationTool.js +50 -8
- package/build/tools/generate-tests/generateContractRestTool.js +125 -12
- package/build/tools/generate-tests/generateIntegrationRestTool.js +83 -1
- package/build/tools/generate-tests/generateUIRestTool.js +10 -2
- package/build/tools/submitReportTool.js +26 -7
- package/build/tools/submitReportTool.test.js +1 -1
- package/build/tools/test-management/analyzeChangesTool.js +9 -4
- package/build/tools/trace/startTraceCollectionTool.js +6 -9
- package/build/tools/trace/stopTraceCollectionTool.js +2 -2
- package/build/types/RepositoryAnalysis.js +3 -1
- package/build/utils/normalizeParams.js +45 -0
- package/build/utils/scenarioDrafting.js +418 -93
- package/build/utils/scenarioDrafting.test.js +190 -2
- package/build/utils/trace-parser.js +49 -22
- package/node_modules/playwright/ThirdPartyNotices.txt +7456 -0
- package/node_modules/playwright/cli.js +19 -0
- package/node_modules/playwright/index.d.ts +17 -0
- package/node_modules/playwright/index.js +17 -0
- package/node_modules/playwright/index.mjs +18 -0
- package/node_modules/playwright/jsx-runtime.js +42 -0
- package/node_modules/playwright/jsx-runtime.mjs +21 -0
- package/node_modules/playwright/lib/agents/agentParser.js +89 -0
- package/node_modules/playwright/lib/agents/copilot-setup-steps.yml +34 -0
- package/node_modules/playwright/lib/agents/generateAgents.js +348 -0
- package/node_modules/playwright/lib/agents/playwright-test-coverage.prompt.md +31 -0
- package/node_modules/playwright/lib/agents/playwright-test-generate.prompt.md +8 -0
- package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +88 -0
- package/node_modules/playwright/lib/agents/playwright-test-heal.prompt.md +6 -0
- package/node_modules/playwright/lib/agents/playwright-test-healer.agent.md +55 -0
- package/node_modules/playwright/lib/agents/playwright-test-plan.prompt.md +9 -0
- package/node_modules/playwright/lib/agents/playwright-test-planner.agent.md +73 -0
- package/node_modules/playwright/lib/common/config.js +282 -0
- package/node_modules/playwright/lib/common/configLoader.js +344 -0
- package/node_modules/playwright/lib/common/esmLoaderHost.js +104 -0
- package/node_modules/playwright/lib/common/expectBundle.js +28 -0
- package/node_modules/playwright/lib/common/expectBundleImpl.js +407 -0
- package/node_modules/playwright/lib/common/fixtures.js +302 -0
- package/node_modules/playwright/lib/common/globals.js +58 -0
- package/node_modules/playwright/lib/common/ipc.js +60 -0
- package/node_modules/playwright/lib/common/poolBuilder.js +85 -0
- package/node_modules/playwright/lib/common/process.js +132 -0
- package/node_modules/playwright/lib/common/suiteUtils.js +140 -0
- package/node_modules/playwright/lib/common/test.js +321 -0
- package/node_modules/playwright/lib/common/testLoader.js +101 -0
- package/node_modules/playwright/lib/common/testType.js +298 -0
- package/node_modules/playwright/lib/common/validators.js +68 -0
- package/node_modules/playwright/lib/fsWatcher.js +67 -0
- package/node_modules/playwright/lib/index.js +726 -0
- package/node_modules/playwright/lib/internalsForTest.js +42 -0
- package/node_modules/playwright/lib/isomorphic/events.js +77 -0
- package/node_modules/playwright/lib/isomorphic/folders.js +30 -0
- package/node_modules/playwright/lib/isomorphic/stringInternPool.js +69 -0
- package/node_modules/playwright/lib/isomorphic/teleReceiver.js +521 -0
- package/node_modules/playwright/lib/isomorphic/teleSuiteUpdater.js +157 -0
- package/node_modules/playwright/lib/isomorphic/testServerConnection.js +225 -0
- package/node_modules/playwright/lib/isomorphic/testServerInterface.js +16 -0
- package/node_modules/playwright/lib/isomorphic/testTree.js +329 -0
- package/node_modules/playwright/lib/isomorphic/types.d.js +16 -0
- package/node_modules/playwright/lib/loader/loaderMain.js +59 -0
- package/node_modules/playwright/lib/matchers/expect.js +311 -0
- package/node_modules/playwright/lib/matchers/matcherHint.js +44 -0
- package/node_modules/playwright/lib/matchers/matchers.js +383 -0
- package/node_modules/playwright/lib/matchers/toBeTruthy.js +75 -0
- package/node_modules/playwright/lib/matchers/toEqual.js +100 -0
- package/node_modules/playwright/lib/matchers/toHaveURL.js +101 -0
- package/node_modules/playwright/lib/matchers/toMatchAriaSnapshot.js +159 -0
- package/node_modules/playwright/lib/matchers/toMatchSnapshot.js +342 -0
- package/node_modules/playwright/lib/matchers/toMatchText.js +99 -0
- package/node_modules/playwright/lib/mcp/browser/browserContextFactory.js +329 -0
- package/node_modules/playwright/lib/mcp/browser/browserServerBackend.js +84 -0
- package/node_modules/playwright/lib/mcp/browser/config.js +421 -0
- package/node_modules/playwright/lib/mcp/browser/context.js +296 -0
- package/node_modules/playwright/lib/mcp/browser/response.js +278 -0
- package/node_modules/playwright/lib/mcp/browser/sessionLog.js +75 -0
- package/node_modules/playwright/lib/mcp/browser/tab.js +343 -0
- package/node_modules/playwright/lib/mcp/browser/tools/common.js +65 -0
- package/node_modules/playwright/lib/mcp/browser/tools/console.js +46 -0
- package/node_modules/playwright/lib/mcp/browser/tools/dialogs.js +60 -0
- package/node_modules/playwright/lib/mcp/browser/tools/evaluate.js +61 -0
- package/node_modules/playwright/lib/mcp/browser/tools/files.js +58 -0
- package/node_modules/playwright/lib/mcp/browser/tools/form.js +63 -0
- package/node_modules/playwright/lib/mcp/browser/tools/install.js +72 -0
- package/node_modules/playwright/lib/mcp/browser/tools/keyboard.js +107 -0
- package/node_modules/playwright/lib/mcp/browser/tools/mouse.js +107 -0
- package/node_modules/playwright/lib/mcp/browser/tools/navigate.js +71 -0
- package/node_modules/playwright/lib/mcp/browser/tools/network.js +63 -0
- package/node_modules/playwright/lib/mcp/browser/tools/open.js +57 -0
- package/node_modules/playwright/lib/mcp/browser/tools/pdf.js +49 -0
- package/node_modules/playwright/lib/mcp/browser/tools/runCode.js +78 -0
- package/node_modules/playwright/lib/mcp/browser/tools/screenshot.js +93 -0
- package/node_modules/playwright/lib/mcp/browser/tools/snapshot.js +173 -0
- package/node_modules/playwright/lib/mcp/browser/tools/tabs.js +67 -0
- package/node_modules/playwright/lib/mcp/browser/tools/tool.js +47 -0
- package/node_modules/playwright/lib/mcp/browser/tools/tracing.js +74 -0
- package/node_modules/playwright/lib/mcp/browser/tools/utils.js +94 -0
- package/node_modules/playwright/lib/mcp/browser/tools/verify.js +143 -0
- package/node_modules/playwright/lib/mcp/browser/tools/wait.js +63 -0
- package/node_modules/playwright/lib/mcp/browser/tools.js +84 -0
- package/node_modules/playwright/lib/mcp/browser/watchdog.js +44 -0
- package/node_modules/playwright/lib/mcp/config.d.js +16 -0
- package/node_modules/playwright/lib/mcp/extension/cdpRelay.js +351 -0
- package/node_modules/playwright/lib/mcp/extension/extensionContextFactory.js +76 -0
- package/node_modules/playwright/lib/mcp/extension/protocol.js +28 -0
- package/node_modules/playwright/lib/mcp/index.js +61 -0
- package/node_modules/playwright/lib/mcp/log.js +35 -0
- package/node_modules/playwright/lib/mcp/program.js +111 -0
- package/node_modules/playwright/lib/mcp/sdk/exports.js +28 -0
- package/node_modules/playwright/lib/mcp/sdk/http.js +152 -0
- package/node_modules/playwright/lib/mcp/sdk/inProcessTransport.js +71 -0
- package/node_modules/playwright/lib/mcp/sdk/server.js +223 -0
- package/node_modules/playwright/lib/mcp/sdk/tool.js +47 -0
- package/node_modules/playwright/lib/mcp/skyramp/exportTool.js +88 -0
- package/node_modules/playwright/lib/mcp/skyramp/index.js +36 -0
- package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +236 -0
- package/node_modules/playwright/lib/mcp/skyramp/types.js +31 -0
- package/node_modules/playwright/lib/mcp/terminal/cli.js +296 -0
- package/node_modules/playwright/lib/mcp/terminal/command.js +56 -0
- package/node_modules/playwright/lib/mcp/terminal/commands.js +333 -0
- package/node_modules/playwright/lib/mcp/terminal/daemon.js +129 -0
- package/node_modules/playwright/lib/mcp/terminal/help.json +32 -0
- package/node_modules/playwright/lib/mcp/terminal/helpGenerator.js +88 -0
- package/node_modules/playwright/lib/mcp/terminal/socketConnection.js +80 -0
- package/node_modules/playwright/lib/mcp/test/browserBackend.js +98 -0
- package/node_modules/playwright/lib/mcp/test/generatorTools.js +122 -0
- package/node_modules/playwright/lib/mcp/test/plannerTools.js +145 -0
- package/node_modules/playwright/lib/mcp/test/seed.js +82 -0
- package/node_modules/playwright/lib/mcp/test/skyRampExport.js +313 -0
- package/node_modules/playwright/lib/mcp/test/streams.js +44 -0
- package/node_modules/playwright/lib/mcp/test/testBackend.js +99 -0
- package/node_modules/playwright/lib/mcp/test/testContext.js +285 -0
- package/node_modules/playwright/lib/mcp/test/testTool.js +30 -0
- package/node_modules/playwright/lib/mcp/test/testTools.js +108 -0
- package/node_modules/playwright/lib/plugins/gitCommitInfoPlugin.js +198 -0
- package/node_modules/playwright/lib/plugins/index.js +28 -0
- package/node_modules/playwright/lib/plugins/webServerPlugin.js +237 -0
- package/node_modules/playwright/lib/program.js +417 -0
- package/node_modules/playwright/lib/reporters/base.js +634 -0
- package/node_modules/playwright/lib/reporters/blob.js +138 -0
- package/node_modules/playwright/lib/reporters/dot.js +99 -0
- package/node_modules/playwright/lib/reporters/empty.js +32 -0
- package/node_modules/playwright/lib/reporters/github.js +128 -0
- package/node_modules/playwright/lib/reporters/html.js +633 -0
- package/node_modules/playwright/lib/reporters/internalReporter.js +138 -0
- package/node_modules/playwright/lib/reporters/json.js +254 -0
- package/node_modules/playwright/lib/reporters/junit.js +232 -0
- package/node_modules/playwright/lib/reporters/line.js +131 -0
- package/node_modules/playwright/lib/reporters/list.js +253 -0
- package/node_modules/playwright/lib/reporters/listModeReporter.js +69 -0
- package/node_modules/playwright/lib/reporters/markdown.js +144 -0
- package/node_modules/playwright/lib/reporters/merge.js +558 -0
- package/node_modules/playwright/lib/reporters/multiplexer.js +112 -0
- package/node_modules/playwright/lib/reporters/reporterV2.js +102 -0
- package/node_modules/playwright/lib/reporters/teleEmitter.js +317 -0
- package/node_modules/playwright/lib/reporters/versions/blobV1.js +16 -0
- package/node_modules/playwright/lib/runner/dispatcher.js +530 -0
- package/node_modules/playwright/lib/runner/failureTracker.js +72 -0
- package/node_modules/playwright/lib/runner/lastRun.js +77 -0
- package/node_modules/playwright/lib/runner/loadUtils.js +334 -0
- package/node_modules/playwright/lib/runner/loaderHost.js +89 -0
- package/node_modules/playwright/lib/runner/processHost.js +180 -0
- package/node_modules/playwright/lib/runner/projectUtils.js +241 -0
- package/node_modules/playwright/lib/runner/rebase.js +189 -0
- package/node_modules/playwright/lib/runner/reporters.js +138 -0
- package/node_modules/playwright/lib/runner/sigIntWatcher.js +96 -0
- package/node_modules/playwright/lib/runner/storage.js +91 -0
- package/node_modules/playwright/lib/runner/taskRunner.js +127 -0
- package/node_modules/playwright/lib/runner/tasks.js +410 -0
- package/node_modules/playwright/lib/runner/testGroups.js +125 -0
- package/node_modules/playwright/lib/runner/testRunner.js +398 -0
- package/node_modules/playwright/lib/runner/testServer.js +269 -0
- package/node_modules/playwright/lib/runner/uiModeReporter.js +30 -0
- package/node_modules/playwright/lib/runner/vcs.js +72 -0
- package/node_modules/playwright/lib/runner/watchMode.js +396 -0
- package/node_modules/playwright/lib/runner/workerHost.js +104 -0
- package/node_modules/playwright/lib/third_party/pirates.js +62 -0
- package/node_modules/playwright/lib/third_party/tsconfig-loader.js +103 -0
- package/node_modules/playwright/lib/transform/babelBundle.js +46 -0
- package/node_modules/playwright/lib/transform/babelBundleImpl.js +461 -0
- package/node_modules/playwright/lib/transform/compilationCache.js +274 -0
- package/node_modules/playwright/lib/transform/esmLoader.js +103 -0
- package/node_modules/playwright/lib/transform/md.js +221 -0
- package/node_modules/playwright/lib/transform/portTransport.js +67 -0
- package/node_modules/playwright/lib/transform/transform.js +303 -0
- package/node_modules/playwright/lib/util.js +400 -0
- package/node_modules/playwright/lib/utilsBundle.js +50 -0
- package/node_modules/playwright/lib/utilsBundleImpl.js +103 -0
- package/node_modules/playwright/lib/worker/fixtureRunner.js +262 -0
- package/node_modules/playwright/lib/worker/testInfo.js +536 -0
- package/node_modules/playwright/lib/worker/testTracing.js +345 -0
- package/node_modules/playwright/lib/worker/timeoutManager.js +174 -0
- package/node_modules/playwright/lib/worker/util.js +31 -0
- package/node_modules/playwright/lib/worker/workerMain.js +530 -0
- package/node_modules/playwright/package.json +73 -0
- package/node_modules/playwright/test.d.ts +18 -0
- package/node_modules/playwright/test.js +24 -0
- package/node_modules/playwright/test.mjs +34 -0
- package/node_modules/playwright/types/test.d.ts +10251 -0
- package/node_modules/playwright/types/testReporter.d.ts +822 -0
- package/node_modules/playwright-core/LICENSE +202 -0
- package/node_modules/playwright-core/NOTICE +5 -0
- package/node_modules/playwright-core/README.md +3 -0
- package/node_modules/playwright-core/ThirdPartyNotices.txt +4076 -0
- package/node_modules/playwright-core/bin/install_media_pack.ps1 +5 -0
- package/node_modules/playwright-core/bin/install_webkit_wsl.ps1 +33 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/browsers.json +79 -0
- package/node_modules/playwright-core/cli.js +18 -0
- package/node_modules/playwright-core/index.d.ts +17 -0
- package/node_modules/playwright-core/index.js +32 -0
- package/node_modules/playwright-core/index.mjs +28 -0
- package/node_modules/playwright-core/lib/androidServerImpl.js +65 -0
- package/node_modules/playwright-core/lib/browserServerImpl.js +120 -0
- package/node_modules/playwright-core/lib/cli/driver.js +97 -0
- package/node_modules/playwright-core/lib/cli/program.js +589 -0
- package/node_modules/playwright-core/lib/cli/programWithTestStub.js +74 -0
- package/node_modules/playwright-core/lib/client/android.js +361 -0
- package/node_modules/playwright-core/lib/client/api.js +137 -0
- package/node_modules/playwright-core/lib/client/artifact.js +79 -0
- package/node_modules/playwright-core/lib/client/browser.js +161 -0
- package/node_modules/playwright-core/lib/client/browserContext.js +582 -0
- package/node_modules/playwright-core/lib/client/browserType.js +185 -0
- package/node_modules/playwright-core/lib/client/cdpSession.js +51 -0
- package/node_modules/playwright-core/lib/client/channelOwner.js +194 -0
- package/node_modules/playwright-core/lib/client/clientHelper.js +64 -0
- package/node_modules/playwright-core/lib/client/clientInstrumentation.js +55 -0
- package/node_modules/playwright-core/lib/client/clientStackTrace.js +69 -0
- package/node_modules/playwright-core/lib/client/clock.js +68 -0
- package/node_modules/playwright-core/lib/client/connection.js +318 -0
- package/node_modules/playwright-core/lib/client/consoleMessage.js +58 -0
- package/node_modules/playwright-core/lib/client/coverage.js +44 -0
- package/node_modules/playwright-core/lib/client/dialog.js +56 -0
- package/node_modules/playwright-core/lib/client/download.js +62 -0
- package/node_modules/playwright-core/lib/client/electron.js +138 -0
- package/node_modules/playwright-core/lib/client/elementHandle.js +284 -0
- package/node_modules/playwright-core/lib/client/errors.js +77 -0
- package/node_modules/playwright-core/lib/client/eventEmitter.js +314 -0
- package/node_modules/playwright-core/lib/client/events.js +103 -0
- package/node_modules/playwright-core/lib/client/fetch.js +368 -0
- package/node_modules/playwright-core/lib/client/fileChooser.js +46 -0
- package/node_modules/playwright-core/lib/client/fileUtils.js +34 -0
- package/node_modules/playwright-core/lib/client/frame.js +409 -0
- package/node_modules/playwright-core/lib/client/harRouter.js +87 -0
- package/node_modules/playwright-core/lib/client/input.js +84 -0
- package/node_modules/playwright-core/lib/client/jsHandle.js +109 -0
- package/node_modules/playwright-core/lib/client/jsonPipe.js +39 -0
- package/node_modules/playwright-core/lib/client/localUtils.js +60 -0
- package/node_modules/playwright-core/lib/client/locator.js +369 -0
- package/node_modules/playwright-core/lib/client/network.js +747 -0
- package/node_modules/playwright-core/lib/client/page.js +745 -0
- package/node_modules/playwright-core/lib/client/pageAgent.js +64 -0
- package/node_modules/playwright-core/lib/client/platform.js +77 -0
- package/node_modules/playwright-core/lib/client/playwright.js +71 -0
- package/node_modules/playwright-core/lib/client/selectors.js +55 -0
- package/node_modules/playwright-core/lib/client/stream.js +39 -0
- package/node_modules/playwright-core/lib/client/timeoutSettings.js +79 -0
- package/node_modules/playwright-core/lib/client/tracing.js +119 -0
- package/node_modules/playwright-core/lib/client/types.js +28 -0
- package/node_modules/playwright-core/lib/client/video.js +59 -0
- package/node_modules/playwright-core/lib/client/waiter.js +142 -0
- package/node_modules/playwright-core/lib/client/webError.js +39 -0
- package/node_modules/playwright-core/lib/client/webSocket.js +93 -0
- package/node_modules/playwright-core/lib/client/worker.js +85 -0
- package/node_modules/playwright-core/lib/client/writableStream.js +39 -0
- package/node_modules/playwright-core/lib/generated/bindingsControllerSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/clockSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/injectedScriptSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/pollingRecorderSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/storageScriptSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/utilityScriptSource.js +28 -0
- package/node_modules/playwright-core/lib/generated/webSocketMockSource.js +336 -0
- package/node_modules/playwright-core/lib/inProcessFactory.js +60 -0
- package/node_modules/playwright-core/lib/inprocess.js +3 -0
- package/node_modules/playwright-core/lib/mcpBundle.js +84 -0
- package/node_modules/playwright-core/lib/mcpBundleImpl/index.js +147 -0
- package/node_modules/playwright-core/lib/outofprocess.js +76 -0
- package/node_modules/playwright-core/lib/protocol/serializers.js +197 -0
- package/node_modules/playwright-core/lib/protocol/validator.js +2969 -0
- package/node_modules/playwright-core/lib/protocol/validatorPrimitives.js +193 -0
- package/node_modules/playwright-core/lib/remote/playwrightConnection.js +129 -0
- package/node_modules/playwright-core/lib/remote/playwrightServer.js +334 -0
- package/node_modules/playwright-core/lib/server/agent/actionRunner.js +335 -0
- package/node_modules/playwright-core/lib/server/agent/actions.js +128 -0
- package/node_modules/playwright-core/lib/server/agent/codegen.js +111 -0
- package/node_modules/playwright-core/lib/server/agent/context.js +150 -0
- package/node_modules/playwright-core/lib/server/agent/expectTools.js +156 -0
- package/node_modules/playwright-core/lib/server/agent/pageAgent.js +204 -0
- package/node_modules/playwright-core/lib/server/agent/performTools.js +262 -0
- package/node_modules/playwright-core/lib/server/agent/tool.js +109 -0
- package/node_modules/playwright-core/lib/server/android/android.js +465 -0
- package/node_modules/playwright-core/lib/server/android/backendAdb.js +177 -0
- package/node_modules/playwright-core/lib/server/artifact.js +127 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiBrowser.js +549 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiChromium.js +149 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiConnection.js +213 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiDeserializer.js +116 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiExecutionContext.js +267 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiFirefox.js +128 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiInput.js +146 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiNetworkManager.js +383 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiOverCdp.js +102 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiPage.js +583 -0
- package/node_modules/playwright-core/lib/server/bidi/bidiPdf.js +106 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiKeyboard.js +256 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiProtocol.js +24 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiProtocolCore.js +180 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/bidiSerializer.js +148 -0
- package/node_modules/playwright-core/lib/server/bidi/third_party/firefoxPrefs.js +259 -0
- package/node_modules/playwright-core/lib/server/browser.js +149 -0
- package/node_modules/playwright-core/lib/server/browserContext.js +702 -0
- package/node_modules/playwright-core/lib/server/browserType.js +336 -0
- package/node_modules/playwright-core/lib/server/callLog.js +82 -0
- package/node_modules/playwright-core/lib/server/chromium/appIcon.png +0 -0
- package/node_modules/playwright-core/lib/server/chromium/chromium.js +397 -0
- package/node_modules/playwright-core/lib/server/chromium/chromiumSwitches.js +104 -0
- package/node_modules/playwright-core/lib/server/chromium/crBrowser.js +520 -0
- package/node_modules/playwright-core/lib/server/chromium/crConnection.js +197 -0
- package/node_modules/playwright-core/lib/server/chromium/crCoverage.js +235 -0
- package/node_modules/playwright-core/lib/server/chromium/crDevTools.js +111 -0
- package/node_modules/playwright-core/lib/server/chromium/crDragDrop.js +131 -0
- package/node_modules/playwright-core/lib/server/chromium/crExecutionContext.js +146 -0
- package/node_modules/playwright-core/lib/server/chromium/crInput.js +187 -0
- package/node_modules/playwright-core/lib/server/chromium/crNetworkManager.js +707 -0
- package/node_modules/playwright-core/lib/server/chromium/crPage.js +1001 -0
- package/node_modules/playwright-core/lib/server/chromium/crPdf.js +121 -0
- package/node_modules/playwright-core/lib/server/chromium/crProtocolHelper.js +145 -0
- package/node_modules/playwright-core/lib/server/chromium/crServiceWorker.js +136 -0
- package/node_modules/playwright-core/lib/server/chromium/defaultFontFamilies.js +162 -0
- package/node_modules/playwright-core/lib/server/chromium/protocol.d.js +16 -0
- package/node_modules/playwright-core/lib/server/clock.js +149 -0
- package/node_modules/playwright-core/lib/server/codegen/csharp.js +327 -0
- package/node_modules/playwright-core/lib/server/codegen/java.js +274 -0
- package/node_modules/playwright-core/lib/server/codegen/javascript.js +247 -0
- package/node_modules/playwright-core/lib/server/codegen/jsonl.js +52 -0
- package/node_modules/playwright-core/lib/server/codegen/language.js +132 -0
- package/node_modules/playwright-core/lib/server/codegen/languages.js +68 -0
- package/node_modules/playwright-core/lib/server/codegen/python.js +279 -0
- package/node_modules/playwright-core/lib/server/codegen/types.js +16 -0
- package/node_modules/playwright-core/lib/server/console.js +57 -0
- package/node_modules/playwright-core/lib/server/cookieStore.js +206 -0
- package/node_modules/playwright-core/lib/server/debugController.js +191 -0
- package/node_modules/playwright-core/lib/server/debugger.js +119 -0
- package/node_modules/playwright-core/lib/server/deviceDescriptors.js +39 -0
- package/node_modules/playwright-core/lib/server/deviceDescriptorsSource.json +1779 -0
- package/node_modules/playwright-core/lib/server/dialog.js +116 -0
- package/node_modules/playwright-core/lib/server/dispatchers/androidDispatcher.js +325 -0
- package/node_modules/playwright-core/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/node_modules/playwright-core/lib/server/dispatchers/browserContextDispatcher.js +384 -0
- package/node_modules/playwright-core/lib/server/dispatchers/browserDispatcher.js +118 -0
- package/node_modules/playwright-core/lib/server/dispatchers/browserTypeDispatcher.js +64 -0
- package/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js +44 -0
- package/node_modules/playwright-core/lib/server/dispatchers/debugControllerDispatcher.js +78 -0
- package/node_modules/playwright-core/lib/server/dispatchers/dialogDispatcher.js +47 -0
- package/node_modules/playwright-core/lib/server/dispatchers/dispatcher.js +364 -0
- package/node_modules/playwright-core/lib/server/dispatchers/electronDispatcher.js +89 -0
- package/node_modules/playwright-core/lib/server/dispatchers/elementHandlerDispatcher.js +181 -0
- package/node_modules/playwright-core/lib/server/dispatchers/frameDispatcher.js +227 -0
- package/node_modules/playwright-core/lib/server/dispatchers/jsHandleDispatcher.js +85 -0
- package/node_modules/playwright-core/lib/server/dispatchers/jsonPipeDispatcher.js +58 -0
- package/node_modules/playwright-core/lib/server/dispatchers/localUtilsDispatcher.js +149 -0
- package/node_modules/playwright-core/lib/server/dispatchers/networkDispatchers.js +213 -0
- package/node_modules/playwright-core/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
- package/node_modules/playwright-core/lib/server/dispatchers/pageDispatcher.js +393 -0
- package/node_modules/playwright-core/lib/server/dispatchers/playwrightDispatcher.js +108 -0
- package/node_modules/playwright-core/lib/server/dispatchers/streamDispatcher.js +67 -0
- package/node_modules/playwright-core/lib/server/dispatchers/tracingDispatcher.js +68 -0
- package/node_modules/playwright-core/lib/server/dispatchers/webSocketRouteDispatcher.js +165 -0
- package/node_modules/playwright-core/lib/server/dispatchers/writableStreamDispatcher.js +79 -0
- package/node_modules/playwright-core/lib/server/dom.js +815 -0
- package/node_modules/playwright-core/lib/server/download.js +70 -0
- package/node_modules/playwright-core/lib/server/electron/electron.js +273 -0
- package/node_modules/playwright-core/lib/server/electron/loader.js +29 -0
- package/node_modules/playwright-core/lib/server/errors.js +69 -0
- package/node_modules/playwright-core/lib/server/fetch.js +621 -0
- package/node_modules/playwright-core/lib/server/fileChooser.js +43 -0
- package/node_modules/playwright-core/lib/server/fileUploadUtils.js +84 -0
- package/node_modules/playwright-core/lib/server/firefox/ffBrowser.js +418 -0
- package/node_modules/playwright-core/lib/server/firefox/ffConnection.js +142 -0
- package/node_modules/playwright-core/lib/server/firefox/ffExecutionContext.js +150 -0
- package/node_modules/playwright-core/lib/server/firefox/ffInput.js +159 -0
- package/node_modules/playwright-core/lib/server/firefox/ffNetworkManager.js +256 -0
- package/node_modules/playwright-core/lib/server/firefox/ffPage.js +497 -0
- package/node_modules/playwright-core/lib/server/firefox/firefox.js +114 -0
- package/node_modules/playwright-core/lib/server/firefox/protocol.d.js +16 -0
- package/node_modules/playwright-core/lib/server/formData.js +147 -0
- package/node_modules/playwright-core/lib/server/frameSelectors.js +160 -0
- package/node_modules/playwright-core/lib/server/frames.js +1471 -0
- package/node_modules/playwright-core/lib/server/har/harRecorder.js +147 -0
- package/node_modules/playwright-core/lib/server/har/harTracer.js +607 -0
- package/node_modules/playwright-core/lib/server/harBackend.js +157 -0
- package/node_modules/playwright-core/lib/server/helper.js +96 -0
- package/node_modules/playwright-core/lib/server/index.js +58 -0
- package/node_modules/playwright-core/lib/server/input.js +277 -0
- package/node_modules/playwright-core/lib/server/instrumentation.js +72 -0
- package/node_modules/playwright-core/lib/server/javascript.js +291 -0
- package/node_modules/playwright-core/lib/server/launchApp.js +128 -0
- package/node_modules/playwright-core/lib/server/localUtils.js +214 -0
- package/node_modules/playwright-core/lib/server/macEditingCommands.js +143 -0
- package/node_modules/playwright-core/lib/server/network.js +667 -0
- package/node_modules/playwright-core/lib/server/page.js +830 -0
- package/node_modules/playwright-core/lib/server/pipeTransport.js +89 -0
- package/node_modules/playwright-core/lib/server/playwright.js +69 -0
- package/node_modules/playwright-core/lib/server/progress.js +132 -0
- package/node_modules/playwright-core/lib/server/protocolError.js +52 -0
- package/node_modules/playwright-core/lib/server/recorder/chat.js +161 -0
- package/node_modules/playwright-core/lib/server/recorder/recorderApp.js +366 -0
- package/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +138 -0
- package/node_modules/playwright-core/lib/server/recorder/recorderSignalProcessor.js +83 -0
- package/node_modules/playwright-core/lib/server/recorder/recorderUtils.js +157 -0
- package/node_modules/playwright-core/lib/server/recorder/throttledFile.js +57 -0
- package/node_modules/playwright-core/lib/server/recorder.js +499 -0
- package/node_modules/playwright-core/lib/server/registry/browserFetcher.js +177 -0
- package/node_modules/playwright-core/lib/server/registry/dependencies.js +371 -0
- package/node_modules/playwright-core/lib/server/registry/index.js +1422 -0
- package/node_modules/playwright-core/lib/server/registry/nativeDeps.js +1280 -0
- package/node_modules/playwright-core/lib/server/registry/oopDownloadBrowserMain.js +127 -0
- package/node_modules/playwright-core/lib/server/screencast.js +190 -0
- package/node_modules/playwright-core/lib/server/screenshotter.js +333 -0
- package/node_modules/playwright-core/lib/server/selectors.js +112 -0
- package/node_modules/playwright-core/lib/server/socksClientCertificatesInterceptor.js +383 -0
- package/node_modules/playwright-core/lib/server/socksInterceptor.js +95 -0
- package/node_modules/playwright-core/lib/server/trace/recorder/snapshotter.js +147 -0
- package/node_modules/playwright-core/lib/server/trace/recorder/snapshotterInjected.js +561 -0
- package/node_modules/playwright-core/lib/server/trace/recorder/tracing.js +604 -0
- package/node_modules/playwright-core/lib/server/trace/viewer/traceParser.js +72 -0
- package/node_modules/playwright-core/lib/server/trace/viewer/traceViewer.js +245 -0
- package/node_modules/playwright-core/lib/server/transport.js +181 -0
- package/node_modules/playwright-core/lib/server/types.js +28 -0
- package/node_modules/playwright-core/lib/server/usKeyboardLayout.js +145 -0
- package/node_modules/playwright-core/lib/server/utils/ascii.js +44 -0
- package/node_modules/playwright-core/lib/server/utils/comparators.js +139 -0
- package/node_modules/playwright-core/lib/server/utils/crypto.js +216 -0
- package/node_modules/playwright-core/lib/server/utils/debug.js +42 -0
- package/node_modules/playwright-core/lib/server/utils/debugLogger.js +122 -0
- package/node_modules/playwright-core/lib/server/utils/env.js +73 -0
- package/node_modules/playwright-core/lib/server/utils/eventsHelper.js +39 -0
- package/node_modules/playwright-core/lib/server/utils/expectUtils.js +123 -0
- package/node_modules/playwright-core/lib/server/utils/fileUtils.js +191 -0
- package/node_modules/playwright-core/lib/server/utils/happyEyeballs.js +207 -0
- package/node_modules/playwright-core/lib/server/utils/hostPlatform.js +138 -0
- package/node_modules/playwright-core/lib/server/utils/httpServer.js +203 -0
- package/node_modules/playwright-core/lib/server/utils/imageUtils.js +141 -0
- package/node_modules/playwright-core/lib/server/utils/image_tools/colorUtils.js +89 -0
- package/node_modules/playwright-core/lib/server/utils/image_tools/compare.js +109 -0
- package/node_modules/playwright-core/lib/server/utils/image_tools/imageChannel.js +78 -0
- package/node_modules/playwright-core/lib/server/utils/image_tools/stats.js +102 -0
- package/node_modules/playwright-core/lib/server/utils/linuxUtils.js +71 -0
- package/node_modules/playwright-core/lib/server/utils/network.js +242 -0
- package/node_modules/playwright-core/lib/server/utils/nodePlatform.js +154 -0
- package/node_modules/playwright-core/lib/server/utils/pipeTransport.js +84 -0
- package/node_modules/playwright-core/lib/server/utils/processLauncher.js +241 -0
- package/node_modules/playwright-core/lib/server/utils/profiler.js +65 -0
- package/node_modules/playwright-core/lib/server/utils/socksProxy.js +511 -0
- package/node_modules/playwright-core/lib/server/utils/spawnAsync.js +41 -0
- package/node_modules/playwright-core/lib/server/utils/task.js +51 -0
- package/node_modules/playwright-core/lib/server/utils/userAgent.js +98 -0
- package/node_modules/playwright-core/lib/server/utils/wsServer.js +121 -0
- package/node_modules/playwright-core/lib/server/utils/zipFile.js +74 -0
- package/node_modules/playwright-core/lib/server/utils/zones.js +57 -0
- package/node_modules/playwright-core/lib/server/videoRecorder.js +124 -0
- package/node_modules/playwright-core/lib/server/webkit/protocol.d.js +16 -0
- package/node_modules/playwright-core/lib/server/webkit/webkit.js +108 -0
- package/node_modules/playwright-core/lib/server/webkit/wkBrowser.js +335 -0
- package/node_modules/playwright-core/lib/server/webkit/wkConnection.js +144 -0
- package/node_modules/playwright-core/lib/server/webkit/wkExecutionContext.js +154 -0
- package/node_modules/playwright-core/lib/server/webkit/wkInput.js +181 -0
- package/node_modules/playwright-core/lib/server/webkit/wkInterceptableRequest.js +197 -0
- package/node_modules/playwright-core/lib/server/webkit/wkPage.js +1159 -0
- package/node_modules/playwright-core/lib/server/webkit/wkProvisionalPage.js +83 -0
- package/node_modules/playwright-core/lib/server/webkit/wkWorkers.js +105 -0
- package/node_modules/playwright-core/lib/third_party/pixelmatch.js +255 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/ariaSnapshot.js +455 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/assert.js +31 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/colors.js +72 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/cssParser.js +245 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/cssTokenizer.js +1051 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/headers.js +53 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/locatorGenerators.js +689 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/locatorParser.js +176 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/locatorUtils.js +81 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/lruCache.js +51 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/manualPromise.js +114 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/mimeType.js +459 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/multimap.js +80 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/protocolFormatter.js +81 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js +330 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/rtti.js +43 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/selectorParser.js +386 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/semaphore.js +54 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/stackTrace.js +158 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/stringUtils.js +204 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/time.js +49 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/timeoutRunner.js +66 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/entries.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/traceLoader.js +131 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/traceModel.js +365 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/traceUtils.js +58 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/types.js +16 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/urlMatch.js +190 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/utilityScriptSerializers.js +251 -0
- package/node_modules/playwright-core/lib/utils/isomorphic/yaml.js +84 -0
- package/node_modules/playwright-core/lib/utils.js +111 -0
- package/node_modules/playwright-core/lib/utilsBundle.js +109 -0
- package/node_modules/playwright-core/lib/utilsBundleImpl/index.js +218 -0
- package/node_modules/playwright-core/lib/utilsBundleImpl/xdg-open +1066 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/index.html +84 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-BSjZa4pk.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -0
- package/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
- package/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-a5XoALAZ.js +32 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-CJSZINFr.js +266 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.BDwrLSGN.js +2 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.html +43 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +21 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +5 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.Btcz36p_.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CQJ9SCIQ.js +5 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +17 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.DYP7pi_n.css +32 -0
- package/node_modules/playwright-core/lib/zipBundle.js +34 -0
- package/node_modules/playwright-core/lib/zipBundleImpl.js +5 -0
- package/node_modules/playwright-core/package.json +43 -0
- package/node_modules/playwright-core/types/protocol.d.ts +23824 -0
- package/node_modules/playwright-core/types/structs.d.ts +45 -0
- package/node_modules/playwright-core/types/types.d.ts +22843 -0
- package/package.json +6 -2
|
@@ -4,18 +4,123 @@
|
|
|
4
4
|
* resources) with token budget (each scenario adds ~15-20 lines to the prompt).
|
|
5
5
|
*/
|
|
6
6
|
const MAX_DRAFTED_SCENARIOS_PER_CATEGORY = 4;
|
|
7
|
-
const ACTION_PATTERN = /^(me|merge|archive|search|login|logout|verify|forgot|reset|config|dashboard|webhook|migration|favicon|payment|health|status|ping|metrics|callback|confirm|activate|deactivate|subscribe|unsubscribe)$/i;
|
|
7
|
+
const ACTION_PATTERN = /^(me|merge|archive|search|login|logout|verify|forgot|reset|config|dashboard|webhook|migration|favicon|payment|health|status|ping|metrics|callback|confirm|activate|deactivate|subscribe|unsubscribe|unknown)$/i;
|
|
8
8
|
const ACTION_VERB_HYPHEN = /^(forgot-|reset-|verify-|confirm-|send-|check-|get-|set-|update-|delete-|create-|trigger-|start-|stop-)/i;
|
|
9
9
|
export function isRealResource(r) {
|
|
10
10
|
return !ACTION_PATTERN.test(r) && !ACTION_VERB_HYPHEN.test(r);
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
const SKIP_SEGMENTS = new Set(["api", "v1", "v2", "v3", "public"]);
|
|
13
|
+
/**
|
|
14
|
+
* Convert a plural resource name to its singular form for use in field names
|
|
15
|
+
* and step descriptions.
|
|
16
|
+
*
|
|
17
|
+
* Handles the most common irregular plurals found in REST API paths:
|
|
18
|
+
* -ies → -y (categories → category, companies → company)
|
|
19
|
+
* -ses → -s (statuses → status, classes → class)
|
|
20
|
+
* Falls back to removing the trailing "s" for regular plurals.
|
|
21
|
+
*/
|
|
22
|
+
function singularize(word) {
|
|
23
|
+
if (word.endsWith("ies") && word.length > 3) {
|
|
24
|
+
return word.slice(0, -3) + "y";
|
|
25
|
+
}
|
|
26
|
+
if (word.endsWith("ses") && word.length > 4) {
|
|
27
|
+
return word.slice(0, -2); // statuses → status
|
|
28
|
+
}
|
|
29
|
+
return word.endsWith("s") && word.length > 1 ? word.slice(0, -1) : word;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract the primary resource name from an endpoint path.
|
|
33
|
+
* E.g. "/api/v1/flow-costs/{cost_id}" → "flow-costs"
|
|
34
|
+
* "/collections/{id}/links" → "links"
|
|
35
|
+
*/
|
|
36
|
+
function extractResourceName(path) {
|
|
37
|
+
const segments = path.split("/").filter(Boolean);
|
|
38
|
+
const nonParam = segments.filter(s => !s.startsWith("{") && !SKIP_SEGMENTS.has(s));
|
|
39
|
+
const name = nonParam[nonParam.length - 1];
|
|
40
|
+
return name && isRealResource(name) ? name : null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Infer parent→child resource relationships from two signals already present
|
|
44
|
+
* in the endpoint data — no source code scanning required.
|
|
45
|
+
*
|
|
46
|
+
* Signal 1 — path nesting (always available):
|
|
47
|
+
* /collections/{id}/links → links depends on collections
|
|
48
|
+
*
|
|
49
|
+
* Signal 2 — request body FK fields (available when trace data is merged):
|
|
50
|
+
* POST /orders body: { product_id: "..." } → orders depends on products
|
|
51
|
+
*
|
|
52
|
+
* Returns a map of `dependent → Set<parent>`. Only confirmed, real-resource
|
|
53
|
+
* pairs are included. When no signal is found the map is empty, which tells
|
|
54
|
+
* the caller to fall back to heuristic pairing.
|
|
55
|
+
*/
|
|
56
|
+
export function inferResourceRelationships(endpoints) {
|
|
57
|
+
const relationships = new Map();
|
|
58
|
+
const addRelationship = (dependent, parent) => {
|
|
59
|
+
if (dependent === parent)
|
|
60
|
+
return;
|
|
61
|
+
if (!isRealResource(dependent) || !isRealResource(parent))
|
|
62
|
+
return;
|
|
63
|
+
const deps = relationships.get(dependent) ?? new Set();
|
|
64
|
+
deps.add(parent);
|
|
65
|
+
relationships.set(dependent, deps);
|
|
66
|
+
};
|
|
67
|
+
// ── Signal 1: path nesting ──
|
|
68
|
+
// Pattern: /…/parentResource/{param}/childResource
|
|
69
|
+
for (const ep of endpoints) {
|
|
70
|
+
const segments = ep.path.split("/").filter(Boolean);
|
|
71
|
+
for (let i = 0; i + 2 < segments.length; i++) {
|
|
72
|
+
const seg = segments[i];
|
|
73
|
+
const paramSeg = segments[i + 1];
|
|
74
|
+
const childSeg = segments[i + 2];
|
|
75
|
+
if (!seg.startsWith("{") &&
|
|
76
|
+
paramSeg.startsWith("{") &&
|
|
77
|
+
!childSeg.startsWith("{") &&
|
|
78
|
+
!SKIP_SEGMENTS.has(seg) &&
|
|
79
|
+
!SKIP_SEGMENTS.has(childSeg)) {
|
|
80
|
+
addRelationship(childSeg, seg);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ── Signal 2: FK fields in request body interactions ──
|
|
85
|
+
// Collect all known resource names first so we can validate FK targets.
|
|
86
|
+
const knownResources = new Set(endpoints.map(ep => extractResourceName(ep.path)).filter(Boolean));
|
|
87
|
+
for (const ep of endpoints) {
|
|
88
|
+
const resource = extractResourceName(ep.path);
|
|
89
|
+
if (!resource)
|
|
90
|
+
continue;
|
|
91
|
+
for (const m of ep.methods) {
|
|
92
|
+
if (typeof m === "string")
|
|
93
|
+
continue;
|
|
94
|
+
if (!["POST", "PUT", "PATCH"].includes(m.method))
|
|
95
|
+
continue;
|
|
96
|
+
for (const interaction of m.interactions ?? []) {
|
|
97
|
+
const body = interaction.request?.body;
|
|
98
|
+
if (!body || typeof body !== "object")
|
|
99
|
+
continue;
|
|
100
|
+
for (const key of Object.keys(body)) {
|
|
101
|
+
if (!key.endsWith("_id"))
|
|
102
|
+
continue;
|
|
103
|
+
const depSingular = key.slice(0, -3); // "product_id" → "product"
|
|
104
|
+
const depPlural = depSingular + "s"; // → "products"
|
|
105
|
+
// Only create relationship when the dependency actually exists as an endpoint
|
|
106
|
+
if (knownResources.has(depPlural)) {
|
|
107
|
+
addRelationship(resource, depPlural);
|
|
108
|
+
}
|
|
109
|
+
else if (knownResources.has(depSingular)) {
|
|
110
|
+
addRelationship(resource, depSingular);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return relationships;
|
|
117
|
+
}
|
|
118
|
+
export function draftScenariosFromEndpoints(endpoints, newEndpoints = []) {
|
|
13
119
|
const scenarios = [];
|
|
14
120
|
const resourceGroups = new Map();
|
|
15
121
|
for (const ep of endpoints) {
|
|
16
122
|
const segments = ep.path.split("/").filter(Boolean);
|
|
17
|
-
const
|
|
18
|
-
const nonParamSegs = segments.filter(s => !s.startsWith("{") && !skipSet.has(s));
|
|
123
|
+
const nonParamSegs = segments.filter(s => !s.startsWith("{") && !SKIP_SEGMENTS.has(s));
|
|
19
124
|
const resource = nonParamSegs[nonParamSegs.length - 1] || "unknown";
|
|
20
125
|
const hasParam = /\{/.test(ep.path);
|
|
21
126
|
const resourceSegIdx = segments.lastIndexOf(resource);
|
|
@@ -43,6 +148,9 @@ export function draftScenariosFromEndpoints(endpoints) {
|
|
|
43
148
|
});
|
|
44
149
|
}
|
|
45
150
|
}
|
|
151
|
+
// ── Cross-resource integration scenarios ──
|
|
152
|
+
const relationships = inferResourceRelationships(endpoints);
|
|
153
|
+
const hasRelationships = relationships.size > 0;
|
|
46
154
|
const creatableResources = Array.from(resourceGroups.keys()).filter(r => isRealResource(r) && resourceGroups.get(r).methods.has("POST"));
|
|
47
155
|
const MAX_CROSS_RESOURCE = Math.min(Math.max(3, Math.floor(creatableResources.length / 2)), 8);
|
|
48
156
|
let crossCount = 0;
|
|
@@ -50,58 +158,37 @@ export function draftScenariosFromEndpoints(endpoints) {
|
|
|
50
158
|
for (let j = i + 1; j < creatableResources.length && crossCount < MAX_CROSS_RESOURCE; j++) {
|
|
51
159
|
const r1 = creatableResources[i];
|
|
52
160
|
const r2 = creatableResources[j];
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
description: `Create a ${singular2} referencing the ${singular1}`,
|
|
67
|
-
interactionType: "success", expectedStatusCode: 201,
|
|
68
|
-
chainsFrom: { sourceStep: 1, sourceField: `${singular1}_id`, sourceLocation: "body", targetParam: `${singular1}_id`, targetLocation: "body" },
|
|
69
|
-
});
|
|
70
|
-
if (g2.paramPath && g2.methods.has("GET")) {
|
|
71
|
-
steps.push({
|
|
72
|
-
order: order++, method: "GET", path: g2.paramPath,
|
|
73
|
-
description: `Verify the ${singular2} references the correct ${singular1}`,
|
|
74
|
-
interactionType: "success", expectedStatusCode: 200,
|
|
75
|
-
});
|
|
161
|
+
if (hasRelationships) {
|
|
162
|
+
// Only pair resources with a detected relationship; skip unrelated ones.
|
|
163
|
+
const r2DependsOnR1 = relationships.get(r2)?.has(r1) || relationships.get(r2)?.has(singularize(r1));
|
|
164
|
+
const r1DependsOnR2 = relationships.get(r1)?.has(r2) || relationships.get(r1)?.has(singularize(r2));
|
|
165
|
+
if (!r2DependsOnR1 && !r1DependsOnR2)
|
|
166
|
+
continue;
|
|
167
|
+
// Use relationship direction: parent is the one that doesn't depend on the other.
|
|
168
|
+
const [parent, child] = r2DependsOnR1 ? [r1, r2] : [r2, r1];
|
|
169
|
+
const gParent = resourceGroups.get(parent);
|
|
170
|
+
const gChild = resourceGroups.get(child);
|
|
171
|
+
const singularParent = singularize(parent);
|
|
172
|
+
const singularChild = singularize(child);
|
|
173
|
+
scenarios.push(buildCrossResourceScenario(parent, child, gParent, gChild, singularParent, singularChild));
|
|
76
174
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
});
|
|
175
|
+
else {
|
|
176
|
+
// No relationship signals found — fall back to sequential pairing (existing behaviour).
|
|
177
|
+
const g1 = resourceGroups.get(r1);
|
|
178
|
+
const g2 = resourceGroups.get(r2);
|
|
179
|
+
scenarios.push(buildCrossResourceScenario(r1, r2, g1, g2, singularize(r1), singularize(r2)));
|
|
83
180
|
}
|
|
84
|
-
scenarios.push({
|
|
85
|
-
scenarioName: `${r1}-${r2}-integration`,
|
|
86
|
-
description: `Multi-resource integration: create ${singular1}, create ${singular2} linked to it, verify, clean up`,
|
|
87
|
-
category: "workflow",
|
|
88
|
-
priority: "high",
|
|
89
|
-
steps,
|
|
90
|
-
chainingKeys: [`${singular1}_id`, `${singular2}_id`, "id"],
|
|
91
|
-
requiresAuth: true,
|
|
92
|
-
estimatedComplexity: "complex",
|
|
93
|
-
source: "code-inferred",
|
|
94
|
-
});
|
|
95
181
|
crossCount++;
|
|
96
182
|
}
|
|
97
183
|
}
|
|
184
|
+
// ── CRUD lifecycle scenarios ──
|
|
98
185
|
for (const [resource, group] of resourceGroups) {
|
|
99
186
|
const m = group.methods;
|
|
100
187
|
if (!m.has("POST") || !m.has("GET") || !isRealResource(resource))
|
|
101
188
|
continue;
|
|
102
189
|
const steps = [];
|
|
103
190
|
let order = 1;
|
|
104
|
-
const singular = resource
|
|
191
|
+
const singular = singularize(resource);
|
|
105
192
|
steps.push({ order: order++, method: "POST", path: group.basePath, description: `Create a new ${singular}`, interactionType: "success", expectedStatusCode: 201 });
|
|
106
193
|
if (group.paramPath)
|
|
107
194
|
steps.push({ order: order++, method: "GET", path: group.paramPath, description: `Get the created ${singular} by ID`, interactionType: "success", expectedStatusCode: 200 });
|
|
@@ -119,13 +206,56 @@ export function draftScenariosFromEndpoints(endpoints) {
|
|
|
119
206
|
requiresAuth: true,
|
|
120
207
|
estimatedComplexity: "moderate",
|
|
121
208
|
source: "code-inferred",
|
|
209
|
+
testType: "integration",
|
|
122
210
|
});
|
|
123
211
|
}
|
|
124
212
|
scenarios.push(...draftUniqueConstraintScenarios(resourceGroups));
|
|
125
|
-
scenarios.push(...draftCascadeDeleteScenarios(resourceGroups));
|
|
213
|
+
scenarios.push(...draftCascadeDeleteScenarios(resourceGroups, relationships));
|
|
126
214
|
scenarios.push(...draftPermissionBoundaryScenarios(resourceGroups));
|
|
215
|
+
scenarios.push(...draftDiffDirectScenarios(newEndpoints, resourceGroups));
|
|
127
216
|
return scenarios;
|
|
128
217
|
}
|
|
218
|
+
function buildCrossResourceScenario(parent, child, gParent, gChild, singularParent, singularChild) {
|
|
219
|
+
const steps = [];
|
|
220
|
+
let order = 1;
|
|
221
|
+
steps.push({
|
|
222
|
+
order: order++, method: "POST", path: gParent.basePath,
|
|
223
|
+
description: `Create a ${singularParent}`,
|
|
224
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
225
|
+
});
|
|
226
|
+
steps.push({
|
|
227
|
+
order: order++, method: "POST", path: gChild.basePath,
|
|
228
|
+
description: `Create a ${singularChild} referencing the ${singularParent}`,
|
|
229
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
230
|
+
chainsFrom: { sourceStep: 1, sourceField: `${singularParent}_id`, sourceLocation: "body", targetParam: `${singularParent}_id`, targetLocation: "body" },
|
|
231
|
+
});
|
|
232
|
+
if (gChild.paramPath && gChild.methods.has("GET")) {
|
|
233
|
+
steps.push({
|
|
234
|
+
order: order++, method: "GET", path: gChild.paramPath,
|
|
235
|
+
description: `Verify the ${singularChild} references the correct ${singularParent}`,
|
|
236
|
+
interactionType: "success", expectedStatusCode: 200,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
if (gChild.paramPath && gChild.methods.has("DELETE")) {
|
|
240
|
+
steps.push({
|
|
241
|
+
order: order++, method: "DELETE", path: gChild.paramPath,
|
|
242
|
+
description: `Clean up: delete the ${singularChild}`,
|
|
243
|
+
interactionType: "success", expectedStatusCode: 204,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
scenarioName: `${parent}-${child}-integration`,
|
|
248
|
+
description: `Multi-resource integration: create ${singularParent}, create ${singularChild} linked to it, verify, clean up`,
|
|
249
|
+
category: "workflow",
|
|
250
|
+
priority: "high",
|
|
251
|
+
steps,
|
|
252
|
+
chainingKeys: [`${singularParent}_id`, `${singularChild}_id`, "id"],
|
|
253
|
+
requiresAuth: true,
|
|
254
|
+
estimatedComplexity: "complex",
|
|
255
|
+
source: "code-inferred",
|
|
256
|
+
testType: "integration",
|
|
257
|
+
};
|
|
258
|
+
}
|
|
129
259
|
export function draftUniqueConstraintScenarios(resourceGroups) {
|
|
130
260
|
const scenarios = [];
|
|
131
261
|
for (const [resource, group] of resourceGroups) {
|
|
@@ -133,7 +263,7 @@ export function draftUniqueConstraintScenarios(resourceGroups) {
|
|
|
133
263
|
break;
|
|
134
264
|
if (!group.methods.has("POST") || !isRealResource(resource))
|
|
135
265
|
continue;
|
|
136
|
-
const singular = resource
|
|
266
|
+
const singular = singularize(resource);
|
|
137
267
|
scenarios.push({
|
|
138
268
|
scenarioName: `${resource}-unique-constraint`,
|
|
139
269
|
description: `Verify unique constraint: create ${singular}, attempt duplicate creation, expect 409 Conflict`,
|
|
@@ -160,25 +290,41 @@ export function draftUniqueConstraintScenarios(resourceGroups) {
|
|
|
160
290
|
requiresAuth: true,
|
|
161
291
|
estimatedComplexity: "moderate",
|
|
162
292
|
source: "code-inferred",
|
|
293
|
+
testType: "integration",
|
|
163
294
|
});
|
|
164
295
|
}
|
|
165
296
|
return scenarios;
|
|
166
297
|
}
|
|
167
|
-
export function draftCascadeDeleteScenarios(resourceGroups) {
|
|
298
|
+
export function draftCascadeDeleteScenarios(resourceGroups, relationships = new Map()) {
|
|
168
299
|
const scenarios = [];
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
for (let i = 0; i <
|
|
172
|
-
for (let j = i + 1; j <
|
|
173
|
-
|
|
174
|
-
|
|
300
|
+
const hasRelationships = relationships.size > 0;
|
|
301
|
+
const deletableResources = Array.from(resourceGroups.keys()).filter(r => isRealResource(r) && resourceGroups.get(r).methods.has("POST") && resourceGroups.get(r).methods.has("DELETE"));
|
|
302
|
+
for (let i = 0; i < deletableResources.length; i++) {
|
|
303
|
+
for (let j = i + 1; j < deletableResources.length; j++) {
|
|
304
|
+
if (scenarios.length >= MAX_DRAFTED_SCENARIOS_PER_CATEGORY)
|
|
305
|
+
break;
|
|
306
|
+
const r1 = deletableResources[i];
|
|
307
|
+
const r2 = deletableResources[j];
|
|
308
|
+
// Determine relationship direction: which is parent, which is child?
|
|
309
|
+
let parent, child;
|
|
310
|
+
if (hasRelationships) {
|
|
311
|
+
const r2DependsOnR1 = relationships.get(r2)?.has(r1) || relationships.get(r2)?.has(singularize(r1));
|
|
312
|
+
const r1DependsOnR2 = relationships.get(r1)?.has(r2) || relationships.get(r1)?.has(singularize(r2));
|
|
313
|
+
if (!r2DependsOnR1 && !r1DependsOnR2)
|
|
314
|
+
continue; // no detected relationship — skip
|
|
315
|
+
[parent, child] = r2DependsOnR1 ? [r1, r2] : [r2, r1];
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
// Fallback: treat first as parent (existing behaviour)
|
|
319
|
+
[parent, child] = [r1, r2];
|
|
320
|
+
}
|
|
175
321
|
const gParent = resourceGroups.get(parent);
|
|
176
322
|
const gChild = resourceGroups.get(child);
|
|
177
323
|
if (!gParent.paramPath || !gChild.paramPath)
|
|
178
324
|
continue;
|
|
179
|
-
const singularParent = parent
|
|
180
|
-
const singularChild = child
|
|
181
|
-
// Scenario A: cascade delete
|
|
325
|
+
const singularParent = singularize(parent);
|
|
326
|
+
const singularChild = singularize(child);
|
|
327
|
+
// Scenario A: cascade delete — parent delete removes child
|
|
182
328
|
scenarios.push({
|
|
183
329
|
scenarioName: `${parent}-${child}-cascade-delete`,
|
|
184
330
|
description: `Verify cascade delete: create ${singularParent}, create ${singularChild} referencing it, delete ${singularParent}, verify ${singularChild} is also deleted`,
|
|
@@ -211,43 +357,45 @@ export function draftCascadeDeleteScenarios(resourceGroups) {
|
|
|
211
357
|
requiresAuth: true,
|
|
212
358
|
estimatedComplexity: "complex",
|
|
213
359
|
source: "code-inferred",
|
|
360
|
+
testType: "integration",
|
|
214
361
|
});
|
|
215
362
|
// Scenario B: delete blocked by referential integrity — parent cannot be removed while children exist
|
|
216
|
-
scenarios.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
363
|
+
if (scenarios.length < MAX_DRAFTED_SCENARIOS_PER_CATEGORY) {
|
|
364
|
+
scenarios.push({
|
|
365
|
+
scenarioName: `${parent}-${child}-delete-blocked`,
|
|
366
|
+
description: `Verify referential integrity: create ${singularParent} with ${singularChild}, attempt to delete ${singularParent}, expect rejection (409/422), verify ${singularChild} is intact`,
|
|
367
|
+
category: "data_integrity",
|
|
368
|
+
priority: "high",
|
|
369
|
+
steps: [
|
|
370
|
+
{
|
|
371
|
+
order: 1, method: "POST", path: gParent.basePath,
|
|
372
|
+
description: `Create a ${singularParent}`,
|
|
373
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
order: 2, method: "POST", path: gChild.basePath,
|
|
377
|
+
description: `Create a ${singularChild} referencing the ${singularParent}`,
|
|
378
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
379
|
+
chainsFrom: { sourceStep: 1, sourceField: `${singularParent}_id`, sourceLocation: "body", targetParam: `${singularParent}_id`, targetLocation: "body" },
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
order: 3, method: "DELETE", path: gParent.paramPath,
|
|
383
|
+
description: `Attempt to delete the ${singularParent} — expect 409 Conflict or 422 if referential integrity blocks it`,
|
|
384
|
+
interactionType: "error", expectedStatusCode: 409,
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
order: 4, method: "GET", path: gChild.paramPath,
|
|
388
|
+
description: `Verify ${singularChild} is still intact after blocked delete — expect 200`,
|
|
389
|
+
interactionType: "success", expectedStatusCode: 200,
|
|
390
|
+
},
|
|
391
|
+
],
|
|
392
|
+
chainingKeys: [`${singularParent}_id`, `${singularChild}_id`, "id"],
|
|
393
|
+
requiresAuth: true,
|
|
394
|
+
estimatedComplexity: "complex",
|
|
395
|
+
source: "code-inferred",
|
|
396
|
+
testType: "integration",
|
|
397
|
+
});
|
|
398
|
+
}
|
|
251
399
|
}
|
|
252
400
|
if (scenarios.length >= MAX_DRAFTED_SCENARIOS_PER_CATEGORY)
|
|
253
401
|
break;
|
|
@@ -261,7 +409,7 @@ export function draftPermissionBoundaryScenarios(resourceGroups) {
|
|
|
261
409
|
break;
|
|
262
410
|
if (!isRealResource(resource))
|
|
263
411
|
continue;
|
|
264
|
-
const singular = resource
|
|
412
|
+
const singular = singularize(resource);
|
|
265
413
|
const protectedMethods = ["POST", "PUT", "PATCH", "DELETE"].filter(m => group.methods.has(m));
|
|
266
414
|
if (protectedMethods.length === 0)
|
|
267
415
|
continue;
|
|
@@ -283,6 +431,7 @@ export function draftPermissionBoundaryScenarios(resourceGroups) {
|
|
|
283
431
|
requiresAuth: false,
|
|
284
432
|
estimatedComplexity: "simple",
|
|
285
433
|
source: "code-inferred",
|
|
434
|
+
testType: "contract",
|
|
286
435
|
});
|
|
287
436
|
if (group.paramPath && group.methods.has("GET") && group.methods.has("POST") && scenarios.length < MAX_DRAFTED_SCENARIOS_PER_CATEGORY) {
|
|
288
437
|
scenarios.push({
|
|
@@ -306,8 +455,184 @@ export function draftPermissionBoundaryScenarios(resourceGroups) {
|
|
|
306
455
|
requiresAuth: true,
|
|
307
456
|
estimatedComplexity: "moderate",
|
|
308
457
|
source: "code-inferred",
|
|
458
|
+
testType: "integration",
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return scenarios;
|
|
463
|
+
}
|
|
464
|
+
// ── Diff-direct scenario drafting ──
|
|
465
|
+
// Generates targeted scenarios for each new endpoint in the branch diff.
|
|
466
|
+
// These get category "new_endpoint" which maps to the CRITICAL priority tier
|
|
467
|
+
// in the scorer, so they always fill the GENERATE slots before any structural
|
|
468
|
+
// scenario — aligning the plan with what the LLM naturally wants to do anyway.
|
|
469
|
+
/**
|
|
470
|
+
* Build the minimum steps for a diff-direct integration scenario.
|
|
471
|
+
* Prerequisite resources (e.g. POST /products before POST /orders) are NOT
|
|
472
|
+
* computed here — the execution plan instructs the LLM to discover them from
|
|
473
|
+
* source code (FK fields in request bodies) and prepend the steps itself.
|
|
474
|
+
*/
|
|
475
|
+
function diffDirectIntegration(method, resource, singular, group) {
|
|
476
|
+
const steps = [];
|
|
477
|
+
if (method === "POST") {
|
|
478
|
+
steps.push({
|
|
479
|
+
order: 1, method: "POST", path: group.basePath,
|
|
480
|
+
description: `Create a ${singular} — verify 201 and response fields`,
|
|
481
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
482
|
+
});
|
|
483
|
+
if (group.paramPath && group.methods.has("GET")) {
|
|
484
|
+
steps.push({
|
|
485
|
+
order: 2, method: "GET", path: group.paramPath,
|
|
486
|
+
description: `Get the created ${singular} — verify fields match`,
|
|
487
|
+
interactionType: "success", expectedStatusCode: 200,
|
|
488
|
+
chainsFrom: { sourceStep: 1, sourceField: "id", sourceLocation: "body", targetParam: `${singular}_id`, targetLocation: "path" },
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
// PUT/PATCH/DELETE: create the resource first so it exists
|
|
494
|
+
if (group.methods.has("POST")) {
|
|
495
|
+
steps.push({
|
|
496
|
+
order: 1, method: "POST", path: group.basePath,
|
|
497
|
+
description: `Create a ${singular} to be ${method === "DELETE" ? "deleted" : "updated"}`,
|
|
498
|
+
interactionType: "success", expectedStatusCode: 201,
|
|
309
499
|
});
|
|
310
500
|
}
|
|
501
|
+
const targetPath = group.paramPath ?? group.basePath;
|
|
502
|
+
const sourceStep = steps.length; // 1 if create step exists, 0 otherwise
|
|
503
|
+
steps.push({
|
|
504
|
+
order: steps.length + 1, method, path: targetPath,
|
|
505
|
+
description: method === "DELETE"
|
|
506
|
+
? `DELETE the ${singular} — expect 204 No Content`
|
|
507
|
+
: `${method} the ${singular} with valid data — verify updated response fields`,
|
|
508
|
+
interactionType: "success", expectedStatusCode: method === "DELETE" ? 204 : 200,
|
|
509
|
+
...(sourceStep > 0 ? { chainsFrom: { sourceStep, sourceField: "id", sourceLocation: "body", targetParam: `${singular}_id`, targetLocation: "path" } } : {}),
|
|
510
|
+
});
|
|
511
|
+
if (method === "DELETE" && group.paramPath && group.methods.has("GET")) {
|
|
512
|
+
steps.push({
|
|
513
|
+
order: steps.length + 1, method: "GET", path: group.paramPath,
|
|
514
|
+
description: `Verify the ${singular} is gone — expect 404`,
|
|
515
|
+
interactionType: "error", expectedStatusCode: 404,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const suffix = method === "DELETE" ? "delete" : method.toLowerCase();
|
|
520
|
+
return {
|
|
521
|
+
scenarioName: `${resource}-${suffix}-new-endpoint-happy-path`,
|
|
522
|
+
description: `New endpoint happy path: discover prerequisites from source code, then ${steps.map(s => `${s.method} ${s.path}`).join(" → ")}`,
|
|
523
|
+
category: "new_endpoint",
|
|
524
|
+
priority: "high",
|
|
525
|
+
steps,
|
|
526
|
+
chainingKeys: ["id", `${singular}_id`],
|
|
527
|
+
requiresAuth: true,
|
|
528
|
+
estimatedComplexity: "complex",
|
|
529
|
+
source: "code-inferred",
|
|
530
|
+
testType: "integration",
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
function diffDirectContract(method, path, resource) {
|
|
534
|
+
const expectedStatus = method === "POST" ? 201 : method === "DELETE" ? 204 : 200;
|
|
535
|
+
return {
|
|
536
|
+
scenarioName: `${resource}-${method.toLowerCase()}-new-endpoint-contract`,
|
|
537
|
+
description: `Contract: ${method} ${path} returns a schema-conformant response`,
|
|
538
|
+
category: "new_endpoint",
|
|
539
|
+
priority: "high",
|
|
540
|
+
steps: [{ order: 1, method, path, description: `${method} ${path} with valid input — verify response schema`, interactionType: "success", expectedStatusCode: expectedStatus }],
|
|
541
|
+
chainingKeys: [],
|
|
542
|
+
requiresAuth: true,
|
|
543
|
+
estimatedComplexity: "simple",
|
|
544
|
+
source: "code-inferred",
|
|
545
|
+
testType: "contract",
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
function diffDirectNotFound(method, path, resource, singular) {
|
|
549
|
+
return {
|
|
550
|
+
scenarioName: `${resource}-${method.toLowerCase()}-new-endpoint-not-found`,
|
|
551
|
+
description: `Edge case: ${method} ${path} with a non-existent ${singular} ID returns 404`,
|
|
552
|
+
category: "new_endpoint",
|
|
553
|
+
priority: "high",
|
|
554
|
+
steps: [{ order: 1, method, path, description: `${method} ${path} with non-existent ${singular} ID — expect 404 Not Found`, interactionType: "error", expectedStatusCode: 404 }],
|
|
555
|
+
chainingKeys: [],
|
|
556
|
+
requiresAuth: true,
|
|
557
|
+
estimatedComplexity: "simple",
|
|
558
|
+
source: "code-inferred",
|
|
559
|
+
testType: "contract",
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
function diffDirectValidation(method, path, resource) {
|
|
563
|
+
return {
|
|
564
|
+
scenarioName: `${resource}-${method.toLowerCase()}-new-endpoint-validation`,
|
|
565
|
+
description: `Validation: ${method} ${path} with missing required fields returns 422`,
|
|
566
|
+
category: "new_endpoint",
|
|
567
|
+
priority: "high",
|
|
568
|
+
steps: [{ order: 1, method, path, description: `${method} ${path} with empty/missing required fields — expect 422`, interactionType: "error", expectedStatusCode: 422 }],
|
|
569
|
+
chainingKeys: [],
|
|
570
|
+
requiresAuth: true,
|
|
571
|
+
estimatedComplexity: "simple",
|
|
572
|
+
source: "code-inferred",
|
|
573
|
+
testType: "contract",
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Draft scenarios that directly test each new endpoint in the branch diff.
|
|
578
|
+
*
|
|
579
|
+
* For each new endpoint, up to 3 scenarios are produced:
|
|
580
|
+
* PUT/PATCH → integration happy path (prereqs + create + PUT), contract, not-found
|
|
581
|
+
* POST → integration happy path (prereqs + POST + verify GET), contract, validation error
|
|
582
|
+
* DELETE → integration lifecycle (create → DELETE → verify 404), contract
|
|
583
|
+
* GET /{id} → contract, not-found
|
|
584
|
+
*
|
|
585
|
+
* All carry category "new_endpoint" → CRITICAL priority tier so they always
|
|
586
|
+
* rank above structural candidates and occupy the GENERATE slots.
|
|
587
|
+
*/
|
|
588
|
+
export function draftDiffDirectScenarios(newEndpoints, resourceGroups) {
|
|
589
|
+
if (newEndpoints.length === 0)
|
|
590
|
+
return [];
|
|
591
|
+
const scenarios = [];
|
|
592
|
+
const seen = new Set();
|
|
593
|
+
// Group flat list by path
|
|
594
|
+
const grouped = new Map();
|
|
595
|
+
for (const ep of newEndpoints) {
|
|
596
|
+
const methods = grouped.get(ep.path) ?? new Set();
|
|
597
|
+
methods.add(ep.method.toUpperCase());
|
|
598
|
+
grouped.set(ep.path, methods);
|
|
599
|
+
}
|
|
600
|
+
for (const [epPath, methods] of grouped) {
|
|
601
|
+
const resource = extractResourceName(epPath);
|
|
602
|
+
if (!resource)
|
|
603
|
+
continue;
|
|
604
|
+
const group = resourceGroups.get(resource);
|
|
605
|
+
if (!group)
|
|
606
|
+
continue;
|
|
607
|
+
const singular = singularize(resource);
|
|
608
|
+
const hasPathParam = epPath.includes("{");
|
|
609
|
+
const add = (s) => {
|
|
610
|
+
if (!seen.has(s.scenarioName)) {
|
|
611
|
+
seen.add(s.scenarioName);
|
|
612
|
+
scenarios.push(s);
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
for (const method of methods) {
|
|
616
|
+
if (method === "PUT" || method === "PATCH") {
|
|
617
|
+
add(diffDirectIntegration(method, resource, singular, group));
|
|
618
|
+
add(diffDirectContract(method, epPath, resource));
|
|
619
|
+
if (hasPathParam)
|
|
620
|
+
add(diffDirectNotFound(method, epPath, resource, singular));
|
|
621
|
+
}
|
|
622
|
+
else if (method === "POST") {
|
|
623
|
+
add(diffDirectIntegration(method, resource, singular, group));
|
|
624
|
+
add(diffDirectContract(method, epPath, resource));
|
|
625
|
+
add(diffDirectValidation(method, epPath, resource));
|
|
626
|
+
}
|
|
627
|
+
else if (method === "DELETE") {
|
|
628
|
+
add(diffDirectIntegration(method, resource, singular, group));
|
|
629
|
+
add(diffDirectContract(method, epPath, resource));
|
|
630
|
+
}
|
|
631
|
+
else if (method === "GET" && hasPathParam) {
|
|
632
|
+
add(diffDirectContract(method, epPath, resource));
|
|
633
|
+
add(diffDirectNotFound(method, epPath, resource, singular));
|
|
634
|
+
}
|
|
635
|
+
}
|
|
311
636
|
}
|
|
312
637
|
return scenarios;
|
|
313
638
|
}
|