lazycodex-ai 5.1.48 → 5.1.54

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 (908) hide show
  1. package/dist/cli/index.js +2255 -1044
  2. package/dist/cli/service-auth/accounts-gate.d.ts +11 -0
  3. package/dist/cli/service-auth/commands.d.ts +2 -4
  4. package/dist/cli/service-auth/credential-lock.d.ts +11 -0
  5. package/dist/cli/service-auth/credential-owner.d.ts +10 -0
  6. package/dist/cli/service-auth/index.d.ts +3 -1
  7. package/dist/cli/service-auth/keystore.d.ts +33 -2
  8. package/dist/cli/service-auth/owned-refresh.d.ts +21 -0
  9. package/dist/cli/service-auth/protocol-v2.d.ts +27 -0
  10. package/dist/cli/service-auth/protocol.d.ts +32 -2
  11. package/dist/cli/service-auth/recovery-clock.d.ts +7 -0
  12. package/dist/cli/service-auth/refresh-attempt.d.ts +34 -0
  13. package/dist/cli/service-auth/session.d.ts +15 -2
  14. package/dist/cli/service-auth/signed-out-marker.d.ts +11 -0
  15. package/dist/cli-node/index.js +2255 -1044
  16. package/package.json +3 -1
  17. package/packages/lsp-core/package.json +45 -0
  18. package/packages/lsp-core/src/index.ts +30 -0
  19. package/packages/lsp-core/src/lsp/bun-command-output.ts +82 -0
  20. package/packages/lsp-core/src/lsp/bun-project-checks.test.ts +170 -0
  21. package/packages/lsp-core/src/lsp/bun-project-checks.ts +223 -0
  22. package/packages/lsp-core/src/lsp/cleanup-errors.test.ts +18 -0
  23. package/packages/lsp-core/src/lsp/cleanup-errors.ts +14 -0
  24. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +52 -0
  25. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +471 -0
  26. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  27. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  28. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +213 -0
  29. package/packages/lsp-core/src/lsp/client-wrapper.ts +290 -0
  30. package/packages/lsp-core/src/lsp/client.ts +398 -0
  31. package/packages/lsp-core/src/lsp/config-loader.ts +270 -0
  32. package/packages/lsp-core/src/lsp/connection.ts +95 -0
  33. package/packages/lsp-core/src/lsp/constants.ts +17 -0
  34. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
  35. package/packages/lsp-core/src/lsp/directory-diagnostics.test.ts +221 -0
  36. package/packages/lsp-core/src/lsp/directory-diagnostics.ts +187 -0
  37. package/packages/lsp-core/src/lsp/effective-extension.ts +10 -0
  38. package/packages/lsp-core/src/lsp/errors.ts +89 -0
  39. package/packages/lsp-core/src/lsp/fake-bun-test-support.ts +102 -0
  40. package/packages/lsp-core/src/lsp/fixtures/diagnostics-freshness-contract-probe.ts +283 -0
  41. package/packages/lsp-core/src/lsp/fixtures/disposed-stdin-epipe-probe.ts +28 -0
  42. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-contract-probe.ts +196 -0
  43. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +234 -0
  44. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  45. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  46. package/packages/lsp-core/src/lsp/formatters.ts +144 -0
  47. package/packages/lsp-core/src/lsp/host-js-runtime.test.ts +150 -0
  48. package/packages/lsp-core/src/lsp/host-js-runtime.ts +57 -0
  49. package/packages/lsp-core/src/lsp/infer-extension.ts +66 -0
  50. package/packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts +97 -0
  51. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +369 -0
  52. package/packages/lsp-core/src/lsp/language-mappings.ts +173 -0
  53. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  54. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  55. package/packages/lsp-core/src/lsp/manager.ts +495 -0
  56. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  57. package/packages/lsp-core/src/lsp/process-pipe-errors.test.ts +21 -0
  58. package/packages/lsp-core/src/lsp/process-signal-cleanup.ts +21 -0
  59. package/packages/lsp-core/src/lsp/process.ts +221 -0
  60. package/packages/lsp-core/src/lsp/server-definitions.ts +215 -0
  61. package/packages/lsp-core/src/lsp/server-install-state.ts +67 -0
  62. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  63. package/packages/lsp-core/src/lsp/server-installation.ts +218 -0
  64. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  65. package/packages/lsp-core/src/lsp/server-resolution.ts +125 -0
  66. package/packages/lsp-core/src/lsp/startup-failure.ts +1 -0
  67. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  68. package/packages/lsp-core/src/lsp/transport-protocol.ts +52 -0
  69. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  70. package/packages/lsp-core/src/lsp/transport.ts +339 -0
  71. package/packages/lsp-core/src/lsp/types.ts +134 -0
  72. package/packages/lsp-core/src/lsp/typescript-server-defaults.test.ts +84 -0
  73. package/packages/lsp-core/src/lsp/utils.test.ts +72 -0
  74. package/packages/lsp-core/src/lsp/utils.ts +40 -0
  75. package/packages/lsp-core/src/lsp/workspace-apply-edit-failure.ts +19 -0
  76. package/packages/lsp-core/src/lsp/workspace-apply-edit-lease.integration.test.ts +218 -0
  77. package/packages/lsp-core/src/lsp/workspace-apply-edit-sync.integration.test.ts +113 -0
  78. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +194 -0
  79. package/packages/lsp-core/src/lsp/workspace-apply-edit.integration.test.ts +163 -0
  80. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +150 -0
  81. package/packages/lsp-core/src/lsp/workspace-document-state.ts +392 -0
  82. package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +132 -0
  83. package/packages/lsp-core/src/lsp/workspace-edit-commit.test.ts +140 -0
  84. package/packages/lsp-core/src/lsp/workspace-edit-commit.ts +220 -0
  85. package/packages/lsp-core/src/lsp/workspace-edit-contract-evidence.test.ts +56 -0
  86. package/packages/lsp-core/src/lsp/workspace-edit-contract-evidence.ts +30 -0
  87. package/packages/lsp-core/src/lsp/workspace-edit-fingerprint.ts +44 -0
  88. package/packages/lsp-core/src/lsp/workspace-edit-options.test.ts +147 -0
  89. package/packages/lsp-core/src/lsp/workspace-edit-parse-helpers.ts +59 -0
  90. package/packages/lsp-core/src/lsp/workspace-edit-parser.ts +130 -0
  91. package/packages/lsp-core/src/lsp/workspace-edit-path.ts +98 -0
  92. package/packages/lsp-core/src/lsp/workspace-edit-plan-types.ts +60 -0
  93. package/packages/lsp-core/src/lsp/workspace-edit-plan.ts +73 -0
  94. package/packages/lsp-core/src/lsp/workspace-edit-prevalidation.test.ts +174 -0
  95. package/packages/lsp-core/src/lsp/workspace-edit-resource-parser.ts +89 -0
  96. package/packages/lsp-core/src/lsp/workspace-edit-simulation.ts +183 -0
  97. package/packages/lsp-core/src/lsp/workspace-edit-snapshot.ts +53 -0
  98. package/packages/lsp-core/src/lsp/workspace-edit-text.ts +125 -0
  99. package/packages/lsp-core/src/lsp/workspace-edit-types.ts +121 -0
  100. package/packages/lsp-core/src/lsp/workspace-edit.characterization.test.ts +95 -0
  101. package/packages/lsp-core/src/lsp/workspace-edit.ts +55 -0
  102. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  103. package/packages/lsp-core/src/lsp/workspace-mutation-controller.ts +182 -0
  104. package/packages/lsp-core/src/mcp-protocol-pin.test.ts +97 -0
  105. package/packages/lsp-core/src/mcp.ts +122 -0
  106. package/packages/lsp-core/src/missing-dependency-result.test.ts +135 -0
  107. package/packages/lsp-core/src/missing-dependency-result.ts +79 -0
  108. package/packages/lsp-core/src/post-edit/file-location.ts +55 -0
  109. package/packages/lsp-core/src/post-edit/index.ts +3 -0
  110. package/packages/lsp-core/src/post-edit/not-installed-guidance.ts +36 -0
  111. package/packages/lsp-core/src/post-edit/not-installed.test.ts +224 -0
  112. package/packages/lsp-core/src/post-edit/orchestration.test.ts +157 -0
  113. package/packages/lsp-core/src/post-edit/orchestration.ts +205 -0
  114. package/packages/lsp-core/src/request-context.test.ts +200 -0
  115. package/packages/lsp-core/src/request-context.ts +235 -0
  116. package/packages/lsp-core/src/tool-surface.test.ts +173 -0
  117. package/packages/lsp-core/src/tools/bun-directory-diagnostics.test.ts +113 -0
  118. package/packages/lsp-core/src/tools/bun-directory-diagnostics.ts +75 -0
  119. package/packages/lsp-core/src/tools/definitions.ts +156 -0
  120. package/packages/lsp-core/src/tools/diagnostics.ts +133 -0
  121. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  122. package/packages/lsp-core/src/tools/format.ts +56 -0
  123. package/packages/lsp-core/src/tools/index.ts +11 -0
  124. package/packages/lsp-core/src/tools/install-decision.ts +39 -0
  125. package/packages/lsp-core/src/tools/navigation.ts +88 -0
  126. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  127. package/packages/lsp-core/src/tools/parameters.ts +49 -0
  128. package/packages/lsp-core/src/tools/rename.ts +69 -0
  129. package/packages/lsp-core/src/tools/result.ts +5 -0
  130. package/packages/lsp-core/src/tools/runtime.ts +21 -0
  131. package/packages/lsp-core/src/tools/schema.ts +9 -0
  132. package/packages/lsp-core/src/tools/status.ts +28 -0
  133. package/packages/lsp-core/src/tools/symbols.ts +99 -0
  134. package/packages/lsp-core/src/tools/types.ts +116 -0
  135. package/packages/lsp-core/src/tools.ts +1 -0
  136. package/packages/lsp-daemon/dist/cli.js +81 -15
  137. package/packages/lsp-daemon/dist/client.js +74 -8
  138. package/packages/lsp-daemon/dist/index.js +76 -10
  139. package/packages/lsp-tools-mcp/dist/cli.js +74 -8
  140. package/packages/lsp-tools-mcp/dist/mcp.js +74 -8
  141. package/packages/lsp-tools-mcp/dist/tools.js +74 -8
  142. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  143. package/packages/omo-codex/plugin/README.md +1 -1
  144. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +20 -4
  145. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  146. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  147. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  148. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  149. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  150. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  151. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  152. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  153. package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/SKILL.md +51 -55
  154. package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  155. package/packages/omo-codex/plugin/components/lcx/skills/lcx-report-bug/SKILL.md +7 -7
  156. package/packages/omo-codex/plugin/components/lcx/skills/lcx-report-bug/agents/openai.yaml +1 -1
  157. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  158. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +77 -13
  159. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  160. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  161. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  162. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  163. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  164. package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
  165. package/packages/omo-codex/plugin/components/telemetry/README.md +2 -2
  166. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +85 -16
  167. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +85 -20
  168. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  169. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  170. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +2 -9
  171. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -13
  172. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +0 -2
  173. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +0 -3
  174. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +17 -9
  175. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +3 -0
  176. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  177. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  178. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  179. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  180. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  181. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +3 -0
  182. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  183. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  184. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  185. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  186. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  187. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  188. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  189. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  190. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  191. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  192. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  193. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  194. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  195. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  196. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  197. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  198. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  199. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  200. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  201. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  202. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  203. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  204. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  205. package/packages/omo-codex/plugin/package-lock.json +16 -16
  206. package/packages/omo-codex/plugin/package.json +1 -1
  207. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +16 -1
  208. package/packages/omo-codex/plugin/shared/package.json +1 -1
  209. package/packages/omo-codex/plugin/skills/ast-grep/README.md +1 -1
  210. package/packages/omo-codex/plugin/skills/ast-grep/install.ps1 +5 -3
  211. package/packages/omo-codex/plugin/skills/ast-grep/install.sh +4 -5
  212. package/packages/omo-codex/plugin/skills/ast-grep/references/install.md +2 -2
  213. package/packages/omo-codex/plugin/skills/ast-grep/scripts/ast_grep_helper.py +13 -3
  214. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +24 -33
  215. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +3 -3
  216. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +5 -4
  217. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +11 -11
  218. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +2 -2
  219. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +4 -4
  220. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +1 -1
  221. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +6 -3
  222. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +105 -2
  223. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +40 -14
  224. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +2 -2
  225. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +2 -1
  226. package/packages/omo-codex/plugin/skills/frontend/references/design/component-catalogs.md +14 -10
  227. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +22 -9
  228. package/packages/omo-codex/plugin/skills/frontend/references/design/grounding.md +29 -0
  229. package/packages/omo-codex/plugin/skills/frontend/references/perfection/craft-floor.md +59 -0
  230. package/packages/omo-codex/plugin/skills/frontend/references/perfection/detect.md +52 -0
  231. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +2 -0
  232. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +2 -0
  233. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/cli.ts +70 -0
  234. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/config.ts +53 -0
  235. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/core/characters.ts +2 -0
  236. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/core/color.ts +150 -0
  237. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/core/page.ts +84 -0
  238. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/core/shadow.ts +40 -0
  239. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/core/source.ts +33 -0
  240. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/detect.ts +77 -0
  241. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/index.ts +23 -0
  242. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/lint.ts +98 -0
  243. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/render/probe-placement.ts +50 -0
  244. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/render/renderer.ts +37 -0
  245. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/render/webview.ts +71 -0
  246. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/report.ts +29 -0
  247. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rule.ts +42 -0
  248. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/ai-color-palette.ts +83 -0
  249. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/cream-palette.ts +35 -0
  250. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/dark-glow.ts +44 -0
  251. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/design-system-color.ts +35 -0
  252. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/gradient-text.ts +59 -0
  253. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/gray-on-color.ts +38 -0
  254. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/index.ts +15 -0
  255. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/low-contrast.ts +57 -0
  256. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/radial-halo.ts +31 -0
  257. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/radial-spotlight-glow.ts +33 -0
  258. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/animation-opacity.ts +78 -0
  259. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/color-path.ts +15 -0
  260. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/contrast-pairs.ts +54 -0
  261. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/contrast-role.ts +76 -0
  262. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/glow-forms.ts +56 -0
  263. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/gradient-samples.ts +134 -0
  264. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/gradients.ts +91 -0
  265. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/mockup-roots.ts +63 -0
  266. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/page-ignore.ts +7 -0
  267. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/painted-text.ts +141 -0
  268. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/palette-roles.ts +58 -0
  269. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/placeholder-contrast.ts +25 -0
  270. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/stock-accent.ts +31 -0
  271. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/color/support/text-colors.ts +80 -0
  272. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/aphoristic-cadence.ts +20 -0
  273. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/broken-image.ts +17 -0
  274. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/em-dash-overuse.ts +46 -0
  275. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/index.ts +15 -0
  276. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/marketing-buzzword.ts +33 -0
  277. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/numbered-section-labels.ts +34 -0
  278. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/repeated-container-text.ts +56 -0
  279. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/script-error.ts +38 -0
  280. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/skipped-heading.ts +81 -0
  281. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/support/numbered-label.ts +94 -0
  282. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/support/page-text.ts +37 -0
  283. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/copy/theater-slop-phrase.ts +21 -0
  284. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/blinking-cursor.ts +48 -0
  285. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/border-accent-on-rounded.ts +14 -0
  286. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/bounce-easing.ts +83 -0
  287. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/buried-raster.ts +72 -0
  288. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/codex-grid-background.ts +34 -0
  289. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/design-system-radius.ts +31 -0
  290. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/gpt-thin-border-wide-shadow.ts +66 -0
  291. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/hard-offset-shadow.ts +31 -0
  292. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/hero-eyebrow-chip.ts +19 -0
  293. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/icon-tile-stack.ts +92 -0
  294. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/index.ts +38 -0
  295. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/kicker-above-heading.ts +69 -0
  296. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/marquee.ts +51 -0
  297. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/organic-clip-path.ts +41 -0
  298. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/pulsing-dot.ts +72 -0
  299. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/repeating-stripes-gradient.ts +25 -0
  300. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/shape-assembled-illustration.ts +58 -0
  301. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/side-tab.ts +17 -0
  302. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/appearance.ts +110 -0
  303. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/assert-cases.ts +25 -0
  304. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/borders.ts +150 -0
  305. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/clip-geometry.ts +151 -0
  306. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/css-candidates.ts +66 -0
  307. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/curve-samples.ts +55 -0
  308. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/gradient-pattern.ts +40 -0
  309. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/keyframes.ts +134 -0
  310. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/labels.ts +85 -0
  311. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/decoration/support/raster-state.ts +51 -0
  312. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/index.ts +16 -0
  313. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/body-text-viewport-edge.ts +62 -0
  314. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/clipped-overflow-container.ts +15 -0
  315. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/content-hidden-at-rest.ts +63 -0
  316. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/cramped-padding.ts +97 -0
  317. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/edge-flush-cards.ts +47 -0
  318. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/first-viewport-column-overflow.ts +43 -0
  319. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/heading-rhythm.ts +30 -0
  320. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/index.ts +21 -0
  321. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/monotonous-spacing.ts +32 -0
  322. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/nested-cards.ts +38 -0
  323. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/straggler.ts +28 -0
  324. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/cards.ts +114 -0
  325. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/clipping.ts +71 -0
  326. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/declared-mockups.ts +46 -0
  327. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/geometry.ts +73 -0
  328. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/hidden-interface.ts +35 -0
  329. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/layout-cases.ts +23 -0
  330. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/line-breaks.ts +32 -0
  331. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/motion.ts +77 -0
  332. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/padding.ts +93 -0
  333. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/support/rhythm.ts +161 -0
  334. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/text-occlusion.ts +84 -0
  335. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/text-overflow.ts +72 -0
  336. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/unbalanced-heading.ts +22 -0
  337. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/layout/viewport-reflow.ts +33 -0
  338. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/ai-color-palette.ts +11 -0
  339. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/aphoristic-cadence.ts +14 -0
  340. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/border-accent-on-rounded.ts +20 -0
  341. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/bounce-easing.ts +21 -0
  342. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/broken-image.ts +16 -0
  343. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/codex-grid-background.ts +18 -0
  344. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/dark-glow.ts +21 -0
  345. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/em-dash-overuse.ts +15 -0
  346. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/gradient-text.ts +11 -0
  347. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/gray-on-color.ts +13 -0
  348. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/index.ts +19 -0
  349. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/marketing-buzzword.ts +17 -0
  350. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/marquee.ts +12 -0
  351. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/monotonous-spacing.ts +22 -0
  352. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/overused-font.ts +16 -0
  353. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/radial-halo.ts +14 -0
  354. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/side-tab.ts +58 -0
  355. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/accent-scans.ts +78 -0
  356. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/check-source.ts +6 -0
  357. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/corners.ts +105 -0
  358. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/css-effects.ts +81 -0
  359. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/css-scopes.ts +131 -0
  360. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/image-tags.ts +113 -0
  361. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/js-punctuation.ts +34 -0
  362. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/markup-scope.ts +44 -0
  363. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/source-color.ts +42 -0
  364. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/source-shadow.ts +15 -0
  365. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/source/support/source-text.ts +110 -0
  366. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/all-caps-body.ts +15 -0
  367. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/design-system-font-size.ts +23 -0
  368. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/design-system-font.ts +24 -0
  369. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/extreme-negative-tracking.ts +18 -0
  370. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/flat-type-hierarchy.ts +26 -0
  371. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/index.ts +21 -0
  372. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/italic-serif-display.ts +24 -0
  373. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/justified-text.ts +32 -0
  374. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/line-length.ts +28 -0
  375. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/oversized-h1.ts +20 -0
  376. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/overused-font.ts +45 -0
  377. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/drawn-enlargement.ts +48 -0
  378. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/fading-text.ts +48 -0
  379. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/flex-runs.ts +16 -0
  380. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/font-family.ts +28 -0
  381. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/painted-text.ts +81 -0
  382. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/svg-size.ts +57 -0
  383. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/text-context.ts +112 -0
  384. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/text-lines.ts +43 -0
  385. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/support/type-hierarchy.ts +48 -0
  386. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/tight-leading.ts +47 -0
  387. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/tiny-text.ts +23 -0
  388. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/undersized-ui-text.ts +28 -0
  389. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/rules/typography/wide-tracking.ts +26 -0
  390. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/snapshot/collect.ts +158 -0
  391. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/snapshot/style-props.ts +25 -0
  392. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/testing/build-snapshot.ts +78 -0
  393. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/tsconfig.json +19 -0
  394. package/packages/omo-codex/plugin/skills/frontend/scripts/detect/types.ts +124 -0
  395. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +51 -55
  396. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  397. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +7 -7
  398. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
  399. package/packages/omo-codex/plugin/skills/programming/SKILL.md +15 -74
  400. package/packages/omo-codex/plugin/skills/programming/references/go/README.md +1 -1
  401. package/packages/omo-codex/plugin/skills/programming/references/go/bootstrap.md +2 -2
  402. package/packages/omo-codex/plugin/skills/programming/references/python/README.md +4 -4
  403. package/packages/omo-codex/plugin/skills/programming/references/python/one-liners.md +5 -5
  404. package/packages/omo-codex/plugin/skills/programming/references/testing/README.md +82 -0
  405. package/packages/omo-codex/plugin/skills/programming/references/testing/junk-classes.md +56 -0
  406. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +1 -2
  407. package/packages/omo-codex/plugin/skills/programming/scripts/go/new-project.ts +197 -0
  408. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-project.ts +231 -0
  409. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-script.ts +134 -0
  410. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.ts +215 -0
  411. package/packages/omo-codex/plugin/skills/programming/scripts/shared/run-tool.ts +19 -0
  412. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +5 -4
  413. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +2 -2
  414. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +9 -6
  415. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +1 -1
  416. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  417. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +4 -2
  418. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +3 -0
  419. package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +8 -4
  420. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +7 -316
  421. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +23 -21
  422. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger-grammar.md +7 -3
  423. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger.md +42 -8
  424. package/packages/omo-codex/plugin/skills/ulw-research/references/fidelity-claim-kinds.md +1 -1
  425. package/packages/omo-codex/plugin/skills/ulw-research/references/markdown-blocks.md +12 -0
  426. package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +12 -5
  427. package/packages/omo-codex/plugin/skills/ulw-research/references/research-collection.md +195 -0
  428. package/packages/omo-codex/plugin/skills/ulw-research/references/research-delivery.md +123 -0
  429. package/packages/omo-codex/plugin/skills/ulw-research/scripts/claim-kinds.mjs +33 -5
  430. package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +13 -4
  431. package/packages/omo-codex/plugin/skills/ulw-research/scripts/conversion-probe.mjs +229 -0
  432. package/packages/omo-codex/plugin/skills/ulw-research/scripts/css-hiding.mjs +158 -0
  433. package/packages/omo-codex/plugin/skills/ulw-research/scripts/css-lite.mjs +4 -2
  434. package/packages/omo-codex/plugin/skills/ulw-research/scripts/entities.mjs +13 -4
  435. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-fill.mjs +11 -1
  436. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-meaning.mjs +13 -9
  437. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-polish.mjs +40 -18
  438. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-verify.mjs +25 -8
  439. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands.mjs +35 -16
  440. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-derive.mjs +7 -2
  441. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-fill.mjs +6 -4
  442. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-kinds.mjs +6 -7
  443. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-locate.mjs +15 -9
  444. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-claims.mjs +4 -3
  445. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-csv.mjs +32 -0
  446. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-lexicon.mjs +1 -1
  447. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-originals.mjs +161 -0
  448. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-policy.mjs +4 -4
  449. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-records.mjs +81 -14
  450. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-snapshot-readability.mjs +49 -0
  451. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-sources.mjs +76 -0
  452. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-trace.mjs +25 -11
  453. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-value-unit.mjs +202 -0
  454. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-values.mjs +40 -39
  455. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-fidelity.mjs +8 -6
  456. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +10 -1
  457. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-lite.mjs +6 -2
  458. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-markup.mjs +2 -2
  459. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-text-map.mjs +140 -0
  460. package/packages/omo-codex/plugin/skills/ulw-research/scripts/markdown-closers.mjs +126 -0
  461. package/packages/omo-codex/plugin/skills/ulw-research/scripts/md-lite.mjs +1 -1
  462. package/packages/omo-codex/plugin/skills/ulw-research/scripts/number-grammar.mjs +33 -0
  463. package/packages/omo-codex/plugin/skills/ulw-research/scripts/numerals.mjs +18 -7
  464. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome-start.mjs +66 -0
  465. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +11 -22
  466. package/packages/omo-codex/plugin/skills/ulw-research/scripts/placeholder.mjs +18 -6
  467. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-apply.mjs +3 -2
  468. package/packages/omo-codex/plugin/skills/ulw-research/scripts/raw-decode.mjs +110 -0
  469. package/packages/omo-codex/plugin/skills/ulw-research/scripts/raw-locator.mjs +47 -0
  470. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +1 -1
  471. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools.mjs +7 -1
  472. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-commands.mjs +79 -26
  473. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-refresh.mjs +82 -0
  474. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-snapshot.mjs +73 -69
  475. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-view.mjs +89 -0
  476. package/packages/omo-codex/plugin/skills/ulw-research/scripts/sources-citation.mjs +203 -0
  477. package/packages/omo-codex/plugin/skills/ulw-research/scripts/units.mjs +14 -3
  478. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +12 -1
  479. package/packages/omo-codex/plugin/test/auto-update.test.mjs +62 -0
  480. package/packages/omo-codex/plugin/test/payload-equivalence.test.mjs +18 -6
  481. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -3
  482. package/packages/omo-codex/scripts/install-dist/install-local.mjs +413 -245
  483. package/packages/prompts-core/prompts/ultrawork/codex.md +3 -0
  484. package/packages/shared-skills/skill-source-filter.mjs +6 -2
  485. package/packages/shared-skills/skills/ast-grep/README.md +1 -1
  486. package/packages/shared-skills/skills/ast-grep/install.ps1 +5 -3
  487. package/packages/shared-skills/skills/ast-grep/install.sh +4 -5
  488. package/packages/shared-skills/skills/ast-grep/references/install.md +2 -2
  489. package/packages/shared-skills/skills/ast-grep/scripts/ast_grep_helper.py +13 -3
  490. package/packages/shared-skills/skills/browser/runtime/omowright/index.js +24 -33
  491. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +3 -3
  492. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +5 -4
  493. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +11 -11
  494. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +2 -2
  495. package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +4 -4
  496. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +1 -1
  497. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +6 -3
  498. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +105 -2
  499. package/packages/shared-skills/skills/frontend/SKILL.md +40 -14
  500. package/packages/shared-skills/skills/frontend/references/design/README.md +2 -2
  501. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +2 -1
  502. package/packages/shared-skills/skills/frontend/references/design/component-catalogs.md +14 -10
  503. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +22 -9
  504. package/packages/shared-skills/skills/frontend/references/design/grounding.md +29 -0
  505. package/packages/shared-skills/skills/frontend/references/perfection/craft-floor.md +59 -0
  506. package/packages/shared-skills/skills/frontend/references/perfection/detect.md +52 -0
  507. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +2 -0
  508. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +2 -0
  509. package/packages/shared-skills/skills/frontend/scripts/detect/cli.ts +70 -0
  510. package/packages/shared-skills/skills/frontend/scripts/detect/config.test.ts +26 -0
  511. package/packages/shared-skills/skills/frontend/scripts/detect/config.ts +53 -0
  512. package/packages/shared-skills/skills/frontend/scripts/detect/core/characters.ts +2 -0
  513. package/packages/shared-skills/skills/frontend/scripts/detect/core/color.test.ts +29 -0
  514. package/packages/shared-skills/skills/frontend/scripts/detect/core/color.ts +150 -0
  515. package/packages/shared-skills/skills/frontend/scripts/detect/core/page.ts +84 -0
  516. package/packages/shared-skills/skills/frontend/scripts/detect/core/shadow.ts +40 -0
  517. package/packages/shared-skills/skills/frontend/scripts/detect/core/source.ts +33 -0
  518. package/packages/shared-skills/skills/frontend/scripts/detect/detect.ts +77 -0
  519. package/packages/shared-skills/skills/frontend/scripts/detect/index.ts +23 -0
  520. package/packages/shared-skills/skills/frontend/scripts/detect/lint.test.ts +27 -0
  521. package/packages/shared-skills/skills/frontend/scripts/detect/lint.ts +98 -0
  522. package/packages/shared-skills/skills/frontend/scripts/detect/render/probe-placement.test.ts +19 -0
  523. package/packages/shared-skills/skills/frontend/scripts/detect/render/probe-placement.ts +50 -0
  524. package/packages/shared-skills/skills/frontend/scripts/detect/render/renderer.ts +37 -0
  525. package/packages/shared-skills/skills/frontend/scripts/detect/render/webview.ts +71 -0
  526. package/packages/shared-skills/skills/frontend/scripts/detect/report.ts +29 -0
  527. package/packages/shared-skills/skills/frontend/scripts/detect/rule.ts +42 -0
  528. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/ai-color-palette.test.ts +74 -0
  529. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/ai-color-palette.ts +83 -0
  530. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/cream-palette.test.ts +24 -0
  531. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/cream-palette.ts +35 -0
  532. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/dark-glow.test.ts +47 -0
  533. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/dark-glow.ts +44 -0
  534. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/design-system-color.test.ts +26 -0
  535. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/design-system-color.ts +35 -0
  536. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/gradient-text.test.ts +24 -0
  537. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/gradient-text.ts +59 -0
  538. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/gray-on-color.test.ts +39 -0
  539. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/gray-on-color.ts +38 -0
  540. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/index.ts +15 -0
  541. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/low-contrast.test.ts +209 -0
  542. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/low-contrast.ts +57 -0
  543. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/placeholder-contrast.test.ts +62 -0
  544. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/radial-halo.test.ts +40 -0
  545. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/radial-halo.ts +31 -0
  546. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/radial-spotlight-glow.test.ts +27 -0
  547. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/radial-spotlight-glow.ts +33 -0
  548. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/animation-opacity.ts +78 -0
  549. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/color-path.ts +15 -0
  550. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/contrast-pairs.ts +54 -0
  551. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/contrast-role.ts +76 -0
  552. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/glow-forms.ts +56 -0
  553. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/gradient-samples.ts +134 -0
  554. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/gradients.ts +91 -0
  555. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/mockup-roots.ts +63 -0
  556. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/page-ignore.ts +7 -0
  557. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/painted-text.ts +141 -0
  558. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/palette-roles.ts +58 -0
  559. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/placeholder-contrast.ts +25 -0
  560. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/stock-accent.ts +31 -0
  561. package/packages/shared-skills/skills/frontend/scripts/detect/rules/color/support/text-colors.ts +80 -0
  562. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/aphoristic-cadence.test.ts +18 -0
  563. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/aphoristic-cadence.ts +20 -0
  564. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/broken-image.test.ts +25 -0
  565. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/broken-image.ts +17 -0
  566. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/em-dash-overuse.test.ts +39 -0
  567. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/em-dash-overuse.ts +46 -0
  568. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/index.ts +15 -0
  569. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/marketing-buzzword.test.ts +18 -0
  570. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/marketing-buzzword.ts +33 -0
  571. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/numbered-section-labels.test.ts +58 -0
  572. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/numbered-section-labels.ts +34 -0
  573. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/repeated-container-text.test.ts +43 -0
  574. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/repeated-container-text.ts +56 -0
  575. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/script-error.test.ts +48 -0
  576. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/script-error.ts +38 -0
  577. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/skipped-heading.test.ts +49 -0
  578. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/skipped-heading.ts +81 -0
  579. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/support/numbered-label.ts +94 -0
  580. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/support/page-text.ts +37 -0
  581. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/theater-slop-phrase.test.ts +17 -0
  582. package/packages/shared-skills/skills/frontend/scripts/detect/rules/copy/theater-slop-phrase.ts +21 -0
  583. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/blinking-cursor.test.ts +43 -0
  584. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/blinking-cursor.ts +48 -0
  585. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/border-accent-on-rounded.test.ts +33 -0
  586. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/border-accent-on-rounded.ts +14 -0
  587. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/bounce-easing.test.ts +72 -0
  588. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/bounce-easing.ts +83 -0
  589. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/buried-raster.test.ts +95 -0
  590. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/buried-raster.ts +72 -0
  591. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/codex-grid-background.test.ts +28 -0
  592. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/codex-grid-background.ts +34 -0
  593. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/design-system-radius.test.ts +37 -0
  594. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/design-system-radius.ts +31 -0
  595. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/gpt-thin-border-wide-shadow.test.ts +59 -0
  596. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/gpt-thin-border-wide-shadow.ts +66 -0
  597. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/hard-offset-shadow.test.ts +45 -0
  598. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/hard-offset-shadow.ts +31 -0
  599. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/hero-eyebrow-chip.test.ts +76 -0
  600. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/hero-eyebrow-chip.ts +19 -0
  601. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/icon-tile-stack.test.ts +67 -0
  602. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/icon-tile-stack.ts +92 -0
  603. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/index.ts +38 -0
  604. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/kicker-above-heading.test.ts +126 -0
  605. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/kicker-above-heading.ts +69 -0
  606. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/marquee.test.ts +63 -0
  607. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/marquee.ts +51 -0
  608. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/organic-clip-path.test.ts +67 -0
  609. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/organic-clip-path.ts +41 -0
  610. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/pulsing-dot.test.ts +58 -0
  611. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/pulsing-dot.ts +72 -0
  612. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/repeating-stripes-gradient.test.ts +26 -0
  613. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/repeating-stripes-gradient.ts +25 -0
  614. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/shape-assembled-illustration.test.ts +59 -0
  615. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/shape-assembled-illustration.ts +58 -0
  616. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/side-tab.test.ts +91 -0
  617. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/side-tab.ts +17 -0
  618. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/appearance.ts +110 -0
  619. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/assert-cases.ts +25 -0
  620. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/borders.ts +150 -0
  621. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/clip-geometry.ts +151 -0
  622. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/css-candidates.ts +66 -0
  623. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/curve-samples.ts +55 -0
  624. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/gradient-pattern.ts +40 -0
  625. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/keyframes.ts +134 -0
  626. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/labels.ts +85 -0
  627. package/packages/shared-skills/skills/frontend/scripts/detect/rules/decoration/support/raster-state.ts +51 -0
  628. package/packages/shared-skills/skills/frontend/scripts/detect/rules/index.ts +16 -0
  629. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/body-text-viewport-edge.test.ts +64 -0
  630. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/body-text-viewport-edge.ts +62 -0
  631. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/clipped-overflow-container.test.ts +40 -0
  632. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/clipped-overflow-container.ts +15 -0
  633. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/content-hidden-at-rest.test.ts +62 -0
  634. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/content-hidden-at-rest.ts +63 -0
  635. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/cramped-padding.test.ts +61 -0
  636. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/cramped-padding.ts +97 -0
  637. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/edge-flush-cards.test.ts +43 -0
  638. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/edge-flush-cards.ts +47 -0
  639. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/first-viewport-column-overflow.test.ts +28 -0
  640. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/first-viewport-column-overflow.ts +43 -0
  641. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/heading-rhythm.test.ts +67 -0
  642. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/heading-rhythm.ts +30 -0
  643. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/index.ts +21 -0
  644. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/monotonous-spacing.test.ts +19 -0
  645. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/monotonous-spacing.ts +32 -0
  646. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/nested-cards.test.ts +60 -0
  647. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/nested-cards.ts +38 -0
  648. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/straggler.test.ts +33 -0
  649. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/straggler.ts +28 -0
  650. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/cards.ts +114 -0
  651. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/clipping.ts +71 -0
  652. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/declared-mockups.ts +46 -0
  653. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/geometry.ts +73 -0
  654. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/hidden-interface.ts +35 -0
  655. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/layout-cases.ts +23 -0
  656. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/line-breaks.ts +32 -0
  657. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/motion.ts +77 -0
  658. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/padding.ts +93 -0
  659. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/support/rhythm.ts +161 -0
  660. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/text-occlusion.test.ts +37 -0
  661. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/text-occlusion.ts +84 -0
  662. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/text-overflow.test.ts +83 -0
  663. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/text-overflow.ts +72 -0
  664. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/unbalanced-heading.test.ts +22 -0
  665. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/unbalanced-heading.ts +22 -0
  666. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/viewport-reflow.test.ts +34 -0
  667. package/packages/shared-skills/skills/frontend/scripts/detect/rules/layout/viewport-reflow.ts +33 -0
  668. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/ai-color-palette.test.ts +13 -0
  669. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/ai-color-palette.ts +11 -0
  670. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/aphoristic-cadence.test.ts +12 -0
  671. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/aphoristic-cadence.ts +14 -0
  672. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/border-accent-on-rounded.test.ts +14 -0
  673. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/border-accent-on-rounded.ts +20 -0
  674. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/bounce-easing.test.ts +19 -0
  675. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/bounce-easing.ts +21 -0
  676. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/broken-image.test.ts +27 -0
  677. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/broken-image.ts +16 -0
  678. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/codex-grid-background.test.ts +11 -0
  679. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/codex-grid-background.ts +18 -0
  680. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/dark-glow.test.ts +15 -0
  681. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/dark-glow.ts +21 -0
  682. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/em-dash-overuse.test.ts +13 -0
  683. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/em-dash-overuse.ts +15 -0
  684. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/gradient-text.test.ts +12 -0
  685. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/gradient-text.ts +11 -0
  686. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/gray-on-color.test.ts +20 -0
  687. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/gray-on-color.ts +13 -0
  688. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/index.ts +19 -0
  689. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/marketing-buzzword.test.ts +12 -0
  690. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/marketing-buzzword.ts +17 -0
  691. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/marquee.test.ts +12 -0
  692. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/marquee.ts +12 -0
  693. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/monotonous-spacing.test.ts +13 -0
  694. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/monotonous-spacing.ts +22 -0
  695. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/overused-font.test.ts +21 -0
  696. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/overused-font.ts +16 -0
  697. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/radial-halo.test.ts +16 -0
  698. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/radial-halo.ts +14 -0
  699. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/side-tab.test.ts +29 -0
  700. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/side-tab.ts +58 -0
  701. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/accent-scans.ts +78 -0
  702. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/check-source.ts +6 -0
  703. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/corners.ts +105 -0
  704. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/css-effects.ts +81 -0
  705. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/css-scopes.ts +131 -0
  706. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/image-tags.ts +113 -0
  707. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/js-punctuation.ts +34 -0
  708. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/markup-scope.ts +44 -0
  709. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/source-color.ts +42 -0
  710. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/source-shadow.ts +15 -0
  711. package/packages/shared-skills/skills/frontend/scripts/detect/rules/source/support/source-text.ts +110 -0
  712. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/all-caps-body.test.ts +24 -0
  713. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/all-caps-body.ts +15 -0
  714. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/design-system-font-size.test.ts +21 -0
  715. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/design-system-font-size.ts +23 -0
  716. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/design-system-font.test.ts +22 -0
  717. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/design-system-font.ts +24 -0
  718. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/extreme-negative-tracking.test.ts +23 -0
  719. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/extreme-negative-tracking.ts +18 -0
  720. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/flat-type-hierarchy.test.ts +33 -0
  721. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/flat-type-hierarchy.ts +26 -0
  722. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/index.ts +21 -0
  723. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/italic-serif-display.test.ts +24 -0
  724. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/italic-serif-display.ts +24 -0
  725. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/justified-text.test.ts +31 -0
  726. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/justified-text.ts +32 -0
  727. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/line-length.test.ts +43 -0
  728. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/line-length.ts +28 -0
  729. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/oversized-h1.test.ts +26 -0
  730. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/oversized-h1.ts +20 -0
  731. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/overused-font.test.ts +35 -0
  732. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/overused-font.ts +45 -0
  733. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/drawn-enlargement.ts +48 -0
  734. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/fading-text.ts +48 -0
  735. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/flex-runs.ts +16 -0
  736. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/font-family.ts +28 -0
  737. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/painted-text.test.ts +63 -0
  738. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/painted-text.ts +81 -0
  739. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/svg-size.ts +57 -0
  740. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/text-context.ts +112 -0
  741. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/text-lines.ts +43 -0
  742. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/support/type-hierarchy.ts +48 -0
  743. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/tight-leading.test.ts +54 -0
  744. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/tight-leading.ts +47 -0
  745. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/tiny-text.test.ts +60 -0
  746. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/tiny-text.ts +23 -0
  747. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/undersized-ui-text.test.ts +98 -0
  748. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/undersized-ui-text.ts +28 -0
  749. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/wide-tracking.test.ts +26 -0
  750. package/packages/shared-skills/skills/frontend/scripts/detect/rules/typography/wide-tracking.ts +26 -0
  751. package/packages/shared-skills/skills/frontend/scripts/detect/snapshot/collect.ts +158 -0
  752. package/packages/shared-skills/skills/frontend/scripts/detect/snapshot/style-props.ts +25 -0
  753. package/packages/shared-skills/skills/frontend/scripts/detect/testing/build-snapshot.ts +78 -0
  754. package/packages/shared-skills/skills/frontend/scripts/detect/tsconfig.json +19 -0
  755. package/packages/shared-skills/skills/frontend/scripts/detect/types.ts +124 -0
  756. package/packages/shared-skills/skills/programming/SKILL.md +15 -74
  757. package/packages/shared-skills/skills/programming/references/go/README.md +1 -1
  758. package/packages/shared-skills/skills/programming/references/go/bootstrap.md +2 -2
  759. package/packages/shared-skills/skills/programming/references/python/README.md +4 -4
  760. package/packages/shared-skills/skills/programming/references/python/one-liners.md +5 -5
  761. package/packages/shared-skills/skills/programming/references/testing/README.md +82 -0
  762. package/packages/shared-skills/skills/programming/references/testing/junk-classes.md +56 -0
  763. package/packages/shared-skills/skills/programming/references/typescript/README.md +1 -2
  764. package/packages/shared-skills/skills/programming/scripts/go/new-project.ts +197 -0
  765. package/packages/shared-skills/skills/programming/scripts/python/new-project.ts +231 -0
  766. package/packages/shared-skills/skills/programming/scripts/python/new-script.ts +134 -0
  767. package/packages/shared-skills/skills/programming/scripts/rust/new-project.ts +215 -0
  768. package/packages/shared-skills/skills/programming/scripts/scaffolders.test.ts +96 -0
  769. package/packages/shared-skills/skills/programming/scripts/shared/run-tool.ts +19 -0
  770. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +5 -4
  771. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +2 -2
  772. package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +9 -6
  773. package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +1 -1
  774. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  775. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +4 -2
  776. package/packages/shared-skills/skills/ulw-research/AGENTS.md +8 -4
  777. package/packages/shared-skills/skills/ulw-research/SKILL.md +7 -316
  778. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +23 -21
  779. package/packages/shared-skills/skills/ulw-research/references/fact-ledger-grammar.md +7 -3
  780. package/packages/shared-skills/skills/ulw-research/references/fact-ledger.md +42 -8
  781. package/packages/shared-skills/skills/ulw-research/references/fidelity-claim-kinds.md +1 -1
  782. package/packages/shared-skills/skills/ulw-research/references/markdown-blocks.md +12 -0
  783. package/packages/shared-skills/skills/ulw-research/references/report-gates.md +12 -5
  784. package/packages/shared-skills/skills/ulw-research/references/research-collection.md +195 -0
  785. package/packages/shared-skills/skills/ulw-research/references/research-delivery.md +123 -0
  786. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.mjs +33 -5
  787. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.test.ts +37 -2
  788. package/packages/shared-skills/skills/ulw-research/scripts/claim-prefix.test.ts +76 -0
  789. package/packages/shared-skills/skills/ulw-research/scripts/contracts-validation.test.ts +83 -0
  790. package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +13 -4
  791. package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +6 -110
  792. package/packages/shared-skills/skills/ulw-research/scripts/conversion-altered.test.ts +154 -0
  793. package/packages/shared-skills/skills/ulw-research/scripts/conversion-originals.test.ts +297 -0
  794. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe-classes.test.ts +361 -0
  795. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe.mjs +229 -0
  796. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe.test.ts +218 -0
  797. package/packages/shared-skills/skills/ulw-research/scripts/copy-returns-polish.test.ts +4 -3
  798. package/packages/shared-skills/skills/ulw-research/scripts/css-hiding.mjs +158 -0
  799. package/packages/shared-skills/skills/ulw-research/scripts/css-lite.mjs +4 -2
  800. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier-meaning.test.ts +186 -0
  801. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier.test.ts +40 -87
  802. package/packages/shared-skills/skills/ulw-research/scripts/entities.mjs +13 -4
  803. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-fill.mjs +11 -1
  804. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-meaning.mjs +13 -9
  805. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-polish.mjs +40 -18
  806. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-verify.mjs +25 -8
  807. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands.mjs +35 -16
  808. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive-2.test.ts +149 -0
  809. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.mjs +7 -2
  810. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.test.ts +7 -192
  811. package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.mjs +6 -4
  812. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +6 -7
  813. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +2 -1
  814. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-legacy.test.ts +2 -1
  815. package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.mjs +15 -9
  816. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions-2.test.ts +149 -0
  817. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions.test.ts +4 -168
  818. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-rules.test.ts +3 -229
  819. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-claims.mjs +4 -3
  820. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-csv.mjs +32 -0
  821. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.mjs +1 -1
  822. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-originals.mjs +161 -0
  823. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-policy.mjs +4 -4
  824. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-records.mjs +81 -14
  825. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-snapshot-readability.mjs +49 -0
  826. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-sources.mjs +76 -0
  827. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.mjs +25 -11
  828. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-value-unit.mjs +202 -0
  829. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.mjs +40 -39
  830. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.test.ts +8 -29
  831. package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.mjs +8 -6
  832. package/packages/shared-skills/skills/ulw-research/scripts/gates-static-headings.test.ts +17 -0
  833. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +10 -1
  834. package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +6 -2
  835. package/packages/shared-skills/skills/ulw-research/scripts/html-markup.mjs +2 -2
  836. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.mjs +140 -0
  837. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.test.ts +148 -0
  838. package/packages/shared-skills/skills/ulw-research/scripts/markdown-closers.mjs +126 -0
  839. package/packages/shared-skills/skills/ulw-research/scripts/md-lite-boundaries.test.ts +46 -0
  840. package/packages/shared-skills/skills/ulw-research/scripts/md-lite.mjs +1 -1
  841. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.mjs +33 -0
  842. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.test.ts +36 -0
  843. package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +18 -7
  844. package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +3 -0
  845. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.mjs +66 -0
  846. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.test.ts +109 -0
  847. package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +11 -22
  848. package/packages/shared-skills/skills/ulw-research/scripts/page-source-locator.test.ts +187 -0
  849. package/packages/shared-skills/skills/ulw-research/scripts/placeholder.mjs +18 -6
  850. package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.mjs +3 -2
  851. package/packages/shared-skills/skills/ulw-research/scripts/polish-markup.test.ts +15 -1
  852. package/packages/shared-skills/skills/ulw-research/scripts/polish-partial.test.ts +42 -0
  853. package/packages/shared-skills/skills/ulw-research/scripts/raw-decode.mjs +110 -0
  854. package/packages/shared-skills/skills/ulw-research/scripts/raw-locator.mjs +47 -0
  855. package/packages/shared-skills/skills/ulw-research/scripts/raw-snapshot.test.ts +139 -0
  856. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-2.test.ts +233 -0
  857. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-3.test.ts +141 -0
  858. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-4.test.ts +135 -0
  859. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-5.test.ts +231 -0
  860. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +1 -1
  861. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +7 -1
  862. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +5 -800
  863. package/packages/shared-skills/skills/ulw-research/scripts/snapshot-readability.test.ts +116 -0
  864. package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +79 -26
  865. package/packages/shared-skills/skills/ulw-research/scripts/source-integrity.test.ts +243 -0
  866. package/packages/shared-skills/skills/ulw-research/scripts/source-refresh.mjs +82 -0
  867. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.mjs +73 -69
  868. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.test.ts +7 -4
  869. package/packages/shared-skills/skills/ulw-research/scripts/source-view.mjs +89 -0
  870. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.mjs +203 -0
  871. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.test.ts +236 -0
  872. package/packages/shared-skills/skills/ulw-research/scripts/tests/contracts-support.ts +147 -0
  873. package/packages/shared-skills/skills/ulw-research/scripts/tests/delivery-barrier-session.ts +59 -0
  874. package/packages/shared-skills/skills/ulw-research/scripts/tests/derive-clock.ts +4 -0
  875. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-derive-support.ts +65 -0
  876. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-dimensions-support.ts +41 -0
  877. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-rules-support.ts +241 -0
  878. package/packages/shared-skills/skills/ulw-research/scripts/tests/fidelity-values-support.ts +30 -0
  879. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/conversion-probe.html +14 -0
  880. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/sources-shapes.html +20 -0
  881. package/packages/shared-skills/skills/ulw-research/scripts/tests/numeral-classes.ts +196 -0
  882. package/packages/shared-skills/skills/ulw-research/scripts/tests/report-tools-support.ts +182 -0
  883. package/packages/shared-skills/skills/ulw-research/scripts/tests/value-mode-support.ts +48 -0
  884. package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +14 -3
  885. package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +10 -0
  886. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit-classes.test.ts +255 -0
  887. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit.test.ts +179 -0
  888. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-cli.test.ts +157 -0
  889. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-followups.test.ts +72 -0
  890. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-priority.test.ts +80 -0
  891. package/packages/shared-skills/skills/visual-qa/SKILL.md +12 -1
  892. package/packages/omo-codex/plugin/skills/programming/scripts/go/new-project.py +0 -138
  893. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-project.py +0 -172
  894. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-script.py +0 -116
  895. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +0 -178
  896. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +0 -7
  897. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +0 -19
  898. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +0 -1
  899. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +0 -1128
  900. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +0 -77
  901. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +0 -86
  902. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +0 -279
  903. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +0 -252
  904. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +0 -78
  905. package/packages/shared-skills/skills/programming/scripts/go/new-project.py +0 -138
  906. package/packages/shared-skills/skills/programming/scripts/python/new-project.py +0 -172
  907. package/packages/shared-skills/skills/programming/scripts/python/new-script.py +0 -116
  908. package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +0 -178
@@ -0,0 +1,218 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+
3
+ import { afterEach, describe, expect, it } from "bun:test";
4
+
5
+ import {
6
+ createWorkspaceEditTestHarness,
7
+ readEvents,
8
+ renameTextEdit,
9
+ waitForEventCount,
10
+ waitForEventCountBySubscription,
11
+ } from "./workspace-apply-edit-test-support.js";
12
+
13
+ const harness = createWorkspaceEditTestHarness();
14
+
15
+ afterEach(async () => {
16
+ await harness.cleanup();
17
+ });
18
+
19
+ describe("LspClient workspace mutation lease", () => {
20
+ it("#given no mutating request #when the server calls applyEdit #then the request is rejected as unscoped", async () => {
21
+ const context = await harness.makeClient({
22
+ unscopedApplyEditOnDidOpen: renameTextEdit("before", "after", { version: 1 }),
23
+ });
24
+ const response = waitForEventCountBySubscription(
25
+ context.events,
26
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
27
+ 1,
28
+ );
29
+ await context.client.openFile(context.source);
30
+ const responses = await response;
31
+
32
+ expect(responses[0]?.result).toEqual({
33
+ applied: false,
34
+ failureReason: expect.stringContaining("active workspace mutation"),
35
+ });
36
+ expect(readFileSync(context.source, "utf-8")).toBe("const before = 1;\n");
37
+ });
38
+
39
+ it("#given one valid server apply #when the server applies twice #then the repeated request is rejected", async () => {
40
+ const context = await harness.makeClient({
41
+ renameSteps: [
42
+ { applyEdit: renameTextEdit("before", "after", { version: 1 }), applyTwice: true, renameResult: "same" },
43
+ ],
44
+ });
45
+ await context.client.openFile(context.source);
46
+
47
+ const result = await context.client.rename(context.source, 1, 6, "after");
48
+
49
+ expect(result.apply.success).toBe(true);
50
+ const responses = readEvents(context.events).filter(
51
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
52
+ );
53
+ expect(responses).toHaveLength(2);
54
+ expect(responses[0]?.result).toEqual({ applied: true });
55
+ expect(responses[1]?.result).toEqual({
56
+ applied: false,
57
+ failureReason: expect.stringContaining("already handled"),
58
+ });
59
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
60
+ });
61
+
62
+ it("#given two concurrent server applies #when one enters commit #then the other is rejected without a second write", async () => {
63
+ const context = await harness.makeClient({
64
+ renameSteps: [
65
+ {
66
+ applyEdit: renameTextEdit("before", "after", { version: 1 }),
67
+ applyConcurrently: true,
68
+ renameResult: "same",
69
+ },
70
+ ],
71
+ });
72
+ let writes = 0;
73
+ context.client.setWorkspaceEditIo({
74
+ writeFile(path, content) {
75
+ writes += 1;
76
+ writeFileSync(path, content, "utf-8");
77
+ },
78
+ });
79
+ await context.client.openFile(context.source);
80
+
81
+ const result = await context.client.rename(context.source, 1, 6, "after");
82
+
83
+ expect(result.apply.success).toBe(true);
84
+ expect(writes).toBe(1);
85
+ const responses = readEvents(context.events).filter(
86
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
87
+ );
88
+ expect(responses.map((response) => response.result)).toContainEqual({ applied: true });
89
+ const rejection = responses.find(
90
+ (response) => typeof response.result === "object" && response.result !== null && "failureReason" in response.result,
91
+ );
92
+ expect(rejection?.result).toMatchObject({ applied: false });
93
+ expect(JSON.stringify(rejection?.result)).toMatch(/already (?:in progress|handled)/);
94
+ });
95
+
96
+ it("#given a rename lease is held #when another rename starts #then it is rejected without a second request", async () => {
97
+ const context = await harness.makeClient({
98
+ renameSteps: [
99
+ {
100
+ renameResult: "edit",
101
+ renameEdit: renameTextEdit("before", "after", { version: 1 }),
102
+ responseDelayMs: 150,
103
+ },
104
+ ],
105
+ });
106
+ await context.client.openFile(context.source);
107
+ const firstPromise = context.client.rename(context.source, 1, 6, "after");
108
+ await waitForEventCount(
109
+ context.events,
110
+ (event) => event.type === "clientRequest" && event.method === "textDocument/rename",
111
+ 1,
112
+ );
113
+
114
+ const concurrent = await context.client.rename(context.source, 1, 6, "other_");
115
+ const first = await firstPromise;
116
+
117
+ expect(concurrent.apply.success).toBe(false);
118
+ expect(concurrent.apply.errors.join("\n")).toContain("workspace mutation is already in progress");
119
+ expect(first.apply.success).toBe(true);
120
+ const requests = readEvents(context.events).filter(
121
+ (event) => event.type === "clientRequest" && event.method === "textDocument/rename",
122
+ );
123
+ expect(requests).toHaveLength(1);
124
+ });
125
+
126
+ it("#given no server apply #when rename directly returns an edit #then it is applied exactly once", async () => {
127
+ const context = await harness.makeClient({
128
+ renameSteps: [{ renameResult: "edit", renameEdit: renameTextEdit("before", "after", { version: 1 }) }],
129
+ });
130
+ await context.client.openFile(context.source);
131
+
132
+ const result = await context.client.rename(context.source, 1, 6, "after");
133
+
134
+ expect(result.apply.success).toBe(true);
135
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
136
+ expect(readEvents(context.events).filter((event) => event.method === "workspace/applyEdit")).toHaveLength(0);
137
+ });
138
+
139
+ it("#given cancellation before a delayed server apply #when the rename request is aborted #then no file is mutated", async () => {
140
+ const controller = new AbortController();
141
+ const context = await harness.makeClient({
142
+ renameSteps: [
143
+ {
144
+ applyEdit: renameTextEdit("before", "after", { version: 1 }),
145
+ applyDelayMs: 100,
146
+ renameResult: "same",
147
+ },
148
+ ],
149
+ });
150
+ await context.client.openFile(context.source);
151
+ const rename = context.client.rename(context.source, 1, 6, "after", controller.signal);
152
+ await waitForEventCount(
153
+ context.events,
154
+ (event) => event.type === "clientRequest" && event.method === "textDocument/rename",
155
+ 1,
156
+ );
157
+ controller.abort();
158
+
159
+ await expect(rename).rejects.toThrow(/cancel/i);
160
+
161
+ const [cancel] = await waitForEventCount(
162
+ context.events,
163
+ (event) => event.type === "clientNotification" && event.method === "$/cancelRequest",
164
+ 1,
165
+ );
166
+ expect(cancel?.params).toEqual({ id: 2 });
167
+ expect(readFileSync(context.source, "utf-8")).toBe("const before = 1;\n");
168
+ });
169
+
170
+ it("#given cancellation after the commit gate #when applyEdit finishes #then rename reports one completed late-abort mutation", async () => {
171
+ const controller = new AbortController();
172
+ const context = await harness.makeClient({
173
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 1 }), renameResult: "same" }],
174
+ });
175
+ let writes = 0;
176
+ context.client.setWorkspaceEditIo({
177
+ writeFile(path, content) {
178
+ writes += 1;
179
+ writeFileSync(path, content, "utf-8");
180
+ controller.abort();
181
+ },
182
+ });
183
+ await context.client.openFile(context.source);
184
+
185
+ const result = await context.client.rename(context.source, 1, 6, "after", controller.signal);
186
+
187
+ expect(result.apply).toMatchObject({ success: true, lateAbort: true, totalEdits: 1 });
188
+ expect(writes).toBe(1);
189
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
190
+ });
191
+
192
+ it("#given lease-backed and bare clients #when initialized #then applyEdit and annotations are advertised honestly", async () => {
193
+ const active = await harness.makeClient({});
194
+ const inactive = await harness.makeBareConnection({});
195
+
196
+ const activeCapabilities = initializeCapabilities(active.events);
197
+ const inactiveCapabilities = initializeCapabilities(inactive.events);
198
+ expect(activeCapabilities.workspace?.applyEdit).toBe(true);
199
+ expect(inactiveCapabilities.workspace?.applyEdit).toBeUndefined();
200
+ expect(activeCapabilities.textDocument?.rename?.honorsChangeAnnotations).toBeUndefined();
201
+ expect(activeCapabilities.workspace?.workspaceEdit?.changeAnnotationSupport).toBeUndefined();
202
+ });
203
+ });
204
+
205
+ interface InitializeCapabilities {
206
+ readonly workspace?: {
207
+ readonly applyEdit?: boolean;
208
+ readonly workspaceEdit?: { readonly changeAnnotationSupport?: unknown };
209
+ };
210
+ readonly textDocument?: { readonly rename?: { readonly honorsChangeAnnotations?: boolean } };
211
+ }
212
+
213
+ function initializeCapabilities(path: string): InitializeCapabilities {
214
+ const initialize = readEvents(path).find(
215
+ (event) => event.type === "clientRequest" && event.method === "initialize",
216
+ );
217
+ return (initialize?.params as { capabilities?: InitializeCapabilities } | undefined)?.capabilities ?? {};
218
+ }
@@ -0,0 +1,113 @@
1
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ import { afterEach, describe, expect, it } from "bun:test";
5
+
6
+ import type { WorkspaceEdit } from "./types.js";
7
+ import {
8
+ createWorkspaceEditTestHarness,
9
+ readEvents,
10
+ renameTextEdit,
11
+ } from "./workspace-apply-edit-test-support.js";
12
+
13
+ const harness = createWorkspaceEditTestHarness();
14
+
15
+ afterEach(async () => {
16
+ await harness.cleanup();
17
+ });
18
+
19
+ describe("LspClient workspace edit synchronization", () => {
20
+ it("#given an open edited document #when applyEdit commits #then didChange precedes didSave with the next version", async () => {
21
+ const context = await harness.makeClient({
22
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 1 }), renameResult: "same" }],
23
+ });
24
+ await context.client.openFile(context.source);
25
+
26
+ await context.client.rename(context.source, 1, 6, "after");
27
+
28
+ const notifications = readEvents(context.events).filter((event) => event.type === "clientNotification");
29
+ const changeIndex = notifications.findIndex((event) => event.method === "textDocument/didChange");
30
+ const saveIndex = notifications.findIndex((event) => event.method === "textDocument/didSave");
31
+ expect(changeIndex).toBeGreaterThan(-1);
32
+ expect(saveIndex).toBeGreaterThan(changeIndex);
33
+ expect(notifications[changeIndex]?.params).toMatchObject({ textDocument: { version: 2 } });
34
+ });
35
+
36
+ it("#given an open file resource rename #when applyEdit commits #then didClose and didOpen move document state", async () => {
37
+ const edit: WorkspaceEdit = {
38
+ documentChanges: [{ kind: "rename", oldUri: "file:///placeholder", newUri: "file:///destination" }],
39
+ };
40
+ const context = await harness.makeClient({ renameSteps: [{ applyEdit: edit, renameResult: "null" }] });
41
+ await context.client.openFile(context.source);
42
+
43
+ const result = await context.client.rename(context.source, 1, 6, "after");
44
+
45
+ expect(result.apply.success).toBe(true);
46
+ expect(existsSync(context.source)).toBe(false);
47
+ expect(readFileSync(context.destination, "utf-8")).toBe("const before = 1;\n");
48
+ expect(context.client.getOpenDocumentVersion(context.source)).toBeUndefined();
49
+ expect(context.client.getOpenDocumentVersion(context.destination)).toBe(1);
50
+ const methods = readEvents(context.events).map((event) => event.method);
51
+ expect(methods.indexOf("textDocument/didClose")).toBeLessThan(methods.lastIndexOf("textDocument/didOpen"));
52
+ });
53
+
54
+ it("#given an open file deletion #when applyEdit commits #then didClose removes document state", async () => {
55
+ const edit: WorkspaceEdit = { documentChanges: [{ kind: "delete", uri: "file:///placeholder" }] };
56
+ const context = await harness.makeClient({ renameSteps: [{ applyEdit: edit, renameResult: "null" }] });
57
+ await context.client.openFile(context.source);
58
+
59
+ const result = await context.client.rename(context.source, 1, 6, "after");
60
+
61
+ expect(result.apply.success).toBe(true);
62
+ expect(existsSync(context.source)).toBe(false);
63
+ expect(context.client.getOpenDocumentVersion(context.source)).toBeUndefined();
64
+ expect(readEvents(context.events).some((event) => event.method === "textDocument/didClose")).toBe(true);
65
+ });
66
+
67
+ it("#given a closed edited file #when applyEdit commits #then one changed watched-file event is emitted", async () => {
68
+ const edit = renameTextEdit("closed", "after_", { version: null, uri: "file:///closed" });
69
+ const context = await harness.makeClient({ renameSteps: [{ applyEdit: edit, renameResult: "null" }] });
70
+ await context.client.openFile(context.source);
71
+
72
+ const result = await context.client.rename(context.source, 1, 6, "after");
73
+
74
+ expect(result.apply.success).toBe(true);
75
+ expect(readFileSync(context.closed, "utf-8")).toBe("const after_ = 1;\n");
76
+ const watched = readEvents(context.events).find(
77
+ (event) => event.type === "clientNotification" && event.method === "workspace/didChangeWatchedFiles",
78
+ );
79
+ expect(watched?.params).toEqual({ changes: [{ uri: pathToFileURL(realpathSync(context.closed)).href, type: 2 }] });
80
+ });
81
+
82
+ it("#given a new closed file #when applyEdit creates it #then one created watched-file event is emitted", async () => {
83
+ const edit: WorkspaceEdit = { documentChanges: [{ kind: "create", uri: "file:///created" }] };
84
+ const context = await harness.makeClient({ renameSteps: [{ applyEdit: edit, renameResult: "null" }] });
85
+ await context.client.openFile(context.source);
86
+
87
+ const result = await context.client.rename(context.source, 1, 6, "after");
88
+
89
+ expect(result.apply.success).toBe(true);
90
+ expect(readFileSync(context.created, "utf-8")).toBe("");
91
+ const watched = readEvents(context.events).find(
92
+ (event) => event.type === "clientNotification" && event.method === "workspace/didChangeWatchedFiles",
93
+ );
94
+ expect(watched?.params).toEqual({ changes: [{ uri: pathToFileURL(realpathSync(context.created)).href, type: 1 }] });
95
+ });
96
+
97
+ it("#given an open file overwritten by create #when applyEdit commits #then didClose and didOpen reset its state", async () => {
98
+ const edit: WorkspaceEdit = {
99
+ documentChanges: [{ kind: "create", uri: "file:///closed", options: { overwrite: true } }],
100
+ };
101
+ const context = await harness.makeClient({ renameSteps: [{ applyEdit: edit, renameResult: "null" }] });
102
+ await context.client.openFile(context.source);
103
+ await context.client.openFile(context.closed);
104
+
105
+ const result = await context.client.rename(context.source, 1, 6, "after");
106
+
107
+ expect(result.apply.success).toBe(true);
108
+ expect(readFileSync(context.closed, "utf-8")).toBe("");
109
+ expect(context.client.getOpenDocumentVersion(context.closed)).toBe(1);
110
+ const methods = readEvents(context.events).map((event) => event.method);
111
+ expect(methods.indexOf("textDocument/didClose")).toBeLessThan(methods.lastIndexOf("textDocument/didOpen"));
112
+ });
113
+ });
@@ -0,0 +1,194 @@
1
+ import { mkdtempSync, readFileSync, realpathSync, rmSync, watch, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+
6
+ import { LspClient } from "./client.js";
7
+ import { LspClientConnection } from "./connection.js";
8
+ import type { LspClientOptions } from "./client.js";
9
+ import type { LspClientTransport } from "./transport.js";
10
+ import type { Diagnostic, ResolvedServer, WorkspaceEdit } from "./types.js";
11
+
12
+ const fixturePath = join(dirname(fileURLToPath(import.meta.url)), "fixtures", "workspace-edit-server.mjs");
13
+
14
+ export interface RecordedEvent {
15
+ readonly type: string;
16
+ readonly id?: string | number;
17
+ readonly method?: string;
18
+ readonly params?: unknown;
19
+ readonly result?: unknown;
20
+ readonly error?: unknown;
21
+ }
22
+
23
+ export interface WorkspaceEditTestContext {
24
+ readonly client: LspClient;
25
+ readonly workspace: string;
26
+ readonly source: string;
27
+ readonly destination: string;
28
+ readonly closed: string;
29
+ readonly created: string;
30
+ readonly events: string;
31
+ }
32
+
33
+ export function createWorkspaceEditTestHarness() {
34
+ const tempDirectories: string[] = [];
35
+ const clients: LspClientTransport[] = [];
36
+
37
+ return {
38
+ async cleanup(): Promise<void> {
39
+ for (const client of clients.splice(0)) await client.stop();
40
+ for (const directory of tempDirectories.splice(0)) rmSync(directory, { recursive: true, force: true });
41
+ },
42
+ async makeClient(
43
+ scenario: Record<string, unknown>,
44
+ clientOptions: Partial<LspClientOptions> = {},
45
+ ): Promise<WorkspaceEditTestContext> {
46
+ const fixture = createFixture(scenario, tempDirectories);
47
+ const client = new LspClient(fixture.workspace, fixture.server, {
48
+ requestTimeoutMs: 5_000,
49
+ initializeTimeoutMs: 5_000,
50
+ ...clientOptions,
51
+ });
52
+ clients.push(client);
53
+ await client.start();
54
+ await client.initialize();
55
+ return { client, ...fixture.paths };
56
+ },
57
+ async makeBareConnection(
58
+ scenario: Record<string, unknown>,
59
+ ): Promise<{ readonly connection: LspClientConnection; readonly events: string }> {
60
+ const fixture = createFixture(scenario, tempDirectories);
61
+ const connection = new LspClientConnection(fixture.workspace, fixture.server, {
62
+ requestTimeoutMs: 5_000,
63
+ initializeTimeoutMs: 5_000,
64
+ });
65
+ clients.push(connection);
66
+ await connection.start();
67
+ await connection.initialize();
68
+ return { connection, events: fixture.paths.events };
69
+ },
70
+ };
71
+ }
72
+
73
+ function createFixture(scenario: Record<string, unknown>, tempDirectories: string[]) {
74
+ // The fixture server echoes URIs built from the canonical temp path, so the client root must be
75
+ // canonical too. On macOS tmpdir() is a /var -> /private/var symlink; without realpath the
76
+ // publishes target a document the client never opened (#9476).
77
+ const workspace = mkdtempSync(join(realpathSync(tmpdir()), "lsp-apply-edit-"));
78
+ tempDirectories.push(workspace);
79
+ const source = join(workspace, "source.ts");
80
+ const destination = join(workspace, "destination.ts");
81
+ const closed = join(workspace, "closed.ts");
82
+ const created = join(workspace, "created.ts");
83
+ const scenarioPath = join(workspace, "scenario.json");
84
+ const events = join(workspace, "events.jsonl");
85
+ writeFileSync(source, "const before = 1;\n", "utf-8");
86
+ writeFileSync(closed, "const closed = 1;\n", "utf-8");
87
+ const uriByPlaceholder = new Map([
88
+ ["file:///placeholder", pathToFileURL(source).href],
89
+ ["file:///destination", pathToFileURL(destination).href],
90
+ ["file:///closed", pathToFileURL(closed).href],
91
+ ["file:///created", pathToFileURL(created).href],
92
+ ]);
93
+ writeFileSync(scenarioPath, JSON.stringify(replacePlaceholderUris(scenario, uriByPlaceholder)), "utf-8");
94
+ writeFileSync(events, "", "utf-8");
95
+ const server: ResolvedServer = {
96
+ id: "workspace-edit-fixture",
97
+ command: [process.env["NODE_BINARY"] ?? "node", fixturePath, scenarioPath, events],
98
+ extensions: [".ts"],
99
+ priority: 0,
100
+ };
101
+ return { workspace, server, paths: { workspace, source, destination, closed, created, events } };
102
+ }
103
+
104
+ function replacePlaceholderUris(value: unknown, uriByPlaceholder: ReadonlyMap<string, string>): unknown {
105
+ if (Array.isArray(value)) return value.map((item) => replacePlaceholderUris(item, uriByPlaceholder));
106
+ if (typeof value !== "object" || value === null) {
107
+ return typeof value === "string" ? (uriByPlaceholder.get(value) ?? value) : value;
108
+ }
109
+ return Object.fromEntries(
110
+ Object.entries(value).map(([key, item]) => [key, replacePlaceholderUris(item, uriByPlaceholder)]),
111
+ );
112
+ }
113
+
114
+ interface RenameTextEditTarget {
115
+ readonly version: number | null;
116
+ readonly uri?: string;
117
+ }
118
+
119
+ export function renameTextEdit(before: string, after: string, target: RenameTextEditTarget): WorkspaceEdit {
120
+ const uri = target.uri ?? "file:///placeholder";
121
+ return {
122
+ documentChanges: [
123
+ {
124
+ textDocument: { uri, version: target.version },
125
+ edits: [
126
+ {
127
+ range: { start: { line: 0, character: 6 }, end: { line: 0, character: 6 + before.length } },
128
+ newText: after,
129
+ },
130
+ ],
131
+ },
132
+ ],
133
+ };
134
+ }
135
+
136
+ export function diagnostic(message: string): Diagnostic {
137
+ return { range: { start: { line: 0, character: 0 }, end: { line: 0, character: 1 } }, message };
138
+ }
139
+
140
+ export function readEvents(path: string): readonly RecordedEvent[] {
141
+ const events: RecordedEvent[] = [];
142
+ for (const line of readFileSync(path, "utf-8").split("\n")) {
143
+ if (!line) continue;
144
+ const value: unknown = JSON.parse(line);
145
+ if (isRecordedEvent(value)) events.push(value);
146
+ }
147
+ return events;
148
+ }
149
+
150
+ export async function waitForEventCount(
151
+ path: string,
152
+ predicate: (event: RecordedEvent) => boolean,
153
+ count: number,
154
+ ): Promise<readonly RecordedEvent[]> {
155
+ const deadline = Date.now() + 2_000;
156
+ while (Date.now() < deadline) {
157
+ const matches = readEvents(path).filter(predicate);
158
+ if (matches.length >= count) return matches;
159
+ await new Promise((resolve) => setTimeout(resolve, 10));
160
+ }
161
+ return readEvents(path).filter(predicate);
162
+ }
163
+
164
+ export async function waitForEventCountBySubscription(
165
+ path: string,
166
+ predicate: (event: RecordedEvent) => boolean,
167
+ count: number,
168
+ ): Promise<readonly RecordedEvent[]> {
169
+ const initial = readEvents(path).filter(predicate);
170
+ if (initial.length >= count) return initial;
171
+ return new Promise((resolve) => {
172
+ let watcher: ReturnType<typeof watch> | undefined;
173
+ let timeout: ReturnType<typeof setTimeout> | undefined;
174
+ let settled = false;
175
+ const finish = (matches: readonly RecordedEvent[]): void => {
176
+ if (settled) return;
177
+ settled = true;
178
+ if (timeout !== undefined) clearTimeout(timeout);
179
+ watcher?.close();
180
+ resolve(matches);
181
+ };
182
+ const check = (): void => {
183
+ const matches = readEvents(path).filter(predicate);
184
+ if (matches.length >= count) finish(matches);
185
+ };
186
+ watcher = watch(path, { persistent: false }, check);
187
+ timeout = setTimeout(() => finish(readEvents(path).filter(predicate)), 2_000);
188
+ check();
189
+ });
190
+ }
191
+
192
+ function isRecordedEvent(value: unknown): value is RecordedEvent {
193
+ return typeof value === "object" && value !== null && "type" in value && typeof value.type === "string";
194
+ }
@@ -0,0 +1,163 @@
1
+ import { readFileSync, realpathSync, writeFileSync } from "node:fs";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ import { afterEach, describe, expect, it } from "bun:test";
5
+
6
+ import {
7
+ createWorkspaceEditTestHarness,
8
+ diagnostic,
9
+ readEvents,
10
+ renameTextEdit,
11
+ } from "./workspace-apply-edit-test-support.js";
12
+
13
+ const harness = createWorkspaceEditTestHarness();
14
+
15
+ afterEach(async () => {
16
+ await harness.cleanup();
17
+ });
18
+
19
+ describe("LspClient workspace/applyEdit", () => {
20
+ it("#given a server-applied edit returned again by rename #when rename completes #then one write is reused truthfully", async () => {
21
+ const context = await harness.makeClient({
22
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 1 }), renameResult: "same" }],
23
+ diagnostics: [diagnostic("fresh")],
24
+ });
25
+ let writes = 0;
26
+ context.client.setWorkspaceEditIo({
27
+ writeFile(path, content) {
28
+ writes += 1;
29
+ writeFileSync(path, content, "utf-8");
30
+ },
31
+ });
32
+ await context.client.openFile(context.source);
33
+
34
+ const result = await context.client.rename(context.source, 1, 6, "after");
35
+
36
+ expect(result.apply.success).toBe(true);
37
+ expect(result.apply.totalEdits).toBe(1);
38
+ expect(writes).toBe(1);
39
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
40
+ expect(context.client.getOpenDocumentVersion(context.source)).toBe(2);
41
+ expect(context.client.getStoredDiagnostics(pathToFileURL(realpathSync(context.source)).href)).toEqual([
42
+ diagnostic("fresh"),
43
+ ]);
44
+ const responses = readEvents(context.events).filter(
45
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
46
+ );
47
+ expect(responses).toHaveLength(1);
48
+ expect(responses[0]?.result).toEqual({ applied: true });
49
+ });
50
+
51
+ it("#given a server-applied edit and a null rename result #when rename completes #then the recorded result is reused", async () => {
52
+ const context = await harness.makeClient({
53
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 1 }), renameResult: "null" }],
54
+ });
55
+ await context.client.openFile(context.source);
56
+
57
+ const result = await context.client.rename(context.source, 1, 6, "after");
58
+
59
+ expect(result.edit).toBeNull();
60
+ expect(result.apply.success).toBe(true);
61
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
62
+ });
63
+
64
+ it("#given two versioned server edits #when applied sequentially #then the synchronized version accepts the second edit", async () => {
65
+ const context = await harness.makeClient({
66
+ renameSteps: [
67
+ { applyEdit: renameTextEdit("before", "first_", { version: 1 }), renameResult: "same" },
68
+ { applyEdit: renameTextEdit("first_", "second", { version: 2 }), renameResult: "same" },
69
+ ],
70
+ });
71
+ await context.client.openFile(context.source);
72
+
73
+ const first = await context.client.rename(context.source, 1, 6, "first_");
74
+ const second = await context.client.rename(context.source, 1, 6, "second");
75
+
76
+ expect(first.apply.success).toBe(true);
77
+ expect(second.apply.success).toBe(true);
78
+ expect(context.client.getOpenDocumentVersion(context.source)).toBe(3);
79
+ expect(readFileSync(context.source, "utf-8")).toBe("const second = 1;\n");
80
+ });
81
+
82
+ it("#given a mismatched document version #when the server requests applyEdit #then mutation is rejected truthfully", async () => {
83
+ const context = await harness.makeClient({
84
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 9 }), renameResult: "same" }],
85
+ });
86
+ await context.client.openFile(context.source);
87
+
88
+ const result = await context.client.rename(context.source, 1, 6, "after");
89
+
90
+ expect(result.apply.success).toBe(false);
91
+ expect(result.apply.errors.join("\n")).toContain("document version");
92
+ expect(readFileSync(context.source, "utf-8")).toBe("const before = 1;\n");
93
+ const response = readEvents(context.events).find(
94
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
95
+ );
96
+ expect(response?.result).toEqual({
97
+ applied: false,
98
+ failureReason: expect.stringContaining("document version"),
99
+ failedChange: 0,
100
+ });
101
+ });
102
+
103
+ it("#given a server-applied edit and a different rename result #when rename completes #then conflict is reported without a second mutation", async () => {
104
+ const context = await harness.makeClient({
105
+ renameSteps: [
106
+ {
107
+ applyEdit: renameTextEdit("before", "after", { version: 1 }),
108
+ renameResult: "different",
109
+ differentEdit: renameTextEdit("before", "other_", { version: 1 }),
110
+ },
111
+ ],
112
+ });
113
+ let writes = 0;
114
+ context.client.setWorkspaceEditIo({
115
+ writeFile(path, content) {
116
+ writes += 1;
117
+ writeFileSync(path, content, "utf-8");
118
+ },
119
+ });
120
+ await context.client.openFile(context.source);
121
+
122
+ const result = await context.client.rename(context.source, 1, 6, "after");
123
+
124
+ expect(result.apply.success).toBe(false);
125
+ expect(result.apply.errors.join("\n")).toContain("conflicts with server-applied workspace edit");
126
+ expect(writes).toBe(1);
127
+ expect(readFileSync(context.source, "utf-8")).toBe("const after = 1;\n");
128
+ });
129
+
130
+ it("#given a real commit I/O failure #when the server requests applyEdit #then both protocol and rename result report failure", async () => {
131
+ const context = await harness.makeClient({
132
+ renameSteps: [{ applyEdit: renameTextEdit("before", "after", { version: 1 }), renameResult: "same" }],
133
+ });
134
+ context.client.setWorkspaceEditIo({
135
+ writeFile() {
136
+ throw new InjectedWorkspaceIoError();
137
+ },
138
+ });
139
+ await context.client.openFile(context.source);
140
+
141
+ const result = await context.client.rename(context.source, 1, 6, "after");
142
+
143
+ expect(result.apply.success).toBe(false);
144
+ expect(result.apply.errors.join("\n")).toContain("I/O failure during text");
145
+ expect(readFileSync(context.source, "utf-8")).toBe("const before = 1;\n");
146
+ const response = readEvents(context.events).find(
147
+ (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
148
+ );
149
+ expect(response?.result).toEqual({
150
+ applied: false,
151
+ failureReason: expect.stringContaining("I/O failure during text"),
152
+ failedChange: 0,
153
+ });
154
+ });
155
+ });
156
+
157
+ class InjectedWorkspaceIoError extends Error {
158
+ override readonly name = "InjectedWorkspaceIoError";
159
+
160
+ constructor() {
161
+ super("injected workspace I/O failure");
162
+ }
163
+ }