@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
@@ -35,15 +35,53 @@ export function rememberTestsRepoDir(dir) {
35
35
  export function getTestsRepoDir() {
36
36
  return _testsRepoDir;
37
37
  }
38
+ /**
39
+ * The run's PRIMARY checkout — its path and its `owner/repo`. Declared at the
40
+ * run's entry point, never inferred from write order: the testbot action passes
41
+ * its workingDirectory and its slug to the prompt, so rendering the prompt is
42
+ * where the run says which checkout is primary (the same capture point as the
43
+ * report language).
44
+ *
45
+ * Write order cannot decide this. A docs-only primary diff lets the related
46
+ * repo's analyze call land first, and taking the root from whoever wrote first
47
+ * flipped the attribution of every test in the run (SKYR-4333).
48
+ *
49
+ * Entry without a prompt render — IDE use, a bare analyze call — has no
50
+ * declaration to read, so the first analyze call declares its own here.
51
+ */
52
+ let _primary;
53
+ export function rememberPrimaryRepository(repositoryPath, repo) {
54
+ if (!_primary)
55
+ _primary = { repositoryPath, repo };
56
+ }
57
+ /**
58
+ * Test seam, and the declaration the prompt render makes at the start of a run.
59
+ *
60
+ * A render is a run boundary, so it drops the in-memory state-file anchor as well:
61
+ * a server that renders a second prompt is serving a second run, and the first
62
+ * run's file must not take the second run's analysis. The pointer file stays, since
63
+ * it lives in the job's own `RUNNER_TEMP` — a later STAGE of the same run renders
64
+ * again in a fresh process and must still find that run's file.
65
+ */
66
+ export function setPrimaryRepository(primary) {
67
+ _primary = primary;
68
+ _activeRunStatePath = undefined;
69
+ }
70
+ export function getPrimaryRepository() {
71
+ return _primary;
72
+ }
38
73
  /**
39
74
  * Multi-repo run anchor: the path of the run-scoped analysis state file for the
40
75
  * current Testbot run.
41
76
  *
42
- * skyramp_analyze_changes sets this on the FIRST call of a multi-repo run (the one
43
- * carrying a `repository`) and REUSES it on subsequent related-repo calls, so every
44
- * repo's analysis lands in ONE state file with per-repo sections without the agent
45
- * ever passing a file path (which previously caused filename hallucinations).
46
- * Single-repo / standalone calls (no `repository`) never set or read this.
77
+ * skyramp_analyze_changes sets this on the FIRST call of a run and REUSES it on
78
+ * every later call, so a multi-repo run's analyses land in ONE state file with
79
+ * per-repo sections without the agent ever passing a file path (which previously
80
+ * caused filename hallucinations). A single-repo run takes the same path now that
81
+ * `repository` is required on every call.
82
+ *
83
+ * `setPrimaryRepository` clears it: the prompt render that declares the run's primary
84
+ * is the same boundary that ends the previous run's file.
47
85
  *
48
86
  * A staged Testbot run starts a NEW server process per stage, so this value is gone
49
87
  * at every stage boundary. That is what the pointer file below is for.
@@ -142,16 +180,15 @@ export function clearActiveRunStatePath() {
142
180
  * The run's state-file path, for tools that need to read or amend it without the
143
181
  * agent naming it.
144
182
  *
145
- * `setActiveRunStatePath` is only called by skyramp_analyze_changes on multi-repo
146
- * runs (the ones carrying a `repository` param). It is read back two ways: from
147
- * memory in this process, and from the pointer file a previous stage of the same
148
- * run wrote a staged run starts a fresh server per stage, so memory alone would
149
- * send later stages to the wrong file.
183
+ * `setActiveRunStatePath` is called by skyramp_analyze_changes on every run. It is
184
+ * read back two ways: from memory in this process, and from the pointer file a
185
+ * previous stage of the same run wrote a staged run starts a fresh server per
186
+ * stage, so memory alone would send later stages to the wrong file.
150
187
  *
151
- * A single-repo Testbot run's path is still deterministic in CI: the StateManager
152
- * constructor above roots "analysis" state under `runArtifactDir()`. Falling back
153
- * to that covers single-repo runs. Standalone/IDE usage has no RUNNER_TEMP and
154
- * resolves to undefined — correct, since there is no run state.
188
+ * The path is deterministic in CI either way: the StateManager constructor above
189
+ * roots "analysis" state under `runArtifactDir()`, so a run whose anchor was cleared
190
+ * at a stage boundary resolves to the same file. Standalone/IDE usage has no
191
+ * RUNNER_TEMP and resolves to undefined — correct, since there is no run state.
155
192
  */
156
193
  export function resolveRunStatePath(explicitPath) {
157
194
  if (explicitPath)
@@ -168,6 +205,50 @@ export function resolveRunStatePath(explicitPath) {
168
205
  }
169
206
  return undefined;
170
207
  }
208
+ /** Whether two paths name the same file. Compared by device and inode, not by
209
+ * spelling: `./`, a `..` round-trip, a trailing slash, a symlink and a differing
210
+ * case on a case-insensitive disk all name one file, and a string compare calls
211
+ * four of those five a different one. Falls back to the resolved spelling when
212
+ * either path cannot be read. */
213
+ function namesTheSameFile(a, b) {
214
+ try {
215
+ const left = fs.statSync(a);
216
+ const right = fs.statSync(b);
217
+ return left.dev === right.dev && left.ino === right.ino;
218
+ }
219
+ catch {
220
+ return path.resolve(a) === path.resolve(b);
221
+ }
222
+ }
223
+ /**
224
+ * The state file a tool may act on, or a refusal saying why not.
225
+ *
226
+ * A run's state file holds THIS run's analysis and THIS run's plan. A path from
227
+ * another run carries another run's, and every check would then judge this diff
228
+ * against it — silently, because both files are valid state files. So a named path
229
+ * is accepted only when it names the file this run created.
230
+ *
231
+ * Gated on `currentRunStateFile`, never on `resolveRunStatePath`: that one builds a
232
+ * path out of `RUNNER_TEMP`, which GitHub Actions sets on every job including this
233
+ * repo's own CI, so it answers "where would the file be" and not "is there a run".
234
+ * Refusing on it would refuse a named path wherever that variable merely exists.
235
+ *
236
+ * With no run of its own — standalone use, an IDE, a test — the named path is the
237
+ * only one there is, and is taken as given.
238
+ */
239
+ export function resolveOwnRunStatePath(explicitPath) {
240
+ if (!explicitPath)
241
+ return { path: resolveRunStatePath() };
242
+ const own = currentRunStateFile();
243
+ if (!own)
244
+ return { path: explicitPath };
245
+ if (namesTheSameFile(explicitPath, own))
246
+ return { path: own };
247
+ return {
248
+ refusal: `stateFile names ${explicitPath}, which is not this run's state file. This run's is ${own}, ` +
249
+ `and it holds the analysis and the plan every check reads. Leave stateFile out — the run finds its own.`,
250
+ };
251
+ }
171
252
  /**
172
253
  * The run's state file if this process is actually serving a run, else undefined.
173
254
  *
@@ -299,7 +380,76 @@ const ROOT_FIELDS_OWNED_ELSEWHERE = [
299
380
  "plan",
300
381
  "registrationCount",
301
382
  "reportObjections",
383
+ "maxFixAttempts",
384
+ // Written by the generators, and the analysis payload has none — so without
385
+ // this a second analyze drops the list of files this run wrote. The report's
386
+ // execution check reads a missing key as "nothing was written" and goes
387
+ // quiet, which is the one failure it must not have.
388
+ "generatedTests",
302
389
  ];
390
+ /**
391
+ * Execution records survive a re-analysis. A repeat `skyramp_analyze_changes`
392
+ * rewrites a section from a payload that has no `testExecutions` and whose
393
+ * `existingTests[]` rows carry no `executionBefore/After` — it discovers tests,
394
+ * it does not run them. Dropping the records would reset every file's
395
+ * attempt counter (SKYR-4460) while the run-wide cap survives, and lose the
396
+ * before/after statuses the report reads. So the incoming section keeps the
397
+ * existing records: `testExecutions` merged (incoming wins per file), and each
398
+ * existing-test row that lacks execution results takes them from the row with
399
+ * the same `testFile`. Returns the fields to overlay; empty when nothing carries.
400
+ */
401
+ function carryForwardExecutionRecords(incoming, existing, where) {
402
+ if (!existing)
403
+ return {};
404
+ const carried = {};
405
+ const priorExecutions = existing.testExecutions;
406
+ if (priorExecutions && Object.keys(priorExecutions).length > 0) {
407
+ const incomingExecutions = (incoming?.testExecutions ?? {});
408
+ const merged = { ...priorExecutions, ...incomingExecutions };
409
+ if (Object.keys(merged).length > Object.keys(incomingExecutions).length) {
410
+ carried.testExecutions = merged;
411
+ }
412
+ }
413
+ const priorRows = existing.existingTests;
414
+ const incomingRows = incoming?.existingTests;
415
+ if (Array.isArray(priorRows) && Array.isArray(incomingRows)) {
416
+ const byFile = new Map();
417
+ for (const row of priorRows) {
418
+ if (row?.testFile && (row.executionBefore || row.executionAfter))
419
+ byFile.set(row.testFile, row);
420
+ }
421
+ if (byFile.size > 0) {
422
+ let touched = 0;
423
+ const rows = incomingRows.map((row) => {
424
+ const prior = row?.testFile ? byFile.get(row.testFile) : undefined;
425
+ if (!prior)
426
+ return row;
427
+ const next = { ...row };
428
+ if (next.executionBefore === undefined && prior.executionBefore) {
429
+ next.executionBefore = prior.executionBefore;
430
+ touched++;
431
+ }
432
+ if (next.executionAfter === undefined && prior.executionAfter) {
433
+ next.executionAfter = prior.executionAfter;
434
+ touched++;
435
+ }
436
+ return next;
437
+ });
438
+ if (touched > 0)
439
+ carried.existingTests = rows;
440
+ }
441
+ }
442
+ if (Object.keys(carried).length > 0) {
443
+ logger.info("Carried execution records through a state rewrite", {
444
+ where,
445
+ testExecutions: carried.testExecutions
446
+ ? Object.keys(carried.testExecutions).length
447
+ : 0,
448
+ existingTestRows: carried.existingTests ? "merged" : "unchanged",
449
+ });
450
+ }
451
+ return carried;
452
+ }
303
453
  function carryForwardRootFields(data, existing) {
304
454
  if (!existing)
305
455
  return {};
@@ -410,6 +560,24 @@ export class StateManager {
410
560
  * Data fields are spread at root level alongside metadata
411
561
  */
412
562
  async writeData(data, options) {
563
+ await this.persist(data, options, options.repository);
564
+ }
565
+ /**
566
+ * Append to the root payload of a state file the run has already created.
567
+ * Takes no repository: the name the first write recorded stays, and the
568
+ * metadata it wrote is what these callers read back before patching it.
569
+ */
570
+ async appendData(data, options) {
571
+ const recorded = (await this.readFullState())?.metadata.repository;
572
+ // Not a check on the field — the field is required and always there. This
573
+ // is the caller appending to a run that never started, which loses the
574
+ // payload silently if it writes an untagged root instead.
575
+ if (!recorded) {
576
+ throw new Error(`no state file to append to at ${this.stateFile}: the run's first write creates it`);
577
+ }
578
+ await this.persist(data, options, recorded);
579
+ }
580
+ async persist(data, options, repository) {
413
581
  try {
414
582
  // Read existing metadata + any related-repo sections if file exists, so
415
583
  // rewriting the primary (root) payload preserves the multi-repo sections.
@@ -425,16 +593,17 @@ export class StateManager {
425
593
  const state = {
426
594
  ...data,
427
595
  ...carryForwardRootFields(data, existingRoot),
596
+ ...carryForwardExecutionRecords(data, existingRoot, `root of ${this.stateFile}`),
428
597
  metadata: {
429
598
  sessionId: this.sessionId,
430
599
  stateType: this.stateType,
431
600
  repositoryPath: options?.repositoryPath || existingMetadata?.repositoryPath,
432
- repository: options?.repository ?? existingMetadata?.repository,
601
+ repository,
433
602
  createdAt: existingMetadata?.createdAt || new Date().toISOString(),
434
603
  updatedAt: new Date().toISOString(),
435
604
  // Preserve the prior step when the caller omits one (matches
436
605
  // repositoryPath/repository/createdAt above) so a metadata-agnostic
437
- // write — e.g. persistExternalRun appending externalTestResults
606
+ // write — e.g. skyramp_execute_test recording an execution
438
607
  // does not wipe the pipeline step recorded by an earlier phase.
439
608
  step: options?.step ?? existingMetadata?.step,
440
609
  },
@@ -459,25 +628,12 @@ export class StateManager {
459
628
  // matching the root's metadata.repo) targets the PRIMARY section, so all
460
629
  // single-repo behavior is unchanged.
461
630
  // -----------------------------------------------------------------------
462
- /** Is `repo` the primary section? By NAME when the caller declares one: the run
463
- * says which repo is primary, so whichever call lands first cannot decide it.
464
- * Otherwise the legacy rule falsy `repo` (single-repo callers), the first
465
- * write of the run, or a `repo` matching the root metadata (SKYR-4333: a
466
- * docs-only primary diff let the related repo write first and take the root). */
467
- async isPrimaryRepo(repo, primaryRepo) {
468
- if (!repo)
469
- return true;
470
- if (primaryRepo)
471
- return repo === primaryRepo;
472
- // No primary declared: the first write of the run is the primary, even when
473
- // it carries an explicit owner/repo.
474
- if (!this.exists())
475
- return true;
476
- const full = await this.readFullState();
477
- // File already exists: primary only if `repo` matches the repo recorded on
478
- // the root. An untagged root means the primary was written without a repo
479
- // (legacy/single-repo), so any non-empty `repo` here is a RELATED repo.
480
- return full?.metadata.repository === repo;
631
+ /** Is `repo` the primary section? By NAME, against the name the run declared
632
+ * for its primary checkout so whichever call lands first cannot decide it
633
+ * (SKYR-4333: a docs-only primary diff let the related repo write first and
634
+ * take the root). */
635
+ isPrimaryRepo(repo, primaryRepo) {
636
+ return repo === primaryRepo;
481
637
  }
482
638
  /**
483
639
  * Write one repo's analysis into the run-scoped state file. The primary repo
@@ -492,7 +648,25 @@ export class StateManager {
492
648
  * did so deleted the plan the agent had registered. NAMED rather than "keep
493
649
  * everything omitted", which would resurrect fields a re-analysis clears. */
494
650
  async writeRepoData(data, options) {
495
- if (await this.isPrimaryRepo(options.repo, options.primaryRepo)) {
651
+ await this.route(data, options, options.primary.repo);
652
+ }
653
+ /**
654
+ * Update one repo's section of a state file the run has already created.
655
+ * Takes no primary: the root records the primary's name, and these callers
656
+ * (execute, run-existing-tests, actions) read the section back before they
657
+ * patch it, so the run is already under way.
658
+ */
659
+ async updateRepoData(data, options) {
660
+ const recorded = (await this.readFullState())?.metadata.repository;
661
+ // Not a check on the field — the field is required and the root always has
662
+ // one. This is a caller patching a run that never started.
663
+ if (!recorded) {
664
+ throw new Error(`no state file to update at ${this.stateFile}: skyramp_analyze_changes creates it`);
665
+ }
666
+ await this.route(data, options, recorded);
667
+ }
668
+ async route(data, options, primaryRepo) {
669
+ if (this.isPrimaryRepo(options.repo, primaryRepo)) {
496
670
  await this.writeData(data, {
497
671
  repositoryPath: options.repositoryPath,
498
672
  step: options.step,
@@ -512,7 +686,10 @@ export class StateManager {
512
686
  metadata: {
513
687
  sessionId: this.sessionId,
514
688
  stateType: this.stateType,
515
- repository: options.primaryRepo,
689
+ // The primary's own name AND path, so a root created by a related
690
+ // repo's earlier call still describes the primary completely.
691
+ repository: primaryRepo,
692
+ repositoryPath: options.primary?.repositoryPath,
516
693
  createdAt: new Date().toISOString(),
517
694
  updatedAt: new Date().toISOString(),
518
695
  },
@@ -524,8 +701,12 @@ export class StateManager {
524
701
  // that skyramp_analyze_changes recorded — getRepoRepositoryPath() relies on
525
702
  // it to re-absolutize that repo's test paths.
526
703
  const priorRepositoryPath = relatedRepos[options.repo]?.repositoryPath;
704
+ const priorData = relatedRepos[options.repo]?.data;
527
705
  relatedRepos[options.repo] = {
528
- data,
706
+ data: {
707
+ ...data,
708
+ ...carryForwardExecutionRecords(data, priorData, `section ${options.repo} of ${this.stateFile}`),
709
+ },
529
710
  repositoryPath: options.repositoryPath ?? priorRepositoryPath,
530
711
  };
531
712
  base.relatedRepos = relatedRepos;
@@ -539,10 +720,10 @@ export class StateManager {
539
720
  * undefined → the primary (root) section (identical to readData()).
540
721
  */
541
722
  async readRepoData(repo) {
542
- if (await this.isPrimaryRepo(repo)) {
723
+ const full = await this.readFullState();
724
+ if (!repo || (full && this.isPrimaryRepo(repo, full.metadata.repository))) {
543
725
  return this.readData();
544
726
  }
545
- const full = await this.readFullState();
546
727
  return full?.relatedRepos?.[repo]?.data ?? null;
547
728
  }
548
729
  /**
@@ -551,7 +732,7 @@ export class StateManager {
551
732
  */
552
733
  async getRepoRepositoryPath(repo) {
553
734
  const full = await this.readFullState();
554
- if (await this.isPrimaryRepo(repo)) {
735
+ if (!repo || (full && this.isPrimaryRepo(repo, full.metadata.repository))) {
555
736
  return full?.metadata.repositoryPath;
556
737
  }
557
738
  return full?.relatedRepos?.[repo]?.repositoryPath;
@@ -572,13 +753,16 @@ export class StateManager {
572
753
  */
573
754
  async listRepoCheckouts() {
574
755
  const full = await this.readFullState();
756
+ // No file, no checkouts — a question about the run, not about the field.
757
+ if (!full)
758
+ return [];
575
759
  const checkouts = [
576
760
  {
577
- root: full?.metadata.repositoryPath,
578
- repository: full?.metadata.repository,
761
+ root: full.metadata.repositoryPath,
762
+ repository: full.metadata.repository,
579
763
  primary: true,
580
764
  },
581
- ...Object.entries(full?.relatedRepos ?? {}).map(([repository, section]) => ({
765
+ ...Object.entries(full.relatedRepos ?? {}).map(([repository, section]) => ({
582
766
  root: section.repositoryPath,
583
767
  repository,
584
768
  primary: false,
@@ -41,9 +41,16 @@ function assertedStatuses(commentless, statusUseOffsets) {
41
41
  for (const offset of statusUseOffsets) {
42
42
  const lineEnd = commentless.indexOf("\n", offset);
43
43
  const line = commentless.slice(offset, lineEnd === -1 ? undefined : lineEnd);
44
- const code = /\b([1-5]\d{2})\b/.exec(line);
45
- if (code)
46
- statuses.push(Number(code[1]));
44
+ // Every status-looking token on the line, not the first: a label such as
45
+ // `expect(r.statusCode, "legacy 404").toBe(200)` reads 404 before the code
46
+ // the matcher actually asserts. Two different codes on one line means the
47
+ // line does not say which is asserted, so NaN goes in and every exemption
48
+ // below refuses to fire on it.
49
+ const codes = new Set([...line.matchAll(/\b([1-5]\d{2})\b/g)].map((m) => Number(m[1])));
50
+ if (codes.size === 1)
51
+ statuses.push([...codes][0]);
52
+ else if (codes.size > 1)
53
+ statuses.push(Number.NaN);
47
54
  }
48
55
  return statuses;
49
56
  }
@@ -94,10 +101,12 @@ const STATUS_HELPER_BEFORE_RE = /check_?status_?code\s*\(\s*$/i;
94
101
  * Any other read — getValue/get_response_value/checkSchema/.json()/passed as a
95
102
  * call argument, including inside a template-literal or f-string interpolation
96
103
  * — clears it. Exempt: DELETE calls, sole 204/202 statuses, poll bindings
97
- * inside loops. Severity follows the rubric: unconditional (`hard`) for
98
- * 4xx/5xx an error body must always be asserted and advisory (`warn`)
99
- * when only 2xx statuses are asserted, because a 200 can legitimately carry
100
- * no body (/logout, /cancel) and that is not deterministically knowable. */
104
+ * inside loops, and any response whose asserted statuses are all >= 400 — a
105
+ * refusal is proven by the refusal, and which error fields a test pins is the
106
+ * plan's decision. Severity: unconditional (`hard`) for a response nothing
107
+ * asserts at all, and advisory (`warn`) when only 2xx statuses are asserted,
108
+ * because a 200 can legitimately carry no body (/logout, /cancel) and that is
109
+ * not deterministically knowable. */
101
110
  function lintStatusOnlyResponses(stripped, commentless, language, bindings) {
102
111
  const findings = [];
103
112
  for (const { varName, declIndex, declClose } of bindings) {
@@ -144,27 +153,36 @@ function lintStatusOnlyResponses(stripped, commentless, language, bindings) {
144
153
  if (statuses.length > 0 && statuses.every((s) => s === 204 || s === 202)) {
145
154
  continue;
146
155
  }
147
- // Never-used responses and asserted error statuses are unconditional
148
- // violations; a 2xx-only status check is advisory (empty-body 200s exist).
149
- const severity = statusUses === 0 || statuses.some((s) => s >= 400) ? "hard" : "warn";
156
+ // A refused request is proven by the refusal. Which error body fields a test
157
+ // pins, if any, is the plan's decision — a case that states the exact code or
158
+ // wording gets it asserted, and one that does not must not be forced into
159
+ // pinning today's spelling, because the fixed app refuses the same input with
160
+ // a different code. This lint made that a hard failure and so contradicted the
161
+ // planning rule on `mrugesh/refusal-not-status`.
162
+ // EVERY asserted status, the way the 204/202 exemption above reads them: a
163
+ // variable reused for a refused call and then a successful one asserts both,
164
+ // and `some` let the successful one's missing body ride out on the refusal.
165
+ if (statuses.length > 0 && statuses.every((status) => status >= 400))
166
+ continue;
167
+ // A response nothing asserts at all is still an unconditional violation; a
168
+ // 2xx-only status check stays advisory, because empty-body 200s exist.
169
+ const severity = statusUses === 0 ? "hard" : "warn";
150
170
  findings.push({
151
171
  rule: "status-only-response",
152
172
  severity,
153
173
  line: lineOfOffset(stripped, declIndex),
154
174
  message: statusUses > 0
155
- ? severity === "hard"
156
- ? `Error response \`${varName}\` is only checked for its status code — the error body (code/message/detail) must be asserted.`
157
- : `Response \`${varName}\` is only checked for its status code.`
175
+ ? `Response \`${varName}\` is only checked for its status code.`
158
176
  : `Response \`${varName}\` is captured but never asserted.`,
159
177
  // The advisory case is phrased as a question, not an instruction. A
160
178
  // response no behaviour in the file depends on is CORRECT with its
161
179
  // status code and nothing more (SKYR-4310) — telling the agent to
162
180
  // assert the body regardless is how a 136-assertion test gets written
163
- // to prove a default page size. The hard case is unchanged: an error
164
- // body carries the evidence, so it is never optional.
181
+ // to prove a default page size. The hard case is now only a response
182
+ // nothing asserts at all.
165
183
  remediation: severity === "warn"
166
184
  ? `If a behaviour this file tests depends on this response's body, assert the fields it depends on via \`${helperCall(language, varName)}\`. If no behaviour depends on it, the status code alone is the right answer — leave it.`
167
- : `Assert the error body's fields via \`${helperCall(language, varName)}\` after the status assertion.`,
185
+ : `Assert this response's status, and the fields a behaviour in this file depends on via \`${helperCall(language, varName)}\`.`,
168
186
  });
169
187
  }
170
188
  return findings;
@@ -27,6 +27,10 @@ const EXACT_MATCHERS = new Set([
27
27
  "to_equal",
28
28
  "toHaveJSProperty",
29
29
  "to_have_js_property",
30
+ // SKYR-4462: an exact computed value, the same tier as toHaveAttribute and
31
+ // strictly stronger than toContainText (which already weighs 2).
32
+ "toHaveCSS",
33
+ "to_have_css",
30
34
  ]);
31
35
  /** Pattern/partial/state matchers — weaker than exact values, but real
32
36
  * behavioral assertions: `toBeDisabled` after an action asserts a semantic
@@ -48,7 +52,25 @@ const PARTIAL_MATCHERS = new Set([
48
52
  "to_be_disabled",
49
53
  "to_be_enabled",
50
54
  "to_be_hidden",
55
+ // SKYR-4462: token-bounded class match — a real class assertion, the
56
+ // appearance rule's preferred form.
57
+ "toContainClass",
58
+ "to_contain_class",
51
59
  ]);
60
+ // SKYR-4462: numeric comparison matchers. Generic on their own (an existence-
61
+ // tier `expect(count).toBeGreaterThan(0)` is padding), so they earn weight 2
62
+ // ONLY when the compared subject reads a geometry property — a boundingBox()
63
+ // x/y/edge comparison, the one appearance case that has no record-time kind.
64
+ const RANGE_MATCHERS = new Set([
65
+ "toBeLessThan",
66
+ "toBeGreaterThan",
67
+ "toBeLessThanOrEqual",
68
+ "toBeGreaterThanOrEqual",
69
+ ]);
70
+ // `.x` / `.y` / `.left` … or `['x']` / `["width"]` — a boundingBox() geometry
71
+ // access. `count`, `.length`, `status_code` do not match, so their comparisons
72
+ // stay existence-tier.
73
+ const GEOMETRY_ACCESS = /(?:\.|\[['"])(?:x|y|left|top|right|bottom|width|height)\b/;
52
74
  /** Absence matchers whose tier depends on whether the chain negates them. */
53
75
  const NULL_MATCHERS = new Set(["toBeNull", "to_be_null"]);
54
76
  /** Chain links to skip between `expect(...)` and the matcher. */
@@ -79,9 +101,13 @@ export function detectAssertionLanguage(testFile) {
79
101
  return undefined;
80
102
  }
81
103
  }
82
- function matcherWeight(matcher, links = []) {
104
+ function matcherWeight(matcher, links = [], subject = "") {
83
105
  if (matcher === undefined)
84
106
  return 1;
107
+ // A boundingBox() ordering comparison is a real layout assertion; the same
108
+ // matcher on a count/length is padding, so it is the subject that decides.
109
+ if (RANGE_MATCHERS.has(matcher))
110
+ return GEOMETRY_ACCESS.test(subject) ? 2 : 1;
85
111
  // `not.toBeNull()` is the weak existence idiom the rubric bans, while a bare
86
112
  // `toBeNull()` is the exact absence assertion it asks for. Same matcher, so
87
113
  // only the chain separates them.
@@ -189,7 +215,7 @@ function expectSites(raw, stripped) {
189
215
  sites.push({
190
216
  line: lineOfOffset(stripped, m.index),
191
217
  matcher,
192
- weight: matcherWeight(matcher, links),
218
+ weight: matcherWeight(matcher, links, actual),
193
219
  fingerprint: fingerprintOf(`expect${soft}(${actual})` +
194
220
  links.map((link) => `.${link}`).join("") +
195
221
  (matcher === undefined ? "" : `.${matcher}`) +
@@ -199,8 +225,11 @@ function expectSites(raw, stripped) {
199
225
  }
200
226
  return sites;
201
227
  }
202
- /** Weight of a bare python `assert` statement, classified by its operators. */
203
- function pythonAssertWeight(stmt) {
228
+ /** Weight of a bare python `assert` statement, classified by its operators.
229
+ * `raw` is the unstripped text: the geometry check reads a `['x']` key that the
230
+ * string-blanking pass would otherwise erase; the operator checks stay on the
231
+ * stripped `stmt` so they never match inside a string literal. */
232
+ function pythonAssertWeight(stmt, raw = stmt) {
204
233
  if (stmt.includes("==") ||
205
234
  stmt.includes("!=") ||
206
235
  // `is None` is the python spelling of `toBeNull` — an exact absence check.
@@ -211,7 +240,11 @@ function pythonAssertWeight(stmt) {
211
240
  // in python when spelled checkSchema.
212
241
  /\bcheck_?schema\s*\(/i.test(stmt))
213
242
  return 3;
214
- if (/\bre\s*\.\s*(?:match|fullmatch)\s*\(|\.startswith\s*\(|\bin\b/.test(stmt))
243
+ if (/\bre\s*\.\s*(?:match|fullmatch)\s*\(|\.startswith\s*\(|\bin\b/.test(stmt) ||
244
+ // SKYR-4462: a bounding_box x/y ordering compare (image['x'] < info['x']),
245
+ // the python twin of toBeLessThan on a geometry property. A plain range
246
+ // check (status_code >= 200) reads no geometry access and stays weight 1.
247
+ (/[<>]/.test(stmt) && GEOMETRY_ACCESS.test(raw)))
215
248
  return 2;
216
249
  return 1;
217
250
  }
@@ -238,7 +271,7 @@ function pythonAssertSites(raw, stripped) {
238
271
  const stmtEnd = offset + stmt.length;
239
272
  sites.push({
240
273
  line: i + 1,
241
- weight: pythonAssertWeight(stmt),
274
+ weight: pythonAssertWeight(stmt, raw.slice(offset + (line.length - line.trimStart().length), stmtEnd)),
242
275
  fingerprint: fingerprintOf(raw.slice(offset + (line.length - line.trimStart().length), stmtEnd)),
243
276
  });
244
277
  i = last;
@@ -244,13 +244,15 @@ function lintNegativeOnlySpec(commentless) {
244
244
  ABSENCE_ASSERT_RE.lastIndex = 0;
245
245
  if (POSITIVE_ASSERT_RE.test(remainder))
246
246
  return [];
247
- return [{
247
+ return [
248
+ {
248
249
  rule: "negative-only-spec",
249
250
  severity: "hard",
250
251
  line: lineOfOffset(commentless, first.index),
251
252
  message: "Every locator assertion in this spec asserts absence (toBeHidden / not.toBeVisible); nothing proves the page rendered, so it passes on a blank page, a 404 or a typo'd selector.",
252
253
  remediation: "Add at least one positive assertion on a retained element of the same page (toHaveText / toHaveValue / toHaveCount / toHaveURL) next to the absence assertions.",
253
- }];
254
+ },
255
+ ];
254
256
  }
255
257
  export function lintUiSpec(raw, language, opts) {
256
258
  if (language === "java")