@skyramp/mcp 0.4.1 → 0.4.2-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/build/adapters/jestAdapter.js +23 -5
  2. package/build/adapters/mochaAdapter.js +7 -1
  3. package/build/adapters/playwrightAdapter.js +3 -1
  4. package/build/adapters/pytestAdapter.js +14 -3
  5. package/build/commands/localDevTestChangesCommand.js +1 -0
  6. package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
  7. package/build/commands/testThisEndpointCommand.js +16 -4
  8. package/build/index.js +34 -4
  9. package/build/playwright/blueprintDigest.js +28 -7
  10. package/build/playwright/registerPlaywrightTools.js +33 -28
  11. package/build/playwright/traceRecordingPrompt.js +9 -2
  12. package/build/prompts/code-reuse.js +95 -29
  13. package/build/prompts/fix-error-prompt.d.ts +9 -1
  14. package/build/prompts/fix-error-prompt.js +31 -28
  15. package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
  16. package/build/prompts/local-dev/local-dev-plan.js +3 -1
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +30 -3
  19. package/build/prompts/modularization/integration-test-modularization.js +13 -6
  20. package/build/prompts/modularization/ui-test-modularization.js +1 -1
  21. package/build/prompts/personas.js +1 -1
  22. package/build/prompts/pom-aware-code-reuse.js +7 -9
  23. package/build/prompts/reuse-hand-off.d.ts +64 -0
  24. package/build/prompts/reuse-hand-off.js +130 -0
  25. package/build/prompts/shared-helper-policy.d.ts +88 -2
  26. package/build/prompts/shared-helper-policy.js +145 -11
  27. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
  28. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  29. package/build/prompts/sut-setup/shared.d.ts +4 -1
  30. package/build/prompts/sut-setup/shared.js +2 -2
  31. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  32. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  33. package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
  34. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  35. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  36. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
  37. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  38. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  39. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  40. package/build/prompts/testbot/testbot-prompts.js +123 -55
  41. package/build/recommendation/answers.js +18 -9
  42. package/build/recommendation/pullRequestText.js +1 -1
  43. package/build/recommendation/registerPlan.js +31 -17
  44. package/build/recommendation/subjectStep.d.ts +8 -10
  45. package/build/recommendation/subjectStep.js +17 -16
  46. package/build/recommendation/types.d.ts +71 -17
  47. package/build/recommendation/types.js +9 -15
  48. package/build/recommendation/verifierContracts.d.ts +7 -3
  49. package/build/recommendation/verifierContracts.js +8 -4
  50. package/build/recommendation/verifiers/changedFile.js +11 -13
  51. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  52. package/build/recommendation/verifiers/citedPath.js +16 -2
  53. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  54. package/build/recommendation/verifiers/coverage.js +190 -134
  55. package/build/recommendation/verifiers/defects.js +56 -16
  56. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  57. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  58. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  59. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  60. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  61. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  62. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  63. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  64. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  65. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  66. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  67. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  68. package/build/recommendation/verifiers/screenRoute.js +15 -10
  69. package/build/recommendation/verifiers/statedDifference.js +15 -8
  70. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  71. package/build/resources/analysisResources.js +7 -3
  72. package/build/resources/progressResource.js +4 -2
  73. package/build/resources/sutSetupResource.js +20 -2
  74. package/build/resources/testbotResource.js +19 -1
  75. package/build/services/AnalyticsService.js +3 -1
  76. package/build/services/ScenarioGenerationService.js +5 -5
  77. package/build/services/TestDiscoveryService.js +21 -5
  78. package/build/services/TestExecutionService.js +63 -21
  79. package/build/services/TestGenerationService.d.ts +1 -1
  80. package/build/services/TestGenerationService.js +43 -24
  81. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  82. package/build/skills/enhanceAssertionsSkill.js +103 -0
  83. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  84. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  85. package/build/skills/skillFiles.d.ts +38 -0
  86. package/build/skills/skillFiles.js +94 -0
  87. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  88. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  89. package/build/tool-phases.js +4 -0
  90. package/build/tools/auth/loginTool.js +3 -1
  91. package/build/tools/auth/logoutTool.js +3 -1
  92. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  93. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  94. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  95. package/build/tools/code-refactor/assertion-state.js +1 -1
  96. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  97. package/build/tools/code-refactor/assertionOperations.js +82 -0
  98. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  99. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  100. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  101. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  102. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  103. package/build/tools/code-refactor/gate-markers.js +95 -0
  104. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  105. package/build/tools/code-refactor/retrofit-state.js +44 -2
  106. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  107. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  108. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  109. package/build/tools/code-refactor/reuse-state.js +191 -61
  110. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  111. package/build/tools/code-refactor/utils-verify-gates.js +252 -27
  112. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  113. package/build/tools/code-refactor/verify-gates.js +36 -4
  114. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  115. package/build/tools/enrichTestWithMocksTool.js +9 -5
  116. package/build/tools/executeSkyrampTestTool.d.ts +22 -1
  117. package/build/tools/executeSkyrampTestTool.js +571 -271
  118. package/build/tools/execution-video-state.js +1 -1
  119. package/build/tools/fixErrorTool.js +5 -6
  120. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  121. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  122. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  123. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  124. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  125. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  126. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  127. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  128. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  129. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  130. package/build/tools/generate-tests/planGuard.js +6 -3
  131. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  132. package/build/tools/generate-tests/scenarioLint.js +17 -5
  133. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  134. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  135. package/build/tools/one-click/oneClickTool.js +3 -1
  136. package/build/tools/preflightMockCheckTool.js +23 -7
  137. package/build/tools/runExistingTestsTool.d.ts +1 -1
  138. package/build/tools/runExistingTestsTool.js +43 -21
  139. package/build/tools/submitReportTool.d.ts +51 -12
  140. package/build/tools/submitReportTool.js +860 -161
  141. package/build/tools/test-management/actionsTool.js +210 -51
  142. package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
  143. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  144. package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
  145. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  146. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  147. package/build/tools/test-management/resolveScreenTool.js +33 -9
  148. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  149. package/build/tools/trace/stopTraceCollectionTool.js +41 -5
  150. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  151. package/build/tools/verifyTestDependenciesTool.js +54 -0
  152. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  153. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  154. package/build/types/AssertionOutcome.d.ts +1 -1
  155. package/build/types/EnhanceType.d.ts +6 -0
  156. package/build/types/EnhanceType.js +1 -0
  157. package/build/types/ExternalTestExecution.d.ts +2 -2
  158. package/build/types/RepositoryAnalysis.d.ts +0 -40
  159. package/build/types/ReuseOutcome.d.ts +96 -4
  160. package/build/types/ReuseOutcome.js +16 -0
  161. package/build/types/StepMethod.js +20 -6
  162. package/build/types/TestAnalysis.d.ts +10 -2
  163. package/build/types/TestExecution.d.ts +45 -0
  164. package/build/types/TestRecommendation.d.ts +1 -1
  165. package/build/types/TestRecommendation.js +4 -1
  166. package/build/types/TestTypes.d.ts +13 -0
  167. package/build/types/TestTypes.js +34 -3
  168. package/build/types/TestbotPromptOptions.d.ts +9 -1
  169. package/build/types/TestbotReport.d.ts +45 -9
  170. package/build/utils/AnalysisStateManager.d.ts +137 -27
  171. package/build/utils/AnalysisStateManager.js +227 -43
  172. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  173. package/build/utils/assertion-verify/metrics.js +39 -6
  174. package/build/utils/assertion-verify/ui-lints.js +4 -2
  175. package/build/utils/branchDiff.js +47 -12
  176. package/build/utils/canonicalJson.js +3 -1
  177. package/build/utils/dartRouteExtractor.js +36 -7
  178. package/build/utils/fixAttempts.d.ts +26 -0
  179. package/build/utils/fixAttempts.js +109 -0
  180. package/build/utils/frontendSelectors.js +23 -4
  181. package/build/utils/generatedTestRecord.d.ts +19 -0
  182. package/build/utils/generatedTestRecord.js +61 -0
  183. package/build/utils/gitStaging.js +7 -2
  184. package/build/utils/initAgent.js +26 -6
  185. package/build/utils/language-helper.js +39 -45
  186. package/build/utils/pathMatching.js +2 -1
  187. package/build/utils/pathSignatures.js +6 -2
  188. package/build/utils/planMatchKeys.d.ts +2 -2
  189. package/build/utils/planMatchKeys.js +20 -14
  190. package/build/utils/pom-catalog-parse.js +7 -2
  191. package/build/utils/pom-scope/import-expansion.js +6 -1
  192. package/build/utils/pom-scope/index.js +50 -12
  193. package/build/utils/pom-scope/scoring.js +13 -3
  194. package/build/utils/pom-scope/selector-extractor.js +16 -3
  195. package/build/utils/pom-scope/strip.d.ts +8 -0
  196. package/build/utils/pom-scope/strip.js +238 -0
  197. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  198. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  199. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  200. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  201. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  202. package/build/utils/pom-verify/bindings.js +5 -1
  203. package/build/utils/pom-verify/calls.js +9 -2
  204. package/build/utils/pom-verify/verify.js +27 -5
  205. package/build/utils/pr-comment-parser.js +20 -7
  206. package/build/utils/proxy-terminal.d.ts +19 -1
  207. package/build/utils/proxy-terminal.js +346 -21
  208. package/build/utils/removedUiElements.js +1 -1
  209. package/build/utils/reportLanguage.js +35 -7
  210. package/build/utils/reportVerification.d.ts +14 -8
  211. package/build/utils/reportVerification.js +19 -19
  212. package/build/utils/repositorySlug.d.ts +32 -0
  213. package/build/utils/repositorySlug.js +77 -0
  214. package/build/utils/reuseRouting.js +6 -2
  215. package/build/utils/runSerialized.d.ts +3 -0
  216. package/build/utils/runSerialized.js +39 -0
  217. package/build/utils/screenRoutes.js +74 -18
  218. package/build/utils/sourceRouteExtractor.js +13 -6
  219. package/build/utils/telemetry.d.ts +1 -0
  220. package/build/utils/telemetry.js +8 -5
  221. package/build/utils/testDependencyPolicy.d.ts +9 -0
  222. package/build/utils/testDependencyPolicy.js +788 -0
  223. package/build/utils/testExecutionRecord.d.ts +90 -0
  224. package/build/utils/testExecutionRecord.js +267 -0
  225. package/build/utils/testFileClassification.js +3 -1
  226. package/build/utils/trace-parser.js +62 -14
  227. package/build/utils/urlPath.js +3 -1
  228. package/build/utils/utils-verify/action-key.d.ts +4 -0
  229. package/build/utils/utils-verify/action-key.js +2 -2
  230. package/build/utils/utils-verify/allow.d.ts +122 -3
  231. package/build/utils/utils-verify/allow.js +146 -21
  232. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  233. package/build/utils/utils-verify/body-reach.js +335 -0
  234. package/build/utils/utils-verify/call-sites.d.ts +6 -1
  235. package/build/utils/utils-verify/call-sites.js +72 -8
  236. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  237. package/build/utils/utils-verify/delivered-imports.js +84 -0
  238. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  239. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  240. package/build/utils/utils-verify/in-house.d.ts +93 -0
  241. package/build/utils/utils-verify/in-house.js +719 -0
  242. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  243. package/build/utils/utils-verify/incumbent.js +75 -0
  244. package/build/utils/utils-verify/index.d.ts +1 -0
  245. package/build/utils/utils-verify/index.js +1 -0
  246. package/build/utils/utils-verify/language-spec.d.ts +26 -10
  247. package/build/utils/utils-verify/language-spec.js +217 -20
  248. package/build/utils/utils-verify/locate.d.ts +26 -0
  249. package/build/utils/utils-verify/locate.js +125 -23
  250. package/build/utils/utils-verify/module-name.d.ts +40 -0
  251. package/build/utils/utils-verify/module-name.js +98 -0
  252. package/build/utils/utils-verify/parse.d.ts +46 -6
  253. package/build/utils/utils-verify/parse.js +176 -38
  254. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  255. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  256. package/build/utils/utils-verify/stage.d.ts +5 -0
  257. package/build/utils/utils-verify/stage.js +47 -2
  258. package/build/utils/utils-verify/status-once.d.ts +62 -0
  259. package/build/utils/utils-verify/status-once.js +207 -0
  260. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  261. package/build/utils/utils-verify/typecheck.js +338 -0
  262. package/build/utils/utils-verify/verify.d.ts +76 -1
  263. package/build/utils/utils-verify/verify.js +516 -44
  264. package/build/utils/versions.d.ts +3 -3
  265. package/build/utils/versions.js +1 -1
  266. package/build/utils/workspaceAuth.js +107 -37
  267. package/build/workspace/queryParamResolution.js +11 -4
  268. package/build/workspace/workspace.js +7 -7
  269. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  270. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  271. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  272. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  273. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  274. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  275. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  276. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  277. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  278. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  279. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  280. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  281. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  282. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  283. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  284. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  285. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  286. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  287. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  288. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  289. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  290. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  291. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  292. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  293. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  294. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  295. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  296. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  297. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  298. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  299. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  300. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  301. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  302. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  509. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  510. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  511. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  512. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  513. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  514. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  515. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  516. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  518. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  519. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  520. package/node_modules/playwright/package.json +2 -2
  521. package/package.json +7 -6
  522. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  523. package/plugin/prompts/generate-tests/generation.md +1 -1
  524. package/plugin/prompts/plan-tests.md +14 -14
  525. package/plugin/prompts/testbot-task1.md +4 -2
  526. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  527. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  528. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  529. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  530. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  531. package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
  532. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  533. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  534. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  535. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  536. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  537. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  538. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  539. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  540. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  541. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  542. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  543. package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { logger } from "../../utils/logger.js";
3
3
  import { StateManager, } from "../../utils/AnalysisStateManager.js";
4
- import { TestSource, DriftAction, RecommendationPriority, EstimatedWork } from "../../types/TestAnalysis.js";
4
+ import { TestSource, DriftAction, RecommendationPriority, EstimatedWork, } from "../../types/TestAnalysis.js";
5
5
  import { TestExecutionStatus } from "../../types/TestExecution.js";
6
6
  import { TestType } from "../../types/TestTypes.js";
7
7
  import * as fs from "fs";
@@ -9,8 +9,10 @@ import * as path from "path";
9
9
  import { AnalyticsService } from "../../services/AnalyticsService.js";
10
10
  import { dualChannelResult, toolError } from "../../utils/utils.js";
11
11
  import { isTestFile } from "../../utils/testFileClassification.js";
12
- import { REBASELINE_SNAPSHOT_NAME_RE, looksLikeOnDiskBaselineName } from "../../utils/rebaselineSnapshots.js";
12
+ import { REBASELINE_SNAPSHOT_NAME_RE, looksLikeOnDiskBaselineName, } from "../../utils/rebaselineSnapshots.js";
13
13
  import { buildRenameStrategy, buildFileRenameStrategy, buildUpdateStrategy, buildRebaselineStrategy, buildRegenerateStrategy, buildDeleteStrategy, buildUpdateFileInstruction, buildRegenerateFileInstruction, } from "../../prompts/test-maintenance/actionsInstructions.js";
14
+ import { buildModularizeFirstNextSteps, isMaintenanceRegenerable, isModularizeFirstHandOffTarget, regenerateCodeReuse, } from "../../prompts/reuse-hand-off.js";
15
+ import { recordReuseHandOff } from "../code-refactor/reuse-state.js";
14
16
  /**
15
17
  * Compute a suggested new filename when an endpoint is renamed.
16
18
  */
@@ -51,12 +53,16 @@ export function computeRenamedTestFile(testFile, renames) {
51
53
  const recommendationSchema = z.object({
52
54
  testFilePath: z
53
55
  .string()
54
- .refine((p) => path.isAbsolute(p), { message: "testFilePath must be an absolute path" })
56
+ .refine((p) => path.isAbsolute(p), {
57
+ message: "testFilePath must be an absolute path",
58
+ })
55
59
  .describe("Absolute path to the test spec file — use the path as reported by skyramp_analyze_changes or skyramp_analyze_test_health. For POM-based tests, this is the spec file (shown in the report); set pomFile to the page object path to edit."),
56
60
  pomFile: z
57
61
  .string()
58
62
  .optional()
59
- .refine((p) => p === undefined || path.isAbsolute(p), { message: "pomFile must be an absolute path" })
63
+ .refine((p) => p === undefined || path.isAbsolute(p), {
64
+ message: "pomFile must be an absolute path",
65
+ })
60
66
  .describe("Absolute path to the page object (POM) file to edit, when the spec delegates selectors to a page object. When set, skyramp_actions edits this file instead of testFilePath. testFilePath (the spec) is still used for catalog validation and the maintenance report."),
61
67
  action: z
62
68
  .nativeEnum(DriftAction)
@@ -94,12 +100,19 @@ const recommendationSchema = z.object({
94
100
  "Test hits GET /products — assert stock_count is present and non-negative.'"),
95
101
  editSites: z
96
102
  .array(z.object({
97
- line: z.number().int().min(1).describe("1-based line number of the edit site in the current file."),
103
+ line: z
104
+ .number()
105
+ .int()
106
+ .min(1)
107
+ .describe("1-based line number of the edit site in the current file."),
98
108
  anchor: z
99
109
  .string()
100
110
  .min(1)
101
111
  .describe("A short verbatim snippet from that line (copied exactly from the file you read) so the edit can be located without re-scanning."),
102
- change: z.string().optional().describe("What to change at this site (e.g. 'add work_pool_name to this payload')."),
112
+ change: z
113
+ .string()
114
+ .optional()
115
+ .describe("What to change at this site (e.g. 'add work_pool_name to this payload')."),
103
116
  }))
104
117
  .optional()
105
118
  .describe("For a large UPDATE file, the concrete per-site edits you already located while reading it — one entry per place that must change, with a verbatim anchor. " +
@@ -110,7 +123,7 @@ const recommendationSchema = z.object({
110
123
  // are dropped and surfaced in the response.
111
124
  .array(z.string())
112
125
  .optional()
113
- .describe("UPDATE only — the toHaveScreenshot() baseline filenames (e.g. [\"page-001.png\"]) whose captured page/element/region the diff visibly changed, so the committed PNG is stale (SKYR-4298). " +
126
+ .describe('UPDATE only — the toHaveScreenshot() baseline filenames (e.g. ["page-001.png"]) whose captured page/element/region the diff visibly changed, so the committed PNG is stale (SKYR-4298). ' +
114
127
  "List only the baselines the change reaches; leave unaffected ones out. These are refreshed at the final skyramp_execute_test run via its rebaselineSnapshots parameter, never by editing the assertion, its maxDiffPixelRatio, or the PNG. " +
115
128
  "Omit when the diff does not explain a screenshot mismatch — that failure stays red."),
116
129
  renamedEndpoints: z
@@ -125,12 +138,15 @@ const recommendationSchema = z.object({
125
138
  const actionsSchema = {
126
139
  stateFile: z
127
140
  .string()
128
- .refine((p) => path.isAbsolute(p), { message: "stateFile must be an absolute path" })
141
+ .refine((p) => path.isAbsolute(p), {
142
+ message: "stateFile must be an absolute path",
143
+ })
129
144
  .describe("Path to state file from skyramp_analyze_changes"),
130
145
  repository: z
131
146
  .string()
132
- .optional()
133
- .describe("The owner/repo whose analysis section to act on (e.g. 'letsramp/api-insight'). In a multi-repo run, ALWAYS set it — the primary's owner/repo for the primary repo's tests, or a related repo's owner/repo for that repo's section — within the run-scoped stateFile. Omit only for a single-repo run."),
147
+ .trim()
148
+ .min(1)
149
+ .describe("The owner/repo whose analysis section to act on (e.g. 'letsramp/api-insight'). Set it on every call — the primary's owner/repo for the primary repo's tests, or a related repo's owner/repo for that repo's section — within the run-scoped stateFile."),
134
150
  recommendations: z
135
151
  .array(recommendationSchema)
136
152
  .default([])
@@ -180,7 +196,7 @@ export function registerActionsTool(server) {
180
196
  // Allowlist: Skyramp-generated tests + relevant external tests.
181
197
  // Using an allowlist (not a blocklist) catches hallucinated paths the LLM
182
198
  // may supply that are not in the scanned catalog at all.
183
- const testAnalysisResults = (stateData.existingTests || []);
199
+ const testAnalysisResults = stateData.existingTests || [];
184
200
  const skyrampTestFiles = new Set(testAnalysisResults
185
201
  .filter((t) => t.source !== TestSource.External)
186
202
  .map((t) => t.testFile));
@@ -209,9 +225,14 @@ export function registerActionsTool(server) {
209
225
  // Exception: files already in the scanned test catalog (externalTestFiles / skyrampTestFiles)
210
226
  // may legitimately live in a separate testsRepoDir outside repositoryPath — catalog
211
227
  // membership is a sufficient provenance check for those paths.
212
- const isInCatalog = skyrampTestFiles.has(resolvedFile) || skyrampTestFiles.has(rec.testFilePath)
213
- || externalTestFiles.has(resolvedFile) || externalTestFiles.has(rec.testFilePath);
214
- if (repoRoot && !isInCatalog && !resolvedFile.startsWith(repoRoot + path.sep) && resolvedFile !== repoRoot) {
228
+ const isInCatalog = skyrampTestFiles.has(resolvedFile) ||
229
+ skyrampTestFiles.has(rec.testFilePath) ||
230
+ externalTestFiles.has(resolvedFile) ||
231
+ externalTestFiles.has(rec.testFilePath);
232
+ if (repoRoot &&
233
+ !isInCatalog &&
234
+ !resolvedFile.startsWith(repoRoot + path.sep) &&
235
+ resolvedFile !== repoRoot) {
215
236
  logger.warning(`Skipping recommendation for path outside repo root: ${rec.testFilePath}`);
216
237
  return;
217
238
  }
@@ -219,9 +240,11 @@ export function registerActionsTool(server) {
219
240
  // recommendation. Hallucinated paths (not in either set) are rejected for
220
241
  // all actions, including VERIFY and IGNORE, to keep the report consistent
221
242
  // with what was actually discovered.
222
- const isSkyramp = skyrampTestFiles.has(resolvedFile) || skyrampTestFiles.has(rec.testFilePath);
243
+ const isSkyramp = skyrampTestFiles.has(resolvedFile) ||
244
+ skyrampTestFiles.has(rec.testFilePath);
223
245
  // Catalog membership is the safety boundary — prevents editing non-test files.
224
- const isRelevantExternal = (externalTestFiles.has(resolvedFile) || externalTestFiles.has(rec.testFilePath));
246
+ const isRelevantExternal = externalTestFiles.has(resolvedFile) ||
247
+ externalTestFiles.has(rec.testFilePath);
225
248
  const isInAnyKnownCatalog = isSkyramp || isRelevantExternal;
226
249
  // Discovery is relevance-scoped, not exhaustive — it can miss a real test file the
227
250
  // agent correctly identifies from the diff (e.g. an e2e Playwright spec/POM under a
@@ -234,7 +257,9 @@ export function registerActionsTool(server) {
234
257
  // this preserves the anti-hallucination guarantee (an invented path fails existsSync).
235
258
  const isRealUncatalogedTest = !isInAnyKnownCatalog &&
236
259
  isTestFile(resolvedFile) &&
237
- (!repoRoot || resolvedFile.startsWith(repoRoot + path.sep) || resolvedFile === repoRoot) &&
260
+ (!repoRoot ||
261
+ resolvedFile.startsWith(repoRoot + path.sep) ||
262
+ resolvedFile === repoRoot) &&
238
263
  fs.existsSync(resolvedFile);
239
264
  if (!isInAnyKnownCatalog && !isRealUncatalogedTest) {
240
265
  logger.warning(`Skipping ${rec.action} for unknown test (not in scanned catalog, not a real test file): ${rec.testFilePath}`);
@@ -243,7 +268,11 @@ export function registerActionsTool(server) {
243
268
  if (isRealUncatalogedTest) {
244
269
  logger.info(`Accepting uncataloged but real test file discovery missed: ${rec.testFilePath}`);
245
270
  }
246
- const isActionable = [DriftAction.Update, DriftAction.Regenerate, DriftAction.Delete].includes(rec.action);
271
+ const isActionable = [
272
+ DriftAction.Update,
273
+ DriftAction.Regenerate,
274
+ DriftAction.Delete,
275
+ ].includes(rec.action);
247
276
  // No write access to a related repo's checkout — convert any edit-requiring
248
277
  // action to VERIFY so the finding still surfaces without attempting a write that
249
278
  // would fail (or land in a checkout that shouldn't be touched at all).
@@ -261,7 +290,10 @@ export function registerActionsTool(server) {
261
290
  });
262
291
  return;
263
292
  }
264
- if (isActionable && !isSkyramp && !isRelevantExternal && !isRealUncatalogedTest) {
293
+ if (isActionable &&
294
+ !isSkyramp &&
295
+ !isRelevantExternal &&
296
+ !isRealUncatalogedTest) {
265
297
  logger.warning(`Skipping ${rec.action} for irrelevant external test: ${rec.testFilePath}`);
266
298
  return;
267
299
  }
@@ -272,8 +304,10 @@ export function registerActionsTool(server) {
272
304
  // report renders it as a deletion/regeneration RECOMMENDATION the developer applies
273
305
  // manually. `reportOnly: true` makes the apply loops below skip it (B2 — a flattened
274
306
  // VERIFY read to the D2 judge as "uncertain", hiding a correct DELETE call).
275
- if (isExternalTarget && !isSkyramp &&
276
- (rec.action === DriftAction.Regenerate || rec.action === DriftAction.Delete)) {
307
+ if (isExternalTarget &&
308
+ !isSkyramp &&
309
+ (rec.action === DriftAction.Regenerate ||
310
+ rec.action === DriftAction.Delete)) {
277
311
  recommendations.push({
278
312
  testFilePath: resolvedFile,
279
313
  action: rec.action,
@@ -306,7 +340,8 @@ export function registerActionsTool(server) {
306
340
  resolvedPomFile = undefined;
307
341
  }
308
342
  }
309
- if (rec.action !== DriftAction.Update && rec.rebaselineSnapshots?.length) {
343
+ if (rec.action !== DriftAction.Update &&
344
+ rec.rebaselineSnapshots?.length) {
310
345
  droppedRebaselineNotes.push(`${rec.testFilePath}: rebaselineSnapshots [${rec.rebaselineSnapshots.join(", ")}] ignored on ${rec.action} — a baseline refresh is only meaningful on UPDATE.`);
311
346
  }
312
347
  // Per-entry validation (the schema is deliberately loose, see above).
@@ -350,7 +385,12 @@ export function registerActionsTool(server) {
350
385
  testFilePath: resolvedFile,
351
386
  pomFile: resolvedPomFile,
352
387
  action: actionForVerdict,
353
- testType: rec.testType,
388
+ // The catalog's type wins over the caller's claim, and it wins ONCE, here:
389
+ // the verdict the report row is built from, the reuse hand-off, the steps
390
+ // and the regenerate context all read this one value. Letting the row keep
391
+ // a mislabeled type while the hand-off carried the cataloged one made the
392
+ // report drop the row's reuse on the mismatch.
393
+ testType: catalogByFile.get(resolvedFile)?.testType ?? rec.testType,
354
394
  endpoint: rec.endpoint,
355
395
  priority: rec.priority ?? RecommendationPriority.Medium,
356
396
  rationale: rationaleForVerdict,
@@ -384,6 +424,24 @@ export function registerActionsTool(server) {
384
424
  // `maintenanceVerdicts` (the validated recommendations), persisted below at
385
425
  // decision-time — that persistence is what prevents a decided-upon entry from silently
386
426
  // vanishing at report time; the ignored set is a complete, accurate record for free.
427
+ // The renamed path has to be known BEFORE the verdicts are persisted.
428
+ // The rename itself happens further down, and the report looks for the
429
+ // file's run under the name the file ends up with; persisted with the
430
+ // old name, a moved spec is not found on disk and drops out of
431
+ // execution coverage without a word.
432
+ //
433
+ // Always derived from the spec (testFilePath), never the POM
434
+ // (editTarget): fileRenames keys off testFilePath, so the spec is what
435
+ // moves, and deriving from editTarget when pomFile is set would produce
436
+ // a name built from the page-object path.
437
+ for (const r of recommendations) {
438
+ if (!r.renamedEndpoints?.length)
439
+ continue;
440
+ const renamed = computeRenamedTestFile(r.testFilePath, r.renamedEndpoints) ??
441
+ undefined;
442
+ if (renamed)
443
+ r._suggestedNewFile = renamed;
444
+ }
387
445
  const recommendedPaths = new Set(recommendations.map((r) => r.testFilePath));
388
446
  const ignoredTestFiles = testAnalysisResults
389
447
  .map((t) => t.testFile)
@@ -392,7 +450,7 @@ export function registerActionsTool(server) {
392
450
  // Must fail loud — edits below apply regardless, so a swallowed failure here
393
451
  // would let edits ship with no testMaintenance in the final report.
394
452
  try {
395
- await stateManager.writeRepoData({
453
+ await stateManager.updateRepoData({
396
454
  ...stateData,
397
455
  ignoredTestFiles,
398
456
  maintenanceVerdicts: recommendations.map((r) => ({
@@ -408,13 +466,22 @@ export function registerActionsTool(server) {
408
466
  // Persisted so the report-time working-tree check knows this UPDATE's
409
467
  // change is the refreshed PNG, not the spec (SKYR-4298).
410
468
  ...(r.rebaselineSnapshots?.length
411
- ? { rebaselineSnapshots: r.rebaselineSnapshots, rebaselineOnly: r.rebaselineOnly === true }
469
+ ? {
470
+ rebaselineSnapshots: r.rebaselineSnapshots,
471
+ rebaselineOnly: r.rebaselineOnly === true,
472
+ }
412
473
  : {}),
413
474
  // Persisted so maintenance coverage can tell a REGENERATE that rewrote a
414
475
  // file from one that only advised the developer to: an external test's
415
476
  // REGENERATE/DELETE keeps its real action and touches nothing, so without
416
477
  // this the report credits a `maintains` claim no edit backs.
417
478
  ...(r.reportOnly ? { reportOnly: true } : {}),
479
+ // Persisted so the report stage can find the renamed file's run: the
480
+ // rename lands before execution, so the run is recorded under this
481
+ // path while testFilePath still holds the name it had before.
482
+ ...(r._suggestedNewFile
483
+ ? { _suggestedNewFile: r._suggestedNewFile }
484
+ : {}),
418
485
  })),
419
486
  }, { repo: args.repository, repositoryPath, step: "actions" });
420
487
  }
@@ -445,13 +512,15 @@ export function registerActionsTool(server) {
445
512
  continue;
446
513
  if (rec.action === DriftAction.Delete) {
447
514
  const existing = deleteByFile.get(rec.testFilePath);
448
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
515
+ if (!existing ||
516
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
449
517
  deleteByFile.set(rec.testFilePath, rec);
450
518
  }
451
519
  }
452
520
  else if (rec.action === DriftAction.Regenerate) {
453
521
  const existing = regenerateByFile.get(rec.testFilePath);
454
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
522
+ if (!existing ||
523
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
455
524
  regenerateByFile.set(rec.testFilePath, rec);
456
525
  }
457
526
  }
@@ -460,7 +529,8 @@ export function registerActionsTool(server) {
460
529
  if (!regenerateByFile.has(rec.testFilePath)) {
461
530
  const key = `${rec.testFilePath}::${rec.pomFile ?? ""}`;
462
531
  const existing = updateByKey.get(key);
463
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
532
+ if (!existing ||
533
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
464
534
  updateByKey.set(key, rec);
465
535
  }
466
536
  }
@@ -489,6 +559,36 @@ export function registerActionsTool(server) {
489
559
  const testFilesToDelete = deleteRecommendations.map((rec) => rec.testFilePath);
490
560
  const fileInstructions = [];
491
561
  const testFilesToUpdate = [];
562
+ // A Skyramp test rewritten in place — updated or regenerated — owes the same
563
+ // modularize → reuse pair a generated one does, under the same predicate. The
564
+ // hand-off is recorded here, at the site that emits the instruction, as a
565
+ // maintenance hand-off: the file is at HEAD by definition, so the chain gate
566
+ // must not read that as "not this run's". An external test is the customer's
567
+ // code and is never modularized into the shared module. Returns the
568
+ // next-steps block for the file, or undefined when nothing was armed.
569
+ const armReuseChain = async (rec) => {
570
+ if (!skyrampTestFiles.has(rec.testFilePath))
571
+ return undefined;
572
+ const cataloged = catalogByFile.get(rec.testFilePath);
573
+ const language = cataloged?.language;
574
+ // Already the cataloged type — normalized once where the recommendation
575
+ // was built, so the verdict, the hand-off and the steps cannot disagree.
576
+ const testType = rec.testType;
577
+ if (!language) {
578
+ logger.info(`No language cataloged for ${rec.testFilePath} — not arming the modularize → reuse chain for this ${rec.action}`);
579
+ return undefined;
580
+ }
581
+ if (!isModularizeFirstHandOffTarget(testType, language))
582
+ return undefined;
583
+ const framework = cataloged?.framework ?? "";
584
+ await recordReuseHandOff([rec.testFilePath], testType, language, framework, args.stateFile, "maintenance");
585
+ return buildModularizeFirstNextSteps({
586
+ testType,
587
+ language,
588
+ framework,
589
+ enhanceFirst: false,
590
+ });
591
+ };
492
592
  // ── UPDATE: emit targeted edit instructions ──
493
593
  for (const rec of updateRecommendations) {
494
594
  if (!rec.testFilePath) {
@@ -508,16 +608,33 @@ export function registerActionsTool(server) {
508
608
  continue;
509
609
  }
510
610
  const renames = rec.renamedEndpoints || [];
511
- const isRenameUpdate = renames.length > 0;
512
- // Always derive the rename suggestion from the spec (testFilePath), not the
513
- // POM (editTarget). fileRenames keys off rec.testFilePath so the spec is
514
- // what gets renamed; computing from editTarget when pomFile is set
515
- // would produce a name derived from the page-object path instead.
516
- const suggestedNewFile = isRenameUpdate
517
- ? computeRenamedTestFile(rec.testFilePath, renames) ?? undefined
518
- : undefined;
519
- if (suggestedNewFile)
520
- rec._suggestedNewFile = suggestedNewFile;
611
+ // Computed above, before the verdicts were persisted.
612
+ const suggestedNewFile = rec._suggestedNewFile;
613
+ // Armed only when this UPDATE rewrites the SPEC BODY, because that is the
614
+ // only edit the modularize → reuse pair has anything to act on.
615
+ //
616
+ // `pomFile` set means the edit lands somewhere the spec delegates its
617
+ // selectors to, and the spec body is left alone. That is a page object in
618
+ // the case the field was named for, but agents also use it for the SHARED
619
+ // MODULE when a stale selector lives in a helper — observed twice on the
620
+ // repo20-SR02 fixture, and correct by the field's own description. Either
621
+ // way the spec is not rewritten, so it owes nothing. Consequence worth
622
+ // knowing: a fixture cannot assume a maintained spec gets armed, since the
623
+ // agent may route the whole edit through this field (SKYR-4412).
624
+ //
625
+ // A rename UPDATE is a URL-path substitution and moves the file; the hand-off
626
+ // is keyed by the path the file has now, so after the move the gate and the
627
+ // report would look there and find nothing — a debt recorded where no one
628
+ // reads it. A rebaseline-only UPDATE edits no spec at all; its maintenance is
629
+ // the PNG refresh. A rationale-only UPDATE (no updateInstructions) has no
630
+ // update_context entry to carry post_edit_steps, so the structured plan could
631
+ // not pay the debt.
632
+ if (!rec.pomFile &&
633
+ !suggestedNewFile &&
634
+ !rec.rebaselineOnly &&
635
+ rec.updateInstructions) {
636
+ rec._postEditSteps = await armReuseChain(rec);
637
+ }
521
638
  fileInstructions.push(buildUpdateFileInstruction({
522
639
  testFile: editTarget,
523
640
  renames,
@@ -525,6 +642,7 @@ export function registerActionsTool(server) {
525
642
  updateInstructions: rec.updateInstructions,
526
643
  rationale: rec.rationale,
527
644
  rebaselineSnapshots: rec.rebaselineSnapshots,
645
+ postEditSteps: rec._postEditSteps,
528
646
  }));
529
647
  }
530
648
  // ── REGENERATE: emit overwrite instructions ──
@@ -536,11 +654,21 @@ export function registerActionsTool(server) {
536
654
  continue;
537
655
  }
538
656
  testFilesToRegenerate.push(rec.testFilePath);
657
+ const cataloged = catalogByFile.get(rec.testFilePath);
658
+ // The generation call the instruction prescribes records its own hand-off for
659
+ // the file it writes; this maintenance mark is what that hand-off inherits its
660
+ // origin from, so the rewrite of a file at HEAD still owes the chain. Only for
661
+ // a type this step can actually regenerate (see isMaintenanceRegenerable).
662
+ if (isMaintenanceRegenerable(rec.testType)) {
663
+ await armReuseChain(rec);
664
+ }
539
665
  regenerateInstructions.push(buildRegenerateFileInstruction({
540
666
  testFile: rec.testFilePath,
541
667
  updateInstructions: rec.updateInstructions,
542
668
  outputDir: path.dirname(rec.testFilePath),
543
669
  outputFile: path.basename(rec.testFilePath),
670
+ testType: rec.testType,
671
+ language: cataloged?.language,
544
672
  }));
545
673
  }
546
674
  // ── Build response text ──
@@ -556,7 +684,9 @@ export function registerActionsTool(server) {
556
684
  }
557
685
  if (regenerateRecommendations.length > 0) {
558
686
  sections.push(`## Tests Requiring Regeneration (${regenerateRecommendations.length})\n\n` +
559
- testFilesToRegenerate.map((f, i) => `${i + 1}. \`${f}\``).join("\n") +
687
+ testFilesToRegenerate
688
+ .map((f, i) => `${i + 1}. \`${f}\``)
689
+ .join("\n") +
560
690
  `\n\n---\n` +
561
691
  regenerateInstructions.join("\n---\n"));
562
692
  }
@@ -564,12 +694,16 @@ export function registerActionsTool(server) {
564
694
  sections.push(`## Tests To Delete (${deleteRecommendations.length})\n\n` +
565
695
  testFilesToDelete.map((f, i) => `${i + 1}. \`${f}\``).join("\n") +
566
696
  `\n\n---\n` +
567
- deleteRecommendations.map((rec) => `- **${rec.testFilePath}**${rec.rationale ? ` — ${rec.rationale}` : ""}`).join("\n"));
697
+ deleteRecommendations
698
+ .map((rec) => `- **${rec.testFilePath}**${rec.rationale ? ` — ${rec.rationale}` : ""}`)
699
+ .join("\n"));
568
700
  }
569
701
  if (otherRecs.length > 0) {
570
702
  sections.push(`## Other Findings (${otherRecs.length})\n\n` +
571
- otherRecs.map((rec) => `- **${rec.testFilePath}** — Action: ${rec.action}, Priority: ${rec.priority}` +
572
- (rec.rationale ? ` — ${rec.rationale}` : "")).join("\n"));
703
+ otherRecs
704
+ .map((rec) => `- **${rec.testFilePath}** — Action: ${rec.action}, Priority: ${rec.priority}` +
705
+ (rec.rationale ? ` — ${rec.rationale}` : ""))
706
+ .join("\n"));
573
707
  }
574
708
  else if (updateRecommendations.length === 0 &&
575
709
  regenerateRecommendations.length === 0 &&
@@ -585,7 +719,9 @@ export function registerActionsTool(server) {
585
719
  // ── Build LLM instructions ──
586
720
  const uniqueRenames = updateRecommendations
587
721
  .flatMap((rec) => rec.renamedEndpoints ?? [])
588
- .filter((r, i, arr) => arr.findIndex((x) => x.oldPath === r.oldPath && x.newPath === r.newPath && x.method === r.method) === i);
722
+ .filter((r, i, arr) => arr.findIndex((x) => x.oldPath === r.oldPath &&
723
+ x.newPath === r.newPath &&
724
+ x.method === r.method) === i);
589
725
  const llmInstructionsObj = {
590
726
  workflow: "test_maintenance",
591
727
  action: "execute_updates",
@@ -603,7 +739,10 @@ export function registerActionsTool(server) {
603
739
  const fileRenames = [];
604
740
  for (const rec of updateRecommendations) {
605
741
  if (rec._suggestedNewFile) {
606
- fileRenames.push({ from: rec.testFilePath, to: rec._suggestedNewFile });
742
+ fileRenames.push({
743
+ from: rec.testFilePath,
744
+ to: rec._suggestedNewFile,
745
+ });
607
746
  }
608
747
  }
609
748
  if (fileRenames.length > 0) {
@@ -624,19 +763,29 @@ export function registerActionsTool(server) {
624
763
  // explicit edit_required: false so the strategy's "make the changes
625
764
  // described in context" cannot apply to it (rationale is always set,
626
765
  // so it must not stand in for edit instructions here).
627
- ...(hasEdit ? { context: rec.updateInstructions } : { edit_required: false }),
766
+ ...(hasEdit
767
+ ? { context: rec.updateInstructions }
768
+ : { edit_required: false }),
628
769
  ...(rec.editSites?.length ? { edit_sites: rec.editSites } : {}),
629
770
  // The baselines to pass as skyramp_execute_test's rebaselineSnapshots for
630
771
  // the SPEC (testFilePath, which is what runs) — never `file`, which is
631
772
  // the page object for a POM-backed UPDATE.
632
773
  ...(rec.rebaselineSnapshots?.length
633
- ? { spec_file: rec.testFilePath, rebaseline_snapshots: rec.rebaselineSnapshots }
774
+ ? {
775
+ spec_file: rec.testFilePath,
776
+ rebaseline_snapshots: rec.rebaselineSnapshots,
777
+ }
778
+ : {}),
779
+ // The modularize → reuse steps the file owes, on the entry the agent
780
+ // follows (the summary block above is the same text for a reader).
781
+ ...(rec._postEditSteps
782
+ ? { post_edit_steps: rec._postEditSteps }
634
783
  : {}),
635
784
  };
636
785
  });
637
786
  if (updateContext.length > 0) {
638
787
  llmInstructionsObj.update_context = updateContext;
639
- llmInstructionsObj.update_strategy = buildUpdateStrategy();
788
+ llmInstructionsObj.update_strategy = buildUpdateStrategy(updateContext.some((u) => "post_edit_steps" in u));
640
789
  if (updateContext.some((u) => "rebaseline_snapshots" in u)) {
641
790
  llmInstructionsObj.rebaseline_strategy = buildRebaselineStrategy();
642
791
  }
@@ -649,6 +798,7 @@ export function registerActionsTool(server) {
649
798
  // replicate the file. Those come from the discovery catalog, so the file
650
799
  // text is not needed to carry them.
651
800
  const cataloged = catalogByFile.get(rec.testFilePath);
801
+ const generationArgs = regenerateCodeReuse(rec.testType, cataloged?.language)?.args;
652
802
  return {
653
803
  file: rec.testFilePath,
654
804
  rationale: rec.updateInstructions || rec.rationale,
@@ -656,13 +806,17 @@ export function registerActionsTool(server) {
656
806
  // use them instead of reading the file, so an absent one leaves the generation
657
807
  // call without a target. The catalog's apiEndpoint is optional and can be an
658
808
  // empty string; both fields are required on the recommendation itself.
659
- test_type: cataloged?.testType ?? rec.testType,
809
+ test_type: rec.testType,
660
810
  endpoint: cataloged?.apiEndpoint || rec.endpoint,
661
811
  ...(cataloged?.language && { language: cataloged.language }),
662
812
  ...(cataloged?.framework && { framework: cataloged.framework }),
813
+ // The codeReuse options the per-file instruction asks for, on the entry
814
+ // the agent follows, so a client that reads only the structured plan
815
+ // still arms the chain the maintenance hand-off recorded.
816
+ ...(generationArgs && { generation_args: generationArgs }),
663
817
  };
664
818
  });
665
- llmInstructionsObj.regenerate_strategy = buildRegenerateStrategy();
819
+ llmInstructionsObj.regenerate_strategy = buildRegenerateStrategy(llmInstructionsObj.regenerate_context.some((e) => !!e.generation_args));
666
820
  }
667
821
  if (deleteRecommendations.length > 0) {
668
822
  llmInstructionsObj.delete_strategy = buildDeleteStrategy();
@@ -671,7 +825,10 @@ export function registerActionsTool(server) {
671
825
  // The two payloads were previously separate content[] blocks annotated
672
826
  // audience: ["user"] and ["assistant"]. Nothing in this repo read those
673
827
  // annotations, and the field names carry the same distinction.
674
- return dualChannelResult({ summary: responseText, instructions: llmInstructions });
828
+ return dualChannelResult({
829
+ summary: responseText,
830
+ instructions: llmInstructions,
831
+ });
675
832
  }
676
833
  catch (error) {
677
834
  logger.error(`Actions tool failed: ${error.message}`, error);
@@ -689,7 +846,9 @@ export function registerActionsTool(server) {
689
846
  }
690
847
  AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, {
691
848
  repositoryPath,
692
- }).catch((err) => { logger.warning("Analytics event failed", { error: String(err) }); });
849
+ }).catch((err) => {
850
+ logger.warning("Analytics event failed", { error: String(err) });
851
+ });
693
852
  }
694
853
  });
695
854
  }
@@ -11,12 +11,11 @@ export declare function buildTraceFileEntry(tracePath: string, result: TracePars
11
11
  export declare function isGraphQLFile(filePath: string, repositoryPath: string): Promise<boolean>;
12
12
  export declare const analyzeChangesInputSchema: {
13
13
  repositoryPath: z.ZodString;
14
+ repository: z.ZodString;
14
15
  scope: z.ZodOptional<z.ZodDefault<z.ZodEnum<["full_repo", "branch_diff"]>>>;
15
16
  baseBranch: z.ZodOptional<z.ZodString>;
16
17
  testDirectory: z.ZodOptional<z.ZodString>;
17
18
  prNumber: z.ZodOptional<z.ZodNumber>;
18
- repository: z.ZodOptional<z.ZodString>;
19
- primaryRepository: z.ZodOptional<z.ZodString>;
20
19
  testsRepoDir: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
21
20
  includeUncommitted: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
22
21
  };
@@ -31,8 +30,8 @@ export interface AnalyzeChangesData {
31
30
  stateFile?: string;
32
31
  repositoryPath: string;
33
32
  repositoryName: string;
34
- /** owner/repo, when the caller supplied it. */
35
- repository?: string;
33
+ /** owner/repo of the analyzed repository. Always supplied. */
34
+ repository: string;
36
35
  /** Other repositories already analyzed into this run's state file. */
37
36
  relatedRepositories?: string[];
38
37
  analysisScope: string;
@@ -86,7 +85,7 @@ export declare const analyzeChangesOutputSchema: {
86
85
  stateFile: z.ZodOptional<z.ZodString>;
87
86
  repositoryPath: z.ZodString;
88
87
  repositoryName: z.ZodString;
89
- repository: z.ZodOptional<z.ZodString>;
88
+ repository: z.ZodString;
90
89
  relatedRepositories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
91
90
  analysisScope: z.ZodString;
92
91
  planOnly: z.ZodBoolean;