@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.
Files changed (583) hide show
  1. package/build/commands/localDevTestChangesCommand.js +2 -1
  2. package/build/commands/recommendTestsAndExecuteCommand.js +15 -7
  3. package/build/commands/testThisEndpointCommand.js +35 -6
  4. package/build/execution/wrapperConfig.d.ts +56 -0
  5. package/build/execution/wrapperConfig.js +155 -0
  6. package/build/index.js +40 -10
  7. package/build/playwright/blueprintDigest.js +28 -7
  8. package/build/playwright/registerPlaywrightTools.js +47 -28
  9. package/build/playwright/traceExportStore.d.ts +22 -0
  10. package/build/playwright/traceExportStore.js +81 -0
  11. package/build/playwright/traceRecordingPrompt.js +11 -3
  12. package/build/prompts/code-reuse.js +118 -49
  13. package/build/prompts/fix-error-prompt.d.ts +9 -1
  14. package/build/prompts/fix-error-prompt.js +31 -28
  15. package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
  16. package/build/prompts/local-dev/local-dev-plan.js +8 -23
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +31 -4
  19. package/build/prompts/modularization/integration-test-modularization.js +13 -6
  20. package/build/prompts/modularization/ui-test-modularization.js +1 -1
  21. package/build/prompts/personas.js +1 -1
  22. package/build/prompts/pom-aware-code-reuse.js +7 -9
  23. package/build/prompts/reuse-hand-off.d.ts +64 -0
  24. package/build/prompts/reuse-hand-off.js +130 -0
  25. package/build/prompts/shared-helper-policy.d.ts +124 -2
  26. package/build/prompts/shared-helper-policy.js +178 -12
  27. package/build/prompts/startTraceCollectionPrompts.js +1 -1
  28. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +7 -8
  29. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  30. package/build/prompts/sut-setup/shared.d.ts +4 -1
  31. package/build/prompts/sut-setup/shared.js +6 -4
  32. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  33. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  34. package/build/prompts/test-maintenance/drift-analysis-prompt.d.ts +16 -8
  35. package/build/prompts/test-maintenance/drift-analysis-prompt.js +93 -38
  36. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  37. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  38. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +8 -5
  39. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  40. package/build/prompts/test-recommendation/recommendationShared.d.ts +1 -1
  41. package/build/prompts/test-recommendation/recommendationShared.js +0 -1
  42. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  43. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  44. package/build/prompts/testbot/testbot-prompts.js +133 -63
  45. package/build/recommendation/answers.js +18 -9
  46. package/build/recommendation/pullRequestText.js +1 -1
  47. package/build/recommendation/registerPlan.js +31 -17
  48. package/build/recommendation/subjectStep.d.ts +8 -10
  49. package/build/recommendation/subjectStep.js +17 -16
  50. package/build/recommendation/types.d.ts +71 -17
  51. package/build/recommendation/types.js +9 -15
  52. package/build/recommendation/verifierContracts.d.ts +7 -3
  53. package/build/recommendation/verifierContracts.js +8 -4
  54. package/build/recommendation/verifiers/changedFile.js +11 -13
  55. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  56. package/build/recommendation/verifiers/citedPath.js +16 -2
  57. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  58. package/build/recommendation/verifiers/coverage.js +190 -134
  59. package/build/recommendation/verifiers/defects.js +56 -16
  60. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  61. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  62. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  63. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  64. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  65. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  66. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  67. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  68. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  69. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  70. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  71. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  72. package/build/recommendation/verifiers/screenRoute.js +15 -10
  73. package/build/recommendation/verifiers/statedDifference.js +15 -8
  74. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  75. package/build/resources/analysisResources.js +7 -3
  76. package/build/resources/progressResource.js +4 -2
  77. package/build/resources/sutSetupResource.js +20 -2
  78. package/build/resources/testbotResource.js +19 -1
  79. package/build/services/AnalyticsService.js +3 -1
  80. package/build/services/ScenarioGenerationService.js +5 -5
  81. package/build/services/TestDiscoveryService.js +53 -9
  82. package/build/services/TestExecutionService.js +63 -21
  83. package/build/services/TestGenerationService.d.ts +1 -1
  84. package/build/services/TestGenerationService.js +43 -24
  85. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  86. package/build/skills/enhanceAssertionsSkill.js +103 -0
  87. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  88. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  89. package/build/skills/runTestSkill.d.ts +6 -0
  90. package/build/skills/runTestSkill.js +17 -0
  91. package/build/skills/skillFiles.d.ts +38 -0
  92. package/build/skills/skillFiles.js +94 -0
  93. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  94. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  95. package/build/tool-phases.js +4 -1
  96. package/build/tools/auth/loginTool.js +3 -1
  97. package/build/tools/auth/logoutTool.js +3 -1
  98. package/build/tools/budgetExcuse.d.ts +15 -0
  99. package/build/tools/budgetExcuse.js +113 -0
  100. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  101. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  102. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  103. package/build/tools/code-refactor/assertion-state.js +1 -1
  104. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  105. package/build/tools/code-refactor/assertionOperations.js +82 -0
  106. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  107. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  108. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  109. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  110. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  111. package/build/tools/code-refactor/gate-markers.js +95 -0
  112. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  113. package/build/tools/code-refactor/retrofit-state.js +44 -2
  114. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  115. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  116. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  117. package/build/tools/code-refactor/reuse-state.js +191 -61
  118. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  119. package/build/tools/code-refactor/utils-verify-gates.js +269 -30
  120. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  121. package/build/tools/code-refactor/verify-gates.js +36 -4
  122. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  123. package/build/tools/enrichTestWithMocksTool.js +9 -5
  124. package/build/tools/executeSkyrampTestTool.d.ts +118 -48
  125. package/build/tools/executeSkyrampTestTool.js +998 -372
  126. package/build/tools/execution-video-state.js +1 -1
  127. package/build/tools/fixErrorTool.js +5 -6
  128. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  129. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  130. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  131. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  132. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  133. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  134. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  135. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  136. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  137. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  138. package/build/tools/generate-tests/planGuard.js +6 -3
  139. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  140. package/build/tools/generate-tests/scenarioLint.js +17 -5
  141. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  142. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  143. package/build/tools/one-click/oneClickTool.js +3 -1
  144. package/build/tools/preflightMockCheckTool.js +23 -7
  145. package/build/tools/submitReportTool.d.ts +51 -12
  146. package/build/tools/submitReportTool.js +988 -161
  147. package/build/tools/test-management/actionsTool.js +241 -51
  148. package/build/tools/test-management/analyzeChangesTool.d.ts +8 -9
  149. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  150. package/build/tools/test-management/analyzeTestHealthTool.d.ts +0 -11
  151. package/build/tools/test-management/analyzeTestHealthTool.js +42 -76
  152. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  153. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  154. package/build/tools/test-management/resolveScreenTool.js +33 -9
  155. package/build/tools/test-management/testsOwedBeforeRun.d.ts +28 -0
  156. package/build/tools/test-management/testsOwedBeforeRun.js +53 -0
  157. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  158. package/build/tools/trace/stopTraceCollectionTool.js +42 -6
  159. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  160. package/build/tools/verifyTestDependenciesTool.js +54 -0
  161. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  162. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  163. package/build/types/AssertionOutcome.d.ts +1 -1
  164. package/build/types/EnhanceType.d.ts +6 -0
  165. package/build/types/EnhanceType.js +1 -0
  166. package/build/types/RepositoryAnalysis.d.ts +32 -72
  167. package/build/types/ReuseOutcome.d.ts +100 -7
  168. package/build/types/ReuseOutcome.js +16 -0
  169. package/build/types/StepMethod.js +20 -6
  170. package/build/types/TestAnalysis.d.ts +10 -2
  171. package/build/types/TestExecution.d.ts +45 -0
  172. package/build/types/TestRecommendation.d.ts +1 -1
  173. package/build/types/TestRecommendation.js +4 -1
  174. package/build/types/TestTypes.d.ts +16 -0
  175. package/build/types/TestTypes.js +40 -3
  176. package/build/types/TestbotPromptOptions.d.ts +9 -1
  177. package/build/types/TestbotReport.d.ts +45 -9
  178. package/build/utils/AnalysisStateManager.d.ts +137 -34
  179. package/build/utils/AnalysisStateManager.js +228 -44
  180. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  181. package/build/utils/assertion-verify/metrics.js +39 -6
  182. package/build/utils/assertion-verify/ui-lints.js +4 -2
  183. package/build/utils/branchDiff.js +47 -12
  184. package/build/utils/canonicalJson.js +3 -1
  185. package/build/utils/connectionErrors.d.ts +10 -0
  186. package/build/utils/connectionErrors.js +10 -0
  187. package/build/utils/dartRouteExtractor.js +36 -7
  188. package/build/utils/fixAttempts.d.ts +26 -0
  189. package/build/utils/fixAttempts.js +109 -0
  190. package/build/utils/frontendSelectors.js +23 -4
  191. package/build/utils/generatedTestRecord.d.ts +19 -0
  192. package/build/utils/generatedTestRecord.js +61 -0
  193. package/build/utils/gitStaging.js +7 -2
  194. package/build/utils/initAgent.js +26 -6
  195. package/build/utils/language-helper.js +60 -45
  196. package/build/utils/pathMatching.js +2 -1
  197. package/build/utils/pathSignatures.js +6 -2
  198. package/build/utils/planMatchKeys.d.ts +2 -2
  199. package/build/utils/planMatchKeys.js +20 -14
  200. package/build/utils/pom-catalog-parse.js +7 -2
  201. package/build/utils/pom-scope/import-expansion.js +6 -1
  202. package/build/utils/pom-scope/index.js +50 -12
  203. package/build/utils/pom-scope/scoring.js +13 -3
  204. package/build/utils/pom-scope/selector-extractor.js +16 -3
  205. package/build/utils/pom-scope/strip.d.ts +8 -0
  206. package/build/utils/pom-scope/strip.js +238 -0
  207. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  208. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  209. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  210. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  211. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  212. package/build/utils/pom-verify/bindings.js +5 -1
  213. package/build/utils/pom-verify/calls.js +9 -2
  214. package/build/utils/pom-verify/verify.js +27 -5
  215. package/build/utils/pr-comment-parser.js +20 -7
  216. package/build/utils/progress.d.ts +1 -1
  217. package/build/utils/progress.js +1 -1
  218. package/build/utils/proxy-terminal.d.ts +19 -1
  219. package/build/utils/proxy-terminal.js +346 -21
  220. package/build/utils/rebaselineSnapshots.d.ts +1 -1
  221. package/build/utils/rebaselineSnapshots.js +6 -16
  222. package/build/utils/removedUiElements.js +1 -1
  223. package/build/utils/reportLanguage.js +35 -7
  224. package/build/utils/reportVerification.d.ts +14 -8
  225. package/build/utils/reportVerification.js +19 -19
  226. package/build/utils/repositorySlug.d.ts +32 -0
  227. package/build/utils/repositorySlug.js +77 -0
  228. package/build/utils/reuseRouting.d.ts +10 -0
  229. package/build/utils/reuseRouting.js +21 -2
  230. package/build/utils/runContextGauge.d.ts +27 -0
  231. package/build/utils/runContextGauge.js +181 -0
  232. package/build/utils/runSerialized.d.ts +3 -0
  233. package/build/utils/runSerialized.js +39 -0
  234. package/build/utils/screenRoutes.js +74 -18
  235. package/build/utils/skyrampMdContent.d.ts +1 -1
  236. package/build/utils/skyrampMdContent.js +1 -1
  237. package/build/utils/skyrampSdkVersion.d.ts +9 -0
  238. package/build/utils/skyrampSdkVersion.js +16 -0
  239. package/build/utils/sourceRouteExtractor.js +13 -6
  240. package/build/utils/telemetry.d.ts +1 -0
  241. package/build/utils/telemetry.js +8 -5
  242. package/build/utils/testDependencyPolicy.d.ts +9 -0
  243. package/build/utils/testDependencyPolicy.js +809 -0
  244. package/build/utils/testExecutionRecord.d.ts +94 -0
  245. package/build/utils/testExecutionRecord.js +269 -0
  246. package/build/utils/testFileClassification.d.ts +8 -0
  247. package/build/utils/testFileClassification.js +39 -4
  248. package/build/utils/trace-parser.js +62 -14
  249. package/build/utils/urlPath.js +3 -1
  250. package/build/utils/utils-verify/action-key.d.ts +46 -0
  251. package/build/utils/utils-verify/action-key.js +120 -38
  252. package/build/utils/utils-verify/action-sites.d.ts +32 -0
  253. package/build/utils/utils-verify/action-sites.js +202 -0
  254. package/build/utils/utils-verify/allow.d.ts +122 -3
  255. package/build/utils/utils-verify/allow.js +146 -21
  256. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  257. package/build/utils/utils-verify/body-reach.js +333 -0
  258. package/build/utils/utils-verify/call-sites.d.ts +31 -7
  259. package/build/utils/utils-verify/call-sites.js +80 -13
  260. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  261. package/build/utils/utils-verify/delivered-imports.js +84 -0
  262. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  263. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  264. package/build/utils/utils-verify/in-house.d.ts +93 -0
  265. package/build/utils/utils-verify/in-house.js +719 -0
  266. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  267. package/build/utils/utils-verify/incumbent.js +75 -0
  268. package/build/utils/utils-verify/index.d.ts +2 -0
  269. package/build/utils/utils-verify/index.js +2 -0
  270. package/build/utils/utils-verify/language-spec.d.ts +51 -10
  271. package/build/utils/utils-verify/language-spec.js +232 -21
  272. package/build/utils/utils-verify/locate.d.ts +26 -0
  273. package/build/utils/utils-verify/locate.js +125 -23
  274. package/build/utils/utils-verify/module-name.d.ts +40 -0
  275. package/build/utils/utils-verify/module-name.js +98 -0
  276. package/build/utils/utils-verify/parse.d.ts +56 -7
  277. package/build/utils/utils-verify/parse.js +195 -40
  278. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  279. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  280. package/build/utils/utils-verify/stage.d.ts +5 -0
  281. package/build/utils/utils-verify/stage.js +47 -2
  282. package/build/utils/utils-verify/status-once.d.ts +62 -0
  283. package/build/utils/utils-verify/status-once.js +207 -0
  284. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  285. package/build/utils/utils-verify/typecheck.js +338 -0
  286. package/build/utils/utils-verify/verify.d.ts +79 -3
  287. package/build/utils/utils-verify/verify.js +531 -61
  288. package/build/utils/versions.d.ts +3 -3
  289. package/build/utils/versions.js +1 -1
  290. package/build/utils/workspaceAuth.js +107 -37
  291. package/build/workspace/queryParamResolution.js +11 -4
  292. package/build/workspace/workspace.d.ts +72 -52
  293. package/build/workspace/workspace.js +19 -15
  294. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  295. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  296. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  297. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  298. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  299. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  300. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  301. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  302. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  509. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  510. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  511. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  512. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  513. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  514. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  515. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  516. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  518. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  519. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  520. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  521. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  522. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  523. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  524. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  525. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  526. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  527. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  528. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  529. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  530. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  531. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  532. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  533. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  534. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  535. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  536. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  537. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  538. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  539. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  540. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  541. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  542. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  543. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  544. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  545. package/node_modules/playwright/package.json +2 -2
  546. package/package.json +7 -6
  547. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  548. package/plugin/prompts/generate-tests/generation.md +1 -1
  549. package/plugin/prompts/plan-tests.md +14 -14
  550. package/plugin/prompts/testbot-task1.md +2 -2
  551. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  552. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  553. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  554. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  555. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  556. package/plugin/skills/fix-test-import-errors/SKILL.md +45 -50
  557. package/plugin/skills/run-test/SKILL.md +16 -0
  558. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  559. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  560. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  561. package/build/adapters/jestAdapter.d.ts +0 -14
  562. package/build/adapters/jestAdapter.js +0 -113
  563. package/build/adapters/mochaAdapter.d.ts +0 -13
  564. package/build/adapters/mochaAdapter.js +0 -87
  565. package/build/adapters/playwrightAdapter.d.ts +0 -17
  566. package/build/adapters/playwrightAdapter.js +0 -182
  567. package/build/adapters/pytestAdapter.d.ts +0 -15
  568. package/build/adapters/pytestAdapter.js +0 -108
  569. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  570. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  571. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  572. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  573. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  574. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  575. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  576. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  577. package/build/tools/runExistingTestsTool.d.ts +0 -138
  578. package/build/tools/runExistingTestsTool.js +0 -644
  579. package/build/types/ExternalTestExecution.d.ts +0 -67
  580. package/build/types/ExternalTestExecution.js +0 -8
  581. package/build/workspace/testSuites.d.ts +0 -20
  582. package/build/workspace/testSuites.js +0 -17
  583. 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, resolveRunStatePath } from "../../utils/AnalysisStateManager.js";
7
+ import { StateManager, resolveOwnRunStatePath, } from "../../utils/AnalysisStateManager.js";
8
8
  import { toolError } from "../../utils/utils.js";
9
- import { TestType } 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, 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.object({
28
- order: z.number().int().positive().describe("This step's position in the scenario, from 1. `stepUnderTest` and `routes` name a step by this number."),
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, { message: "path must not be blank" })
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.string().optional().describe("What this step does, in one line."),
35
- interactionType: z.string().optional().describe("success, error, or another label for what this step exercises."),
36
- requestBody: z.unknown().optional().describe(`Request payload for this step, when it sends one. ${CREATED_VALUE_PLACEHOLDER}`),
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.number().int().optional().describe("Status code this step expects."),
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
- }, { message: "a navigate step's path is a URL path such as /login", path: ["path"] });
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
- changes: z
65
- .array(z.string())
66
- .optional()
67
- .describe("The ids of the changes that this test proves. Take the ids from your `changes` list. 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."),
68
- defects: z
69
- .array(z.string())
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.object({
93
- plannedTestId: z.string().describe("The other planned test this one is distinct from, named by its `scenarioName`."),
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
- }).strict())
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.object({
100
- file: z.string().describe("Repository-relative path of an existing test you read that exercises this change."),
101
- differsBy: z.string().describe("What this planned test checks that the existing test does not."),
102
- }).strict())
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.object({
111
- step: z.number().int().describe("The `order` of the step this file declares."),
112
- file: z.string().describe("Repository-relative path of the file that declares what that step calls."),
113
- }).strict())
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.string().describe("Repository-relative path of the changed file that renders this screen."),
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 = [element.accessibleName, element.testId, element.stableId].some((value) => typeof value === "string" && value.trim().length > 0);
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) ? plannedTest.declarations : undefined;
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.object({
308
+ const registerPlannedTestSchema = z.preprocess(hoistDeclarationFields, z
309
+ .object({
215
310
  scenarioName: z
216
311
  .string()
217
- .refine((value) => value.trim().length > 0, { message: "scenarioName must not be blank" })
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: z
316
+ repository: repositorySlugField("a planned test", "which has the change this test is targeting"),
317
+ description: z
220
318
  .string()
221
- .optional()
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(PLAN_TEST_TYPES)
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), { message: "stateFile must be an absolute path" })
374
+ .refine((p) => path.isAbsolute(p), {
375
+ message: "stateFile must be an absolute path",
376
+ })
279
377
  .optional()
280
- .describe("Optional. A Testbot run finds its own state file, so leave this out. Give an absolute path only to name a state file the run would not find by itself."),
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, { message: "a change id must not be blank" })
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.string().describe("The change in one sentence, as the pull request must make it."),
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
- cases: z
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.literal(true).optional().describe("The parameter is left out of the request."),
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 || String(entry.derived ?? "").trim().length === 0, {
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, { message: "a `cases` list with no entry states no input — leave it out instead" })
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, { message: "a defect id must not be blank" })
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.string().describe("Repository-relative path of the file that holds the defect, spelled as the diff spells it."),
379
- line: z.number().int().positive().optional().describe("1-based line of the wrong statement. Advisory; nothing checks it."),
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 gets a planned test that cites it in `defects` and expects to fail, 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."),
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 checkout: a change is credited as covered only when it does, and `existingCoverage` objects when it does not."),
443
- differsBy: z.string().describe("What your edit changes in that test, in one sentence."),
444
- changes: z
445
- .array(z.string())
446
- .describe("The ids of the declared changes this maintenance covers, spelled as your own `changes` list gives them."),
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.object({
453
- objectionId: z.string().describe("The objection's id, exactly as this tool reported it. Answers are matched by id, never by position."),
454
- answer: z.string().describe("Why the objection does not apply, or what you decided instead."),
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
- }).strict())
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
- ...(input.repository ? { repository: input.repository } : {}),
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: { ...rest, asserts: declared?.asserts ?? "", ...(elements ? { elements } : {}) },
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
- { repo: state.metadata?.repository ?? "the primary repository", repositoryPath: state.metadata?.repositoryPath, data: state },
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
- const roots = [];
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
- const real = fs.realpathSync(section.repositoryPath);
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
- return roots.some((root) => fileExistsWithinRoot(root, cited));
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
- * Built like {@link makeCitedFileCheck}: one resolver per checkout, asked in turn,
558
- * so a planned test does not have to say which repository its file lives in. The
559
- * scan is lazy inside each resolver and reused across planned tests, so a plan with
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
- * A repository that CAN speak for the file wins: `undefined` from a resolver means
563
- * "not my file, or not a framework I read", so it is skipped, and the first
564
- * definite answer is returned. Every resolver saying `undefined` is the answer the
565
- * check stays silent on.
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) => createScreenRouteResolver(section.repositoryPath));
571
- return (relativePath) => {
572
- let unmounted;
573
- for (const resolve of resolvers) {
574
- const routes = resolve(relativePath);
575
- if (routes === undefined)
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 that names one is checked against it alone.
624
- // A planned test that names none reads every entry, which is every planned test of a
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.filter((_s, i) => !listings[i]?.length).map((s) => s.repo),
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 on ordinary field validation, and on three rules that read more than one field: a non-UI planned test with an empty `steps` list, a `ui` or `e2e` planned test whose steps make no HTTP call and names no `elements.pageUrl`, and an `elements.items` entry carrying no name and no identifier. " +
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 = resolveRunStatePath(params.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.writeData({ ...rootData, plan: result.plan, registrationCount: registrationNumber }, { step: TOOL_NAME });
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 { content: [{ type: "text", text: renderPlanResult(result) }] };
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)}`);