@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
@@ -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,13 @@ 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";
16
+ import { isPlanOnlyMode } from "../../utils/planOnlyMode.js";
17
+ import { runTestCall } from "../../skills/runTestSkill.js";
18
+ import { formatOwedFiles, testsOwedBeforeRun } from "./testsOwedBeforeRun.js";
14
19
  /**
15
20
  * Compute a suggested new filename when an endpoint is renamed.
16
21
  */
@@ -51,12 +56,16 @@ export function computeRenamedTestFile(testFile, renames) {
51
56
  const recommendationSchema = z.object({
52
57
  testFilePath: z
53
58
  .string()
54
- .refine((p) => path.isAbsolute(p), { message: "testFilePath must be an absolute path" })
59
+ .refine((p) => path.isAbsolute(p), {
60
+ message: "testFilePath must be an absolute path",
61
+ })
55
62
  .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
63
  pomFile: z
57
64
  .string()
58
65
  .optional()
59
- .refine((p) => p === undefined || path.isAbsolute(p), { message: "pomFile must be an absolute path" })
66
+ .refine((p) => p === undefined || path.isAbsolute(p), {
67
+ message: "pomFile must be an absolute path",
68
+ })
60
69
  .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
70
  action: z
62
71
  .nativeEnum(DriftAction)
@@ -94,12 +103,19 @@ const recommendationSchema = z.object({
94
103
  "Test hits GET /products — assert stock_count is present and non-negative.'"),
95
104
  editSites: z
96
105
  .array(z.object({
97
- line: z.number().int().min(1).describe("1-based line number of the edit site in the current file."),
106
+ line: z
107
+ .number()
108
+ .int()
109
+ .min(1)
110
+ .describe("1-based line number of the edit site in the current file."),
98
111
  anchor: z
99
112
  .string()
100
113
  .min(1)
101
114
  .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')."),
115
+ change: z
116
+ .string()
117
+ .optional()
118
+ .describe("What to change at this site (e.g. 'add work_pool_name to this payload')."),
103
119
  }))
104
120
  .optional()
105
121
  .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 +126,7 @@ const recommendationSchema = z.object({
110
126
  // are dropped and surfaced in the response.
111
127
  .array(z.string())
112
128
  .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). " +
129
+ .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
130
  "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
131
  "Omit when the diff does not explain a screenshot mismatch — that failure stays red."),
116
132
  renamedEndpoints: z
@@ -125,12 +141,15 @@ const recommendationSchema = z.object({
125
141
  const actionsSchema = {
126
142
  stateFile: z
127
143
  .string()
128
- .refine((p) => path.isAbsolute(p), { message: "stateFile must be an absolute path" })
144
+ .refine((p) => path.isAbsolute(p), {
145
+ message: "stateFile must be an absolute path",
146
+ })
129
147
  .describe("Path to state file from skyramp_analyze_changes"),
130
148
  repository: z
131
149
  .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."),
150
+ .trim()
151
+ .min(1)
152
+ .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
153
  recommendations: z
135
154
  .array(recommendationSchema)
136
155
  .default([])
@@ -180,7 +199,7 @@ export function registerActionsTool(server) {
180
199
  // Allowlist: Skyramp-generated tests + relevant external tests.
181
200
  // Using an allowlist (not a blocklist) catches hallucinated paths the LLM
182
201
  // may supply that are not in the scanned catalog at all.
183
- const testAnalysisResults = (stateData.existingTests || []);
202
+ const testAnalysisResults = stateData.existingTests || [];
184
203
  const skyrampTestFiles = new Set(testAnalysisResults
185
204
  .filter((t) => t.source !== TestSource.External)
186
205
  .map((t) => t.testFile));
@@ -209,9 +228,14 @@ export function registerActionsTool(server) {
209
228
  // Exception: files already in the scanned test catalog (externalTestFiles / skyrampTestFiles)
210
229
  // may legitimately live in a separate testsRepoDir outside repositoryPath — catalog
211
230
  // 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) {
231
+ const isInCatalog = skyrampTestFiles.has(resolvedFile) ||
232
+ skyrampTestFiles.has(rec.testFilePath) ||
233
+ externalTestFiles.has(resolvedFile) ||
234
+ externalTestFiles.has(rec.testFilePath);
235
+ if (repoRoot &&
236
+ !isInCatalog &&
237
+ !resolvedFile.startsWith(repoRoot + path.sep) &&
238
+ resolvedFile !== repoRoot) {
215
239
  logger.warning(`Skipping recommendation for path outside repo root: ${rec.testFilePath}`);
216
240
  return;
217
241
  }
@@ -219,9 +243,11 @@ export function registerActionsTool(server) {
219
243
  // recommendation. Hallucinated paths (not in either set) are rejected for
220
244
  // all actions, including VERIFY and IGNORE, to keep the report consistent
221
245
  // with what was actually discovered.
222
- const isSkyramp = skyrampTestFiles.has(resolvedFile) || skyrampTestFiles.has(rec.testFilePath);
246
+ const isSkyramp = skyrampTestFiles.has(resolvedFile) ||
247
+ skyrampTestFiles.has(rec.testFilePath);
223
248
  // Catalog membership is the safety boundary — prevents editing non-test files.
224
- const isRelevantExternal = (externalTestFiles.has(resolvedFile) || externalTestFiles.has(rec.testFilePath));
249
+ const isRelevantExternal = externalTestFiles.has(resolvedFile) ||
250
+ externalTestFiles.has(rec.testFilePath);
225
251
  const isInAnyKnownCatalog = isSkyramp || isRelevantExternal;
226
252
  // Discovery is relevance-scoped, not exhaustive — it can miss a real test file the
227
253
  // agent correctly identifies from the diff (e.g. an e2e Playwright spec/POM under a
@@ -234,7 +260,9 @@ export function registerActionsTool(server) {
234
260
  // this preserves the anti-hallucination guarantee (an invented path fails existsSync).
235
261
  const isRealUncatalogedTest = !isInAnyKnownCatalog &&
236
262
  isTestFile(resolvedFile) &&
237
- (!repoRoot || resolvedFile.startsWith(repoRoot + path.sep) || resolvedFile === repoRoot) &&
263
+ (!repoRoot ||
264
+ resolvedFile.startsWith(repoRoot + path.sep) ||
265
+ resolvedFile === repoRoot) &&
238
266
  fs.existsSync(resolvedFile);
239
267
  if (!isInAnyKnownCatalog && !isRealUncatalogedTest) {
240
268
  logger.warning(`Skipping ${rec.action} for unknown test (not in scanned catalog, not a real test file): ${rec.testFilePath}`);
@@ -243,7 +271,11 @@ export function registerActionsTool(server) {
243
271
  if (isRealUncatalogedTest) {
244
272
  logger.info(`Accepting uncataloged but real test file discovery missed: ${rec.testFilePath}`);
245
273
  }
246
- const isActionable = [DriftAction.Update, DriftAction.Regenerate, DriftAction.Delete].includes(rec.action);
274
+ const isActionable = [
275
+ DriftAction.Update,
276
+ DriftAction.Regenerate,
277
+ DriftAction.Delete,
278
+ ].includes(rec.action);
247
279
  // No write access to a related repo's checkout — convert any edit-requiring
248
280
  // action to VERIFY so the finding still surfaces without attempting a write that
249
281
  // would fail (or land in a checkout that shouldn't be touched at all).
@@ -261,7 +293,10 @@ export function registerActionsTool(server) {
261
293
  });
262
294
  return;
263
295
  }
264
- if (isActionable && !isSkyramp && !isRelevantExternal && !isRealUncatalogedTest) {
296
+ if (isActionable &&
297
+ !isSkyramp &&
298
+ !isRelevantExternal &&
299
+ !isRealUncatalogedTest) {
265
300
  logger.warning(`Skipping ${rec.action} for irrelevant external test: ${rec.testFilePath}`);
266
301
  return;
267
302
  }
@@ -272,8 +307,10 @@ export function registerActionsTool(server) {
272
307
  // report renders it as a deletion/regeneration RECOMMENDATION the developer applies
273
308
  // manually. `reportOnly: true` makes the apply loops below skip it (B2 — a flattened
274
309
  // 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)) {
310
+ if (isExternalTarget &&
311
+ !isSkyramp &&
312
+ (rec.action === DriftAction.Regenerate ||
313
+ rec.action === DriftAction.Delete)) {
277
314
  recommendations.push({
278
315
  testFilePath: resolvedFile,
279
316
  action: rec.action,
@@ -306,7 +343,8 @@ export function registerActionsTool(server) {
306
343
  resolvedPomFile = undefined;
307
344
  }
308
345
  }
309
- if (rec.action !== DriftAction.Update && rec.rebaselineSnapshots?.length) {
346
+ if (rec.action !== DriftAction.Update &&
347
+ rec.rebaselineSnapshots?.length) {
310
348
  droppedRebaselineNotes.push(`${rec.testFilePath}: rebaselineSnapshots [${rec.rebaselineSnapshots.join(", ")}] ignored on ${rec.action} — a baseline refresh is only meaningful on UPDATE.`);
311
349
  }
312
350
  // Per-entry validation (the schema is deliberately loose, see above).
@@ -350,7 +388,12 @@ export function registerActionsTool(server) {
350
388
  testFilePath: resolvedFile,
351
389
  pomFile: resolvedPomFile,
352
390
  action: actionForVerdict,
353
- testType: rec.testType,
391
+ // The catalog's type wins over the caller's claim, and it wins ONCE, here:
392
+ // the verdict the report row is built from, the reuse hand-off, the steps
393
+ // and the regenerate context all read this one value. Letting the row keep
394
+ // a mislabeled type while the hand-off carried the cataloged one made the
395
+ // report drop the row's reuse on the mismatch.
396
+ testType: catalogByFile.get(resolvedFile)?.testType ?? rec.testType,
354
397
  endpoint: rec.endpoint,
355
398
  priority: rec.priority ?? RecommendationPriority.Medium,
356
399
  rationale: rationaleForVerdict,
@@ -384,6 +427,52 @@ export function registerActionsTool(server) {
384
427
  // `maintenanceVerdicts` (the validated recommendations), persisted below at
385
428
  // decision-time — that persistence is what prevents a decided-upon entry from silently
386
429
  // vanishing at report time; the ignored set is a complete, accurate record for free.
430
+ // The renamed path has to be known BEFORE the verdicts are persisted.
431
+ // The rename itself happens further down, and the report looks for the
432
+ // file's run under the name the file ends up with; persisted with the
433
+ // old name, a moved spec is not found on disk and drops out of
434
+ // execution coverage without a word.
435
+ //
436
+ // Always derived from the spec (testFilePath), never the POM
437
+ // (editTarget): fileRenames keys off testFilePath, so the spec is what
438
+ // moves, and deriving from editTarget when pomFile is set would produce
439
+ // a name built from the page-object path.
440
+ for (const r of recommendations) {
441
+ if (!r.renamedEndpoints?.length)
442
+ continue;
443
+ const renamed = computeRenamedTestFile(r.testFilePath, r.renamedEndpoints) ??
444
+ undefined;
445
+ if (renamed)
446
+ r._suggestedNewFile = renamed;
447
+ }
448
+ // ── Before-run gate on the tests this call will edit ──────────────
449
+ // Drift on the repository's own test must rest on a run, not on a
450
+ // reading of its source: without the pre-edit result the report cannot
451
+ // say what the edit changed, and the test lands at afterStatus=Unknown.
452
+ // The subject is what this call edits, and nothing wider: the gate used
453
+ // to sit in skyramp_analyze_test_health and demand a run for every
454
+ // external test in state, which is the first hundred files discovery
455
+ // found in glob order.
456
+ //
457
+ // A DELETE or a REGENERATE on an external test is report-only (the run
458
+ // edits nothing), and a related repo's entry is already a VERIFY by
459
+ // here, so neither owes a run.
460
+ const { owed, exemptLanguage } = testsOwedBeforeRun(recommendations, catalogByFile);
461
+ if (exemptLanguage > 0) {
462
+ logger.info(`Before-run gate: ${exemptLanguage} recommended external test(s) owe no run — skyramp_execute_test cannot run their language.`);
463
+ }
464
+ // A plan-only run has no application to run the tests against.
465
+ if (owed.length > 0 && !isPlanOnlyMode()) {
466
+ const filesList = formatOwedFiles(owed);
467
+ errorResult = toolError(`${owed.length} test${owed.length === 1 ? "" : "s"} you recommend editing ${owed.length === 1 ? "has" : "have"} no phase: "before" result recorded — never run, or a run was started and recorded no result: ${filesList}. ` +
468
+ `Run each file through skyramp_execute_test with phase: "before", stateFile: "${args.stateFile}"${args.repository ? `, repository: "${args.repository}"` : ""}: ${runTestCall()}. Then call ${TOOL_NAME} again. Nothing was recorded by this call.`);
469
+ return errorResult;
470
+ }
471
+ else if (owed.length > 0) {
472
+ // planOnlyMode is process-global and captured at prompt-render time, so
473
+ // a skip must be visible: no run means no evidence behind these edits.
474
+ logger.warning(`Before-run gate skipped in a plan-only run: ${owed.length} test(s) you recommend editing have no phase: "before" result recorded.`);
475
+ }
387
476
  const recommendedPaths = new Set(recommendations.map((r) => r.testFilePath));
388
477
  const ignoredTestFiles = testAnalysisResults
389
478
  .map((t) => t.testFile)
@@ -392,7 +481,7 @@ export function registerActionsTool(server) {
392
481
  // Must fail loud — edits below apply regardless, so a swallowed failure here
393
482
  // would let edits ship with no testMaintenance in the final report.
394
483
  try {
395
- await stateManager.writeRepoData({
484
+ await stateManager.updateRepoData({
396
485
  ...stateData,
397
486
  ignoredTestFiles,
398
487
  maintenanceVerdicts: recommendations.map((r) => ({
@@ -408,13 +497,22 @@ export function registerActionsTool(server) {
408
497
  // Persisted so the report-time working-tree check knows this UPDATE's
409
498
  // change is the refreshed PNG, not the spec (SKYR-4298).
410
499
  ...(r.rebaselineSnapshots?.length
411
- ? { rebaselineSnapshots: r.rebaselineSnapshots, rebaselineOnly: r.rebaselineOnly === true }
500
+ ? {
501
+ rebaselineSnapshots: r.rebaselineSnapshots,
502
+ rebaselineOnly: r.rebaselineOnly === true,
503
+ }
412
504
  : {}),
413
505
  // Persisted so maintenance coverage can tell a REGENERATE that rewrote a
414
506
  // file from one that only advised the developer to: an external test's
415
507
  // REGENERATE/DELETE keeps its real action and touches nothing, so without
416
508
  // this the report credits a `maintains` claim no edit backs.
417
509
  ...(r.reportOnly ? { reportOnly: true } : {}),
510
+ // Persisted so the report stage can find the renamed file's run: the
511
+ // rename lands before execution, so the run is recorded under this
512
+ // path while testFilePath still holds the name it had before.
513
+ ...(r._suggestedNewFile
514
+ ? { _suggestedNewFile: r._suggestedNewFile }
515
+ : {}),
418
516
  })),
419
517
  }, { repo: args.repository, repositoryPath, step: "actions" });
420
518
  }
@@ -445,13 +543,15 @@ export function registerActionsTool(server) {
445
543
  continue;
446
544
  if (rec.action === DriftAction.Delete) {
447
545
  const existing = deleteByFile.get(rec.testFilePath);
448
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
546
+ if (!existing ||
547
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
449
548
  deleteByFile.set(rec.testFilePath, rec);
450
549
  }
451
550
  }
452
551
  else if (rec.action === DriftAction.Regenerate) {
453
552
  const existing = regenerateByFile.get(rec.testFilePath);
454
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
553
+ if (!existing ||
554
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
455
555
  regenerateByFile.set(rec.testFilePath, rec);
456
556
  }
457
557
  }
@@ -460,7 +560,8 @@ export function registerActionsTool(server) {
460
560
  if (!regenerateByFile.has(rec.testFilePath)) {
461
561
  const key = `${rec.testFilePath}::${rec.pomFile ?? ""}`;
462
562
  const existing = updateByKey.get(key);
463
- if (!existing || priorityRank[rec.priority] > priorityRank[existing.priority]) {
563
+ if (!existing ||
564
+ priorityRank[rec.priority] > priorityRank[existing.priority]) {
464
565
  updateByKey.set(key, rec);
465
566
  }
466
567
  }
@@ -489,6 +590,36 @@ export function registerActionsTool(server) {
489
590
  const testFilesToDelete = deleteRecommendations.map((rec) => rec.testFilePath);
490
591
  const fileInstructions = [];
491
592
  const testFilesToUpdate = [];
593
+ // A Skyramp test rewritten in place — updated or regenerated — owes the same
594
+ // modularize → reuse pair a generated one does, under the same predicate. The
595
+ // hand-off is recorded here, at the site that emits the instruction, as a
596
+ // maintenance hand-off: the file is at HEAD by definition, so the chain gate
597
+ // must not read that as "not this run's". An external test is the customer's
598
+ // code and is never modularized into the shared module. Returns the
599
+ // next-steps block for the file, or undefined when nothing was armed.
600
+ const armReuseChain = async (rec) => {
601
+ if (!skyrampTestFiles.has(rec.testFilePath))
602
+ return undefined;
603
+ const cataloged = catalogByFile.get(rec.testFilePath);
604
+ const language = cataloged?.language;
605
+ // Already the cataloged type — normalized once where the recommendation
606
+ // was built, so the verdict, the hand-off and the steps cannot disagree.
607
+ const testType = rec.testType;
608
+ if (!language) {
609
+ logger.info(`No language cataloged for ${rec.testFilePath} — not arming the modularize → reuse chain for this ${rec.action}`);
610
+ return undefined;
611
+ }
612
+ if (!isModularizeFirstHandOffTarget(testType, language))
613
+ return undefined;
614
+ const framework = cataloged?.framework ?? "";
615
+ await recordReuseHandOff([rec.testFilePath], testType, language, framework, args.stateFile, "maintenance");
616
+ return buildModularizeFirstNextSteps({
617
+ testType,
618
+ language,
619
+ framework,
620
+ enhanceFirst: false,
621
+ });
622
+ };
492
623
  // ── UPDATE: emit targeted edit instructions ──
493
624
  for (const rec of updateRecommendations) {
494
625
  if (!rec.testFilePath) {
@@ -508,16 +639,33 @@ export function registerActionsTool(server) {
508
639
  continue;
509
640
  }
510
641
  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;
642
+ // Computed above, before the verdicts were persisted.
643
+ const suggestedNewFile = rec._suggestedNewFile;
644
+ // Armed only when this UPDATE rewrites the SPEC BODY, because that is the
645
+ // only edit the modularize reuse pair has anything to act on.
646
+ //
647
+ // `pomFile` set means the edit lands somewhere the spec delegates its
648
+ // selectors to, and the spec body is left alone. That is a page object in
649
+ // the case the field was named for, but agents also use it for the SHARED
650
+ // MODULE when a stale selector lives in a helper — observed twice on the
651
+ // repo20-SR02 fixture, and correct by the field's own description. Either
652
+ // way the spec is not rewritten, so it owes nothing. Consequence worth
653
+ // knowing: a fixture cannot assume a maintained spec gets armed, since the
654
+ // agent may route the whole edit through this field (SKYR-4412).
655
+ //
656
+ // A rename UPDATE is a URL-path substitution and moves the file; the hand-off
657
+ // is keyed by the path the file has now, so after the move the gate and the
658
+ // report would look there and find nothing — a debt recorded where no one
659
+ // reads it. A rebaseline-only UPDATE edits no spec at all; its maintenance is
660
+ // the PNG refresh. A rationale-only UPDATE (no updateInstructions) has no
661
+ // update_context entry to carry post_edit_steps, so the structured plan could
662
+ // not pay the debt.
663
+ if (!rec.pomFile &&
664
+ !suggestedNewFile &&
665
+ !rec.rebaselineOnly &&
666
+ rec.updateInstructions) {
667
+ rec._postEditSteps = await armReuseChain(rec);
668
+ }
521
669
  fileInstructions.push(buildUpdateFileInstruction({
522
670
  testFile: editTarget,
523
671
  renames,
@@ -525,6 +673,7 @@ export function registerActionsTool(server) {
525
673
  updateInstructions: rec.updateInstructions,
526
674
  rationale: rec.rationale,
527
675
  rebaselineSnapshots: rec.rebaselineSnapshots,
676
+ postEditSteps: rec._postEditSteps,
528
677
  }));
529
678
  }
530
679
  // ── REGENERATE: emit overwrite instructions ──
@@ -536,11 +685,21 @@ export function registerActionsTool(server) {
536
685
  continue;
537
686
  }
538
687
  testFilesToRegenerate.push(rec.testFilePath);
688
+ const cataloged = catalogByFile.get(rec.testFilePath);
689
+ // The generation call the instruction prescribes records its own hand-off for
690
+ // the file it writes; this maintenance mark is what that hand-off inherits its
691
+ // origin from, so the rewrite of a file at HEAD still owes the chain. Only for
692
+ // a type this step can actually regenerate (see isMaintenanceRegenerable).
693
+ if (isMaintenanceRegenerable(rec.testType)) {
694
+ await armReuseChain(rec);
695
+ }
539
696
  regenerateInstructions.push(buildRegenerateFileInstruction({
540
697
  testFile: rec.testFilePath,
541
698
  updateInstructions: rec.updateInstructions,
542
699
  outputDir: path.dirname(rec.testFilePath),
543
700
  outputFile: path.basename(rec.testFilePath),
701
+ testType: rec.testType,
702
+ language: cataloged?.language,
544
703
  }));
545
704
  }
546
705
  // ── Build response text ──
@@ -556,7 +715,9 @@ export function registerActionsTool(server) {
556
715
  }
557
716
  if (regenerateRecommendations.length > 0) {
558
717
  sections.push(`## Tests Requiring Regeneration (${regenerateRecommendations.length})\n\n` +
559
- testFilesToRegenerate.map((f, i) => `${i + 1}. \`${f}\``).join("\n") +
718
+ testFilesToRegenerate
719
+ .map((f, i) => `${i + 1}. \`${f}\``)
720
+ .join("\n") +
560
721
  `\n\n---\n` +
561
722
  regenerateInstructions.join("\n---\n"));
562
723
  }
@@ -564,12 +725,16 @@ export function registerActionsTool(server) {
564
725
  sections.push(`## Tests To Delete (${deleteRecommendations.length})\n\n` +
565
726
  testFilesToDelete.map((f, i) => `${i + 1}. \`${f}\``).join("\n") +
566
727
  `\n\n---\n` +
567
- deleteRecommendations.map((rec) => `- **${rec.testFilePath}**${rec.rationale ? ` — ${rec.rationale}` : ""}`).join("\n"));
728
+ deleteRecommendations
729
+ .map((rec) => `- **${rec.testFilePath}**${rec.rationale ? ` — ${rec.rationale}` : ""}`)
730
+ .join("\n"));
568
731
  }
569
732
  if (otherRecs.length > 0) {
570
733
  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"));
734
+ otherRecs
735
+ .map((rec) => `- **${rec.testFilePath}** Action: ${rec.action}, Priority: ${rec.priority}` +
736
+ (rec.rationale ? ` — ${rec.rationale}` : ""))
737
+ .join("\n"));
573
738
  }
574
739
  else if (updateRecommendations.length === 0 &&
575
740
  regenerateRecommendations.length === 0 &&
@@ -585,7 +750,9 @@ export function registerActionsTool(server) {
585
750
  // ── Build LLM instructions ──
586
751
  const uniqueRenames = updateRecommendations
587
752
  .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);
753
+ .filter((r, i, arr) => arr.findIndex((x) => x.oldPath === r.oldPath &&
754
+ x.newPath === r.newPath &&
755
+ x.method === r.method) === i);
589
756
  const llmInstructionsObj = {
590
757
  workflow: "test_maintenance",
591
758
  action: "execute_updates",
@@ -603,7 +770,10 @@ export function registerActionsTool(server) {
603
770
  const fileRenames = [];
604
771
  for (const rec of updateRecommendations) {
605
772
  if (rec._suggestedNewFile) {
606
- fileRenames.push({ from: rec.testFilePath, to: rec._suggestedNewFile });
773
+ fileRenames.push({
774
+ from: rec.testFilePath,
775
+ to: rec._suggestedNewFile,
776
+ });
607
777
  }
608
778
  }
609
779
  if (fileRenames.length > 0) {
@@ -624,19 +794,29 @@ export function registerActionsTool(server) {
624
794
  // explicit edit_required: false so the strategy's "make the changes
625
795
  // described in context" cannot apply to it (rationale is always set,
626
796
  // so it must not stand in for edit instructions here).
627
- ...(hasEdit ? { context: rec.updateInstructions } : { edit_required: false }),
797
+ ...(hasEdit
798
+ ? { context: rec.updateInstructions }
799
+ : { edit_required: false }),
628
800
  ...(rec.editSites?.length ? { edit_sites: rec.editSites } : {}),
629
801
  // The baselines to pass as skyramp_execute_test's rebaselineSnapshots for
630
802
  // the SPEC (testFilePath, which is what runs) — never `file`, which is
631
803
  // the page object for a POM-backed UPDATE.
632
804
  ...(rec.rebaselineSnapshots?.length
633
- ? { spec_file: rec.testFilePath, rebaseline_snapshots: rec.rebaselineSnapshots }
805
+ ? {
806
+ spec_file: rec.testFilePath,
807
+ rebaseline_snapshots: rec.rebaselineSnapshots,
808
+ }
809
+ : {}),
810
+ // The modularize → reuse steps the file owes, on the entry the agent
811
+ // follows (the summary block above is the same text for a reader).
812
+ ...(rec._postEditSteps
813
+ ? { post_edit_steps: rec._postEditSteps }
634
814
  : {}),
635
815
  };
636
816
  });
637
817
  if (updateContext.length > 0) {
638
818
  llmInstructionsObj.update_context = updateContext;
639
- llmInstructionsObj.update_strategy = buildUpdateStrategy();
819
+ llmInstructionsObj.update_strategy = buildUpdateStrategy(updateContext.some((u) => "post_edit_steps" in u));
640
820
  if (updateContext.some((u) => "rebaseline_snapshots" in u)) {
641
821
  llmInstructionsObj.rebaseline_strategy = buildRebaselineStrategy();
642
822
  }
@@ -649,6 +829,7 @@ export function registerActionsTool(server) {
649
829
  // replicate the file. Those come from the discovery catalog, so the file
650
830
  // text is not needed to carry them.
651
831
  const cataloged = catalogByFile.get(rec.testFilePath);
832
+ const generationArgs = regenerateCodeReuse(rec.testType, cataloged?.language)?.args;
652
833
  return {
653
834
  file: rec.testFilePath,
654
835
  rationale: rec.updateInstructions || rec.rationale,
@@ -656,13 +837,17 @@ export function registerActionsTool(server) {
656
837
  // use them instead of reading the file, so an absent one leaves the generation
657
838
  // call without a target. The catalog's apiEndpoint is optional and can be an
658
839
  // empty string; both fields are required on the recommendation itself.
659
- test_type: cataloged?.testType ?? rec.testType,
840
+ test_type: rec.testType,
660
841
  endpoint: cataloged?.apiEndpoint || rec.endpoint,
661
842
  ...(cataloged?.language && { language: cataloged.language }),
662
843
  ...(cataloged?.framework && { framework: cataloged.framework }),
844
+ // The codeReuse options the per-file instruction asks for, on the entry
845
+ // the agent follows, so a client that reads only the structured plan
846
+ // still arms the chain the maintenance hand-off recorded.
847
+ ...(generationArgs && { generation_args: generationArgs }),
663
848
  };
664
849
  });
665
- llmInstructionsObj.regenerate_strategy = buildRegenerateStrategy();
850
+ llmInstructionsObj.regenerate_strategy = buildRegenerateStrategy(llmInstructionsObj.regenerate_context.some((e) => !!e.generation_args));
666
851
  }
667
852
  if (deleteRecommendations.length > 0) {
668
853
  llmInstructionsObj.delete_strategy = buildDeleteStrategy();
@@ -671,7 +856,10 @@ export function registerActionsTool(server) {
671
856
  // The two payloads were previously separate content[] blocks annotated
672
857
  // audience: ["user"] and ["assistant"]. Nothing in this repo read those
673
858
  // annotations, and the field names carry the same distinction.
674
- return dualChannelResult({ summary: responseText, instructions: llmInstructions });
859
+ return dualChannelResult({
860
+ summary: responseText,
861
+ instructions: llmInstructions,
862
+ });
675
863
  }
676
864
  catch (error) {
677
865
  logger.error(`Actions tool failed: ${error.message}`, error);
@@ -689,7 +877,9 @@ export function registerActionsTool(server) {
689
877
  }
690
878
  AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, {
691
879
  repositoryPath,
692
- }).catch((err) => { logger.warning("Analytics event failed", { error: String(err) }); });
880
+ }).catch((err) => {
881
+ logger.warning("Analytics event failed", { error: String(err) });
882
+ });
693
883
  }
694
884
  });
695
885
  }
@@ -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;
@@ -132,8 +131,8 @@ export declare const analyzeChangesOutputSchema: {
132
131
  analysedWorkspaceFile: z.ZodString;
133
132
  }, "strip", z.ZodTypeAny, {
134
133
  message: string;
135
- kind: "workspace-disagreement";
136
134
  serviceName: string;
135
+ kind: "workspace-disagreement";
137
136
  field: "authHeader" | "authScheme" | "authType";
138
137
  primaryWorkspaceFile: string;
139
138
  analysedWorkspaceFile: string;
@@ -141,8 +140,8 @@ export declare const analyzeChangesOutputSchema: {
141
140
  analysed: string;
142
141
  }, {
143
142
  message: string;
144
- kind: "workspace-disagreement";
145
143
  serviceName: string;
144
+ kind: "workspace-disagreement";
146
145
  field: "authHeader" | "authScheme" | "authType";
147
146
  primaryWorkspaceFile: string;
148
147
  analysedWorkspaceFile: string;
@@ -157,8 +156,8 @@ export declare const analyzeChangesOutputSchema: {
157
156
  openApiSpecPath?: string | undefined;
158
157
  authFindings?: {
159
158
  message: string;
160
- kind: "workspace-disagreement";
161
159
  serviceName: string;
160
+ kind: "workspace-disagreement";
162
161
  field: "authHeader" | "authScheme" | "authType";
163
162
  primaryWorkspaceFile: string;
164
163
  analysedWorkspaceFile: string;
@@ -173,8 +172,8 @@ export declare const analyzeChangesOutputSchema: {
173
172
  openApiSpecPath?: string | undefined;
174
173
  authFindings?: {
175
174
  message: string;
176
- kind: "workspace-disagreement";
177
175
  serviceName: string;
176
+ kind: "workspace-disagreement";
178
177
  field: "authHeader" | "authScheme" | "authType";
179
178
  primaryWorkspaceFile: string;
180
179
  analysedWorkspaceFile: string;