@skyramp/mcp 0.4.1 → 0.4.2-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/build/adapters/jestAdapter.js +23 -5
  2. package/build/adapters/mochaAdapter.js +7 -1
  3. package/build/adapters/playwrightAdapter.js +3 -1
  4. package/build/adapters/pytestAdapter.js +14 -3
  5. package/build/commands/localDevTestChangesCommand.js +1 -0
  6. package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
  7. package/build/commands/testThisEndpointCommand.js +16 -4
  8. package/build/index.js +34 -4
  9. package/build/playwright/blueprintDigest.js +28 -7
  10. package/build/playwright/registerPlaywrightTools.js +33 -28
  11. package/build/playwright/traceRecordingPrompt.js +9 -2
  12. package/build/prompts/code-reuse.js +95 -29
  13. package/build/prompts/fix-error-prompt.d.ts +9 -1
  14. package/build/prompts/fix-error-prompt.js +31 -28
  15. package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
  16. package/build/prompts/local-dev/local-dev-plan.js +3 -1
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +30 -3
  19. package/build/prompts/modularization/integration-test-modularization.js +13 -6
  20. package/build/prompts/modularization/ui-test-modularization.js +1 -1
  21. package/build/prompts/personas.js +1 -1
  22. package/build/prompts/pom-aware-code-reuse.js +7 -9
  23. package/build/prompts/reuse-hand-off.d.ts +64 -0
  24. package/build/prompts/reuse-hand-off.js +130 -0
  25. package/build/prompts/shared-helper-policy.d.ts +88 -2
  26. package/build/prompts/shared-helper-policy.js +145 -11
  27. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
  28. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  29. package/build/prompts/sut-setup/shared.d.ts +4 -1
  30. package/build/prompts/sut-setup/shared.js +2 -2
  31. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  32. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  33. package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
  34. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  35. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  36. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
  37. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  38. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  39. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  40. package/build/prompts/testbot/testbot-prompts.js +123 -55
  41. package/build/recommendation/answers.js +18 -9
  42. package/build/recommendation/pullRequestText.js +1 -1
  43. package/build/recommendation/registerPlan.js +31 -17
  44. package/build/recommendation/subjectStep.d.ts +8 -10
  45. package/build/recommendation/subjectStep.js +17 -16
  46. package/build/recommendation/types.d.ts +71 -17
  47. package/build/recommendation/types.js +9 -15
  48. package/build/recommendation/verifierContracts.d.ts +7 -3
  49. package/build/recommendation/verifierContracts.js +8 -4
  50. package/build/recommendation/verifiers/changedFile.js +11 -13
  51. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  52. package/build/recommendation/verifiers/citedPath.js +16 -2
  53. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  54. package/build/recommendation/verifiers/coverage.js +190 -134
  55. package/build/recommendation/verifiers/defects.js +56 -16
  56. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  57. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  58. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  59. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  60. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  61. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  62. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  63. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  64. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  65. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  66. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  67. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  68. package/build/recommendation/verifiers/screenRoute.js +15 -10
  69. package/build/recommendation/verifiers/statedDifference.js +15 -8
  70. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  71. package/build/resources/analysisResources.js +7 -3
  72. package/build/resources/progressResource.js +4 -2
  73. package/build/resources/sutSetupResource.js +20 -2
  74. package/build/resources/testbotResource.js +19 -1
  75. package/build/services/AnalyticsService.js +3 -1
  76. package/build/services/ScenarioGenerationService.js +5 -5
  77. package/build/services/TestDiscoveryService.js +21 -5
  78. package/build/services/TestExecutionService.js +63 -21
  79. package/build/services/TestGenerationService.d.ts +1 -1
  80. package/build/services/TestGenerationService.js +43 -24
  81. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  82. package/build/skills/enhanceAssertionsSkill.js +103 -0
  83. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  84. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  85. package/build/skills/skillFiles.d.ts +38 -0
  86. package/build/skills/skillFiles.js +94 -0
  87. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  88. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  89. package/build/tool-phases.js +4 -0
  90. package/build/tools/auth/loginTool.js +3 -1
  91. package/build/tools/auth/logoutTool.js +3 -1
  92. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  93. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  94. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  95. package/build/tools/code-refactor/assertion-state.js +1 -1
  96. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  97. package/build/tools/code-refactor/assertionOperations.js +82 -0
  98. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  99. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  100. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  101. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  102. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  103. package/build/tools/code-refactor/gate-markers.js +95 -0
  104. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  105. package/build/tools/code-refactor/retrofit-state.js +44 -2
  106. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  107. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  108. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  109. package/build/tools/code-refactor/reuse-state.js +191 -61
  110. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  111. package/build/tools/code-refactor/utils-verify-gates.js +252 -27
  112. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  113. package/build/tools/code-refactor/verify-gates.js +36 -4
  114. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  115. package/build/tools/enrichTestWithMocksTool.js +9 -5
  116. package/build/tools/executeSkyrampTestTool.d.ts +22 -1
  117. package/build/tools/executeSkyrampTestTool.js +571 -271
  118. package/build/tools/execution-video-state.js +1 -1
  119. package/build/tools/fixErrorTool.js +5 -6
  120. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  121. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  122. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  123. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  124. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  125. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  126. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  127. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  128. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  129. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  130. package/build/tools/generate-tests/planGuard.js +6 -3
  131. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  132. package/build/tools/generate-tests/scenarioLint.js +17 -5
  133. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  134. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  135. package/build/tools/one-click/oneClickTool.js +3 -1
  136. package/build/tools/preflightMockCheckTool.js +23 -7
  137. package/build/tools/runExistingTestsTool.d.ts +1 -1
  138. package/build/tools/runExistingTestsTool.js +43 -21
  139. package/build/tools/submitReportTool.d.ts +51 -12
  140. package/build/tools/submitReportTool.js +860 -161
  141. package/build/tools/test-management/actionsTool.js +210 -51
  142. package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
  143. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  144. package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
  145. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  146. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  147. package/build/tools/test-management/resolveScreenTool.js +33 -9
  148. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  149. package/build/tools/trace/stopTraceCollectionTool.js +41 -5
  150. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  151. package/build/tools/verifyTestDependenciesTool.js +54 -0
  152. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  153. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  154. package/build/types/AssertionOutcome.d.ts +1 -1
  155. package/build/types/EnhanceType.d.ts +6 -0
  156. package/build/types/EnhanceType.js +1 -0
  157. package/build/types/ExternalTestExecution.d.ts +2 -2
  158. package/build/types/RepositoryAnalysis.d.ts +0 -40
  159. package/build/types/ReuseOutcome.d.ts +96 -4
  160. package/build/types/ReuseOutcome.js +16 -0
  161. package/build/types/StepMethod.js +20 -6
  162. package/build/types/TestAnalysis.d.ts +10 -2
  163. package/build/types/TestExecution.d.ts +45 -0
  164. package/build/types/TestRecommendation.d.ts +1 -1
  165. package/build/types/TestRecommendation.js +4 -1
  166. package/build/types/TestTypes.d.ts +13 -0
  167. package/build/types/TestTypes.js +34 -3
  168. package/build/types/TestbotPromptOptions.d.ts +9 -1
  169. package/build/types/TestbotReport.d.ts +45 -9
  170. package/build/utils/AnalysisStateManager.d.ts +137 -27
  171. package/build/utils/AnalysisStateManager.js +227 -43
  172. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  173. package/build/utils/assertion-verify/metrics.js +39 -6
  174. package/build/utils/assertion-verify/ui-lints.js +4 -2
  175. package/build/utils/branchDiff.js +47 -12
  176. package/build/utils/canonicalJson.js +3 -1
  177. package/build/utils/dartRouteExtractor.js +36 -7
  178. package/build/utils/fixAttempts.d.ts +26 -0
  179. package/build/utils/fixAttempts.js +109 -0
  180. package/build/utils/frontendSelectors.js +23 -4
  181. package/build/utils/generatedTestRecord.d.ts +19 -0
  182. package/build/utils/generatedTestRecord.js +61 -0
  183. package/build/utils/gitStaging.js +7 -2
  184. package/build/utils/initAgent.js +26 -6
  185. package/build/utils/language-helper.js +39 -45
  186. package/build/utils/pathMatching.js +2 -1
  187. package/build/utils/pathSignatures.js +6 -2
  188. package/build/utils/planMatchKeys.d.ts +2 -2
  189. package/build/utils/planMatchKeys.js +20 -14
  190. package/build/utils/pom-catalog-parse.js +7 -2
  191. package/build/utils/pom-scope/import-expansion.js +6 -1
  192. package/build/utils/pom-scope/index.js +50 -12
  193. package/build/utils/pom-scope/scoring.js +13 -3
  194. package/build/utils/pom-scope/selector-extractor.js +16 -3
  195. package/build/utils/pom-scope/strip.d.ts +8 -0
  196. package/build/utils/pom-scope/strip.js +238 -0
  197. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  198. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  199. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  200. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  201. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  202. package/build/utils/pom-verify/bindings.js +5 -1
  203. package/build/utils/pom-verify/calls.js +9 -2
  204. package/build/utils/pom-verify/verify.js +27 -5
  205. package/build/utils/pr-comment-parser.js +20 -7
  206. package/build/utils/proxy-terminal.d.ts +19 -1
  207. package/build/utils/proxy-terminal.js +346 -21
  208. package/build/utils/removedUiElements.js +1 -1
  209. package/build/utils/reportLanguage.js +35 -7
  210. package/build/utils/reportVerification.d.ts +14 -8
  211. package/build/utils/reportVerification.js +19 -19
  212. package/build/utils/repositorySlug.d.ts +32 -0
  213. package/build/utils/repositorySlug.js +77 -0
  214. package/build/utils/reuseRouting.js +6 -2
  215. package/build/utils/runSerialized.d.ts +3 -0
  216. package/build/utils/runSerialized.js +39 -0
  217. package/build/utils/screenRoutes.js +74 -18
  218. package/build/utils/sourceRouteExtractor.js +13 -6
  219. package/build/utils/telemetry.d.ts +1 -0
  220. package/build/utils/telemetry.js +8 -5
  221. package/build/utils/testDependencyPolicy.d.ts +9 -0
  222. package/build/utils/testDependencyPolicy.js +788 -0
  223. package/build/utils/testExecutionRecord.d.ts +90 -0
  224. package/build/utils/testExecutionRecord.js +267 -0
  225. package/build/utils/testFileClassification.js +3 -1
  226. package/build/utils/trace-parser.js +62 -14
  227. package/build/utils/urlPath.js +3 -1
  228. package/build/utils/utils-verify/action-key.d.ts +4 -0
  229. package/build/utils/utils-verify/action-key.js +2 -2
  230. package/build/utils/utils-verify/allow.d.ts +122 -3
  231. package/build/utils/utils-verify/allow.js +146 -21
  232. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  233. package/build/utils/utils-verify/body-reach.js +335 -0
  234. package/build/utils/utils-verify/call-sites.d.ts +6 -1
  235. package/build/utils/utils-verify/call-sites.js +72 -8
  236. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  237. package/build/utils/utils-verify/delivered-imports.js +84 -0
  238. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  239. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  240. package/build/utils/utils-verify/in-house.d.ts +93 -0
  241. package/build/utils/utils-verify/in-house.js +719 -0
  242. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  243. package/build/utils/utils-verify/incumbent.js +75 -0
  244. package/build/utils/utils-verify/index.d.ts +1 -0
  245. package/build/utils/utils-verify/index.js +1 -0
  246. package/build/utils/utils-verify/language-spec.d.ts +26 -10
  247. package/build/utils/utils-verify/language-spec.js +217 -20
  248. package/build/utils/utils-verify/locate.d.ts +26 -0
  249. package/build/utils/utils-verify/locate.js +125 -23
  250. package/build/utils/utils-verify/module-name.d.ts +40 -0
  251. package/build/utils/utils-verify/module-name.js +98 -0
  252. package/build/utils/utils-verify/parse.d.ts +46 -6
  253. package/build/utils/utils-verify/parse.js +176 -38
  254. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  255. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  256. package/build/utils/utils-verify/stage.d.ts +5 -0
  257. package/build/utils/utils-verify/stage.js +47 -2
  258. package/build/utils/utils-verify/status-once.d.ts +62 -0
  259. package/build/utils/utils-verify/status-once.js +207 -0
  260. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  261. package/build/utils/utils-verify/typecheck.js +338 -0
  262. package/build/utils/utils-verify/verify.d.ts +76 -1
  263. package/build/utils/utils-verify/verify.js +516 -44
  264. package/build/utils/versions.d.ts +3 -3
  265. package/build/utils/versions.js +1 -1
  266. package/build/utils/workspaceAuth.js +107 -37
  267. package/build/workspace/queryParamResolution.js +11 -4
  268. package/build/workspace/workspace.js +7 -7
  269. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  270. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  271. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  272. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  273. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  274. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  275. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  276. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  277. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  278. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  279. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  280. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  281. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  282. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  283. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  284. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  285. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  286. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  287. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  288. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  289. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  290. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  291. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  292. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  293. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  294. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  295. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  296. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  297. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  298. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  299. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  300. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  301. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  302. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  509. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  510. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  511. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  512. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  513. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  514. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  515. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  516. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  518. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  519. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  520. package/node_modules/playwright/package.json +2 -2
  521. package/package.json +7 -6
  522. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  523. package/plugin/prompts/generate-tests/generation.md +1 -1
  524. package/plugin/prompts/plan-tests.md +14 -14
  525. package/plugin/prompts/testbot-task1.md +4 -2
  526. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  527. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  528. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  529. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  530. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  531. package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
  532. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  533. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  534. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  535. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  536. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  537. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  538. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  539. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  540. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  541. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  542. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  543. package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
@@ -1,13 +1,31 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
3
  import { logger } from "../logger.js";
4
- import { locateUtilsFiles } from "./locate.js";
5
- import { blankCommentsAndStrings, countAssertions, hasPageErrorGuard, parseUtilsFile, } from "./parse.js";
4
+ import { isInside, locateUtilsFiles, realpath, resolveSpecImports, } from "./locate.js";
5
+ import { generateSkyrampHeader } from "../utils.js";
6
+ import { typecheckDelivered } from "./typecheck.js";
7
+ import { blankComments, blankCommentsAndStrings, countAssertions, hasPageErrorGuard, parseUtilsFile, } from "./parse.js";
6
8
  import { escapeRegExp } from "../regex.js";
9
+ import { detectGitRoot } from "../gitStaging.js";
10
+ import { isModularizeFirstTarget } from "../reuseRouting.js";
11
+ import { findDuplicateBodyReach, findUnreachableBodies } from "./body-reach.js";
12
+ import { misnamedNewModules } from "./module-name.js";
13
+ import { additiveChanges, locateInHouseModules, resolveInHouseCalls, } from "./in-house.js";
7
14
  import { findSiblingInlineCallSites, findUnextractedDuplicates, generatedSiblings, } from "./call-sites.js";
8
15
  import { parseUtilsAllows, } from "./allow.js";
16
+ import { describeFixedSleeps, fixedSleepReplacement } from "./fixed-sleep.js";
9
17
  import { singleImporterHelpers, } from "./importers.js";
18
+ import { assertsStatusEquality, defaultedStatusParam, pinnedStatusLiteral, restatedStatusAssertions, } from "./status-once.js";
19
+ import { STATUS_ONCE_RULE } from "../../prompts/shared-helper-policy.js";
20
+ import { committedBaseline } from "./retrofit-equivalence.js";
21
+ import { incumbentSignatureViolations } from "./incumbent.js";
10
22
  import { helperFamilyFor, helperFamilyOf, scenarioNameViolation, utilsSpecFor, utilsSpecForFile, } from "./language-spec.js";
23
+ /** What the compiler says about a name defined twice, which `helper-redefined`
24
+ * already reports once with its remediation: TS2393 "Duplicate function
25
+ * implementation" and TS2323 "Cannot redeclare exported variable" for two
26
+ * `function` declarations, TS2451 "Cannot redeclare block-scoped variable" for two
27
+ * `const` arrow helpers. */
28
+ const REDECLARATION_CODES = new Set([2393, 2323, 2451]);
11
29
  /**
12
30
  * Deterministic post-reuse check of the shared utils file(s) a spec depends on.
13
31
  *
@@ -25,20 +43,51 @@ import { helperFamilyFor, helperFamilyOf, scenarioNameViolation, utilsSpecFor, u
25
43
  * helper (runs 5 and 11 — `assert total_amount == 16.0` in `update_order`); a
26
44
  * body assertion carries one scenario's values into a function every scenario calls.
27
45
  * - `scenario-name` (ADVISORY only): a helper named for its scenario rather than its step.
46
+ * - `status-default` (ADVISORY for now) and `status-restated`: the status a test
47
+ * expects is stated ONCE, as the call's argument — not omitted behind a defaulted
48
+ * parameter, and not asserted again in the spec on the response the helper
49
+ * returned. See status-once.ts.
50
+ * - `type-error` (TypeScript): the delivered module or spec fails the compiler with
51
+ * every strictness flag off — an error under every configuration (a path parameter
52
+ * typed `unknown`, request options built as a record and handed to `sendRequest`).
53
+ * An error only the repository's own tsconfig raises is the `tsconfig-type-error`
54
+ * ADVISORY. See typecheckDelivered.
28
55
  *
29
56
  * Analyses the utils files' INTERNAL invariants — unlike the POM verifier, which
30
57
  * checks a spec's cross-file references — so it reads the utils files, not the spec,
31
58
  * except to count what the spec imports.
32
59
  */
33
60
  export async function verifyUtils(params) {
34
- const spec = utilsSpecFor(params.language) ?? utilsSpecForFile(params.testFile);
61
+ // The spec file's extension decides its language; the declared language covers
62
+ // a path whose extension names none. Each utils file is then judged by ITS OWN
63
+ // extension (`fileSpec` below): a TypeScript spec may import a JavaScript
64
+ // module, and the TypeScript-only rules — the signature advisory, the compiler —
65
+ // must not read it (run 9, sample-microservices: `client: SkyrampClient`
66
+ // prescribed into a `.js` file, and node's `assert` reported unresolved).
67
+ const spec = utilsSpecForFile(params.testFile) ?? utilsSpecFor(params.language);
35
68
  const family = helperFamilyFor(params.testType);
69
+ // CANONICAL, once: `locateInHouseModules` realpaths every module it returns, and
70
+ // `git show HEAD:<rel>` needs a path relative to the same root. A caller-supplied
71
+ // cwd routinely is not canonical — a sandboxed run works under macOS's /tmp, a
72
+ // symlink to /private/tmp — and the mismatch made `path.relative` yield a path git
73
+ // could not read, so the additive gate returned `ran: false` and the pass went
74
+ // green over a module it never compared.
75
+ const rawRoot = params.cwd ?? detectGitRoot(params.testFile);
76
+ const root = rawRoot ? await realpath(rawRoot) : undefined;
77
+ // The repository's own modules the spec imports — ownership decided at HEAD (see
78
+ // locateInHouseModules). Found BEFORE the utils files so a customer module that
79
+ // gained our header this run is judged by the additive gate, never by the Skyramp
80
+ // invariants: the header locator would otherwise claim it.
81
+ const inHouse = spec
82
+ ? await locateInHouseModules({ testFile: params.testFile, spec, cwd: root })
83
+ : [];
84
+ const inHouseFiles = new Set(inHouse.map((m) => m.file));
36
85
  const utilsFiles = spec
37
- ? await locateUtilsFiles({
86
+ ? (await locateUtilsFiles({
38
87
  testFile: params.testFile,
39
88
  language: spec.language,
40
89
  cwd: params.cwd,
41
- })
90
+ })).filter((f) => !inHouseFiles.has(f))
42
91
  : [];
43
92
  const result = {
44
93
  ok: true,
@@ -49,6 +98,7 @@ export async function verifyUtils(params) {
49
98
  violations: [],
50
99
  allowed: [],
51
100
  advisories: [],
101
+ carriedConsumed: [],
52
102
  malformedAllows: [],
53
103
  spec,
54
104
  fallbackFamily: family,
@@ -67,9 +117,19 @@ export async function verifyUtils(params) {
67
117
  }
68
118
  if (spec.language === "python")
69
119
  result.violations.push(...importFormViolations(params.testFile, specContent, utilsFiles));
120
+ // Imports and module qualifiers are read with comments blanked and strings kept:
121
+ // a commented-out `import * as client from "./skyrampUtils"` authorised `client.`
122
+ // as the module's qualifier, and a commented-out named import counted as one.
123
+ const liveSpec = blankComments(specContent, spec);
124
+ /** Per utils file, the helpers defined at HEAD — not this run's. Read once and
125
+ * kept: both the status advisory's scope and the restatement's remediation
126
+ * turn on it. */
127
+ const incumbentsOfFile = new Map();
70
128
  const allHelpers = [];
71
129
  const helpersByFile = new Map();
72
130
  const allAllows = [];
131
+ /** Findings from every located file, classified after the walk — see below. */
132
+ const pending = [];
73
133
  const importedNames = new Set();
74
134
  const importedByFile = new Map();
75
135
  const helpersOfFile = new Map();
@@ -93,61 +153,328 @@ export async function verifyUtils(params) {
93
153
  });
94
154
  throw err; // the caller records a verify error, which fails OPEN — never a silent PASS
95
155
  }
96
- const helpers = parseUtilsFile(content, spec);
156
+ const fileSpec = utilsSpecForFile(file) ?? spec;
157
+ const helpers = parseUtilsFile(content, fileSpec);
158
+ // The module as committed: its helpers are INCUMBENTS. The status rule governs
159
+ // helpers this run writes, so a defaulted status on an incumbent is not advised
160
+ // — and an incumbent's signature is held to what it was (incumbent.ts). Absent
161
+ // for a module this run created, or outside git: then every helper is this run's.
162
+ const baseline = await committedBaseline(file);
163
+ const headHelpers = baseline === undefined ? [] : parseUtilsFile(baseline, fileSpec);
164
+ const incumbents = new Set(headHelpers.map((h) => h.name));
165
+ incumbentsOfFile.set(file, incumbents);
166
+ pending.push(...incumbentSignatureViolations(headHelpers, helpers, file));
97
167
  for (const h of helpers) {
98
- // An untyped parameter is an error under `noImplicitAny`; whether the host repo's
99
- // tsconfig reaches the tests directory is its call, so this advises and never blocks.
100
- if (h.untypedParams.length > 0)
168
+ // A static reading of the signature. An unannotated parameter is an error only
169
+ // under `noImplicitAny`, and `any` is never one whether the host repo's
170
+ // tsconfig reaches the tests directory is its call — so this advises and never
171
+ // blocks; the compiler run below is what blocks, on the error an `unknown`
172
+ // parameter produces at its first use.
173
+ if (h.unusableParamTypes.length > 0)
101
174
  result.advisories.push({
102
- kind: "untyped-parameter",
175
+ kind: "unusable-parameter-type",
103
176
  file,
104
177
  helper: h.name,
105
178
  line: h.line,
106
179
  // Names only — the remediation is stated once, in the advisory footer.
107
- detail: h.untypedParams.map((p) => `\`${p}\``).join(", "),
180
+ detail: h.unusableParamTypes.map((p) => `\`${p}\``).join(", "),
108
181
  });
109
182
  }
110
183
  allHelpers.push(...helpers);
111
184
  helpersByFile.set(file, helpers);
112
185
  helpersOfFile.set(file, helpers);
113
- const { allows, malformed } = parseUtilsAllows(content, spec);
114
- allAllows.push(...allows);
186
+ const { allows, malformed } = parseUtilsAllows(content, fileSpec);
187
+ allAllows.push(...allows.map((a) => ({ ...a, file })));
115
188
  result.helpers += helpers.length;
116
189
  result.malformedAllows.push(...malformed.map((line) => ({ file, line })));
117
190
  const stem = path.basename(file).replace(/\.[^.]+$/, "");
118
191
  const defined = new Set(helpers.map((h) => h.name));
119
192
  const importedHere = new Set();
120
- for (const n of spec.importedNames(specContent, stem))
193
+ for (const n of spec.importedNames(liveSpec, stem))
121
194
  if (defined.has(n)) {
122
195
  importedNames.add(n);
123
196
  importedHere.add(n);
124
197
  }
125
198
  importedByFile.set(file, importedHere);
126
- // One marker documents ONE violation of that kind in that helper: a second,
127
- // undocumented scenario claim in the same helper is not covered by the first
128
- // decline. Markers are consumed in order.
129
- const budget = new Map();
130
- for (const a of allows) {
131
- const k = `${a.kind}\0${a.helper}`;
132
- budget.set(k, (budget.get(k) ?? 0) + 1);
133
- }
134
- for (const v of violationsIn(helpers, file, family, spec, { byRoute, byName, byAction }, result.advisories)) {
135
- const k = `${v.kind}\0${v.helper}`;
136
- const left = budget.get(k) ?? 0;
137
- if (left > 0) {
138
- budget.set(k, left - 1);
139
- result.allowed.push(v);
140
- }
141
- else if (v.kind === "scenario-name") {
142
- result.advisories.push(v);
199
+ // Findings are collected here and classified once every file has been read: a
200
+ // marker may sit beside the CALLER while the finding it documents is raised in
201
+ // the module next to it, and a per-file budget could never reach across.
202
+ pending.push(...violationsIn(helpers, file, family, fileSpec, { byRoute, byName, byAction }, result.advisories, incumbents));
203
+ }
204
+ result.imported = importedNames.size;
205
+ result.importedNames = [...importedNames].sort();
206
+ // The repository's own modules the spec imports. Their helpers join the baseline
207
+ // count for every family the count asks what the delivered test asserts, and a
208
+ // customer's helper asserts whatever it asserts — while the resolve and additive
209
+ // checks run for browser helpers only: a browser helper and the step it replaces
210
+ // drive one library, so the checks have something to read; an API helper written
211
+ // against another HTTP client does not, and that gate is a separate change.
212
+ // The SAME predicate the prompt routes on, not a copy of its conditions: STEP
213
+ // 2b/3b are emitted for a modularize-first browser target, which is UI with utils
214
+ // reuse on and page-object reuse OFF. A hand-maintained `testType === "ui"` also
215
+ // fired where the prompt gives no workflow — with the page-object flag on and a
216
+ // non-Playwright framework, which takes the plain reuse prompt — and a gate the
217
+ // agent was given no way to satisfy is a run that cannot finish.
218
+ const inHouseResult = isModularizeFirstTarget(params.testType, spec.language) &&
219
+ helperFamilyFor(params.testType).family === "browser" &&
220
+ inHouse.length > 0
221
+ ? {
222
+ modules: inHouse.map((m) => m.file),
223
+ resolved: [],
224
+ unverifiable: [],
225
+ additiveGateRan: true,
226
+ added: [],
227
+ widened: [],
228
+ }
229
+ : undefined;
230
+ for (const m of inHouse) {
231
+ let content;
232
+ try {
233
+ content = await fs.promises.readFile(m.file, "utf8");
234
+ }
235
+ catch (err) {
236
+ // A module HEAD holds and the working tree does not was deleted by this run:
237
+ // nothing to resolve against, and the additive gate is what says so.
238
+ if (err?.code === "ENOENT" &&
239
+ inHouseResult &&
240
+ root) {
241
+ const additive = await additiveChanges(m.file, root, spec);
242
+ if (!additive.ran)
243
+ inHouseResult.additiveGateRan = false;
244
+ pending.push(...additive.violations);
245
+ continue;
143
246
  }
144
- else {
145
- result.violations.push(v);
247
+ logger.warning("Could not read an in-house module the spec imports", {
248
+ file: m.file,
249
+ error: String(err),
250
+ });
251
+ if (inHouseResult)
252
+ inHouseResult.additiveGateRan = false;
253
+ continue;
254
+ }
255
+ const helpers = parseUtilsFile(content, spec);
256
+ const stem = path.basename(m.file).replace(/\.[^.]+$/, "");
257
+ const defined = new Set(helpers.map((h) => h.name));
258
+ const importedHere = new Set();
259
+ for (const n of spec.importedNames(specContent, stem))
260
+ if (defined.has(n))
261
+ importedHere.add(n);
262
+ helpersOfFile.set(m.file, helpers);
263
+ importedByFile.set(m.file, importedHere);
264
+ if (!inHouseResult || !root)
265
+ continue;
266
+ const resolution = resolveInHouseCalls(specContent, content, stem, spec, m.file);
267
+ inHouseResult.resolved.push(...resolution.resolved);
268
+ inHouseResult.unverifiable.push(...resolution.unverifiable);
269
+ pending.push(...resolution.violations);
270
+ const additive = await additiveChanges(m.file, root, spec);
271
+ if (!additive.ran)
272
+ inHouseResult.additiveGateRan = false;
273
+ pending.push(...additive.violations);
274
+ inHouseResult.added.push(...additive.added.map((helper) => ({ file: m.file, helper })));
275
+ inHouseResult.widened.push(...additive.widened.map((helper) => ({ file: m.file, helper })));
276
+ for (const d of additive.duplicates)
277
+ result.advisories.push({
278
+ kind: "in-house-duplicate",
279
+ file: m.file,
280
+ helper: d.added,
281
+ line: helpers.find((h) => h.name === d.added)?.line ?? 1,
282
+ detail: `\`${d.added}\`, added this run, performs the action sequence \`${d.existing}\` already performs in this module — call \`${d.existing}\` instead (lift a differing value into a defaulted parameter of it if needed) and delete \`${d.added}\``,
283
+ });
284
+ }
285
+ if (inHouseResult) {
286
+ inHouseResult.resolved.sort();
287
+ inHouseResult.unverifiable.sort();
288
+ result.inHouse = inHouseResult;
289
+ }
290
+ // The spec's own relative imports are evidence the locator can check without
291
+ // the header. Every one must be a utils file, an in-house module, or a test; a
292
+ // module none of those readers claims is one this pass cannot verify or stage,
293
+ // and a PASSED over it is a gate failing open — fixture 12, run 9: a module
294
+ // rewritten with a bare `// Generated by Skyramp` line passed four verify calls
295
+ // as "nothing to verify". Relative imports only (a package the sandbox lacks is
296
+ // a trap this must fail OPEN on) and not Python (spelled the same as a package).
297
+ const unchecked = [];
298
+ const unresolved = [];
299
+ const realTestFile = await realpath(params.testFile);
300
+ const utilsSet = new Set(utilsFiles);
301
+ const headerLine = generateSkyrampHeader(spec.language).trim();
302
+ const testShaped = (file) => /\.(?:spec|test)\.[cm]?[jt]sx?$/.test(path.basename(file));
303
+ for (const imp of await resolveSpecImports(params.testFile, spec)) {
304
+ const stem = (imp.specifier.split("/").pop() ?? imp.specifier).replace(/\.[cm]?[jt]sx?$/, "");
305
+ if (!imp.resolved) {
306
+ // A module HEAD holds and the working tree does not is located from HEAD
307
+ // and refused by the additive gate; this would say the same twice.
308
+ if (imp.candidates.some((c) => inHouseFiles.has(c)))
309
+ continue;
310
+ if (testShaped(imp.candidates[0] ?? ""))
311
+ continue;
312
+ // Reported, not blocked. This resolver tries a fixed set of extensions and an
313
+ // index file; the customer's toolchain resolves more — a component test
314
+ // imports a `.vue`, a fixture imports a `.sql`, a path alias points elsewhere
315
+ // — and every one of those exists on disk. "Could not resolve" is evidence
316
+ // about this pass, not about the file.
317
+ unresolved.push(imp.specifier);
318
+ continue;
319
+ }
320
+ if (utilsSet.has(imp.resolved) || imp.resolved === realTestFile)
321
+ continue;
322
+ if (inHouseFiles.has(imp.resolved)) {
323
+ if (!inHouseResult)
324
+ unchecked.push(imp.resolved);
325
+ continue;
326
+ }
327
+ if (testShaped(imp.resolved))
328
+ continue;
329
+ if (root && !isInside(imp.resolved, root)) {
330
+ unchecked.push(imp.resolved);
331
+ continue;
332
+ }
333
+ // A module is one the reuse step should have written only if the spec calls
334
+ // HELPERS from it. A data module — constants, bodies, fixtures — is a
335
+ // legitimate thing for a run to create beside a test, and demanding a Skyramp
336
+ // header on it is a block the agent cannot act on. The evidence is checkable:
337
+ // the names the spec imports, against the functions the module defines.
338
+ let defines = [];
339
+ try {
340
+ const imported = new Set(spec.importedNames(specContent, path.basename(imp.resolved).replace(/\.[^.]+$/, "")));
341
+ defines = parseUtilsFile(await fs.promises.readFile(imp.resolved, "utf8"), spec)
342
+ .map((h) => h.name)
343
+ .filter((n) => imported.has(n));
344
+ }
345
+ catch {
346
+ /* unreadable: judged below on the import alone */
347
+ }
348
+ if (defines.length === 0) {
349
+ unchecked.push(imp.resolved);
350
+ continue;
351
+ }
352
+ pending.push({
353
+ kind: "unresolved-module",
354
+ file: imp.resolved,
355
+ helper: stem,
356
+ line: 1,
357
+ // A module reaching this point is NOT tracked at HEAD: one at HEAD with the
358
+ // header is a utils file, and one at HEAD without it is the repository's
359
+ // own. So it is either a module this run wrote, or the customer's own file
360
+ // that is not committed yet — and nothing here can tell those apart. The
361
+ // message states both, because telling the agent to stamp our header on
362
+ // their file is the fault this PR's second blocking fix removed.
363
+ detail: `the test imports ${defines.map((n) => `\`${n}\``).join(", ")} from \`${imp.specifier}\` → ${root ? path.relative(root, imp.resolved) : imp.resolved}, a module of helpers that is not tracked at HEAD and carries no Skyramp header, so this pass cannot verify it or stage it and the pull request would not carry it. If this run wrote it: make its FIRST line exactly \`${headerLine}\` — the \`on <timestamp>\` part is what the shared-module tools recognise — and change nothing else in the file. If it is the repository's OWN module and simply not committed yet: do NOT add the header, leave the step inline, and name the module in the report. Then re-verify`,
364
+ });
365
+ }
366
+ if (unresolved.length > 0)
367
+ result.unresolvedImports = unresolved;
368
+ if (unchecked.length > 0) {
369
+ result.uncheckedModules = unchecked.sort();
370
+ if (!inHouseResult && inHouse.length > 0)
371
+ result.inHouseChecksSkipped = `this pass ran ${params.testType
372
+ ? `as a ${params.testType.toLowerCase()} test`
373
+ : "with no test type supplied"}, and they run for a UI test with page-object reuse off`;
374
+ }
375
+ // The spec asserts a status a helper it calls already asserted on the response it
376
+ // returned. Spec-level, like assertion-loss: the finding names the spec and the
377
+ // marker token is the helper. Only helpers that pin the status to ONE value count
378
+ // — after `toBeLessThan(500)` a `toBe(200)` in the spec is a tighter claim, not a
379
+ // repetition.
380
+ if (specContent) {
381
+ // Per utils FILE: a helper's contract travels with the module that defines it
382
+ // and the names the spec binds THAT module to. One flattened set of helpers
383
+ // and one of qualifiers cross-multiplied — `users.get` was scanned under
384
+ // `orders.get`'s pinning contract, and a same-name, equal-arity helper in two
385
+ // modules is a shape the verifier permits.
386
+ for (const [file, imported] of importedByFile) {
387
+ const pinning = [];
388
+ /** Helpers that pin a LITERAL status: the remediation differs, see below. */
389
+ const literalOf = new Map();
390
+ const incumbents = incumbentsOfFile.get(file) ?? new Set();
391
+ for (const h of helpersOfFile.get(file) ?? []) {
392
+ if (!imported.has(h.name) || !assertsStatusEquality(h, spec))
393
+ continue;
394
+ pinning.push(h.name);
395
+ const literal = pinnedStatusLiteral(h, spec);
396
+ if (literal !== undefined)
397
+ literalOf.set(h.name, literal);
146
398
  }
399
+ const qualifiers = spec.moduleQualifiers(liveSpec, path.basename(file).replace(/\.[^.]+$/, ""));
400
+ for (const r of restatedStatusAssertions(specContent, spec, pinning, qualifiers))
401
+ pending.push({
402
+ kind: "status-restated",
403
+ file: params.testFile,
404
+ helper: r.helper,
405
+ line: r.line,
406
+ // Three shapes, three remediations. A helper that reads the status from a
407
+ // parameter: the call already states it, so the spec's copy goes. A helper
408
+ // THIS RUN WROTE that pins a literal has no call argument to keep, so the
409
+ // literal is lifted first. An INCUMBENT that pins a literal keeps its
410
+ // signature — adding a required parameter is what `incumbent-signature`
411
+ // refuses, and prescribing it here would cost the run a round and end in a
412
+ // marker; the pin is acceptable because no caller can vary it.
413
+ detail: `\`${r.text}\` restates the status \`${r.helper}\` already asserts on the response it returned${r.sites > 1 ? ` (${r.sites} call sites do)` : ""} — ${STATUS_ONCE_RULE.notRestated}. ${remediation(r.helper, literalOf.get(r.helper), incumbents.has(r.helper))}`,
414
+ });
147
415
  }
148
416
  }
149
- result.imported = importedNames.size;
150
- result.importedNames = [...importedNames].sort();
417
+ // The compiler over the delivered files: the shared module(s) and the spec that
418
+ // imports them. The executor transpiles TypeScript without typechecking it, so
419
+ // this is the first typecheck the files meet before the customer's own. An error
420
+ // under the permissive settings fails under every configuration and blocks; one
421
+ // only the repository's tsconfig raises advises (see typecheckDelivered).
422
+ // Over the TypeScript files only, by extension: a JavaScript module is not
423
+ // typechecked (its spec would be `checkJs`, which no delivered file relies on),
424
+ // and a JavaScript spec is not compiled beside a TypeScript module.
425
+ const isTs = (f) => utilsSpecForFile(f)?.language === "typescript";
426
+ const tsUtils = utilsFiles.filter(isTs);
427
+ if (tsUtils.length > 0) {
428
+ // No existence guard: `realpath` falls back to `path.resolve`, and a root the
429
+ // compiler cannot find yields no source file, which the diagnostic walk skips.
430
+ const realSpec = await realpath(params.testFile);
431
+ const specFile = realSpec && isTs(realSpec) ? realSpec : undefined;
432
+ const files = specFile ? [...tsUtils, specFile] : tsUtils;
433
+ const tc = await typecheckDelivered(files);
434
+ result.typecheck = tc;
435
+ const subjectOf = (file, line) => file === specFile
436
+ ? path.basename(specFile).replace(/\W/g, "_")
437
+ : (helpersOfFile
438
+ .get(file)
439
+ ?.find((h) => h.line <= line && line <= h.endLine)?.name ??
440
+ path.basename(file).replace(/\.[^.]+$/, ""));
441
+ // One detector per fault: a name defined twice is `helper-redefined`, with its
442
+ // own remediation; the compiler says the same on each of the two definitions,
443
+ // twice each ("Duplicate function implementation", "Cannot redeclare exported
444
+ // variable"), and those four lines would add nothing but noise.
445
+ const redefined = new Set(pending
446
+ .filter((v) => v.kind === "helper-redefined")
447
+ .map((v) => `${v.file}\0${v.helper}`));
448
+ for (const e of tc.errors) {
449
+ const helper = subjectOf(e.file, e.line);
450
+ if (REDECLARATION_CODES.has(e.code) &&
451
+ redefined.has(`${e.file}\0${helper}`))
452
+ continue;
453
+ pending.push({
454
+ kind: "type-error",
455
+ file: e.file,
456
+ helper,
457
+ line: e.line,
458
+ detail: `\`TS${e.code}: ${e.message}\``,
459
+ });
460
+ }
461
+ for (const e of tc.ambientErrors)
462
+ result.advisories.push({
463
+ kind: "ambient-type-error",
464
+ file: e.file,
465
+ helper: subjectOf(e.file, e.line),
466
+ line: e.line,
467
+ detail: `\`TS${e.code}: ${e.message}\``,
468
+ });
469
+ for (const e of tc.settingErrors)
470
+ result.advisories.push({
471
+ kind: "tsconfig-type-error",
472
+ file: e.file,
473
+ helper: subjectOf(e.file, e.line),
474
+ line: e.line,
475
+ detail: `\`TS${e.code}: ${e.message}\``,
476
+ });
477
+ }
151
478
  // One directory walk feeds every sibling advisory: each sibling is read exactly once.
152
479
  let siblings = [];
153
480
  try {
@@ -190,16 +517,120 @@ export async function verifyUtils(params) {
190
517
  inHelpers,
191
518
  };
192
519
  for (const v of baselineViolations(params.baseline, params.testFile, spec, specContent, inSpec, inHelpers, guardInHelpers)) {
193
- // A marker in any utils file documents an assertion-loss (never a removed
194
- // guard). At most one loss finding exists per verify, so a matching marker's
195
- // presence is the whole budget — nothing to consume.
196
- if (v.kind === "assertion-loss" &&
197
- allAllows.some((a) => a.kind === v.kind && a.helper === v.helper))
198
- result.allowed.push(v);
199
- else
200
- result.violations.push(v);
520
+ // Classified with every other finding below: an assertion-loss marker lives in
521
+ // a utils file and the finding is about the spec, so it is cross-file by
522
+ // construction.
523
+ pending.push(v);
524
+ }
525
+ }
526
+ // Two rules about the module this run WROTE, both ungated by test type: a helper
527
+ // that issues a request follows the API rules whatever the test type drives (see
528
+ // helperFamilyOf), and a module's name is not a question about its helpers at all.
529
+ // Both fail open, and both ADVISE for their first cohort — the prompt states each
530
+ // rule, which is the lever that converges a cohort; this counts what it did.
531
+ result.advisories.push(...(await misnamedNewModules(utilsFiles, spec, params.cwd ?? detectGitRoot(params.testFile))));
532
+ try {
533
+ for (const d of await findDuplicateBodyReach(utilsFiles, spec))
534
+ result.advisories.push({
535
+ kind: "duplicate-body-reach",
536
+ file: d.utilsFile,
537
+ helper: d.helper,
538
+ line: d.line,
539
+ detail: `\`${d.helper}\` sends its request body from a body parameter AND from \`${d.override}\`, passed straight through. The body parameter already reaches every property a caller could override, so \`${d.override}\` changes nothing it cannot — and a second run writing this helper has no rule telling it whether to add one. Take one form: keep the body parameter and delete \`${d.override}\` from the signature and the request call, or keep the override and drop the body parameter. Update the call sites either way`,
540
+ });
541
+ }
542
+ catch {
543
+ /* never fails a verify on its own error */
544
+ }
545
+ // ONE classification pass, over every finding and every marker this verify saw.
546
+ //
547
+ // A marker documents ONE finding of its kind and helper, and it is consumed in
548
+ // order. The budget spans all the located utils files rather than one of them: a
549
+ // decline is written where the agent is working, which is often beside the CALLER
550
+ // and not beside the helper the finding names. A per-file budget left that finding
551
+ // blocking, the agent wrote a second marker in the other file, and the first then
552
+ // reported `stale-allow` — two refusals for one decline.
553
+ //
554
+ // A decline this run removed from a delivered file before delivery counts first.
555
+ // The marker is gone from the customer's copy, not from the run's record of what
556
+ // was declined, so a further submission must not refuse a fault already declined.
557
+ // It is never reported as stale: it is no line in any file, so there is nothing
558
+ // for the agent to delete.
559
+ // Queued, not counted: the ENTRY the caller passed is echoed back when a finding
560
+ // consumes it, so a tag the caller put on it (which file it came from) survives.
561
+ const carried = new Map();
562
+ for (const c of params.carriedAllows ?? []) {
563
+ const k = `${c.kind}\0${c.helper}`;
564
+ carried.set(k, [...(carried.get(k) ?? []), c]);
565
+ }
566
+ // Markers in file order, so "consumed in order" still holds and the SURPLUS marker
567
+ // is the later one — which is the line a reader would otherwise trust.
568
+ // A shared helper whose body no parameter reaches, beside a spec that wrote its own
569
+ // helper for the same route. Integration only, as the body rule is: the prompt
570
+ // states the shape, and this is the same statement in code, where it cannot be read
571
+ // two ways. Blocking, unlike the sibling advisories — those name a change to a
572
+ // PRE-EXISTING test the customer owns, and this names the module the run authored.
573
+ // Fails open on any read error, and bodyReachable answers `true` for everything it
574
+ // cannot establish, so a run is never blocked on a guess.
575
+ if ((params.testType ?? "").toLowerCase() === "integration") {
576
+ try {
577
+ for (const f of await findUnreachableBodies(params.testFile, utilsFiles, spec, siblings))
578
+ pending.push({
579
+ kind: "frozen-body",
580
+ file: f.utilsFile,
581
+ helper: f.helper,
582
+ line: 1,
583
+ detail: `\`${f.helper}\` holds the body it sends to ${f.method} ${f.path}, and no parameter of its signature reaches it — so \`${f.rivalHelper}\` in ${path.basename(f.rivalFile)} could not call it and wrote the request again. Lift the body: a parameter defaulted to what the helper sends today, or the differing values through the override map, then delete \`${f.rivalHelper}\` and call the shared helper`,
584
+ });
585
+ }
586
+ catch {
587
+ /* never fails a verify on its own error */
201
588
  }
202
589
  }
590
+ const markers = new Map();
591
+ for (const a of allAllows) {
592
+ const k = `${a.kind}\0${a.helper}`;
593
+ markers.set(k, [...(markers.get(k) ?? []), a]);
594
+ }
595
+ for (const v of pending) {
596
+ const k = `${v.kind}\0${v.helper}`;
597
+ const held = carried.get(k);
598
+ if (held && held.length > 0) {
599
+ result.carriedConsumed.push(held.shift());
600
+ result.allowed.push(v);
601
+ continue;
602
+ }
603
+ const queue = markers.get(k);
604
+ if (queue && queue.length > 0) {
605
+ queue.shift();
606
+ result.allowed.push(v);
607
+ }
608
+ else if (v.kind === "scenario-name" || v.kind === "status-default") {
609
+ // `status-default` advises for now. The defaulted status was measured on 11 of
610
+ // 16 rows of one release and 12 of 16 on the one before, then ten more helpers
611
+ // across five repositories in the next cohort; blocking from day one would fail
612
+ // most of a cohort at once while the prompt side catches up. One cohort as an
613
+ // advisory measures whether the prompt rule landed; blocking is then this
614
+ // clause dropping the kind.
615
+ result.advisories.push(v);
616
+ }
617
+ else {
618
+ result.violations.push(v);
619
+ }
620
+ }
621
+ // Whatever no finding consumed is a marker that documents nothing: either it never
622
+ // applied, or the agent went on to fix the fault and left the line behind, so the
623
+ // file states a reason its own code contradicts. Nothing re-reads a marker once
624
+ // written, which is how such a line reached a customer's repository.
625
+ for (const queue of markers.values())
626
+ for (const a of queue)
627
+ result.violations.push({
628
+ kind: "stale-allow",
629
+ file: a.file,
630
+ helper: a.helper,
631
+ line: a.line,
632
+ detail: `this pass found no further \`${a.kind}\` for \`${a.helper}\`, so the decline describes nothing in the delivered files — delete the marker line`,
633
+ });
203
634
  result.ok =
204
635
  result.violations.length === 0 && result.malformedAllows.length === 0;
205
636
  // Integration only — the same gate as the prompt rule. `contract`, `load` and an
@@ -222,6 +653,15 @@ export async function verifyUtils(params) {
222
653
  }
223
654
  return result;
224
655
  }
656
+ /** What to do about a restated status, by the shape of the helper that asserted it.
657
+ * Stated here rather than inline so the gate note and this text stay one rule. */
658
+ function remediation(helper, literal, incumbent) {
659
+ if (literal === undefined)
660
+ return "Delete the assertion; keep the status as the call's argument";
661
+ if (incumbent)
662
+ return `\`${helper}\` is defined at HEAD and keeps its signature, so the literal \`${literal}\` stays where it is — a status no caller can vary hides nothing. Just delete the assertion from the spec`;
663
+ return `\`${helper}\` pins the status inside the helper: lift the literal \`${literal}\` into a required expected-status parameter, pass it at every call site of \`${helper}\`, then delete the assertion`;
664
+ }
225
665
  /** The compared counts as one phrase, shared by the assertion-loss detail and the
226
666
  * PASSED line's note so the two cannot drift. */
227
667
  export function describeAssertionCount(c) {
@@ -363,7 +803,9 @@ export function importFormViolations(testFile, specContent, utilsFiles) {
363
803
  function blankTripleQuoted(src) {
364
804
  return src.replace(/("""|''')[\s\S]*?\1/g, (m) => m.replace(/[^\n]/g, " "));
365
805
  }
366
- function violationsIn(helpers, file, fallback, spec, seen, advisories) {
806
+ function violationsIn(helpers, file, fallback, spec, seen, advisories,
807
+ /** Helpers defined at HEAD — not this run's, and outside the status rule's scope. */
808
+ incumbents = new Set()) {
367
809
  const { byRoute, byName, byAction } = seen;
368
810
  // Names seen in THIS file: a second definition here is a redefinition, not drift.
369
811
  const inThisFile = new Map();
@@ -468,6 +910,36 @@ function violationsIn(helpers, file, fallback, spec, seen, advisories) {
468
910
  });
469
911
  }
470
912
  }
913
+ // A wait for a duration rather than for a condition — one finding per helper, so
914
+ // a helper's timing reads as one note rather than one per call. The family decides
915
+ // only the REPLACEMENT named in the text: the fault is the same in both, and
916
+ // fixture 2's fifty-second polling helper was the API form of it. Advisory for its
917
+ // first cohort — see UTILS_ADVISORY_KINDS.
918
+ if (h.fixedSleeps.length > 0) {
919
+ advisories.push({
920
+ kind: "fixed-sleep",
921
+ file,
922
+ helper: h.name,
923
+ line: h.fixedSleeps[0].line,
924
+ detail: `${describeFixedSleeps(h.fixedSleeps)}. A shared helper's wait is inherited by every test that calls it and is invisible at the call site. ${fixedSleepReplacement(family.family, spec.language)}`,
925
+ });
926
+ }
927
+ // The parameter the status assertion reads carries a default: a call site may
928
+ // omit the status it expects, and the spec then states it nowhere. Helpers this
929
+ // run writes only — an incumbent keeps its signature, default included.
930
+ const defaulted = incumbents.has(h.name)
931
+ ? undefined
932
+ : defaultedStatusParam(h, spec);
933
+ if (defaulted) {
934
+ out.push({
935
+ kind: "status-default",
936
+ file,
937
+ helper: h.name,
938
+ line: h.line,
939
+ // The rule itself is stated once, in the advisory's footer.
940
+ detail: `\`${defaulted.param}\` lets a caller omit the status it expects — remove the default and pass the status at every call site of \`${h.name}\``,
941
+ });
942
+ }
471
943
  const naming = scenarioNameViolation(h.name);
472
944
  if (naming) {
473
945
  out.push({