@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
@@ -15,7 +15,8 @@ import { isInsideExecutorWorkDir, executorWorkDirRefusal, generationTargets, } f
15
15
  import { getTestsRepoDir } from "../utils/AnalysisStateManager.js";
16
16
  import { recordReuseHandOff } from "../tools/code-refactor/reuse-state.js";
17
17
  import { recordAssertionBaseline } from "../tools/code-refactor/assertion-state.js";
18
- import { isModularizeFirstTarget } from "../utils/reuseRouting.js";
18
+ import { persistGeneratedTest } from "../utils/generatedTestRecord.js";
19
+ import { buildModularizeFirstNextSteps, isModularizeFirstHandOffTarget, reuseCodeArgsClause, } from "../prompts/reuse-hand-off.js";
19
20
  /**
20
21
  * Derive the framework actually used for generation from the (normalized)
21
22
  * language + framework params. A blank/whitespace-only framework is treated as
@@ -107,12 +108,24 @@ export class TestGenerationService {
107
108
  // The files this call wrote, as codegen reports them — the reuse hand-off is
108
109
  // recorded per FILE (SKYR-4220).
109
110
  const written = generatedFilesFrom(result);
111
+ // Record the paths this call wrote, unconditionally. The generator is the
112
+ // only place they are known, and the report otherwise has to fall back to
113
+ // the agent's `fileName` — a basename, so two specs of one name in
114
+ // different directories answer for each other. Not folded into the
115
+ // assertion baseline below: that one is skipped for whole test types.
116
+ // A mock is not a test and is never executed, so it is not recorded.
117
+ const generatedType = this.getTestType();
118
+ if (generatedType !== MOCK_TYPE) {
119
+ for (const file of written) {
120
+ await persistGeneratedTest(file, generatedType);
121
+ }
122
+ }
110
123
  // Seed the assertion-enhancement baseline SERVER-SIDE at generation time
111
124
  // (same pattern as recordReuseHandOff below): the execute-time
112
125
  // verification gate arms even if the agent never calls
113
126
  // skyramp_enhance_assertions at all — the last prompt-mediated entry
114
127
  // point. Best-effort; no run state means the gate stays open as before.
115
- const testType = this.getTestType();
128
+ const testType = generatedType;
116
129
  if (params.enhanceAssertions &&
117
130
  testType !== MOCK_TYPE &&
118
131
  ASSERTION_ENHANCEABLE_TEST_TYPES.includes(testType) &&
@@ -128,25 +141,32 @@ export class TestGenerationService {
128
141
  });
129
142
  // Orchestrate code optimization workflow based on flags
130
143
  let postGenerationMessage = "";
131
- if (params.codeReuse) {
144
+ // skyramp_mock_generation's schema carries no `codeReuse` field, so the mock
145
+ // pseudo-type cannot reach this branch. Narrowed here rather than widened in
146
+ // the shared hand-off module, which deals in TestType only.
147
+ const reuseTestType = testType === MOCK_TYPE ? undefined : testType;
148
+ if (params.codeReuse && reuseTestType) {
132
149
  // Name the framework generation actually used, not the raw parameter:
133
150
  // TS/JS derive to playwright when the caller omitted it, and
134
151
  // skyramp_reuse_code requires framework to route correctly.
135
152
  const effectiveFramework = deriveEffectiveFramework(params.language || "", params.framework);
136
- const reuseArgs = `\`testFile\` set to the absolute path of the generated test file, \`language: "${params.language}"\`, \`testType: "${testType}"\`${effectiveFramework ? `, and \`framework: "${effectiveFramework}"\`` : ""}`;
153
+ const reuseArgs = reuseCodeArgsClause(params.language, reuseTestType, effectiveFramework);
137
154
  // Modularize-first: fresh codegen carries no helper functions (each
138
155
  // endpoint called once, each browser step inline), so modularization is
139
156
  // what creates the named helpers that reuse then consolidates into the
140
157
  // shared utils file. Emitted here, not in the testbot prompt, so the
141
158
  // instruction exists only on runs that actually generated this test type
142
159
  // and needs no hand-maintained step numbering.
143
- if (this.emitsModularizeFirstHandOff(params)) {
160
+ // The predicate rather than emitsModularizeFirstHandOff: both mean the
161
+ // same inside this codeReuse branch, and this one narrows the language to
162
+ // one the utils verifier covers, which is what the steps require.
163
+ if (isModularizeFirstHandOffTarget(reuseTestType, params.language)) {
144
164
  // SKYR-4220: record the hand-off at the site that emits it, under the same
145
165
  // condition, so skyramp_execute_test can refuse a test that skipped the pair
146
166
  // and the report can mark it — without ever owing it for a test that was not
147
167
  // told to run it. Keyed by the files this call wrote: a test generated into
148
168
  // the same directory without codeReuse owes nothing.
149
- await recordReuseHandOff(written, testType, params.language || "", effectiveFramework);
169
+ await recordReuseHandOff(written, testType, params.language, effectiveFramework);
150
170
  // Browser tests: the assertion enhancer anchors new assertions to
151
171
  // selectors present in the test file, and after modularize → reuse
152
172
  // those selectors live in the utils file. So for UI the enhancer runs
@@ -154,23 +174,15 @@ export class TestGenerationService {
154
174
  // assertion in the test body. API enhancers key off response paths,
155
175
  // so integration keeps its validated modularize → reuse → enhance order.
156
176
  const enhanceFirst = testType === TestType.UI && !!params.enhanceAssertions;
157
- const steps = [
158
- ...(enhanceFirst
159
- ? [
160
- `Call \`skyramp_enhance_assertions\` with \`testFile\` set to the absolute path of the generated test file, \`testType: "${testType}"\`, and \`enhanceType: "generation"\`, and apply every instruction returned to that file — BEFORE modularization, while the file's selectors are still inline.`,
161
- ]
162
- : []),
163
- `Call \`skyramp_modularization\` with \`testFile\`, \`testType: "${testType}"\`, and \`isTraceBased: true\`, and apply the returned instructions — this extracts the test's steps into named helper functions, which is what makes cross-test reuse possible.`,
164
- `Immediately after writing the modularized file — as your very NEXT skyramp tool call — call \`skyramp_reuse_code\` with ${reuseArgs}. The modularization call does NOT count as this step: reuse is a separate tool and MUST be invoked even when you expect it to find nothing. Follow the returned steps to completion. Sibling tests offering nothing to reuse is a normal outcome — the returned steps still move THIS test's own helpers into the shared utils file and import them back, so the test file IS expected to change; finish those steps, then continue (do NOT retry).`,
165
- ];
166
- const ordering = enhanceFirst
167
- ? "three sub-steps, STRICTLY SEQUENTIAL (never in the same tool-call batch)"
168
- : "two sub-steps, STRICTLY SEQUENTIAL (never in the same tool-call batch), BOTH BEFORE `skyramp_enhance_assertions`";
169
177
  postGenerationMessage += `
170
178
  Test generated successfully!
171
179
 
172
- ⏭️**CRITICAL NEXT STEPS — ${ordering}**:
173
- ${steps.map((text, i) => `${String.fromCharCode(97 + i)}. ${text}`).join("\n")}
180
+ ${buildModularizeFirstNextSteps({
181
+ testType: reuseTestType,
182
+ language: params.language,
183
+ framework: effectiveFramework,
184
+ enhanceFirst,
185
+ })}
174
186
  `;
175
187
  }
176
188
  else {
@@ -271,10 +283,15 @@ The generated test file remains unchanged and ready to use as-is.
271
283
  const suggested = /\.[tj]s$/.test(parsed.ext)
272
284
  ? params.output.replace(/\.[tj]s$/, ".spec.ts")
273
285
  : params.output + ".spec.ts";
286
+ // Both spellings are named: the repository decides which files are tests,
287
+ // and one that declares `testMatch: ["**/*.test.ts"]` collects no
288
+ // *.spec.ts (SKYR-4489).
289
+ const alternative = suggested.replace(/\.spec\.ts$/, ".test.ts");
274
290
  errList.content.push({
275
291
  type: "text",
276
- text: `Error: Playwright requires test files to match *.{spec}.{ts,js} (got "${params.output}"). ` +
277
- `Rename to e.g. ${suggested} so Playwright can discover it.`,
292
+ text: `Error: Playwright requires test files to match *.{spec,test}.{ts,js} (got "${params.output}"). ` +
293
+ `Rename to ${suggested}, or to ${alternative} if the tests already in ` +
294
+ `${params.outputDir} use that spelling.`,
278
295
  });
279
296
  }
280
297
  }
@@ -303,13 +320,15 @@ The generated test file remains unchanged and ready to use as-is.
303
320
  }
304
321
  /**
305
322
  * Whether this generation's codeReuse hand-off sequences skyramp_modularization
306
- * before skyramp_reuse_code (routing: isModularizeFirstTarget). Subclasses that
323
+ * before skyramp_reuse_code (isModularizeFirstHandOffTarget). Subclasses that
307
324
  * add their own post-generation steps consult this so modularization is
308
325
  * instructed exactly once.
309
326
  */
310
327
  emitsModularizeFirstHandOff(params) {
328
+ const testType = this.getTestType();
311
329
  return (!!params.codeReuse &&
312
- isModularizeFirstTarget(this.getTestType(), params.language));
330
+ testType !== MOCK_TYPE &&
331
+ isModularizeFirstHandOffTarget(testType, params.language));
313
332
  }
314
333
  async handleApiAnalysis(params) {
315
334
  if (params.apiSchema && params.endpointURL && params.method === "") {
@@ -0,0 +1,45 @@
1
+ import type { EnhanceType } from "../types/EnhanceType.js";
2
+ /**
3
+ * The `enhance-assertions` skill ships in `plugin/skills/` at the
4
+ * package root (SKYR-4310). Its markdown is the single source of the assertion
5
+ * instructions: Claude Code loads the skill through `--plugin-dir`, and every
6
+ * other agent gets the same rules assembled from the same files by
7
+ * `skyramp_enhance_assertions`, whose behaviour is otherwise unchanged.
8
+ */
9
+ export declare const ENHANCE_ASSERTIONS_SKILL = "enhance-assertions";
10
+ /** The shared response-body rules, without the surrounding framing. */
11
+ export declare function sharedAssertionRules(): string;
12
+ /** Full instruction text, assembled from the same markdown the skill reads.
13
+ * Used by agents that cannot load the plugin. */
14
+ export declare function buildEnhanceAssertionsInstructions(testFile: string, testType: string, enhanceType: EnhanceType): string;
15
+ /**
16
+ * The maintenance equivalent, for the UPDATE strategy. It covers a set of
17
+ * already-edited files rather than one freshly generated file, so it names no
18
+ * single test type and states the per-file duty over that set.
19
+ *
20
+ * This route was the last one still naming the tool literally. Because MCP tool
21
+ * output beats the prompt on conflict, that one call handed the agent the whole
22
+ * rule text, and an agent already holding the rules has no reason to invoke the
23
+ * skill — which is why two A/B runs recorded zero invocations while the
24
+ * per-file gates worked (SKYR-4310).
25
+ */
26
+ export declare function enhanceAssertionsMaintenanceCall(): string;
27
+ /** `enhanceAssertionsCall` as a standalone sentence, for a generation result's
28
+ * numbered step list. */
29
+ export declare function enhanceAssertionsStep(testType: string, fileDescription: string): string;
30
+ /**
31
+ * How a prompt or a generation result should tell the agent to enhance
32
+ * assertions. With the skills plugin loaded the skill owns the whole workflow
33
+ * — baseline, rules, verification — so naming the tool here would hand the
34
+ * agent the same rules a second time (SKYR-4310).
35
+ *
36
+ * The per-file duty is stated HERE, in the routing text, not left to the skill
37
+ * body. A tool call is cheap and repeatable, so the agent makes one per file
38
+ * without thinking; a skill invocation loads instructions into the
39
+ * conversation, and invoking it again reads as redundant. In the first A/B the
40
+ * agent therefore invoked the skill once and enhanced 3 of 5 files, against 5
41
+ * of 5 with the plugin off. So the routing says the count, and puts the
42
+ * repeated action on the two tools, which are called once per file however
43
+ * many times the skill itself is invoked.
44
+ */
45
+ export declare function enhanceAssertionsCall(testType: string, fileDescription: string): string;
@@ -0,0 +1,103 @@
1
+ import { getPersonaPrefix } from "../prompts/personas.js";
2
+ import { TestType } from "../types/TestTypes.js";
3
+ import { isSkillsLoaded, isTestbotEnabled } from "../utils/featureFlags.js";
4
+ import { readSkillFile, section, sectionBody, sliceBetween, sliceFrom, sliceUntil, fillPlaceholders, } from "./skillFiles.js";
5
+ /**
6
+ * The `enhance-assertions` skill ships in `plugin/skills/` at the
7
+ * package root (SKYR-4310). Its markdown is the single source of the assertion
8
+ * instructions: Claude Code loads the skill through `--plugin-dir`, and every
9
+ * other agent gets the same rules assembled from the same files by
10
+ * `skyramp_enhance_assertions`, whose behaviour is otherwise unchanged.
11
+ */
12
+ export const ENHANCE_ASSERTIONS_SKILL = "enhance-assertions";
13
+ const TESTBOT_UI_SECTION = "## Additional checks in Testbot runs";
14
+ function reference(name) {
15
+ return readSkillFile(ENHANCE_ASSERTIONS_SKILL, `reference/${name}.md`);
16
+ }
17
+ /** The shared response-body rules, without the surrounding framing. */
18
+ export function sharedAssertionRules() {
19
+ return sectionBody(reference("shared-rules"), "## Assertion Rules with Examples");
20
+ }
21
+ /** Full instruction text, assembled from the same markdown the skill reads.
22
+ * Used by agents that cannot load the plugin. */
23
+ export function buildEnhanceAssertionsInstructions(testFile, testType, enhanceType) {
24
+ const shared = reference("shared-rules");
25
+ // Only the maintenance mode narrows scope; generation keeps the whole file.
26
+ const scope = enhanceType === "maintenance"
27
+ ? ` ${sectionBody(shared, "### When maintaining an existing test")}`
28
+ : "";
29
+ if (testType === TestType.UI) {
30
+ const uiRef = reference("ui");
31
+ const ui = sliceFrom(uiRef, "## First Check");
32
+ const rules = isTestbotEnabled() ? ui : sliceUntil(ui, TESTBOT_UI_SECTION);
33
+ // The principle governs every rule below it, so it leads the hand-out too.
34
+ // Both slicers used to start below it and dropped it silently.
35
+ const body = `${section(uiRef, "## What to assert")}\n\n${rules}`;
36
+ // Positional order matches the skill: the two fixed values first, then
37
+ // the path, so a path containing a space cannot shift them.
38
+ return fillPlaceholders(`${getPersonaPrefix()}Your task is to enhance assertions for the given UI test file: \`${testFile}\`.${scope}\n\n${body}\n`, [testType, enhanceType, testFile]);
39
+ }
40
+ if (testType !== TestType.CONTRACT && testType !== TestType.INTEGRATION) {
41
+ throw new Error(`Unsupported testType for skyramp_enhance_assertions: ${testType}`);
42
+ }
43
+ const body = [
44
+ section(shared, "## What to assert"),
45
+ sliceBetween(shared, "## Pre-Edit Assertion Analysis", "## What not to do"),
46
+ sliceFrom(reference(testType), "## Additional assertion rules"),
47
+ sliceFrom(shared, "## What not to do"),
48
+ ].join("\n\n");
49
+ return fillPlaceholders(`${getPersonaPrefix()}Your task is to enhance response body assertions in the given test file: \`${testFile}\`.${scope}\n\n${body}`, [testType, enhanceType, testFile]);
50
+ }
51
+ /**
52
+ * The maintenance equivalent, for the UPDATE strategy. It covers a set of
53
+ * already-edited files rather than one freshly generated file, so it names no
54
+ * single test type and states the per-file duty over that set.
55
+ *
56
+ * This route was the last one still naming the tool literally. Because MCP tool
57
+ * output beats the prompt on conflict, that one call handed the agent the whole
58
+ * rule text, and an agent already holding the rules has no reason to invoke the
59
+ * skill — which is why two A/B runs recorded zero invocations while the
60
+ * per-file gates worked (SKYR-4310).
61
+ */
62
+ export function enhanceAssertionsMaintenanceCall() {
63
+ if (isSkillsLoaded()) {
64
+ return (`invoke the \`${ENHANCE_ASSERTIONS_SKILL}\` skill for each updated file, with arguments ` +
65
+ `\`<testType> maintenance <absolute path of the file>\`. Do this for EVERY file you just ` +
66
+ `edited, one at a time: five updated files means five ` +
67
+ `\`skyramp_enhance_assertions_snapshot\` calls and five passing ` +
68
+ `\`skyramp_verify_enhance_assertions\` calls. The snapshot for a file comes after your ` +
69
+ `maintenance edit and before you add assertions to it — it is the baseline the ` +
70
+ `verification measures against. Read the skill's rules once, then repeat its per-file ` +
71
+ `steps for the rest`);
72
+ }
73
+ return (`call \`skyramp_enhance_assertions\` once per updated file, with that file's path, its ` +
74
+ `\`testType\`, and \`enhanceType: "maintenance"\`, and apply every instruction returned to ` +
75
+ `that file`);
76
+ }
77
+ /** `enhanceAssertionsCall` as a standalone sentence, for a generation result's
78
+ * numbered step list. */
79
+ export function enhanceAssertionsStep(testType, fileDescription) {
80
+ const call = enhanceAssertionsCall(testType, fileDescription);
81
+ return `${call.charAt(0).toUpperCase()}${call.slice(1)}.`;
82
+ }
83
+ /**
84
+ * How a prompt or a generation result should tell the agent to enhance
85
+ * assertions. With the skills plugin loaded the skill owns the whole workflow
86
+ * — baseline, rules, verification — so naming the tool here would hand the
87
+ * agent the same rules a second time (SKYR-4310).
88
+ *
89
+ * The per-file duty is stated HERE, in the routing text, not left to the skill
90
+ * body. A tool call is cheap and repeatable, so the agent makes one per file
91
+ * without thinking; a skill invocation loads instructions into the
92
+ * conversation, and invoking it again reads as redundant. In the first A/B the
93
+ * agent therefore invoked the skill once and enhanced 3 of 5 files, against 5
94
+ * of 5 with the plugin off. So the routing says the count, and puts the
95
+ * repeated action on the two tools, which are called once per file however
96
+ * many times the skill itself is invoked.
97
+ */
98
+ export function enhanceAssertionsCall(testType, fileDescription) {
99
+ if (isSkillsLoaded()) {
100
+ return `invoke the \`${ENHANCE_ASSERTIONS_SKILL}\` skill with arguments \`${testType} generation <absolute path of the ${fileDescription}>\` (a project skill with the same name takes precedence over the plugin copy) and follow every step it lists, including its final verification. Do this for EVERY ${fileDescription}, one file at a time. Read the skill's rules once, then repeat its per-file steps for each remaining file — \`skyramp_enhance_assertions_snapshot\` and \`skyramp_verify_enhance_assertions\` are called once per file, so N such files means N snapshot calls and N passing verify calls. Do not re-invoke the skill for a file whose rules you already hold, and do not stop after the first file`;
101
+ }
102
+ return `call \`skyramp_enhance_assertions\` with \`testFile\` set to the absolute path of the ${fileDescription}, \`testType: "${testType}"\`, and \`enhanceType: "generation"\`, and apply every instruction returned to that file. Do this for EVERY ${fileDescription} — N such files means N calls`;
103
+ }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * The `fix-test-import-errors` skill ships in `plugin/skills/` at the package
3
3
  * root (SKYR-4296). It carries the same instructions `skyramp_fix_errors`
4
- * returns, so an agent that loads the plugin follows the skill and an agent
5
- * that does not keeps calling the tool. The tool itself is unchanged.
4
+ * returns from the same Markdown, so an agent that loads the plugin follows
5
+ * the skill and an agent that does not keeps calling the tool.
6
6
  */
7
7
  export declare const FIX_TEST_IMPORT_ERRORS_SKILL = "fix-test-import-errors";
8
8
  /**
@@ -2,8 +2,8 @@ import { isSkillsLoaded } from "../utils/featureFlags.js";
2
2
  /**
3
3
  * The `fix-test-import-errors` skill ships in `plugin/skills/` at the package
4
4
  * root (SKYR-4296). It carries the same instructions `skyramp_fix_errors`
5
- * returns, so an agent that loads the plugin follows the skill and an agent
6
- * that does not keeps calling the tool. The tool itself is unchanged.
5
+ * returns from the same Markdown, so an agent that loads the plugin follows
6
+ * the skill and an agent that does not keeps calling the tool.
7
7
  */
8
8
  export const FIX_TEST_IMPORT_ERRORS_SKILL = "fix-test-import-errors";
9
9
  const FIX_ERRORS_TOOL = "skyramp_fix_errors";
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Reader for the Agent Skills shipped in `plugin/skills/` at the package root
3
+ * (SKYR-4296, SKYR-4310). The markdown files are the single source of the
4
+ * instruction text: Claude Code loads them through `--plugin-dir`, and every
5
+ * other agent receives the same text back from the MCP tool that would
6
+ * otherwise hand out a prompt.
7
+ */
8
+ /** Absolute path of the shipped `plugin/` directory. */
9
+ export declare function pluginRoot(): string;
10
+ /** Removes a leading YAML frontmatter block, if present. */
11
+ export declare function stripFrontmatter(raw: string): string;
12
+ /** Raw contents of a file inside one skill directory, e.g. `SKILL.md` or
13
+ * `reference/ui.md`. */
14
+ export declare function readSkillFile(skillName: string, relPath: string): string;
15
+ /** SKILL.md body with the YAML frontmatter removed. */
16
+ export declare function readSkillBody(skillName: string): string;
17
+ /** Fill positional `$0`, `$1`, ... placeholders in `text` with `values[n]`,
18
+ * in one pass. `\$` unescapes to a literal `$`, so `\$19.98` in an example
19
+ * reads as itself rather than value 1 followed by "9.98". A placeholder's
20
+ * surrounding backticks, if any, are untouched by the match — the regex
21
+ * matches only the token, not its context — so a standalone code span
22
+ * (`` `$0` ``) and a placeholder nested inside a larger one both come out
23
+ * correctly with no extra handling. */
24
+ export declare function fillPlaceholders(text: string, values: string[]): string;
25
+ /** Everything from `heading` (matched as a line prefix) to the end. */
26
+ export declare function sliceFrom(markdown: string, heading: string): string;
27
+ /** Everything before `heading`; the whole text when the heading is absent. */
28
+ export declare function sliceUntil(markdown: string, heading: string): string;
29
+ /** Everything from `heading` up to `until`, exclusive. */
30
+ export declare function sliceBetween(markdown: string, heading: string, until: string): string;
31
+ /** One section including its heading: `heading` plus the lines under it, up to
32
+ * the next heading of the same or a higher level. */
33
+ export declare function section(markdown: string, heading: string): string;
34
+ /** Body of one section: the lines under `heading`, up to the next heading of
35
+ * the same or a higher level. Lines inside a fenced code block are code, not
36
+ * headings — a Python comment in an example starts with `#` and would
37
+ * otherwise end the section at the first example that carries one. */
38
+ export declare function sectionBody(markdown: string, heading: string): string;
@@ -0,0 +1,94 @@
1
+ import { readFileSync } from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ /**
5
+ * Reader for the Agent Skills shipped in `plugin/skills/` at the package root
6
+ * (SKYR-4296, SKYR-4310). The markdown files are the single source of the
7
+ * instruction text: Claude Code loads them through `--plugin-dir`, and every
8
+ * other agent receives the same text back from the MCP tool that would
9
+ * otherwise hand out a prompt.
10
+ */
11
+ /** Absolute path of the shipped `plugin/` directory. */
12
+ export function pluginRoot() {
13
+ // build/skills/<file>.js or src/skills/<file>.ts → package root → plugin/
14
+ const here = path.dirname(fileURLToPath(import.meta.url));
15
+ return path.resolve(here, "..", "..", "plugin");
16
+ }
17
+ /** Removes a leading YAML frontmatter block, if present. */
18
+ export function stripFrontmatter(raw) {
19
+ const match = raw.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/);
20
+ return match ? raw.slice(match[0].length) : raw;
21
+ }
22
+ /** Raw contents of a file inside one skill directory, e.g. `SKILL.md` or
23
+ * `reference/ui.md`. */
24
+ export function readSkillFile(skillName, relPath) {
25
+ return readFileSync(path.join(pluginRoot(), "skills", skillName, relPath), "utf8");
26
+ }
27
+ /** SKILL.md body with the YAML frontmatter removed. */
28
+ export function readSkillBody(skillName) {
29
+ return stripFrontmatter(readSkillFile(skillName, "SKILL.md")).trim();
30
+ }
31
+ /** Fill positional `$0`, `$1`, ... placeholders in `text` with `values[n]`,
32
+ * in one pass. `\$` unescapes to a literal `$`, so `\$19.98` in an example
33
+ * reads as itself rather than value 1 followed by "9.98". A placeholder's
34
+ * surrounding backticks, if any, are untouched by the match — the regex
35
+ * matches only the token, not its context — so a standalone code span
36
+ * (`` `$0` ``) and a placeholder nested inside a larger one both come out
37
+ * correctly with no extra handling. */
38
+ export function fillPlaceholders(text, values) {
39
+ return text.replace(/\\?\$(\d+)/g, (match, index) => {
40
+ if (match.startsWith("\\"))
41
+ return match.slice(1);
42
+ return values[Number(index)] ?? match;
43
+ });
44
+ }
45
+ function headingIndex(markdown, heading) {
46
+ // Anchored to line start so a heading quoted mid-paragraph cannot match.
47
+ if (markdown.startsWith(heading))
48
+ return 0;
49
+ const at = markdown.indexOf(`\n${heading}`);
50
+ return at === -1 ? -1 : at + 1;
51
+ }
52
+ /** Everything from `heading` (matched as a line prefix) to the end. */
53
+ export function sliceFrom(markdown, heading) {
54
+ const at = headingIndex(markdown, heading);
55
+ if (at === -1)
56
+ throw new Error(`markdown section not found: ${heading}`);
57
+ return markdown.slice(at).trim();
58
+ }
59
+ /** Everything before `heading`; the whole text when the heading is absent. */
60
+ export function sliceUntil(markdown, heading) {
61
+ const at = headingIndex(markdown, heading);
62
+ return (at === -1 ? markdown : markdown.slice(0, at)).trim();
63
+ }
64
+ /** Everything from `heading` up to `until`, exclusive. */
65
+ export function sliceBetween(markdown, heading, until) {
66
+ return sliceUntil(sliceFrom(markdown, heading), until);
67
+ }
68
+ /** One section including its heading: `heading` plus the lines under it, up to
69
+ * the next heading of the same or a higher level. */
70
+ export function section(markdown, heading) {
71
+ const body = sectionBody(markdown, heading);
72
+ return body ? `${heading}\n\n${body}` : heading;
73
+ }
74
+ /** Body of one section: the lines under `heading`, up to the next heading of
75
+ * the same or a higher level. Lines inside a fenced code block are code, not
76
+ * headings — a Python comment in an example starts with `#` and would
77
+ * otherwise end the section at the first example that carries one. */
78
+ export function sectionBody(markdown, heading) {
79
+ const level = heading.match(/^#+/)?.[0].length ?? 0;
80
+ const from = sliceFrom(markdown, heading);
81
+ const lines = from.split("\n").slice(1);
82
+ let fenced = false;
83
+ const end = lines.findIndex((line) => {
84
+ if (/^\s*(```|~~~)/.test(line)) {
85
+ fenced = !fenced;
86
+ return false;
87
+ }
88
+ if (fenced)
89
+ return false;
90
+ const h = line.match(/^(#+)\s/);
91
+ return h !== null && h[1].length <= level;
92
+ });
93
+ return (end === -1 ? lines : lines.slice(0, end)).join("\n").trim();
94
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The `validate-assertion-alignment-post-execution` skill ships in
3
+ * `plugin/skills/` (same arrangement as fix-test-import-errors). It is the
4
+ * post-execution check, for an executed test of any type
5
+ * `ASSERTION_ENHANCEABLE_TEST_TYPES` names (`src/types/TestTypes.ts`), that
6
+ * its assertions evaluate the one behaviour its plan entry asked for, using
7
+ * the file's recorded execution result as evidence.
8
+ */
9
+ export declare const VALIDATE_ASSERTION_ALIGNMENT_SKILL = "validate-assertion-alignment-post-execution";
10
+ /**
11
+ * The skill's full instructions for one file, with `$0`/`$1` replaced by the
12
+ * real test type and path — the same content the skill itself reads when
13
+ * Claude Code loads it, assembled here for an agent that cannot. Mirrors
14
+ * `buildEnhanceAssertionsInstructions`: built from the shipped markdown via
15
+ * the shared skillFiles helpers, not a hand-typed paraphrase, and called
16
+ * from a tool handler with real arguments rather than baked into the
17
+ * always-sent workflow prompt — reference/evidence.md and reference/checks.md
18
+ * are each a few hundred words, too much to inline into every run's prompt
19
+ * whether or not this check ever fires, but entirely reasonable as the
20
+ * response of a tool call made only when it does.
21
+ */
22
+ export declare function buildAlignAssertionsInstructions(testFile: string, testType: string): string;
23
+ /**
24
+ * Mid-sentence clause for the workflow's assertion-alignment step (same
25
+ * convention as fixErrorsInstruction). Names the skill when the plugin is
26
+ * loaded — a project skill of the same name overrides the plugin copy — and
27
+ * falls back to a short hand-off otherwise: the full rules are the response
28
+ * of `skyramp_align_assertions` (buildAlignAssertionsInstructions), not
29
+ * repeated here, so this stays a one-line pointer regardless of which branch
30
+ * fires — matching enhanceAssertionsCall's non-skills branch, which points
31
+ * at `skyramp_enhance_assertions` the same way rather than inlining its
32
+ * rules into the prompt.
33
+ */
34
+ export declare function alignAssertionsStep(): string;
@@ -0,0 +1,59 @@
1
+ import { isSkillsLoaded } from "../utils/featureFlags.js";
2
+ import { readSkillFile, readSkillBody, sectionBody, fillPlaceholders, } from "./skillFiles.js";
3
+ /**
4
+ * The `validate-assertion-alignment-post-execution` skill ships in
5
+ * `plugin/skills/` (same arrangement as fix-test-import-errors). It is the
6
+ * post-execution check, for an executed test of any type
7
+ * `ASSERTION_ENHANCEABLE_TEST_TYPES` names (`src/types/TestTypes.ts`), that
8
+ * its assertions evaluate the one behaviour its plan entry asked for, using
9
+ * the file's recorded execution result as evidence.
10
+ */
11
+ export const VALIDATE_ASSERTION_ALIGNMENT_SKILL = "validate-assertion-alignment-post-execution";
12
+ function skillBody() {
13
+ return readSkillBody(VALIDATE_ASSERTION_ALIGNMENT_SKILL);
14
+ }
15
+ function reference(name) {
16
+ return readSkillFile(VALIDATE_ASSERTION_ALIGNMENT_SKILL, `reference/${name}.md`).trim();
17
+ }
18
+ /**
19
+ * The skill's full instructions for one file, with `$0`/`$1` replaced by the
20
+ * real test type and path — the same content the skill itself reads when
21
+ * Claude Code loads it, assembled here for an agent that cannot. Mirrors
22
+ * `buildEnhanceAssertionsInstructions`: built from the shipped markdown via
23
+ * the shared skillFiles helpers, not a hand-typed paraphrase, and called
24
+ * from a tool handler with real arguments rather than baked into the
25
+ * always-sent workflow prompt — reference/evidence.md and reference/checks.md
26
+ * are each a few hundred words, too much to inline into every run's prompt
27
+ * whether or not this check ever fires, but entirely reasonable as the
28
+ * response of a tool call made only when it does.
29
+ */
30
+ export function buildAlignAssertionsInstructions(testFile, testType) {
31
+ const body = skillBody();
32
+ const goal = sectionBody(body, "## Goal");
33
+ const constraints = sectionBody(body, "## Constraints");
34
+ let steps = sectionBody(body, "## Steps");
35
+ steps = steps
36
+ .replace("Otherwise, read `reference/evidence.md`. It names the four inputs — the user's intention, the plan entry (or, for a maintained test, the maintenance verdict), the test `$1`, and the execution result — and where to find each. Do not ask for any of them or invent them.", "Otherwise, the four inputs are below — the user's intention, the plan entry (or, for a maintained test, the maintenance verdict), the test, and the execution result. Do not ask for any of them or invent them.")
37
+ .replace("Read `reference/checks.md`. Following it, map the behaviour to the assertions in both directions", "Following the checks below, map the behaviour to the assertions in both directions")
38
+ .replace("as `reference/checks.md` describes", "as the checks below describe");
39
+ const evidence = reference("evidence").replace("The checks in `reference/checks.md` are about what an assertion proves, not how it is spelled.", "The checks below are about what an assertion proves, not how it is spelled.");
40
+ const checks = reference("checks");
41
+ return fillPlaceholders([goal, steps, evidence, checks, constraints].join("\n\n"), [testType, testFile]);
42
+ }
43
+ /**
44
+ * Mid-sentence clause for the workflow's assertion-alignment step (same
45
+ * convention as fixErrorsInstruction). Names the skill when the plugin is
46
+ * loaded — a project skill of the same name overrides the plugin copy — and
47
+ * falls back to a short hand-off otherwise: the full rules are the response
48
+ * of `skyramp_align_assertions` (buildAlignAssertionsInstructions), not
49
+ * repeated here, so this stays a one-line pointer regardless of which branch
50
+ * fires — matching enhanceAssertionsCall's non-skills branch, which points
51
+ * at `skyramp_enhance_assertions` the same way rather than inlining its
52
+ * rules into the prompt.
53
+ */
54
+ export function alignAssertionsStep() {
55
+ if (isSkillsLoaded()) {
56
+ return `invoke the \`${VALIDATE_ASSERTION_ALIGNMENT_SKILL}\` skill once per file with arguments \`<testType> <absolute test file path>\` — type first, path last (a project skill with the same name takes precedence over the plugin copy)`;
57
+ }
58
+ return "call `skyramp_align_assertions` once per file with its `testType` and absolute `testFile` path, and follow every instruction it returns — including its own verification and completion-line steps";
59
+ }
@@ -42,6 +42,10 @@ export const TOOLS_WITHOUT_PHASE = new Set([
42
42
  "skyramp_modularization",
43
43
  "skyramp_reuse_code",
44
44
  "skyramp_enhance_assertions",
45
+ "skyramp_enhance_assertions_snapshot",
46
+ "skyramp_verify_enhance_assertions",
47
+ "skyramp_align_assertions",
45
48
  "skyramp_preflight_mock_check",
46
49
  "skyramp_query_proxy_mocks",
50
+ "skyramp_verify_test_dependencies",
47
51
  ]);
@@ -52,7 +52,9 @@ Logging into Skyramp provides access to additional platform features and service
52
52
  const recordParams = {
53
53
  prompt: params.prompt,
54
54
  };
55
- AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, recordParams).catch((err) => { logger.warning("Analytics event failed", { error: String(err) }); });
55
+ AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, recordParams).catch((err) => {
56
+ logger.warning("Analytics event failed", { error: String(err) });
57
+ });
56
58
  }
57
59
  });
58
60
  }
@@ -50,7 +50,9 @@ Logout from Skyramp platform to end your authenticated session.`,
50
50
  const recordParams = {
51
51
  prompt: params.prompt,
52
52
  };
53
- AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, recordParams).catch((err) => { logger.warning("Analytics event failed", { error: String(err) }); });
53
+ AnalyticsService.pushMCPToolEvent(TOOL_NAME, errorResult, recordParams).catch((err) => {
54
+ logger.warning("Analytics event failed", { error: String(err) });
55
+ });
54
56
  }
55
57
  });
56
58
  }
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAlignAssertionsTool(server: McpServer): void;
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ import { ASSERTION_ENHANCEABLE_TEST_TYPES } from "../../types/TestTypes.js";
3
+ import { AnalyticsService } from "../../services/AnalyticsService.js";
4
+ import { buildAlignAssertionsInstructions } from "../../skills/validateAssertionAlignmentSkill.js";
5
+ import { requireAbsoluteTestFile } from "./assertionOperations.js";
6
+ import { toolError } from "../../utils/utils.js";
7
+ /**
8
+ * Deterministic-compatibility path for `validate-assertion-alignment-post-execution`,
9
+ * for an agent that cannot load the Claude Code skill (mirrors why
10
+ * `skyramp_enhance_assertions` exists alongside the `enhance-assertions` skill,
11
+ * SKYR-4310). Renders the skill's full procedure — Goal, Steps, both reference
12
+ * files, Constraints — from the same shipped markdown the skill itself reads,
13
+ * with `$0`/`$1` replaced by the real test type and file path. No state is
14
+ * read or written here; the returned text is the same instructions either
15
+ * path ends up following.
16
+ */
17
+ const TOOL_NAME = "skyramp_align_assertions";
18
+ const alignAssertionsSchema = {
19
+ testFile: z
20
+ .string()
21
+ .describe("Absolute path to the test file whose assertion alignment is being checked."),
22
+ testType: z
23
+ .enum(ASSERTION_ENHANCEABLE_TEST_TYPES)
24
+ .describe("The type of the test being checked."),
25
+ };
26
+ export function registerAlignAssertionsTool(server) {
27
+ server.registerTool(TOOL_NAME, {
28
+ description: `Get the post-execution assertion-alignment procedure for one test file.
29
+
30
+ ### When to call
31
+ - Once per file, after its final execution is settled — it passed, or it failed at an assertion (not at a collection, import, fixture, or navigation error, which the execution-repair step owns instead).
32
+ - For each ${ASSERTION_ENHANCEABLE_TEST_TYPES.join(", ")} test, new or maintained.
33
+
34
+ Returns the full procedure for that file: read it, then follow every step, including its own verification and completion-line steps.`,
35
+ inputSchema: alignAssertionsSchema,
36
+ }, async (params) => {
37
+ const { testFile, testType } = params;
38
+ const pathError = requireAbsoluteTestFile(testFile);
39
+ if (pathError)
40
+ return toolError(pathError);
41
+ const instructions = buildAlignAssertionsInstructions(testFile, testType);
42
+ AnalyticsService.pushMCPToolEvent(TOOL_NAME, undefined, {
43
+ testFile,
44
+ testType,
45
+ }).catch(() => { });
46
+ return {
47
+ content: [{ type: "text", text: instructions }],
48
+ isError: false,
49
+ };
50
+ });
51
+ }