@skyramp/mcp 0.4.1 → 0.4.2-rc.1

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