@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
@@ -0,0 +1,3 @@
1
+ import { type UtilsHelper } from "./parse.js";
2
+ import type { UtilsViolation } from "./verify.js";
3
+ export declare function incumbentSignatureViolations(headHelpers: readonly UtilsHelper[], workHelpers: readonly UtilsHelper[], file: string): UtilsViolation[];
@@ -0,0 +1,75 @@
1
+ import { hasDefault, paramName } from "./parse.js";
2
+ /**
3
+ * A helper defined at HEAD keeps the signature it has. Callers this run cannot see
4
+ * depend on it — the earlier run's tests, and anything the customer wrote against
5
+ * the module since — so the reuse step may ADD a parameter that carries a default
6
+ * and nothing else. Stated for Skyramp's own module because the status rule gave a
7
+ * run a reason to break it: told the expected status takes no default, one run
8
+ * stripped the defaults from three incumbents and rewrote their parameter lists to
9
+ * satisfy the rule, while two others left the incumbents alone. The status rule
10
+ * governs helpers this run writes; this is the gate that makes the other answer
11
+ * impossible.
12
+ *
13
+ * The same policy — a signature at HEAD is frozen, and widening by an appended
14
+ * defaulted parameter is the one permitted change — is enforced for the CUSTOMER's
15
+ * own module by `additiveChanges` in in-house.ts, under the `in-house-modified`
16
+ * kind. Two mechanisms encode one rule today: that one compares helper BODIES as
17
+ * well, and reads its own HEAD copy. They should converge.
18
+ *
19
+ * Read from the two parameter lists, by position: an incumbent parameter keeps its
20
+ * name and, when it had a default (or was optional), keeps one; a parameter beyond
21
+ * the count at HEAD carries a default. A helper HEAD does not hold is this run's and
22
+ * is not judged here. The body is not compared — that is the retrofit-equivalence
23
+ * gate's question, asked from the caller's side.
24
+ */
25
+ const OPTIONAL_RE = /^[A-Za-z_$][\w$]*\s*\?(?:\s*:|$)/;
26
+ const omittable = (p) => hasDefault(p) || OPTIONAL_RE.test(p) || /^(?:\.\.\.|\*)/.test(p);
27
+ /** A parameter list as the agent should READ it: each name, and whether it carries a
28
+ * default. The default's VALUE is deliberately left out, not unavailable: `params`
29
+ * keeps string contents (see signatureParams), so `fields = "id,email"` is there to
30
+ * quote. Eliding it keeps the finding short and sends the agent to the file at HEAD,
31
+ * which is where the signature is restored from either way. Quoting the value would
32
+ * need a length cap — a default can be a whole request body. */
33
+ function describe(params) {
34
+ return params
35
+ .map((p) => (omittable(p) ? `${paramName(p)} = …` : paramName(p)))
36
+ .join(", ");
37
+ }
38
+ export function incumbentSignatureViolations(headHelpers, workHelpers, file) {
39
+ const out = [];
40
+ const workByName = new Map(workHelpers.map((h) => [h.name, h]));
41
+ for (const head of headHelpers) {
42
+ const work = workByName.get(head.name);
43
+ if (!work || !head.params || !work.params)
44
+ continue;
45
+ const faults = [];
46
+ head.params.forEach((was, i) => {
47
+ const now = work.params[i];
48
+ const wasName = paramName(was);
49
+ if (now === undefined) {
50
+ faults.push(`parameter ${i + 1} (\`${wasName}\`) was removed`);
51
+ return;
52
+ }
53
+ const nowName = paramName(now);
54
+ if (nowName !== wasName) {
55
+ faults.push(`parameter ${i + 1} is \`${nowName}\` and was \`${wasName}\``);
56
+ return;
57
+ }
58
+ if (omittable(was) && !omittable(now))
59
+ faults.push(`\`${wasName}\` lost its default`);
60
+ });
61
+ for (const added of work.params.slice(head.params.length))
62
+ if (!omittable(added))
63
+ faults.push(`\`${paramName(added)}\` was added without a default`);
64
+ if (faults.length === 0)
65
+ continue;
66
+ out.push({
67
+ kind: "incumbent-signature",
68
+ file,
69
+ helper: head.name,
70
+ line: work.line,
71
+ detail: `\`${head.name}\` is defined at HEAD as \`(${describe(head.params)})\` and now as \`(${describe(work.params)})\` — ${faults.join("; ")}. Callers this run cannot see depend on the signature at HEAD: restore it as it was. Add what you need as a new parameter with a default, or as a new helper. The expected-status rule governs helpers this run writes, never an incumbent's default`,
72
+ });
73
+ }
74
+ return out;
75
+ }
@@ -5,4 +5,6 @@ export * from "./locate.js";
5
5
  export * from "./verify.js";
6
6
  export * from "./stage.js";
7
7
  export * from "./call-sites.js";
8
+ export * from "./action-sites.js";
8
9
  export * from "./retrofit-equivalence.js";
10
+ export * from "./in-house.js";
@@ -5,4 +5,6 @@ export * from "./locate.js";
5
5
  export * from "./verify.js";
6
6
  export * from "./stage.js";
7
7
  export * from "./call-sites.js";
8
+ export * from "./action-sites.js";
8
9
  export * from "./retrofit-equivalence.js";
10
+ export * from "./in-house.js";
@@ -1,20 +1,27 @@
1
+ export type UtilsLanguage = "python" | "typescript" | "javascript";
1
2
  /**
2
- * Language-parametric description of a shared SkyrampUtils file, and the invariants
3
- * every helper in it must hold. Encoded as DATA rather than as per-language checks so
4
- * that adding a language (or a helper family with a different assertion rule, e.g.
5
- * browser helpers) is a table entry, not a second verifier.
3
+ * A Playwright name as the language SPELLS it: camelCase unchanged, Python
4
+ * snake_case. `toBeVisible` `to_be_visible`, `waitForLoadState`
5
+ * `wait_for_load_state`. Stated ONCE, so a caller that shows a name to the agent and
6
+ * a caller that matches one in source cannot disagree about how Python spells it.
6
7
  *
7
- * The invariants come from the prompts that author these files the HELPER SHAPE
8
- * block in the integration modularization prompt and the API near-duplicate rules in
9
- * the reuse prompt and exist here because prompt rules are LLM-enforced only:
10
- * SKYR-4196 Part B runs 5 and 11 leaked a scenario-literal body assertion into a shared
11
- * helper despite both rules being in the prompt.
8
+ * SPELLING ONLY this is not a JavaScript-to-Python API map, and a name whose
9
+ * Python form differs in SHAPE is not its business. `waitForResponse` is the one to
10
+ * remember: Playwright Python has no `wait_for_response`, only the
11
+ * `expect_response(...)` context manager, so converting that name yields a call that
12
+ * does not exist. It did, and the agent was told to make it. Where the two APIs
13
+ * differ by more than case, the caller names each language's form itself.
12
14
  */
13
- export type UtilsLanguage = "python" | "typescript" | "javascript";
15
+ export declare function playwrightSpelling(name: string, language: UtilsLanguage): string;
14
16
  export interface UtilsLanguageSpec {
15
17
  language: UtilsLanguage;
16
18
  /** File extensions (with dot) a utils file in this language can carry. */
17
19
  extensions: string[];
20
+ /** The basename the reuse prompt prescribes for a shared module in this language.
21
+ * ONE declaration: the prompts render it into the instructions and the gate checks
22
+ * the delivered file against it, so the name the agent is told and the name the
23
+ * pass demands cannot drift apart. */
24
+ fileName: string;
18
25
  commentPrefix: "#" | "//";
19
26
  /** Matches the FIRST line of a module-level helper definition; group 1 is the name. */
20
27
  helperStart: RegExp;
@@ -36,10 +43,19 @@ export interface UtilsLanguageSpec {
36
43
  allowedBrowserAssertion: RegExp;
37
44
  /** Names `specContent` imports from the utils module whose basename stem is `stem`. */
38
45
  importedNames(specContent: string, stem: string): string[];
46
+ /** The local names `specContent` binds the utils MODULE itself to — `import * as
47
+ * utils`, `const utils = require(…)`, `import SkyrampUtils as utils` — under
48
+ * which a helper is called as `<qualifier>.<name>(`. Empty for named imports.
49
+ * A call qualified by anything else (`client.getOrder(`) is another object's
50
+ * method, whatever the helper's name. */
51
+ moduleQualifiers(specContent: string, stem: string): string[];
39
52
  }
40
53
  /** Path parameters spelled `{id}`, `${id}`, `:id` all normalise to `{}` so two helpers
41
54
  * for `/orders/{order_id}` and `/orders/{id}` compare equal. */
42
55
  export declare function normalizePath(p: string): string;
56
+ /** The status of a response as the assertion's RECEIVER — `r.status`, `r.statusCode`,
57
+ * `res.status_code`, `res.status()` — and never a body/json/data field of it. */
58
+ export declare const STATUS_RECEIVER = "(?![\\w.]*\\.(?:body|json|data|payload)\\b)[\\w.]+\\.status(?:_?[cC]ode)?(?:\\(\\))?";
43
59
  export declare const UTILS_LANGUAGE_SPECS: Record<UtilsLanguage, UtilsLanguageSpec>;
44
60
  /**
45
61
  * The two kinds of shared helper, keyed by the test type's substrate — the same
@@ -62,7 +78,32 @@ export interface HelperFamilySpec {
62
78
  /** One clause for the fix-instruction sentence — composed by the gate, never
63
79
  * restated there (the browser clause reads as a continuation of the api one). */
64
80
  fixRule: string;
81
+ /** The sibling inline call-site advisory's family-specific half: what a site is
82
+ * called, what the helper already does with it, and how to replace it. The gate
83
+ * appends the tail both families share. */
84
+ inlineSite: {
85
+ /** The prompt's noun for a site — `HelperPolicy.inlineSite.noun`. */
86
+ noun: string;
87
+ /** `… that a shared helper already <verb>:` */
88
+ already: string;
89
+ /** What makes a site a candidate, and what the replacement keeps. */
90
+ instruction: string;
91
+ /** The copy as the shared tail names it inside a local helper: `that request`
92
+ * / `the sequence`. */
93
+ localCopy: string;
94
+ };
65
95
  }
96
+ /**
97
+ * The RECEIVED value inside `expect(...)` — its first argument, up to the matcher.
98
+ *
99
+ * Only the first, because Playwright takes a message as the second: `expect(locator,
100
+ * "why this matters")`. Reading every argument let that message decide, so a
101
+ * structural wait whose message merely NAMED a text-selecting form was refused — and
102
+ * a refusal blocks a delivery that is right, which is worse than missing one that is
103
+ * wrong. The split walks bracket depth on a copy whose strings are blanked, so a comma
104
+ * inside a selector or a message does not end the argument.
105
+ */
106
+ export declare function expectArgs(expr: string): string;
66
107
  export declare const HELPER_FAMILIES: Record<HelperFamily, HelperFamilySpec>;
67
108
  /** The helper family a test type's shared helpers follow. Unlike `isBrowserTestType`,
68
109
  * an ABSENT test type resolves to `api`: this runs against a utils file that already
@@ -1,3 +1,51 @@
1
+ /**
2
+ * Language-parametric description of a shared SkyrampUtils file, and the invariants
3
+ * every helper in it must hold. Encoded as DATA rather than as per-language checks so
4
+ * that adding a language (or a helper family with a different assertion rule, e.g.
5
+ * browser helpers) is a table entry, not a second verifier.
6
+ *
7
+ * The invariants come from the prompts that author these files — the HELPER SHAPE
8
+ * block in the integration modularization prompt and the API near-duplicate rules in
9
+ * the reuse prompt — and exist here because prompt rules are LLM-enforced only:
10
+ * SKYR-4196 Part B runs 5 and 11 leaked a scenario-literal body assertion into a shared
11
+ * helper despite both rules being in the prompt.
12
+ */
13
+ import { API_HELPERS, BROWSER_HELPERS, HELPER_ASSERTION_POLICIES, CONTENT_ROLES, } from "../../prompts/shared-helper-policy.js";
14
+ import { escapeRegExp } from "../regex.js";
15
+ /**
16
+ * A Playwright name as the language SPELLS it: camelCase unchanged, Python
17
+ * snake_case. `toBeVisible` → `to_be_visible`, `waitForLoadState` →
18
+ * `wait_for_load_state`. Stated ONCE, so a caller that shows a name to the agent and
19
+ * a caller that matches one in source cannot disagree about how Python spells it.
20
+ *
21
+ * SPELLING ONLY — this is not a JavaScript-to-Python API map, and a name whose
22
+ * Python form differs in SHAPE is not its business. `waitForResponse` is the one to
23
+ * remember: Playwright Python has no `wait_for_response`, only the
24
+ * `expect_response(...)` context manager, so converting that name yields a call that
25
+ * does not exist. It did, and the agent was told to make it. Where the two APIs
26
+ * differ by more than case, the caller names each language's form itself.
27
+ */
28
+ export function playwrightSpelling(name, language) {
29
+ return language === "python"
30
+ ? name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase()
31
+ : name;
32
+ }
33
+ function matcherAlternation(names, language) {
34
+ return names.map((n) => playwrightSpelling(n, language)).join("|");
35
+ }
36
+ /** `expect(<anything, one level of nesting>).<negation?><one permitted matcher>(`
37
+ *
38
+ * The negation is spelled per language, like the matcher itself: TypeScript chains
39
+ * it (`expect(x).not.toBeVisible()`), Python folds it into the method name
40
+ * (`expect(x).not_to_be_visible()` — there is no `.not` object to chain through).
41
+ * Reading `.not.` for Python rejected every negated Python assertion the policy
42
+ * permits, and accepted a form Python cannot run. */
43
+ function browserAssertionRe(language) {
44
+ const python = language === "python";
45
+ const expectCall = python ? "\\bexpect\\s*" : "\\bexpect(?:\\.soft)?\\s*";
46
+ const negation = python ? "(?:not_)?" : "(?:not\\.)?";
47
+ return new RegExp(`${expectCall}\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)\\s*\\.\\s*${negation}(?:${matcherAlternation(HELPER_ASSERTION_POLICIES.browser.permittedMatchers, language)})\\s*\\(`);
48
+ }
1
49
  /** Path parameters spelled `{id}`, `${id}`, `:id` all normalise to `{}` so two helpers
2
50
  * for `/orders/{order_id}` and `/orders/{id}` compare equal. */
3
51
  export function normalizePath(p) {
@@ -15,6 +63,7 @@ export function normalizePath(p) {
15
63
  const PYTHON = {
16
64
  language: "python",
17
65
  extensions: [".py"],
66
+ fileName: "SkyrampUtils.py",
18
67
  commentPrefix: "#",
19
68
  helperStart: /^(?:async\s+)?def\s+([A-Za-z_]\w*)\s*\(/,
20
69
  methodRe: /\bmethod\s*=\s*["']([A-Za-z]+)["']/,
@@ -25,8 +74,7 @@ const PYTHON = {
25
74
  // reads the body (`json()`, `get_response_value`, `.text`, subscripts) is a body
26
75
  // assertion whatever else the line says.
27
76
  allowedAssertion: /^\s*assert\b(?=.*\bstatus_code\b)(?!.*(?:\.json\(|get_response_value|\.text\b|\.content\b|\[["']))/,
28
- // Playwright for Python spells the structural matchers in snake_case.
29
- allowedBrowserAssertion: /\bexpect\s*\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)\s*\.\s*(?:not\.)?to_be_(?:visible|hidden|attached|enabled|disabled|editable|focused|in_viewport)\s*\(/,
77
+ allowedBrowserAssertion: browserAssertionRe("python"),
30
78
  importedNames(spec, stem) {
31
79
  const names = new Set();
32
80
  const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -54,7 +102,25 @@ const PYTHON = {
54
102
  }
55
103
  return [...names];
56
104
  },
105
+ moduleQualifiers(spec, stem) {
106
+ const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
107
+ const mod = new RegExp(`^\\s*import\\s+(?:[\\w.]*\\.)?${stemRe}(?:\\s+as\\s+([A-Za-z_]\\w*))?\\s*$`, "m").exec(spec);
108
+ return mod ? [mod[1] ?? stem] : [];
109
+ },
57
110
  };
111
+ /** The status of a response as the assertion's RECEIVER — `r.status`, `r.statusCode`,
112
+ * `res.status_code`, `res.status()` — and never a body/json/data field of it. */
113
+ export const STATUS_RECEIVER = "(?![\\w.]*\\.(?:body|json|data|payload)\\b)[\\w.]+\\.status(?:_?[cC]ode)?(?:\\(\\))?";
114
+ function tsModuleQualifiers(spec, stem) {
115
+ const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
116
+ const from = `["'][^"']*\\/${stemRe}(?:\\.[cm]?[jt]s)?["']`;
117
+ const out = new Set();
118
+ for (const m of spec.matchAll(new RegExp(`import\\s*\\*\\s*as\\s+([A-Za-z_$][\\w$]*)\\s*from\\s*${from}`, "g")))
119
+ out.add(m[1]);
120
+ for (const m of spec.matchAll(new RegExp(`(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*require\\(\\s*${from}\\s*\\)`, "g")))
121
+ out.add(m[1]);
122
+ return [...out];
123
+ }
58
124
  function tsImportedNames(spec, stem) {
59
125
  const names = new Set();
60
126
  const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -71,8 +137,13 @@ function tsImportedNames(spec, stem) {
71
137
  names.add(name);
72
138
  }
73
139
  }
74
- for (const m of spec.matchAll(new RegExp(`import\\s*\\*\\s*as\\s+([A-Za-z_$][\\w$]*)\\s*from\\s*${from}`, "g"))) {
75
- for (const use of spec.matchAll(new RegExp(`\\b${m[1]}\\.([A-Za-z_$][\\w$]*)`, "g")))
140
+ // Every name the spec binds the MODULE to — `import * as utils`, `const utils =
141
+ // require(…)` — and each `<qualifier>.<name>` use under it. Read from the one
142
+ // declaration of those forms: the two lists disagreed, so a helper called through
143
+ // a module-object require counted as a qualifier and never as an import, and its
144
+ // contract was never read.
145
+ for (const qualifier of tsModuleQualifiers(spec, stem)) {
146
+ for (const use of spec.matchAll(new RegExp(`\\b${escapeRegExp(qualifier)}\\.([A-Za-z_$][\\w$]*)`, "g")))
76
147
  names.add(use[1]);
77
148
  }
78
149
  for (const m of spec.matchAll(new RegExp(`(?:const|let|var)\\s*\\{([^}]*)\\}\\s*=\\s*require\\(\\s*${from}\\s*\\)`, "g"))) {
@@ -87,27 +158,41 @@ function tsImportedNames(spec, stem) {
87
158
  }
88
159
  const TYPESCRIPT = {
89
160
  language: "typescript",
90
- extensions: [".ts", ".mts", ".cts"],
161
+ fileName: "skyrampUtils.ts",
162
+ // `.tsx` too: a Playwright spec in a React repository carries that extension, and a
163
+ // file this cannot name is a file the delivery-time strip skips.
164
+ extensions: [".ts", ".mts", ".cts", ".tsx"],
91
165
  commentPrefix: "//",
92
166
  // `function f(`, `const f = (…) =>`, `const f = async function (`, `const f = <T,>(…) =>`
93
167
  // — and a signature Prettier wrapped, whose `(` still opens on the definition line.
94
168
  helperStart: /^(?:export\s+)?(?:(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*[<(]|(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*(?::[^=]*)?=\s*(?:async\s*)?(?:function\b|<[^>]*>\s*\(|\(|[A-Za-z_$][\w$]*\s*=>))/,
95
169
  methodRe: /\bmethod\s*:\s*["'`]([A-Za-z]+)["'`]/,
96
170
  pathRe: /\bpath\s*:\s*["'`]([^"'`]+)["'`]/,
97
- assertionRe: /\bexpect(?:\.soft)?\s*\(/,
171
+ // `expect()` and the `node:assert` idiom a JavaScript suite may use instead
172
+ // (`assert.strictEqual(…)`, `assert(…)`). A helper written in the second was
173
+ // invisible — no assertion recorded, so neither the body rule nor the status
174
+ // rules could see it — while the spec beside it was read. Neither name may
175
+ // follow an identifier or a dot: `console.assert(…)` logs on failure and
176
+ // asserts nothing, and `\b` alone matches after the dot.
177
+ assertionRe: /(?<![\w$.])(?:expect(?:\.soft)?|assert(?:\.\w+)?)\s*\(/,
98
178
  allowedAssertion:
99
179
  // The receiver is the response itself, never a body/json/data field of it:
100
180
  // `expect(res.body.status).toBe("paid")` is a body assertion. An optional
101
181
  // string message argument (`expect(r.statusCode, 'status code')`) is the
102
- // form codegen emits and still a status-only assertion.
103
- /\bexpect(?:\.soft)?\s*\(\s*(?![\w.]*\.(?:body|json|data|payload)\b)[\w.]+\.status(?:_?[cC]ode)?(?:\(\))?\s*(?:,\s*(?:"[^"]*"|'[^']*'|`[^`]*`)\s*)?\)\s*\.\s*(?:not\.)?(?:toBe|toEqual|toStrictEqual|toBeGreaterThan|toBeLessThan|toBeOneOf)\s*\(/,
104
- allowedBrowserAssertion: /\bexpect(?:\.soft)?\s*\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)\s*\.\s*(?:not\.)?toBe(?:Visible|Hidden|Attached|Enabled|Disabled|Editable|Focused|InViewport)\s*\(/,
182
+ // form codegen emits and still a status-only assertion. The assert form takes
183
+ // the same receiver as its first argument (`assert.strictEqual(r.statusCode,
184
+ // 200)`) or inside a comparison (`assert(r.status === 200)`).
185
+ new RegExp(`(?<![\\w$.])expect(?:\\.soft)?\\s*\\(\\s*${STATUS_RECEIVER}\\s*(?:,\\s*(?:"[^"]*"|'[^']*'|\`[^\`]*\`)\\s*)?\\)\\s*\\.\\s*(?:not\\.)?(?:toBe|toEqual|toStrictEqual|toBeGreaterThan|toBeLessThan|toBeOneOf)\\s*\\(` +
186
+ `|(?<![\\w$.])assert(?:\\.(?:strictEqual|equal|deepStrictEqual|deepEqual|notStrictEqual|notEqual|ok))?\\s*\\(\\s*${STATUS_RECEIVER}\\s*(?:,|[=!]==?|[<>]=?|\\))`),
187
+ allowedBrowserAssertion: browserAssertionRe("typescript"),
105
188
  importedNames: tsImportedNames,
189
+ moduleQualifiers: tsModuleQualifiers,
106
190
  };
107
191
  const JAVASCRIPT = {
108
192
  ...TYPESCRIPT,
109
193
  language: "javascript",
110
- extensions: [".js", ".mjs", ".cjs"],
194
+ fileName: "skyrampUtils.js",
195
+ extensions: [".js", ".mjs", ".cjs", ".jsx"],
111
196
  };
112
197
  export const UTILS_LANGUAGE_SPECS = {
113
198
  python: PYTHON,
@@ -115,30 +200,156 @@ export const UTILS_LANGUAGE_SPECS = {
115
200
  javascript: JAVASCRIPT,
116
201
  };
117
202
  const SCENARIO_LITERAL_RE = /["'`][^"'`]*[\d$%€£][^"'`]*["'`]/;
118
- /** The text inside `expect(...)`, up to the matcher. */
119
- function expectArgs(expr) {
203
+ /** The literal a text-matching locator is given: `getByText("…")`, `hasText: "…"`. */
204
+ const TEXT_ARGUMENT_RE = /\b(?:getByText|get_by_text|getByAltText|get_by_alt_text|hasText|has_text)\s*[(:=]\s*["'`]([^"'`]*)["'`]/g;
205
+ /** The literal a test id is given. */
206
+ const TEST_ID_ARGUMENT_RE = /\b(?:getByTestId|get_by_test_id)\s*\(\s*["'`]([^"'`]*)["'`]/g;
207
+ /** A test id an author WROTE, rather than one a scenario's data was interpolated into.
208
+ * An identifier has no spaces and no address in it: `step-2-panel` and `otp-1` are
209
+ * names, `order-def@mail.com - 2 items` is the row it points at. */
210
+ const IDENTIFIER_RE = /^[^\s@]+$/;
211
+ /** A locator built from the page's rendered TEXT rather than from an element's
212
+ * identity. One pattern covers both languages: a TypeScript file does not contain
213
+ * `get_by_text` and a Python one does not contain `getByText`. Playwright's own text
214
+ * engines count too — `text=` and `:has-text()` select by content as surely as
215
+ * `getByText` does. */
216
+ const TEXT_LOCATOR_RE = /\b(?:getByText|get_by_text|getByAltText|get_by_alt_text)\s*\(|\b(?:hasText|has_text)\s*[:=]|\blocator\s*\(\s*["'`]\s*text=|>>\s*text=|:has-text\s*\(/;
217
+ /** Every `getByRole("<role>"` in the locator chain, with the accessible name that
218
+ * follows it when there is one. A chain holds more than one: a control role can be
219
+ * filtered by a content role, and reading only the first compared the wrong one. */
220
+ const ROLE_WITH_NAME_RE = /\b(?:getByRole|get_by_role)\s*\(\s*["'`]([A-Za-z]+)["'`]\s*(?:,\s*(?:\{[^{}]*?["'`]?\bname["'`]?\s*(?::\s*(?:["'`]([^"'`]*)["'`]|\/([^/]*)\/|([A-Za-z_$][\w$.]*))|(?=\s*[,}]))|[^()]*?\bname\s*=\s*(?:["'`]([^"'`]*)["'`]|\/([^/]*)\/|([A-Za-z_$][\w$.]*))))?/g;
221
+ /**
222
+ * The RECEIVED value inside `expect(...)` — its first argument, up to the matcher.
223
+ *
224
+ * Only the first, because Playwright takes a message as the second: `expect(locator,
225
+ * "why this matters")`. Reading every argument let that message decide, so a
226
+ * structural wait whose message merely NAMED a text-selecting form was refused — and
227
+ * a refusal blocks a delivery that is right, which is worse than missing one that is
228
+ * wrong. The split walks bracket depth on a copy whose strings are blanked, so a comma
229
+ * inside a selector or a message does not end the argument.
230
+ */
231
+ export function expectArgs(expr) {
120
232
  const open = expr.indexOf("(", expr.indexOf("expect"));
121
- const close = expr.search(/\)\s*\.\s*(?:not\.)?to/);
122
- return open === -1 || close === -1 ? expr : expr.slice(open + 1, close);
233
+ // `.not.to…` in TypeScript, `.not_to_…` in Python. Reading only the first left a
234
+ // negated Python assertion with no end, so the whole source line a trailing
235
+ // comment included — was scanned as the locator's arguments.
236
+ const close = expr.search(/\)\s*\.\s*(?:not[._])?to/);
237
+ if (open === -1 || close === -1)
238
+ return expr;
239
+ const args = expr.slice(open + 1, close);
240
+ const inert = blankStringContents(args);
241
+ let depth = 0;
242
+ for (let i = 0; i < inert.length; i++) {
243
+ const c = inert[i];
244
+ if (c === "(" || c === "[" || c === "{")
245
+ depth++;
246
+ else if (c === ")" || c === "]" || c === "}")
247
+ depth--;
248
+ else if (c === "," && depth === 0)
249
+ return args.slice(0, i);
250
+ }
251
+ return args;
252
+ }
253
+ /** Offset-preserving blanking of string contents, so a comma or a bracket inside a
254
+ * literal is not read as structure. Local and deliberately small: this walks ONE
255
+ * expression already cut from its line, not a source file. */
256
+ function blankStringContents(src) {
257
+ const out = src.split("");
258
+ let quote = "";
259
+ for (let i = 0; i < src.length; i++) {
260
+ const c = src[i];
261
+ if (quote) {
262
+ if (c === "\\") {
263
+ i++;
264
+ continue;
265
+ }
266
+ if (c === quote)
267
+ quote = "";
268
+ else
269
+ out[i] = " ";
270
+ }
271
+ else if (c === '"' || c === "'" || c === "`")
272
+ quote = c;
273
+ }
274
+ return out.join("");
275
+ }
276
+ /**
277
+ * Whether the locator inside `expect(...)` selects by what the page SAYS rather than
278
+ * by what an element IS. A permitted matcher on such a locator is a value assertion
279
+ * in disguise: `expect(page.getByText("Order deleted")).toBeVisible()` asserts the
280
+ * scenario's outcome, and the helper that holds it fails the next scenario.
281
+ *
282
+ * Positively recognised forms only — a locator shape this does not know is ALLOWED.
283
+ * This predicate blocks a customer's run, so an unfamiliar locator must pass rather
284
+ * than fail: the cost of a miss is an assertion in the wrong place, the cost of a
285
+ * false hit is a run that cannot finish.
286
+ */
287
+ function selectsByRenderedText(args) {
288
+ // A CSS attribute selector can quote anything, Playwright's own engine names
289
+ // included: `locator('[data-note=":has-text(foo)"]')` selects by an attribute, not
290
+ // by text. The bracketed part is blanked before the engines are looked for, the same
291
+ // reason `text=` is anchored to where a selector begins.
292
+ if (TEXT_LOCATOR_RE.test(args.replace(/\[[^\]]*\]/g, "[]")))
293
+ return true;
294
+ // A role is NAMED whether or not the name is a literal. A parameterised name
295
+ // (`{ name: headingText }`) selects by the page's text just as surely; the value is
296
+ // simply not one this pass can read.
297
+ // A role is NAMED whether or not the name is a literal, and whether it is written
298
+ // `name: x`, `"name": x`, the shorthand `{ name }`, or Python's `name=x`. A
299
+ // parameterised or shorthand name selects by the page's text just as surely; the
300
+ // value is simply not one this pass can read.
301
+ const named = [...args.matchAll(ROLE_WITH_NAME_RE)].filter((m) => m.slice(2).some((g) => g !== undefined) || /\bname\b/.test(m[0]));
302
+ // A role with no accessible name selects a kind of element, not a string. A role
303
+ // whose name IS the page's content is a value assertion whatever the name says, and
304
+ // ANY such role in the chain decides: an inner one names the element just as much.
305
+ if (named.some((m) => CONTENT_ROLES.includes(m[1].toLowerCase())))
306
+ return true;
307
+ // Digits and currency, applied to the TEXT a locator matches rather than to every
308
+ // string in it. A step number in a test id, a heading level and a street-address
309
+ // label are not scenario data, and blocking them stops a customer's run over a
310
+ // selector that names nothing.
311
+ const matched = [
312
+ ...named.map((m) => m[2] ?? m[3] ?? m[5] ?? m[6]),
313
+ ...[...args.matchAll(TEXT_ARGUMENT_RE)].map((m) => m[1]),
314
+ // A test id counts only when it reads as content rather than as a name.
315
+ ...[...args.matchAll(TEST_ID_ARGUMENT_RE)]
316
+ .map((m) => m[1])
317
+ .filter((t) => !IDENTIFIER_RE.test(t)),
318
+ ].filter((t) => t !== undefined);
319
+ return matched.some((t) => SCENARIO_LITERAL_RE.test(`"${t}"`));
123
320
  }
124
321
  export const HELPER_FAMILIES = {
125
322
  api: {
126
323
  family: "api",
127
324
  routeDuplicates: true,
128
325
  isAllowed: (spec, expr) => spec.allowedAssertion.test(expr),
129
- assertionRule: "a shared API helper asserts only the status code; move this assertion to the test body, applied to the response the helper returns",
130
- fixRule: "a helper that wraps an SDK request asserts only the status code — one helper per method+path, extended with defaulted parameters, named method + resource",
326
+ assertionRule: HELPER_ASSERTION_POLICIES.api.boundary,
327
+ fixRule: "a helper that wraps an SDK request asserts only the status code — one helper per method+path, extended with defaulted parameters (the expected status excepted: it has no default and every call passes it), named method + resource",
328
+ inlineSite: {
329
+ // The prompt's word for the same thing, read from the policy so the advisory
330
+ // and the rule the agent followed name the site alike.
331
+ noun: API_HELPERS.inlineSite.noun,
332
+ already: "wraps",
333
+ instruction: "Each is a candidate: the request's method, path and call shape match the helper's. Replace the block with a call to the helper only if the remaining differences are literals (they become the arguments; keep the block's response variable; import the helper into that file; change nothing else there).",
334
+ localCopy: "that request",
335
+ },
131
336
  },
132
337
  browser: {
133
338
  family: "browser",
134
339
  routeDuplicates: false,
135
- // A structural wait on a locator that carries a scenario LITERAL
136
- // (`getByText("Total: $899.98")`) is a value assertion in disguise: digits or
137
- // currency in any string inside the expect(...) arguments disqualify it.
340
+ // Two halves of one boundary, both declared in shared-helper-policy: the MATCHER
341
+ // must be one that asks whether the element rendered, and the LOCATOR must select
342
+ // the element by its identity rather than by the text the page shows.
138
343
  isAllowed: (spec, expr) => spec.allowedBrowserAssertion.test(expr) &&
139
- !SCENARIO_LITERAL_RE.test(expectArgs(expr)),
140
- assertionRule: "a shared browser helper holds actions and structural waits only (toBeVisible, toBeEnabled, …); move this value assertion to the test body immediately after the helper call, selector verbatim",
344
+ !selectsByRenderedText(expectArgs(expr)),
345
+ assertionRule: `${HELPER_ASSERTION_POLICIES.browser.boundary}. Move this value assertion to the test body immediately after the helper call, selector verbatim`,
141
346
  fixRule: "every other helper holds actions and structural waits only, named for the user intent",
347
+ inlineSite: {
348
+ noun: BROWSER_HELPERS.inlineSite.noun,
349
+ already: "performs",
350
+ instruction: "Each is a candidate: the sequence's actions and locators equal the helper's, in order. Replace the sequence with a call to the helper only if the remaining differences are literals — fill values, option labels, literal arguments — which become the arguments (import the helper into that file; every assertion and the page-error guard stay in the test body where they are; change nothing else there).",
351
+ localCopy: "the sequence",
352
+ },
142
353
  },
143
354
  };
144
355
  /** The helper family a test type's shared helpers follow. Unlike `isBrowserTestType`,
@@ -1,3 +1,4 @@
1
+ import { type UtilsLanguageSpec } from "./language-spec.js";
1
2
  /** The header `generateSkyrampHeader` writes into a utils file: `Generated by Skyramp on
2
3
  * <timestamp>`. Deliberately NOT the bare `SKYRAMP_UTILS_HEADER`, which every generated
3
4
  * TEST also carries as its codegen marker (`Generated by Skyramp v<version>`). */
@@ -34,6 +35,31 @@ export interface LocateUtilsParams {
34
35
  export declare function locateUtilsFiles(params: LocateUtilsParams): Promise<string[]>;
35
36
  /** Canonical path, or the input unchanged when it does not exist (yet). */
36
37
  export declare function realpath(p: string): Promise<string>;
38
+ export declare function isInside(file: string, dir: string): boolean;
37
39
  /** True when the first lines of `file` carry the utils header. Reads only the head of
38
40
  * the file — a utils file is small, but nothing here should depend on that. */
39
41
  export declare function hasUtilsHeader(file: string): Promise<boolean>;
42
+ /** Absolute paths of sibling modules `testFile` imports, for the module forms the reuse
43
+ * prompt produces. Only paths that exist are returned. Shared with the in-house
44
+ * module locator: the customer's helper module is found through the same import. */
45
+ export declare function importedModules(testFile: string, spec: UtilsLanguageSpec,
46
+ /** `existing` (default) returns only files on disk; `all` returns every candidate
47
+ * path the imports could resolve to, so a caller can ask HEAD about a module the
48
+ * working tree no longer holds. */
49
+ which?: "existing" | "all"): Promise<string[]>;
50
+ /** One relative import a TypeScript/JavaScript spec makes, and where it could
51
+ * resolve. Package imports are not here: a package the sandbox lacks is a
52
+ * missing-node_modules trap the gate must fail OPEN on, and the spec's own
53
+ * relative imports are the evidence it can check. */
54
+ export interface SpecImport {
55
+ /** As written: `./skyrampUtils`, `../helpers/auth.js`. */
56
+ specifier: string;
57
+ /** Every file the specifier could resolve to, in resolution order. */
58
+ candidates: string[];
59
+ /** The first candidate that exists, canonical, or `undefined`. */
60
+ resolved?: string;
61
+ }
62
+ /** The relative imports of a TypeScript/JavaScript spec, each resolved against the
63
+ * files beside it. Empty for Python, where a relative import and a package import
64
+ * are spelled the same and cannot be told apart. Never throws. */
65
+ export declare function resolveSpecImports(testFile: string, spec: UtilsLanguageSpec): Promise<SpecImport[]>;