@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
@@ -31,11 +31,33 @@ const codeReuseSchema = z.object({
31
31
  verify: z
32
32
  .boolean()
33
33
  .default(false)
34
- .describe("Verify a previously refactored test instead of returning the reuse prompt. POM path (browser tests): checks the test's POM calls against source; requires the discovery pass — this tool called for the same testFile without `verify` — to have run first. SkyrampUtils path (every other test type): stages the shared utils file for the output commit, checks its invariants, and — when skyramp_modularization recorded a baseline for this spec — compares the delivered assertion count and page.on('pageerror') guard against that hand-out, rejecting a net loss (API helpers: one helper per method+path, status-code-only assertions, method+resource names; browser helpers: actions and structural waits only, intent names, one helper per action sequence; every family: one name is defined once per module, with one parameter count across modules). Call it after the reuse edits are written; skyramp_enhance_assertions and skyramp_execute_test refuse until it has passed."),
34
+ .describe("Verify a previously refactored test instead of returning the reuse prompt. POM path (browser tests): checks the test's POM calls against source; requires the discovery pass — this tool called for the same testFile without `verify` — to have run first. SkyrampUtils path (every other test type): stages the shared utils file for the output commit, checks its invariants, and — when skyramp_modularization recorded a baseline for this spec — compares the delivered assertion count and page.on('pageerror') guard against that hand-out, rejecting a net loss (API helpers: one helper per method+path, status-code-only assertions, method+resource names; browser helpers: actions and structural waits only, intent names, one helper per action sequence; every family: one name is defined once per module, with one parameter count across modules). For a UI test it also checks the repository's own helper modules the test imports: each imported name resolves with an argument count the signature accepts, and every change this run made to such a module adds a helper or a defaulted parameter. Call it after the reuse edits are written; skyramp_enhance_assertions and skyramp_execute_test refuse until it has passed."),
35
35
  testType: z
36
36
  .nativeEnum(TestType)
37
37
  .optional()
38
38
  .describe("The type of the test being refactored (shared TestType vocabulary). The tool routes on it server-side: browser types (ui, e2e) may take the POM path; every other type takes the SkyrampUtils path. Omit when unknown."),
39
+ inHouse: z
40
+ .object({
41
+ filesRead: z
42
+ .array(z.string())
43
+ .describe("Every file the search for the repository's own browser helper modules READ, repository-relative. All of them, not only the ones that qualified."),
44
+ declined: z
45
+ .array(z.object({
46
+ file: z
47
+ .string()
48
+ .describe("Repository-relative path of the module."),
49
+ helper: z
50
+ .string()
51
+ .describe("The helper's name as the module defines it."),
52
+ reason: z
53
+ .string()
54
+ .describe("Why it was not called: the locator is not a plain string (variable, template literal, regex) so its action key is undefined; the module is not written for Playwright; no step matched it; …"),
55
+ }))
56
+ .default([])
57
+ .describe("Helpers the search read and did not call, one entry each, with the reason."),
58
+ })
59
+ .optional()
60
+ .describe("Verify mode, UI tests only (the SkyrampUtils path with page-object reuse off): what the search for the repository's own browser helper modules read and declined. These are DECLARATIONS — the report records them as what the run states it read, labelled as such, not as a measurement. Pass them on the `verify: true` call once the reuse edits are written."),
39
61
  });
40
62
  const TOOL_NAME = "skyramp_reuse_code";
41
63
  /**
@@ -144,14 +166,16 @@ async function runUtilsVerify(params) {
144
166
  // whatever the file's invariants say.
145
167
  if (staging.failed.length > 0)
146
168
  r.ok = false;
147
- const recorded = await recordUtilsVerifyOutcome(params.testFile, r, params.language, params.framework, params.testType);
169
+ const recorded = await recordUtilsVerifyOutcome(params.testFile, r, params.language, params.framework, params.testType, undefined, params.inHouse);
148
170
  return {
149
171
  content: [
150
172
  {
151
173
  type: "text",
152
174
  text: formatUtilsVerifyText(r, {
153
175
  staged: staging.staged,
154
- unstaged: staging.failed,
176
+ // A refused in-house module is the customer's file, not ours to move.
177
+ unstaged: staging.failed.filter((f) => !staging.inHouse.includes(f)),
178
+ unstagedInHouse: staging.failed.filter((f) => staging.inHouse.includes(f)),
155
179
  recorded,
156
180
  }),
157
181
  },
@@ -1,42 +1,12 @@
1
1
  import { z } from "zod";
2
- import { pendingReuseDebt } from "./reuse-state.js";
3
- import { baselineFrom, readAssertionRecord, recordAssertionBaseline, recordAssertionVerdict, trustedRecord, } from "./assertion-state.js";
4
- import { formatAssertionVerifyReport, verifyAssertionEnhancement, } from "../../utils/assertion-verify/index.js";
5
- import { stageAndRecordRetrofits } from "./retrofit-state.js";
6
- import * as path from "path";
7
2
  import { toolError } from "../../utils/utils.js";
8
- import { ASSERTION_ENHANCEABLE_TEST_TYPES, TestType, } from "../../types/TestTypes.js";
3
+ import { ASSERTION_ENHANCEABLE_TEST_TYPES } from "../../types/TestTypes.js";
9
4
  import { AnalyticsService } from "../../services/AnalyticsService.js";
10
- import { getContractProviderAssertionsPrompt } from "../../prompts/enhance-assertions/contractProviderAssertionsPrompt.js";
11
- import { getIntegrationAssertionsPrompt } from "../../prompts/enhance-assertions/integrationAssertionsPrompt.js";
12
- import { getUIAssertionsPrompt } from "../../prompts/enhance-assertions/uiAssertionsPrompt.js";
13
- import { isTestbotEnabled } from "../../utils/featureFlags.js";
14
- import { renderSharedAssertionRules } from "../../prompts/enhance-assertions/sharedAssertionRules.js";
15
- import { stageGeneratedPaths } from "../../utils/gitStaging.js";
5
+ import { buildEnhanceAssertionsInstructions, sharedAssertionRules, } from "../../skills/enhanceAssertionsSkill.js";
6
+ import { prepareAssertionCall, snapshotAssertionBaseline, verifyAssertionCall, } from "./assertionOperations.js";
16
7
  const TOOL_NAME = "skyramp_enhance_assertions";
17
- const TESTBOT_UI_CHECKS = `
18
- ### Additional Testbot-Specific Checks
19
- - If no suitable selector exists in the generated file for an assertion you need to add, go back and call \`browser_assert\` on the live page to record it with a valid selector, then re-export and regenerate. Do not re-record an assertion that is expected to fail today; add it here with the blueprint's selector.
20
- - **After executing a UI test that documents a bug from \`issuesFound\`**: if it passed when you expected it to fail, the assertions are too weak — add a stronger \`expect()\` that directly targets the buggy behavior. This counts as the single allowed retry under the 2-attempt cap — do NOT re-run more than once.
21
- `;
22
- function buildAssertionInstructions(testFile, testType, enhanceType) {
23
- if (testType === TestType.UI) {
24
- let instructions = getUIAssertionsPrompt(testFile, enhanceType);
25
- if (isTestbotEnabled()) {
26
- instructions += TESTBOT_UI_CHECKS;
27
- }
28
- return instructions;
29
- }
30
- if (testType === TestType.CONTRACT) {
31
- return getContractProviderAssertionsPrompt(testFile, enhanceType);
32
- }
33
- if (testType === TestType.INTEGRATION) {
34
- return getIntegrationAssertionsPrompt(testFile, enhanceType);
35
- }
36
- throw new Error(`Unsupported testType for ${TOOL_NAME}: ${testType}`);
37
- }
38
8
  function buildAutoApplyInstructions(testFile, testType, enhanceType) {
39
- const typeSpecificInstructions = buildAssertionInstructions(testFile, testType, enhanceType);
9
+ const typeSpecificInstructions = buildEnhanceAssertionsInstructions(testFile, testType, enhanceType);
40
10
  return [
41
11
  `Enhance response body assertions in: \`${testFile}\``,
42
12
  `Test type: ${testType} | Context: ${enhanceType}`,
@@ -44,7 +14,7 @@ function buildAutoApplyInstructions(testFile, testType, enhanceType) {
44
14
  `Read the file, apply the type-specific assertion guidance below, and write the file back directly.`,
45
15
  `Add assertions after each send_request/sendRequest status-code assertion.`,
46
16
  `Use SDK helper: Python \`skyramp.get_response_value(response, "json.path")\`, JS \`getValue(response, "json.path")\`.`,
47
- `Do NOT restructure, reformat, or add comments. You may add an import when a new assertion needs a helper — from \`@skyramp/skyramp\` or from the test's own helper module. Only add assertion lines.`,
17
+ `Do NOT restructure, reformat, add comments, or change imports. Only add assertion lines.`,
48
18
  ``,
49
19
  `Type-specific assertion guidance:`,
50
20
  typeSpecificInstructions,
@@ -91,63 +61,29 @@ export function registerEnhanceAssertionsTool(server) {
91
61
  - Optionally with \`verify: true\` for early feedback — the same deterministic checks run automatically inside skyramp_execute_test, which returns per-violation feedback instead of executing until they pass.`,
92
62
  inputSchema: enhanceAssertionsSchema,
93
63
  }, async (params) => {
94
- const { testFile, testType, enhanceType, autoApply, verify, stateFile } = params;
95
- // Everything downstream keys state by this path; a relative spelling
96
- // would fork records and fail gates open (review finding on SKYR-4262).
97
- if (!path.isAbsolute(testFile)) {
98
- return toolError(`testFile must be an absolute path, got: ${testFile}`);
99
- }
100
- // SKYR-4115: the reuse tool hands out POM mapping instructions and then relies on
101
- // the agent to come back with `verify: true` — the call that runs the zero-reuse
102
- // gate. This is the first tool called after it on the same spec, so it is where a
103
- // skipped verify is caught cheapest. Enforcing the call (not the outcome) keeps
104
- // the policy in the reuse phase where it belongs.
105
- // SKYR-4220: stage the shared utils file this spec wrote or imports BEFORE the
106
- // debt check, unconditionally — so the file reaches the output commit even on a
107
- // path where the agent never calls verify. Located by header, not by name.
108
- await stageAndRecordRetrofits(testFile);
109
- const owed = await pendingReuseDebt(testFile, stateFile, testType, {
110
- chain: false,
111
- });
112
- if (owed)
113
- return toolError(owed);
114
- // Stage so testbot includes the generated files in its output commit.
115
- await stageGeneratedPaths(testFile);
64
+ // stateFile is threaded through `params` into the shared helpers.
65
+ const { testFile, testType, enhanceType, autoApply, verify } = params;
66
+ // Path check, retrofit staging and the reuse-debt gate are shared with
67
+ // the single-purpose tools the skill drives (SKYR-4310).
68
+ const refusal = await prepareAssertionCall(params);
69
+ if (refusal)
70
+ return toolError(refusal);
116
71
  // Verify pass: deterministically check the hand-out instructions were applied
117
72
  // (hash delta, no removed coverage, rubric lints, strength increase) and give
118
73
  // per-violation feedback. isError on FAILED forces the fix-and-retry loop.
119
74
  if (verify) {
120
75
  try {
121
- const record = await readAssertionRecord(testFile, stateFile);
122
- // Discriminators come from the persisted record when it matches this
123
- // canonical path — params are agent-supplied, and flipping enhanceType
124
- // to "maintenance" would disarm the strength gate and structural lints
125
- // for a permanent PASS. Canonical comparison closes the alias bypass
126
- // (dir//x.spec.ts). Falls back to params only when stateless.
127
- const trusted = trustedRecord(record, testFile);
128
- const result = await verifyAssertionEnhancement({
129
- testFile,
130
- testType: trusted?.testType ?? testType,
131
- enhanceType: (trusted?.enhanceType ??
132
- enhanceType),
133
- baseline: baselineFrom(record, testFile),
134
- });
135
- await recordAssertionVerdict(testFile, result, stateFile);
76
+ const { ok, report } = await verifyAssertionCall(params);
136
77
  AnalyticsService.pushMCPToolEvent(TOOL_NAME, undefined, {
137
78
  testFile,
138
79
  testType,
139
80
  enhanceType,
140
81
  verify: true,
141
- verifyPassed: result.ok,
82
+ verifyPassed: ok,
142
83
  }).catch(() => { });
143
84
  return {
144
- content: [
145
- {
146
- type: "text",
147
- text: formatAssertionVerifyReport(result, testFile),
148
- },
149
- ],
150
- isError: !result.ok,
85
+ content: [{ type: "text", text: report }],
86
+ isError: !ok,
151
87
  };
152
88
  }
153
89
  catch (err) {
@@ -157,7 +93,7 @@ export function registerEnhanceAssertionsTool(server) {
157
93
  }
158
94
  // Hand-out: snapshot the file as generated so the verify pass has a baseline
159
95
  // to measure against. Best-effort — no run state means stateless verify later.
160
- await recordAssertionBaseline(testFile, testType, enhanceType, stateFile);
96
+ await snapshotAssertionBaseline(params);
161
97
  if (autoApply) {
162
98
  const compactInstructions = [
163
99
  `Enhance response body assertions in: \`${testFile}\``,
@@ -167,7 +103,7 @@ export function registerEnhanceAssertionsTool(server) {
167
103
  `Use SDK helper: Python \`skyramp.get_response_value(response, "json.path")\`, JS \`getValue(response, "json.path")\`.`,
168
104
  ``,
169
105
  `Shared assertion rules (apply all that fit):`,
170
- renderSharedAssertionRules(),
106
+ sharedAssertionRules(),
171
107
  ``,
172
108
  `Do NOT restructure, reformat, or add comments. You may add an import when a new assertion needs a helper — from \`@skyramp/skyramp\` or from the test's own helper module. Only add assertion lines.`,
173
109
  ].join("\n");
@@ -186,7 +122,7 @@ export function registerEnhanceAssertionsTool(server) {
186
122
  const enhanceCtx = enhanceType;
187
123
  const instructions = autoApply
188
124
  ? buildAutoApplyInstructions(testFile, testType, enhanceCtx)
189
- : buildAssertionInstructions(testFile, testType, enhanceCtx);
125
+ : buildEnhanceAssertionsInstructions(testFile, testType, enhanceCtx);
190
126
  const result = {
191
127
  content: [
192
128
  {
@@ -0,0 +1,51 @@
1
+ import { type UtilsLanguageSpec } from "../../utils/utils-verify/index.js";
2
+ /**
3
+ * Remove every comment addressed to a Skyramp gate from a delivered file.
4
+ *
5
+ * Two gates ask the agent to write a decline into the file it delivers — the utils
6
+ * verifier's `reuse-verify: allow <kind> <helper> — <reason>` and the POM gate's
7
+ * `// kept inline: <basename> — <reason>`. Both are how the agent tells a gate it has
8
+ * read a finding and chosen not to act, and neither says anything to the customer who
9
+ * ends up owning the file. A marker also records the state of the file at one moment,
10
+ * and nothing re-reads it when the file changes afterwards, so a delivered file can
11
+ * carry a claim its own code contradicts.
12
+ *
13
+ * A marker OWNS ITS LINE. Both gates instruct exactly that, and both parsers now
14
+ * accept only that, so removal is the deletion of a line. That one constraint is what
15
+ * keeps this safe: a line whose first characters are the comment prefix cannot be a
16
+ * regex literal, cannot carry code, cannot share a comment with the customer's prose,
17
+ * and cannot hold the `*\/` that terminates a block. Every one of those was a way an
18
+ * earlier version of this function delivered a file that did not compile.
19
+ *
20
+ * Strings are blanked first, so a marker quoted in code — or inside a Python docstring
21
+ * — is not a marker. Removal follows the WELL-FORMED grammars, not the loose patterns
22
+ * the gates use to spot a malformed marker: `// kept inline: this loop is kept inline
23
+ * for performance` is English. Neither grammar is re-spelled here; each pattern comes
24
+ * from the module that declares it.
25
+ */
26
+ export interface GateMarkerStrip {
27
+ content: string;
28
+ /** The markers removed, each the line it was. */
29
+ removed: string[];
30
+ /** Text that announces a marker but does not own its line. Left in place — the
31
+ * verify pass reports it as malformed, so it should not reach delivery. */
32
+ unremovable: string[];
33
+ }
34
+ export declare function stripGateMarkers(content: string, spec: UtilsLanguageSpec): GateMarkerStrip;
35
+ /**
36
+ * Whether the only change between two versions of a file is the deletion of whole
37
+ * comment lines.
38
+ *
39
+ * Computed WITHOUT reference to how the strip works, and that is the point. Every
40
+ * defect this function has had was a case nobody had thought of — a regex literal, a
41
+ * line carrying a block terminator, a comment shared with the customer's prose, a
42
+ * directive before a trailing marker. Each was found by a reader. This check does not
43
+ * need the case to be foreseen: it states the only edit the strip is permitted to
44
+ * make, and the caller restores the original bytes when something else happened.
45
+ *
46
+ * Two conditions, together: every line of `after` appears in `before` in the same
47
+ * order, and every line of `before` that `after` drops opens with the comment prefix.
48
+ * A line that was EDITED therefore fails the first, and a line of code that was
49
+ * deleted fails the second.
50
+ */
51
+ export declare function onlyCommentLinesRemoved(before: string, after: string, prefix: "//" | "#"): boolean;
@@ -0,0 +1,95 @@
1
+ import { blankStrings } from "../../utils/utils-verify/parse.js";
2
+ import { ALLOW_LOOSE_RE, ALLOW_START_RE, MARKER_SHAPE_RE, lineCommentOpeners, markerOnOwnLine, } from "../../utils/utils-verify/index.js";
3
+ import { KEPT_INLINE_LOOSE_RE } from "./reuse-outcome.js";
4
+ export function stripGateMarkers(content, spec) {
5
+ const removed = [];
6
+ const unremovable = [];
7
+ const rawLines = content.split("\n");
8
+ const codeLines = blankStrings(content, spec).split("\n");
9
+ const kept = [];
10
+ // Where a comment actually OPENS. A `//` on its own line inside `/* … *\/` opens
11
+ // nothing: the block does, and deleting that line can take the block's terminator
12
+ // with it. One statement of this, shared with the marker parser — when each had its
13
+ // own, the parser read a decline the strip then refused to remove.
14
+ const opensHere = lineCommentOpeners(content, spec.commentPrefix);
15
+ for (let n = 0; n < rawLines.length; n++) {
16
+ const raw = rawLines[n];
17
+ const code = codeLines[n] ?? "";
18
+ if (!ALLOW_LOOSE_RE.test(code) && !KEPT_INLINE_LOOSE_RE.test(code)) {
19
+ kept.push(raw);
20
+ continue;
21
+ }
22
+ const marker = opensHere && !opensHere.has(n)
23
+ ? undefined
24
+ : markerOnOwnLine(raw, code, spec.commentPrefix);
25
+ const body = marker === undefined
26
+ ? undefined
27
+ : marker.replace(spec.commentPrefix, "").trimStart();
28
+ // The SHAPE guard is for the ambiguous grammar only. `// kept inline: this loop is
29
+ // kept inline for performance` is English a customer may write, so removing it
30
+ // needs the separator and reason that make it a marker. `reuse-verify: allow` is
31
+ // nobody's prose: an own-line comment opening with it is gate-addressed whatever
32
+ // follows, and requiring the full shape left a MALFORMED one in the file — which
33
+ // ships once the verifier's bounded refusals run out.
34
+ const removable = body !== undefined &&
35
+ (ALLOW_START_RE.test(body) || MARKER_SHAPE_RE.test(body));
36
+ if (!removable) {
37
+ unremovable.push(raw.trim());
38
+ kept.push(raw);
39
+ continue;
40
+ }
41
+ // Removal follows the marker's SHAPE, not the grammar the gates can read. An
42
+ // own-line comment is safe to delete, and the verify pass lets some of these
43
+ // through: a marker naming an advisory kind is inert by design, so verification
44
+ // passes and the comment reached the customer. Only what the caller CARRIES has
45
+ // to parse — it re-reads `removed` with the well-formed grammars for that.
46
+ removed.push(marker);
47
+ }
48
+ return { content: kept.join("\n"), removed, unremovable };
49
+ }
50
+ /**
51
+ * Whether the only change between two versions of a file is the deletion of whole
52
+ * comment lines.
53
+ *
54
+ * Computed WITHOUT reference to how the strip works, and that is the point. Every
55
+ * defect this function has had was a case nobody had thought of — a regex literal, a
56
+ * line carrying a block terminator, a comment shared with the customer's prose, a
57
+ * directive before a trailing marker. Each was found by a reader. This check does not
58
+ * need the case to be foreseen: it states the only edit the strip is permitted to
59
+ * make, and the caller restores the original bytes when something else happened.
60
+ *
61
+ * Two conditions, together: every line of `after` appears in `before` in the same
62
+ * order, and every line of `before` that `after` drops opens with the comment prefix.
63
+ * A line that was EDITED therefore fails the first, and a line of code that was
64
+ * deleted fails the second.
65
+ */
66
+ export function onlyCommentLinesRemoved(before, after, prefix) {
67
+ const from = before.split("\n");
68
+ const to = after.split("\n");
69
+ // A line that CLOSES a block comment cannot be deleted without changing what that
70
+ // comment covers, whatever else the line looks like. Checked textually, so this
71
+ // holds even when the lexer and the strip agree with each other and are both wrong
72
+ // — which is what a `//` inside a block made them do.
73
+ //
74
+ // Only `*\/` is tested. A `/*` inside the reason of a genuine line comment is inert
75
+ // text, and deleting a line cannot open a block that was not already open; treating
76
+ // it as active made the strip abandon the write, so a marker whose reason discussed
77
+ // a selector shipped to the customer — the one outcome this pass exists to prevent.
78
+ const isComment = (line) => line.trimStart().startsWith(prefix) &&
79
+ !(prefix === "//" && line.includes("*/"));
80
+ let i = 0;
81
+ for (const line of to) {
82
+ while (i < from.length && from[i] !== line) {
83
+ if (!isComment(from[i]))
84
+ return false;
85
+ i++;
86
+ }
87
+ if (i >= from.length)
88
+ return false;
89
+ i++;
90
+ }
91
+ for (; i < from.length; i++)
92
+ if (!isComment(from[i]))
93
+ return false;
94
+ return true;
95
+ }
@@ -27,7 +27,9 @@ export interface RetrofitView {
27
27
  /** Absolute path. */
28
28
  file: string;
29
29
  utilsFile: string;
30
- /** The spec whose reuse pass caused the edit (absolute). */
30
+ /** The spec whose reuse pass caused the edit (absolute) — the row the retrofit is
31
+ * reported on. Equals `file` when the causing spec cannot be established: see
32
+ * `uncrossAttributions`. */
31
33
  testFile: string;
32
34
  /** Status of an execution that ran the CURRENT bytes (executedAt ≥ the file's
33
35
  * mtime), if any. */
@@ -49,7 +49,7 @@ export async function recordReuseRetrofits(retrofits, utilsFiles, testFile, expl
49
49
  if (!entries[key])
50
50
  entries[key] = { utilsFile, testFile: await realpath(testFile) };
51
51
  }
52
- await manager.writeData({ ...data, reuseRetrofits: entries });
52
+ await manager.appendData({ ...data, reuseRetrofits: entries });
53
53
  }
54
54
  catch (err) {
55
55
  logger.warning("Could not record the reuse retrofits — the report will not be checked for them", { retrofits, error: String(err) });
@@ -83,7 +83,49 @@ export async function standingRetrofits(state, changedFilesAbs) {
83
83
  }
84
84
  out.push({ file, utilsFile: r.utilsFile, testFile: r.testFile, execution });
85
85
  }
86
- return out;
86
+ return uncrossAttributions(out);
87
+ }
88
+ /**
89
+ * Drop the CAUSING spec from any pair of retrofits that name each other, keeping the
90
+ * retrofit itself and re-attributing it to its own file.
91
+ *
92
+ * A retrofit is found by `modifiedSiblingsImporting`, whose evidence is "modified
93
+ * since HEAD and imports the module". That establishes the edit; it establishes
94
+ * nothing about WHO made it. When two specs on one module are each edited by their
95
+ * own chain, each one's staging call sees the other as a modified sibling and claims
96
+ * it, and `recordReuseRetrofits` is first-wins, so both claims persist. The report
97
+ * then shows each row naming the other row's file — a statement of cause that cannot
98
+ * be true in both directions, observed in three fixtures of the 2026-09-18 cohort.
99
+ *
100
+ * A cycle proves at least one claim is false and run state holds nothing that says
101
+ * which, so neither is reported. What survives is what the files do prove: this
102
+ * pre-existing test was rewired onto the shared module by this run, and here is the
103
+ * execution that ran it. That keeps the disclosure — and the report gate over it — on
104
+ * the row a reader looks at for that file, instead of on a sibling that may not have
105
+ * touched it.
106
+ *
107
+ * Only reciprocal claims ON THE SAME MODULE are touched. Two conditions, both read
108
+ * off the evidence:
109
+ *
110
+ * - A one-way attribution is the ordinary STEP 5c case, where a spec's reuse pass
111
+ * reached a sibling that is not being edited in its own right, and nothing
112
+ * contradicts it.
113
+ * - A reciprocal pair naming DIFFERENT modules is a shape no cohort has produced —
114
+ * the observed defect is two specs on one module — so nothing says the same cause
115
+ * is behind it, and the row it would move to carries another module's record.
116
+ */
117
+ function uncrossAttributions(views) {
118
+ const claimed = new Map();
119
+ for (const v of views)
120
+ claimed.set(canonPath(v.file), v);
121
+ return views.map((v) => {
122
+ const reciprocal = claimed.get(canonPath(v.testFile));
123
+ return reciprocal &&
124
+ canonPath(reciprocal.testFile) === canonPath(v.file) &&
125
+ reciprocal.utilsFile === v.utilsFile
126
+ ? { ...v, testFile: v.file }
127
+ : v;
128
+ });
87
129
  }
88
130
  /**
89
131
  * The report gate over the standing retrofits: every one needs an execution of its
@@ -1,5 +1,5 @@
1
1
  import type { VerifyResult } from "../../utils/pom-verify/index.js";
2
- import { ReuseVerificationOutcome, type ReuseSkippedEntry } from "../../types/ReuseOutcome.js";
2
+ import { ReuseVerificationOutcome, type InHouseDeclinedEntry, type ReuseSkippedEntry } from "../../types/ReuseOutcome.js";
3
3
  import { HelperVerificationOutcome } from "../../types/ReuseOutcome.js";
4
4
  export { ReuseDeclinedBy, ReuseVerificationOutcome, HelperVerificationOutcome, type ReuseOutcome, type ReuseSkippedEntry, } from "../../types/ReuseOutcome.js";
5
5
  /** A member the verifier flagged at some point in this run. NOT the same as "a
@@ -77,7 +77,29 @@ export interface UtilsReuseRecord {
77
77
  verification?: HelperVerificationOutcome;
78
78
  /** The last verify pass threw; the debt fails open until a pass succeeds. */
79
79
  verifyError?: boolean;
80
+ /** What the agent DECLARED on its last verify call about the search for the
81
+ * repository's own browser helper modules: the files it read, the helpers it
82
+ * declined. Testimony, kept for the report and labelled there as such. */
83
+ inHouseDeclared?: InHouseDeclaration;
80
84
  }
85
+ export interface InHouseDeclaration {
86
+ filesRead: string[];
87
+ declined: InHouseDeclinedEntry[];
88
+ }
89
+ /** Matches a well-formed `// kept inline: <basename> <sep> <reason>` marker.
90
+ *
91
+ * The separator must be an em/en dash or a *spaced* hyphen. Discovery has no
92
+ * anchor to tell where the file name ends, and a bare hyphen is ambiguous with
93
+ * hyphens inside file names (`alert-destinations.page.ts-reason`), so requiring
94
+ * whitespace is what makes the split decidable. `findUnparsableKeptInline` below
95
+ * reports anything that looks like a marker but does not match, so a malformed
96
+ * one is never silently lost. */
97
+ export declare const KEPT_INLINE_RE: RegExp;
98
+ /** Lines that look like a kept-inline marker. Deliberately looser than
99
+ * KEPT_INLINE_RE so the difference between the two is detectable. Exported so the
100
+ * delivery-time strip recognises the grammar from its one declaration here rather
101
+ * than re-spelling it. */
102
+ export declare const KEPT_INLINE_LOOSE_RE: RegExp;
81
103
  /**
82
104
  * Every well-formed `// kept inline: <basename> — <reason>` marker in a spec.
83
105
  *
@@ -1,5 +1,6 @@
1
1
  import * as path from "path";
2
2
  import { stripStrings } from "../../utils/pom-scope/strip.js";
3
+ import { lineCommentOpeners, markerOnOwnLine, } from "../../utils/utils-verify/allow.js";
3
4
  import { ReuseDeclinedBy, ReuseVerificationOutcome, } from "../../types/ReuseOutcome.js";
4
5
  /**
5
6
  * Server-side derivation of a UI test's POM code-reuse outcome.
@@ -31,15 +32,12 @@ export { ReuseDeclinedBy, ReuseVerificationOutcome, HelperVerificationOutcome, }
31
32
  * whitespace is what makes the split decidable. `findUnparsableKeptInline` below
32
33
  * reports anything that looks like a marker but does not match, so a malformed
33
34
  * one is never silently lost. */
34
- const KEPT_INLINE_RE = /\/\/\s*kept inline:\s*(\S.*?)\s*(?:[—–]+|\s+-+\s+)\s*(\S.*?)\s*$/;
35
+ export const KEPT_INLINE_RE = /\/\/\s*kept inline:\s*(\S.*?)\s*(?:[—–]+|\s+-+\s+)\s*(\S.*?)\s*$/;
35
36
  /** Lines that look like a kept-inline marker. Deliberately looser than
36
- * KEPT_INLINE_RE so the difference between the two is detectable. */
37
- const KEPT_INLINE_LOOSE_RE = /\/\/\s*kept inline:/;
38
- /** Comment lines only — a marker quoted inside a string literal is not a real
39
- * marker, the same reasoning as the zero-reuse gate's predicate. */
40
- function commentLines(specContent) {
41
- return stripStrings(specContent).split("\n");
42
- }
37
+ * KEPT_INLINE_RE so the difference between the two is detectable. Exported so the
38
+ * delivery-time strip recognises the grammar from its one declaration here rather
39
+ * than re-spelling it. */
40
+ export const KEPT_INLINE_LOOSE_RE = /\/\/\s*kept inline:/;
43
41
  /**
44
42
  * Every well-formed `// kept inline: <basename> — <reason>` marker in a spec.
45
43
  *
@@ -53,8 +51,8 @@ function commentLines(specContent) {
53
51
  export function parseKeptInline(specContent) {
54
52
  const out = [];
55
53
  const seen = new Set();
56
- for (const line of commentLines(specContent)) {
57
- const m = KEPT_INLINE_RE.exec(line);
54
+ for (const { marker } of keptInlineLines(specContent)) {
55
+ const m = marker && KEPT_INLINE_RE.exec(marker);
58
56
  if (!m)
59
57
  continue;
60
58
  const pageObject = path.basename(m[1].trim());
@@ -67,6 +65,31 @@ export function parseKeptInline(specContent) {
67
65
  }
68
66
  return out;
69
67
  }
68
+ /** Every line that announces a kept-inline decline, with the marker text when the
69
+ * comment owns the line. A marker after code or inside a block reports as
70
+ * unparsable — one placement, so a decline can be removed by deleting a line. */
71
+ function keptInlineLines(specContent) {
72
+ const rawLines = specContent.split("\n");
73
+ const codeLines = stripStrings(specContent).split("\n");
74
+ // Where a comment actually OPENS. Through the same helper the utils grammar and the
75
+ // delivery strip use: a `//` inside `/* … *\/` opens nothing, and reading one as a
76
+ // decline authorised the candidate it named while the strip — correctly — refused
77
+ // to delete a line carrying the block's terminator, so the note shipped as well.
78
+ const opens = lineCommentOpeners(specContent, "//");
79
+ const out = [];
80
+ for (let n = 0; n < rawLines.length; n++) {
81
+ const code = codeLines[n] ?? "";
82
+ if (!KEPT_INLINE_LOOSE_RE.test(code))
83
+ continue;
84
+ out.push({
85
+ raw: rawLines[n],
86
+ marker: opens && !opens.has(n)
87
+ ? undefined
88
+ : markerOnOwnLine(rawLines[n], code, "//"),
89
+ });
90
+ }
91
+ return out;
92
+ }
70
93
  /**
71
94
  * Lines that announce a kept-inline decline but that `parseKeptInline` cannot
72
95
  * read — a missing reason clause, or a bare unspaced hyphen the zero-reuse gate's
@@ -78,9 +101,9 @@ export function parseKeptInline(specContent) {
78
101
  * dropping them quietly.
79
102
  */
80
103
  export function findUnparsableKeptInline(specContent) {
81
- return commentLines(specContent)
82
- .filter((line) => KEPT_INLINE_LOOSE_RE.test(line) && !KEPT_INLINE_RE.test(line))
83
- .map((line) => line.trim());
104
+ return keptInlineLines(specContent)
105
+ .filter(({ marker }) => !marker || !KEPT_INLINE_RE.test(marker))
106
+ .map(({ raw }) => raw.trim());
84
107
  }
85
108
  /** Members the verifier flagged in one pass, keyed to the file a decline comment
86
109
  * would name. */