lazycodex-ai 5.1.44 → 5.1.45

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 (273) hide show
  1. package/dist/cli/index.js +948 -416
  2. package/dist/cli/service-auth/keystore.d.ts +4 -2
  3. package/dist/cli-node/index.js +948 -416
  4. package/docs/reference/web-terminal-visual-qa.md +8 -0
  5. package/package.json +1 -1
  6. package/packages/lsp-daemon/dist/cli.js +4 -4
  7. package/packages/lsp-daemon/dist/client.js +4 -4
  8. package/packages/lsp-daemon/dist/index.js +4 -4
  9. package/packages/lsp-daemon/package.json +3 -3
  10. package/packages/lsp-tools-mcp/dist/cli.js +4 -4
  11. package/packages/lsp-tools-mcp/dist/mcp.js +4 -4
  12. package/packages/lsp-tools-mcp/dist/tools.js +4 -4
  13. package/packages/lsp-tools-mcp/package.json +3 -3
  14. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +62 -21
  16. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -1
  19. package/packages/omo-codex/plugin/components/comment-checker/biome.json +1 -21
  20. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/package.json +4 -4
  22. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +1 -21
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +4 -4
  27. package/packages/omo-codex/plugin/components/lsp/biome.json +1 -21
  28. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  29. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +4 -4
  30. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  31. package/packages/omo-codex/plugin/components/lsp/package.json +4 -4
  32. package/packages/omo-codex/plugin/components/lsp/scripts/build-runtime.mjs +0 -1
  33. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-not-installed.test.ts +1 -1
  34. package/packages/omo-codex/plugin/components/rules/biome.json +1 -21
  35. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  36. package/packages/omo-codex/plugin/components/rules/package.json +4 -4
  37. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  38. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/telemetry/biome.json +1 -21
  40. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +90 -1
  41. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +91 -1
  42. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/package.json +4 -4
  44. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +2 -2
  45. package/packages/omo-codex/plugin/components/ultrawork/biome.json +1 -21
  46. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  47. package/packages/omo-codex/plugin/components/ultrawork/package.json +4 -4
  48. package/packages/omo-codex/plugin/components/ulw-execute-continuation/biome.json +1 -21
  49. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
  50. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  51. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +4 -4
  52. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -21
  53. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +1 -1
  54. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +7 -7
  55. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +5 -5
  56. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +1 -1
  57. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  58. package/packages/omo-codex/plugin/components/ulw-loop/package.json +4 -4
  59. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +5 -5
  61. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +1 -1
  62. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +2 -0
  63. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  84. package/packages/omo-codex/plugin/package-lock.json +12 -12
  85. package/packages/omo-codex/plugin/package.json +1 -1
  86. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +7 -7
  87. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +2 -0
  88. package/packages/omo-codex/plugin/skills/browser/SKILL.md +21 -22
  89. package/packages/omo-codex/plugin/skills/browser/references/commands.md +2 -9
  90. package/packages/omo-codex/plugin/skills/browser/references/install.md +1 -2
  91. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  92. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +2 -2
  93. package/packages/omo-codex/plugin/skills/browser/scripts/browser-engine-guard.mjs +63 -487
  94. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +1 -1
  95. package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +1 -10
  96. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +79 -118
  97. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +75 -224
  98. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +32 -27
  99. package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +2 -2
  100. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
  101. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
  102. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/collect-files.ts +53 -0
  103. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
  104. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
  105. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
  106. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
  107. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
  108. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
  109. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
  110. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
  111. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
  112. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
  113. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
  114. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
  115. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
  116. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
  117. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
  118. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
  119. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
  120. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
  121. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
  122. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
  123. package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -7
  124. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +10 -7
  125. package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +9 -23
  126. package/packages/omo-codex/plugin/skills/programming/references/typescript/oxc-lint.md +130 -0
  127. package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +6 -62
  128. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
  129. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +20 -81
  130. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
  131. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
  132. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
  133. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
  134. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
  135. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
  136. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
  137. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +14 -14
  138. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
  139. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +2 -2
  140. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +2 -2
  141. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  142. package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +9 -3
  143. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  144. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +7 -6
  145. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger-grammar.md +116 -0
  146. package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +51 -3
  147. package/packages/omo-codex/plugin/skills/ulw-research/scripts/claims-index.mjs +125 -0
  148. package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +68 -3
  149. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-kinds.mjs +136 -0
  150. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-schema.mjs +204 -0
  151. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger.mjs +103 -0
  152. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-brief.mjs +145 -0
  153. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-state.mjs +63 -0
  154. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +1 -1
  155. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-structure.mjs +1 -1
  156. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-text.mjs +1 -27
  157. package/packages/omo-codex/plugin/skills/ulw-research/scripts/lexicon.mjs +47 -0
  158. package/packages/omo-codex/plugin/skills/ulw-research/scripts/numerals.mjs +226 -0
  159. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +2 -3
  160. package/packages/omo-codex/plugin/skills/ulw-research/scripts/particles-ko.mjs +108 -0
  161. package/packages/omo-codex/plugin/skills/ulw-research/scripts/rational.mjs +139 -0
  162. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +2 -2
  163. package/packages/omo-codex/plugin/skills/ulw-research/scripts/sentence-split.mjs +77 -0
  164. package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-normalize.mjs +82 -0
  165. package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-similarity.mjs +28 -0
  166. package/packages/omo-codex/plugin/skills/ulw-research/scripts/units.mjs +105 -0
  167. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +71 -64
  168. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +4 -1
  169. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +6 -6
  170. package/packages/omo-codex/scripts/install-dist/install-local.mjs +152 -23
  171. package/packages/shared-skills/skills/browser/SKILL.md +21 -22
  172. package/packages/shared-skills/skills/browser/references/commands.md +2 -9
  173. package/packages/shared-skills/skills/browser/references/install.md +1 -2
  174. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  175. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +2 -2
  176. package/packages/shared-skills/skills/browser/scripts/browser-engine-guard.mjs +63 -487
  177. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +1 -1
  178. package/packages/shared-skills/skills/browser/scripts/omowright.mjs +1 -10
  179. package/packages/shared-skills/skills/frontend/SKILL.md +79 -118
  180. package/packages/shared-skills/skills/frontend/references/design/README.md +75 -224
  181. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +32 -27
  182. package/packages/shared-skills/skills/frontend/references/perfection/README.md +2 -2
  183. package/packages/shared-skills/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
  184. package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.test.ts +101 -0
  185. package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
  186. package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.test.ts +50 -0
  187. package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.ts +53 -0
  188. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
  189. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
  190. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
  191. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
  192. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
  193. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
  194. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
  195. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
  196. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
  197. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
  198. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
  199. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
  200. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
  201. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
  202. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
  203. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
  204. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
  205. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
  206. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
  207. package/packages/shared-skills/skills/programming/SKILL.md +10 -7
  208. package/packages/shared-skills/skills/programming/references/typescript/README.md +10 -7
  209. package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +9 -23
  210. package/packages/shared-skills/skills/programming/references/typescript/oxc-lint.md +130 -0
  211. package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +6 -62
  212. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
  213. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.test.ts +162 -0
  214. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +20 -81
  215. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
  216. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
  217. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
  218. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
  219. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
  220. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
  221. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
  222. package/packages/shared-skills/skills/refactor/SKILL.md +13 -13
  223. package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
  224. package/packages/shared-skills/skills/ulw-research/AGENTS.md +9 -3
  225. package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
  226. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +7 -6
  227. package/packages/shared-skills/skills/ulw-research/references/fact-ledger-grammar.md +116 -0
  228. package/packages/shared-skills/skills/ulw-research/references/report-gates.md +51 -3
  229. package/packages/shared-skills/skills/ulw-research/scripts/claims-index.mjs +125 -0
  230. package/packages/shared-skills/skills/ulw-research/scripts/claims-index.test.ts +149 -0
  231. package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +68 -3
  232. package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +97 -12
  233. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-grammar.test.ts +190 -0
  234. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +136 -0
  235. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +141 -0
  236. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.mjs +204 -0
  237. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.test.ts +43 -0
  238. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.mjs +103 -0
  239. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.test.ts +252 -0
  240. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.mjs +145 -0
  241. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.test.ts +179 -0
  242. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.mjs +63 -0
  243. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.test.ts +46 -0
  244. package/packages/shared-skills/skills/ulw-research/scripts/gates-context.test.ts +64 -0
  245. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +1 -1
  246. package/packages/shared-skills/skills/ulw-research/scripts/gates-structure.mjs +1 -1
  247. package/packages/shared-skills/skills/ulw-research/scripts/gates-text.mjs +1 -27
  248. package/packages/shared-skills/skills/ulw-research/scripts/lexicon.mjs +47 -0
  249. package/packages/shared-skills/skills/ulw-research/scripts/lexicon.test.ts +57 -0
  250. package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +226 -0
  251. package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +120 -0
  252. package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +2 -3
  253. package/packages/shared-skills/skills/ulw-research/scripts/outcome.test.ts +29 -0
  254. package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.mjs +108 -0
  255. package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.test.ts +86 -0
  256. package/packages/shared-skills/skills/ulw-research/scripts/rational.mjs +139 -0
  257. package/packages/shared-skills/skills/ulw-research/scripts/rational.test.ts +46 -0
  258. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +2 -2
  259. package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.mjs +77 -0
  260. package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.test.ts +109 -0
  261. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/claim-graph.md +13 -0
  262. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-locked.md +17 -0
  263. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-pending.md +17 -0
  264. package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.mjs +82 -0
  265. package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.test.ts +73 -0
  266. package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.mjs +28 -0
  267. package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.test.ts +38 -0
  268. package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +105 -0
  269. package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +83 -0
  270. package/packages/shared-skills/skills/visual-qa/SKILL.md +70 -63
  271. package/packages/shared-skills/skills/visual-qa/scripts/skill-doc-fields.test.ts +34 -0
  272. package/script/qa/web-terminal-visual-qa.mjs +6 -2
  273. package/script/qa/xterm-live-terminal.mjs +26 -3
@@ -91,31 +91,15 @@ bun install
91
91
  bun run dev
92
92
  ```
93
93
 
94
- ## Lint + format — Biome
94
+ ## Lint + format: oxlint + oxfmt
95
95
 
96
- Biome replaces ESLint + Prettier with one tool, written in Rust, ~30x faster.
96
+ **Strongly prefer oxlint + oxfmt for new TS/JS projects**, including the local `no-em-dash-copy` and `require-suppression-reason` plugin. Keep ESLint, Prettier, or Biome only when the repository already uses them.
97
97
 
98
98
  ```bash
99
- bun add --dev @biomejs/biome
100
- bun biome init
99
+ bun add --dev oxlint@1.89.0 oxfmt@0.74.0 oxlint-tsgolint@7.0.2005
101
100
  ```
102
101
 
103
- `biome.json`:
104
-
105
- ```json
106
- {
107
- "$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
108
- "organizeImports": { "enabled": true },
109
- "linter": { "enabled": true, "rules": { "recommended": true } },
110
- "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2 }
111
- }
112
- ```
113
-
114
- Use ESLint only when:
115
- - You have an ESLint plugin Biome doesn't replicate (rare in 2026)
116
- - You're contributing to an existing ESLint project
117
-
118
- Never run both — pick one.
102
+ Copy `.oxlintrc.json`, `.oxfmtrc.json`, and the plain-JS plugin with its license from [oxc-lint.md](oxc-lint.md), or run the scaffold. The reference explains product-source scoping and verified strict rules. Use `oxlint --type-aware --deny-warnings` where the companion/runtime/project supports it, plus `oxfmt --check` and `tsc --noEmit`. On unsupported targets use syntax lint and keep the compiler gate; do not claim type-aware checks ran.
119
103
 
120
104
  ## Test runner — bun test or vitest
121
105
 
@@ -166,8 +150,8 @@ NEVER Jest for a new project. Jest's CommonJS-first design fights every modern N
166
150
  mkdir my-api && cd my-api
167
151
  bun init -y
168
152
  bun add hono hono-openapi @scalar/hono-api-reference @hono/swagger-ui zod
169
- bun add --dev @biomejs/biome typescript
170
- bun biome init
153
+ bun add --dev oxlint@1.89.0 oxfmt@0.74.0 oxlint-tsgolint@7.0.2005 typescript
154
+ # Copy the configs and plugin from oxc-lint.md, including the plugin LICENSE.
171
155
  ```
172
156
 
173
157
  `package.json` scripts:
@@ -179,7 +163,9 @@ bun biome init
179
163
  "start": "bun run src/index.ts",
180
164
  "build": "bun build src/index.ts --target bun --outdir dist",
181
165
  "typecheck": "tsc --noEmit",
182
- "lint": "biome check --write src tests",
166
+ "lint": "oxlint --type-aware --deny-warnings",
167
+ "fmt": "oxfmt",
168
+ "fmt:check": "oxfmt --check",
183
169
  "test": "bun test"
184
170
  }
185
171
  }
@@ -0,0 +1,130 @@
1
+ # Default TypeScript / JavaScript lint and format setup
2
+
3
+ **Use oxlint + oxfmt with `no-em-dash-copy` and `require-suppression-reason` by default.** Strongly prefer this OXC toolchain for new projects. Retain ESLint, Prettier, or Biome only when the repository already uses them; do not migrate an existing toolchain as incidental cleanup.
4
+
5
+ ## Install and run
6
+
7
+ ```bash
8
+ bun add --dev oxlint@1.89.0 oxfmt@0.74.0 oxlint-tsgolint@7.0.2005
9
+ bunx oxlint --type-aware --deny-warnings
10
+ bunx oxfmt --check
11
+ bunx tsc --noEmit
12
+ ```
13
+
14
+ The scaffold at `../../scripts/typescript/new-project.ts` copies the configs and plugin below. For manual setup, copy `.oxlintrc.json`, `.oxfmtrc.json`, and `lint/oxlint-plugin/` (including `LICENSE`) from `../../scripts/typescript/oxc/` into the project root. Merge the `tsconfig.json` flags into an existing project's config; copy that file only for a new project. The plugin is plain ESM JavaScript; use `"type": "module"` in `package.json`.
15
+
16
+ `--type-aware` requires the installed `oxlint-tsgolint` companion and a supported runtime/platform and TS project. Use it wherever supported. For syntax-only JS or an unsupported target, use `oxlint --deny-warnings`; retain the compiler gate for TS/checked JS and report that type-aware rules did not run. Type-aware lint does not replace `tsc --noEmit`. JS plugins are experimental, so keep these tested versions pinned and re-verify upgrades.
17
+
18
+ ## Complete .oxlintrc.json
19
+
20
+ ```json
21
+ {
22
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
23
+ "plugins": ["typescript", "import", "oxc"],
24
+ "jsPlugins": [
25
+ { "name": "programming", "specifier": "./lint/oxlint-plugin/index.js" }
26
+ ],
27
+ "categories": { "correctness": "error", "suspicious": "error" },
28
+ "rules": {
29
+ "typescript/no-explicit-any": "error",
30
+ "typescript/no-non-null-assertion": "error",
31
+ "typescript/consistent-type-imports": "error",
32
+ "typescript/ban-ts-comment": [
33
+ "error",
34
+ { "ts-expect-error": true, "ts-ignore": true, "ts-nocheck": true, "ts-check": false }
35
+ ],
36
+ "typescript/no-empty-object-type": "error",
37
+ "typescript/no-wrapper-object-types": "error",
38
+ "typescript/no-floating-promises": "error",
39
+ "typescript/no-misused-promises": "error",
40
+ "typescript/switch-exhaustiveness-check": "error",
41
+ "import/no-default-export": "error",
42
+ "no-param-reassign": "error",
43
+ "no-unused-vars": "error",
44
+ "no-empty": "error",
45
+ "no-fallthrough": "error",
46
+ "prefer-const": "error",
47
+ "programming/require-suppression-reason": "error"
48
+ },
49
+ "ignorePatterns": ["node_modules/**", "dist/**", "build/**", "coverage/**", "vendor/**"],
50
+ "overrides": [
51
+ {
52
+ "files": ["src/**/*", "apps/*/src/**/*", "packages/*/src/**/*"],
53
+ "rules": { "programming/no-em-dash-copy": "error" }
54
+ },
55
+ {
56
+ "files": [
57
+ "**/*.{test,spec}.*",
58
+ "**/{test,tests,__tests__,fixtures,__fixtures__,_generated,vendor,vendored}/**",
59
+ "**/*.{gen,generated}.*"
60
+ ],
61
+ "rules": { "programming/no-em-dash-copy": "off" }
62
+ },
63
+ {
64
+ "files": ["src/index.ts", "lint/oxlint-plugin/*.js"],
65
+ "rules": { "import/no-default-export": "off" }
66
+ }
67
+ ]
68
+ }
69
+ ```
70
+
71
+ The final override is for Hono's required entrypoint export and the plugin API's default exports. Remove the `src/index.ts` exception in projects without that framework requirement. Adjust product globs to the repository's real source roots. Tests, fixtures, generated code, and vendored code are exempt from the copy rule, not from type strictness.
72
+
73
+ ## Complete .oxfmtrc.json
74
+
75
+ ```json
76
+ {
77
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
78
+ "printWidth": 100,
79
+ "tabWidth": 2,
80
+ "useTabs": false,
81
+ "semi": true,
82
+ "singleQuote": false,
83
+ "ignorePatterns": ["node_modules/**", "dist/**", "build/**", "coverage/**", "vendor/**"]
84
+ }
85
+ ```
86
+
87
+ Use `oxfmt` to write formatting and `oxfmt --check` in CI. Keep lint/type suppression directives on their own lines; put a reason on the directive or a separate comment above, never join the directive to the code it covers.
88
+
89
+ ## Local JavaScript plugin
90
+
91
+ The complete, copyable implementation lives in:
92
+
93
+ - [`index.js`](../../scripts/typescript/oxc/lint/oxlint-plugin/index.js): registers both rules.
94
+ - [`no-em-dash-copy.js`](../../scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js): visits string `Literal`, cooked `TemplateElement`, and `JSXText`. Escaped em dashes are caught; comments and regex literals are exempt.
95
+ - [`require-suppression-reason.js`](../../scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js): checks oxlint/eslint disable directives and `@ts-expect-error`, `@ts-ignore`, `@ts-nocheck`. A reason follows the directive (`-- reason` for lint directives), or appears in a comment line above. Enable directives are exempt.
96
+ - [`LICENSE`](../../scripts/typescript/oxc/lint/oxlint-plugin/LICENSE): retain alongside copied code.
97
+
98
+ The copy diagnostic is exactly: "No em dashes in product copy. Use a period, comma, colon, or parentheses instead."
99
+
100
+ Rewrite paired em dashes as asides using parentheses or commas, not colon chains. Choose punctuation from the whole sentence rather than replacing each dash token mechanically. The rule deliberately does not auto-fix prose.
101
+
102
+ A reason is necessary, not permission to suppress an error. The strict TS config still bans type suppression directives even when explained. Fix the type; the reason rule additionally protects repositories where a justified exception is already allowed.
103
+
104
+ ## Strictness mapping
105
+
106
+ Built-in names below were checked against oxlint **1.89.0**'s installed `configuration_schema.json` and by running the generated config. Re-check the installed schema or `oxlint --rules` before adding a rule; do not guess ESLint/Biome translations.
107
+
108
+ | Intent | Enforcement |
109
+ |---|---|
110
+ | No explicit `any` | `typescript/no-explicit-any` |
111
+ | No non-null assertions | `typescript/no-non-null-assertion` |
112
+ | Explicit type-only imports | `typescript/consistent-type-imports` + `verbatimModuleSyntax` |
113
+ | No TS suppressions | `typescript/ban-ts-comment` with all suppression directives banned |
114
+ | Named exports | `import/no-default-export`, with narrow framework/plugin exceptions |
115
+ | No parameter assignment | `no-param-reassign` |
116
+ | No unused variables or imports | `no-unused-vars` |
117
+ | No empty catches or switch fallthrough | `no-empty`, `no-fallthrough` |
118
+ | Prefer constant bindings | `prefer-const` |
119
+ | Avoid empty object and wrapper types | `typescript/no-empty-object-type`, `typescript/no-wrapper-object-types` |
120
+ | Await promises and avoid async callbacks in synchronous contracts | `typescript/no-floating-promises`, `typescript/no-misused-promises` (`--type-aware`) |
121
+ | Exhaustive discriminated unions | `typescript/switch-exhaustiveness-check` (`--type-aware`) + `assertNever` |
122
+ | No assertion escapes, enums, or catch-without-narrowing | Existing `check-no-excuse-rules.ts` audit; these are not claimed as built-in oxlint rules |
123
+
124
+ ## Provenance and license
125
+
126
+ Source: **pingdotgg/t3code oxlint plugin at d7f3b72**; `no-em-dash-copy` from **t3code#23799**, `require-suppression-reason` from **t3code#16294**. This plain-JS port uses `sisyphuslabs/omo-relay`'s `lint/oxlint-plugin/{index,no-em-dash-copy,require-suppression-reason}.js`, with the local plugin namespace renamed to `programming`.
127
+
128
+ The upstream [license at d7f3b72](https://github.com/pingdotgg/t3code/blob/d7f3b72/LICENSE) is **MIT**, copyright (c) 2026 T3 Tools Inc. The full notice is shipped in the plugin's `LICENSE` and copied by the scaffold.
129
+
130
+ References: [JS plugins](https://oxc.rs/docs/guide/usage/linter/js-plugins.html), [type-aware lint](https://oxc.rs/docs/guide/usage/linter/type-aware.html), [oxlint config](https://oxc.rs/docs/guide/usage/linter/config.html), [oxfmt config](https://oxc.rs/docs/guide/usage/formatter/config.html).
@@ -1,4 +1,4 @@
1
- # Strict tsconfig + Biome
1
+ # Strict tsconfig + OXC
2
2
 
3
3
  The canonical ultra-strict config. Copy-paste, then add your own paths.
4
4
 
@@ -72,73 +72,17 @@ For Bun projects, add to `compilerOptions`:
72
72
 
73
73
  ---
74
74
 
75
- ## biome.jsonc
75
+ ## oxlint + oxfmt
76
76
 
77
- ```jsonc
78
- {
79
- "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
80
- "organizeImports": {
81
- "enabled": true
82
- },
83
- "linter": {
84
- "enabled": true,
85
- "rules": {
86
- "recommended": true,
87
- "suspicious": {
88
- "noExplicitAny": "error",
89
- "noConfusingVoidType": "error",
90
- "noFallthroughSwitchClause": "error"
91
- },
92
- "style": {
93
- "noDefaultExport": "error",
94
- "useImportType": "error",
95
- "noNonNullAssertion": "error",
96
- "useEnumInitializers": "off",
97
- "noParameterAssign": "error"
98
- },
99
- "correctness": {
100
- "noUnusedVariables": "error",
101
- "noUnusedImports": "error"
102
- },
103
- "complexity": {
104
- "noBannedTypes": "error"
105
- }
106
- }
107
- },
108
- "formatter": {
109
- "enabled": true,
110
- "indentStyle": "space",
111
- "indentWidth": 2,
112
- "lineWidth": 100
113
- },
114
- "javascript": {
115
- "formatter": {
116
- "quoteStyle": "double",
117
- "semicolons": "asNeeded"
118
- }
119
- },
120
- "files": {
121
- "ignore": ["node_modules", "dist", "build", ".next", ".nuxt", "coverage"]
122
- }
123
- }
124
- ```
125
-
126
- ### Key Biome rules
127
-
128
- | Rule | What |
129
- |---|---|
130
- | `noExplicitAny` | `any` in annotations is an error |
131
- | `noNonNullAssertion` | `x!` is an error |
132
- | `noDefaultExport` | Forces named exports |
133
- | `useImportType` | Forces `import type` for type-only imports |
134
- | `noParameterAssign` | No mutation of function parameters |
77
+ Use [oxc-lint.md](oxc-lint.md) for the complete `.oxlintrc.json`, `.oxfmtrc.json`, and local JS plugin. It maps the strictness intent to verified oxlint rules, adds the two t3code copy rules, and documents type-aware support. Retain ESLint, Prettier, or Biome only in repositories already using them.
135
78
 
136
79
  ---
137
80
 
138
81
  ## CI gate
139
82
 
140
83
  ```bash
141
- bunx biome check .
84
+ bunx oxlint --type-aware --deny-warnings
85
+ bunx oxfmt --check
142
86
  bunx tsc --noEmit
143
87
  bun test
144
88
  ```
@@ -148,5 +92,5 @@ bun test
148
92
  ## Sources
149
93
 
150
94
  - TypeScript: [tsconfig reference](https://www.typescriptlang.org/tsconfig)
151
- - Biome: [configuration](https://biomejs.dev/reference/configuration/)
95
+ - OXC: [oxlint configuration](https://oxc.rs/docs/guide/usage/linter/config.html) and [oxfmt configuration](https://oxc.rs/docs/guide/usage/formatter/config.html)
152
96
  - Total TypeScript: [tsconfig cheat sheet](https://www.totaltypescript.com/tsconfig-cheat-sheet)
@@ -180,24 +180,24 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
180
180
  const typeText = node.type.getText(sourceFile)
181
181
  if (typeText === "any") {
182
182
  const p = pos(node)
183
- violations.push({ ruleId: "no-any-assertion", filePath, ...p, message: "`as any` — narrow with type guards or redesign the types" })
183
+ violations.push({ ruleId: "no-any-assertion", filePath, ...p, message: "`as any`: narrow with type guards or redesign the types" })
184
184
  }
185
185
  if (typeText === "unknown") {
186
186
  const p = pos(node)
187
- violations.push({ ruleId: "no-unknown-assertion", filePath, ...p, message: "`as unknown` — redesign the types" })
187
+ violations.push({ ruleId: "no-unknown-assertion", filePath, ...p, message: "`as unknown`: redesign the types" })
188
188
  }
189
189
  }
190
190
 
191
191
  // ── enum ──
192
192
  if (ts.isEnumDeclaration(node)) {
193
193
  const p = pos(node)
194
- violations.push({ ruleId: "no-enum", filePath, ...p, message: "`enum` — use `as const` object + literal union type" })
194
+ violations.push({ ruleId: "no-enum", filePath, ...p, message: "`enum`: use `as const` object + literal union type" })
195
195
  }
196
196
 
197
197
  // ── x! non-null assertion ──
198
198
  if (ts.isNonNullExpression(node)) {
199
199
  const p = pos(node)
200
- violations.push({ ruleId: "no-non-null-assertion", filePath, ...p, message: "`x!` — use narrowing or optional chaining" })
200
+ violations.push({ ruleId: "no-non-null-assertion", filePath, ...p, message: "`x!`: use narrowing or optional chaining" })
201
201
  }
202
202
 
203
203
  // ── throw "literal" ──
@@ -205,11 +205,11 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
205
205
  const expr = node.expression
206
206
  if (ts.isStringLiteral(expr) || ts.isNumericLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {
207
207
  const p = pos(node)
208
- violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw literal` — throw an Error subclass" })
208
+ violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw literal`: throw an Error subclass" })
209
209
  }
210
210
  if (ts.isTemplateExpression(expr)) {
211
211
  const p = pos(node)
212
- violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw template` — throw an Error subclass" })
212
+ violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw template`: throw an Error subclass" })
213
213
  }
214
214
  }
215
215
 
@@ -220,7 +220,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
220
220
  const flags = node.declarationList.flags
221
221
  if (!(flags & ts.NodeFlags.Const)) {
222
222
  const p = pos(node)
223
- violations.push({ ruleId: "no-mutable-export", filePath, ...p, message: "`export let/var` — use `export const`" })
223
+ violations.push({ ruleId: "no-mutable-export", filePath, ...p, message: "`export let/var`: use `export const`" })
224
224
  }
225
225
  }
226
226
  }
@@ -239,7 +239,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
239
239
  ts.isPropertySignature(parent)
240
240
  )) {
241
241
  const p = pos(node)
242
- violations.push({ ruleId: "no-any-annotation", filePath, ...p, message: "`: any` annotation — use `unknown` and narrow" })
242
+ violations.push({ ruleId: "no-any-annotation", filePath, ...p, message: "`: any` annotation: use `unknown` and narrow" })
243
243
  } else if (parent && (
244
244
  ts.isFunctionDeclaration(parent) ||
245
245
  ts.isMethodDeclaration(parent) ||
@@ -247,7 +247,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
247
247
  ts.isFunctionExpression(parent)
248
248
  )) {
249
249
  const p = pos(node)
250
- violations.push({ ruleId: "no-explicit-any-return", filePath, ...p, message: "`(): any` return — use a specific type" })
250
+ violations.push({ ruleId: "no-explicit-any-return", filePath, ...p, message: "`(): any` return: use a specific type" })
251
251
  }
252
252
  }
253
253
  }
@@ -263,7 +263,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
263
263
  if (stmts.length === 0) {
264
264
  // Empty catch — swallows everything silently
265
265
  const p = pos(node)
266
- violations.push({ ruleId: "empty-catch", filePath, ...p, message: "empty `catch` block — handle, re-throw, or remove the try/catch" })
266
+ violations.push({ ruleId: "empty-catch", filePath, ...p, message: "empty `catch` block: handle, re-throw, or remove the try/catch" })
267
267
  } else if (node.variableDeclaration) {
268
268
  // Has a bound variable — check if it's narrowed with instanceof
269
269
  const varName = node.variableDeclaration.name.getText(sourceFile)
@@ -272,7 +272,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
272
272
  const hasRethrow = blockText.includes(`throw ${varName}`) || blockText.includes(`throw new`)
273
273
  if (!hasInstanceof && !hasRethrow) {
274
274
  const p = pos(node)
275
- violations.push({ ruleId: "catch-without-narrowing", filePath, ...p, message: "`catch` without `instanceof` narrowing or re-throw — narrow the error type or re-throw" })
275
+ violations.push({ ruleId: "catch-without-narrowing", filePath, ...p, message: "`catch` without `instanceof` narrowing or re-throw: narrow the error type or re-throw" })
276
276
  }
277
277
  }
278
278
  }
@@ -298,7 +298,7 @@ function analyzeFile(filePath: string, sourceFile: tsTypes.SourceFile): Violatio
298
298
  filePath,
299
299
  line: line + 1,
300
300
  column: character + 1,
301
- message: `\`@ts-${kind}\` — fix the underlying type`,
301
+ message: `\`@ts-${kind}\`: fix the underlying type`,
302
302
  })
303
303
  }
304
304
 
@@ -11,14 +11,16 @@
11
11
  *
12
12
  * Creates:
13
13
  * <name>/
14
- * package.json (Bun + Hono + Zod + Drizzle + Biome)
15
- * tsconfig.json (ultra-strict from tsconfig-strict.md)
16
- * biome.json (strict from tsconfig-strict.md)
14
+ * package.json (Bun + Hono + Zod + oxlint + oxfmt)
15
+ * tsconfig.json (static ultra-strict config copied from oxc/)
16
+ * .oxlintrc.json (strict rules and local copy plugin)
17
+ * .oxfmtrc.json (format defaults)
18
+ * lint/oxlint-plugin/ (plain-JS rules and MIT license)
17
19
  * src/index.ts (minimal Hono entrypoint)
18
20
  * .gitignore
19
21
  */
20
22
 
21
- import { mkdirSync, writeFileSync, existsSync } from "node:fs";
23
+ import { cpSync, mkdirSync, writeFileSync, existsSync } from "node:fs";
22
24
  import { join, resolve } from "node:path";
23
25
  import { parseArgs } from "node:util";
24
26
 
@@ -44,8 +46,9 @@ Options:
44
46
  process.exit(positionals.length === 0 ? 2 : 0);
45
47
  }
46
48
 
47
- const name = positionals[0]!;
48
- const root = resolve(values.path!, name);
49
+ const name = positionals[0];
50
+ if (!name) throw new Error("Project name is required");
51
+ const root = resolve(values.path ?? ".", name);
49
52
 
50
53
  if (existsSync(root)) {
51
54
  console.error(`Error: ${root} already exists`);
@@ -64,8 +67,12 @@ const pkg = {
64
67
  scripts: {
65
68
  dev: "bun --hot src/index.ts",
66
69
  start: "bun src/index.ts",
67
- check: "bunx biome check . && bunx tsc --noEmit && bun test",
68
- "check:fix": "bunx biome check --write .",
70
+ lint: "oxlint --type-aware --deny-warnings",
71
+ fmt: "oxfmt",
72
+ "fmt:check": "oxfmt --check",
73
+ typecheck: "tsc --noEmit",
74
+ check: "bun run lint && bun run fmt:check && bun run typecheck && bun test",
75
+ "check:fix": "oxlint --type-aware --fix && oxfmt",
69
76
  test: "bun test",
70
77
  },
71
78
  dependencies: {
@@ -73,85 +80,17 @@ const pkg = {
73
80
  zod: "^3.24.0",
74
81
  },
75
82
  devDependencies: {
76
- "@biomejs/biome": "^1.9.0",
77
83
  "@types/bun": "latest",
84
+ oxfmt: "0.74.0",
85
+ oxlint: "1.89.0",
86
+ "oxlint-tsgolint": "7.0.2005",
78
87
  typescript: "^5.8.0",
79
88
  },
80
89
  };
81
90
  writeFileSync(join(root, "package.json"), JSON.stringify(pkg, null, 2) + "\n");
82
91
 
83
- // ── tsconfig.json (ultra-strict) ──
84
- const tsconfig = {
85
- compilerOptions: {
86
- strict: true,
87
- noUncheckedIndexedAccess: true,
88
- exactOptionalPropertyTypes: true,
89
- noFallthroughCasesInSwitch: true,
90
- forceConsistentCasingInFileNames: true,
91
- verbatimModuleSyntax: true,
92
- isolatedModules: true,
93
- esModuleInterop: true,
94
- resolveJsonModule: true,
95
- target: "ESNext",
96
- lib: ["ESNext"],
97
- declaration: true,
98
- declarationMap: true,
99
- sourceMap: true,
100
- outDir: "dist",
101
- rootDir: "src",
102
- module: "ESNext",
103
- moduleResolution: "bundler",
104
- types: ["bun-types"],
105
- skipLibCheck: true,
106
- noEmit: true,
107
- },
108
- include: ["src/**/*.ts"],
109
- exclude: ["node_modules", "dist"],
110
- };
111
- writeFileSync(
112
- join(root, "tsconfig.json"),
113
- JSON.stringify(tsconfig, null, 2) + "\n",
114
- );
115
-
116
- // ── biome.json (strict) ──
117
- const biome = {
118
- $schema: "https://biomejs.dev/schemas/1.9.0/schema.json",
119
- organizeImports: { enabled: true },
120
- formatter: {
121
- enabled: true,
122
- indentStyle: "space",
123
- indentWidth: 2,
124
- lineWidth: 100,
125
- },
126
- linter: {
127
- enabled: true,
128
- rules: {
129
- recommended: true,
130
- complexity: {
131
- noBannedTypes: "error",
132
- noExtraBooleanCast: "error",
133
- noUselessConstructor: "error",
134
- noUselessRename: "error",
135
- noVoid: "error",
136
- },
137
- correctness: {
138
- noUnusedVariables: "error",
139
- noUnusedImports: "error",
140
- useExhaustiveDependencies: "warn",
141
- },
142
- style: {
143
- noNonNullAssertion: "error",
144
- useConst: "error",
145
- noParameterAssign: "error",
146
- },
147
- suspicious: {
148
- noExplicitAny: "error",
149
- noAssertion: "warn",
150
- },
151
- },
152
- },
153
- };
154
- writeFileSync(join(root, "biome.json"), JSON.stringify(biome, null, 2) + "\n");
92
+ // Copy the formatted strict configs and plugin documented in oxc-lint.md.
93
+ cpSync(join(import.meta.dir, "oxc"), root, { recursive: true });
155
94
 
156
95
  // ── src/index.ts ──
157
96
  const indexTs = `import { Hono } from "hono";
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
+ "printWidth": 100,
4
+ "tabWidth": 2,
5
+ "useTabs": false,
6
+ "semi": true,
7
+ "singleQuote": false,
8
+ "ignorePatterns": ["node_modules/**", "dist/**", "build/**", "coverage/**", "vendor/**"]
9
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["typescript", "import", "oxc"],
4
+ "jsPlugins": [{ "name": "programming", "specifier": "./lint/oxlint-plugin/index.js" }],
5
+ "categories": { "correctness": "error", "suspicious": "error" },
6
+ "rules": {
7
+ "typescript/no-explicit-any": "error",
8
+ "typescript/no-non-null-assertion": "error",
9
+ "typescript/consistent-type-imports": "error",
10
+ "typescript/ban-ts-comment": [
11
+ "error",
12
+ { "ts-expect-error": true, "ts-ignore": true, "ts-nocheck": true, "ts-check": false }
13
+ ],
14
+ "typescript/no-empty-object-type": "error",
15
+ "typescript/no-wrapper-object-types": "error",
16
+ "typescript/no-floating-promises": "error",
17
+ "typescript/no-misused-promises": "error",
18
+ "typescript/switch-exhaustiveness-check": "error",
19
+ "import/no-default-export": "error",
20
+ "no-param-reassign": "error",
21
+ "no-unused-vars": "error",
22
+ "no-empty": "error",
23
+ "no-fallthrough": "error",
24
+ "prefer-const": "error",
25
+ "programming/require-suppression-reason": "error"
26
+ },
27
+ "ignorePatterns": ["node_modules/**", "dist/**", "build/**", "coverage/**", "vendor/**"],
28
+ "overrides": [
29
+ {
30
+ "files": ["src/**/*", "apps/*/src/**/*", "packages/*/src/**/*"],
31
+ "rules": { "programming/no-em-dash-copy": "error" }
32
+ },
33
+ {
34
+ "files": [
35
+ "**/*.{test,spec}.*",
36
+ "**/{test,tests,__tests__,fixtures,__fixtures__,_generated,vendor,vendored}/**",
37
+ "**/*.{gen,generated}.*"
38
+ ],
39
+ "rules": { "programming/no-em-dash-copy": "off" }
40
+ },
41
+ {
42
+ "files": ["src/index.ts", "lint/oxlint-plugin/*.js"],
43
+ "rules": { "import/no-default-export": "off" }
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 T3 Tools Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ import noEmDashCopy from "./no-em-dash-copy.js";
2
+ import requireSuppressionReason from "./require-suppression-reason.js";
3
+
4
+ export default {
5
+ meta: { name: "programming" },
6
+ rules: {
7
+ "no-em-dash-copy": noEmDashCopy,
8
+ "require-suppression-reason": requireSuppressionReason,
9
+ },
10
+ };
@@ -0,0 +1,28 @@
1
+ // Ported from pingdotgg/t3code at d7f3b72 (t3code#23799). MIT; see LICENSE.
2
+ const EM_DASH = "\u2014";
3
+ const MESSAGE = "No em dashes in product copy. Use a period, comma, colon, or parentheses instead.";
4
+
5
+ export default {
6
+ meta: {
7
+ type: "suggestion",
8
+ docs: {
9
+ description: "Disallow em dashes in strings and JSX text that users or agents read.",
10
+ },
11
+ },
12
+ create(context) {
13
+ const check = (node, text) => {
14
+ if (text?.includes(EM_DASH)) context.report({ node, message: MESSAGE });
15
+ };
16
+ return {
17
+ Literal(node) {
18
+ if (typeof node.value === "string") check(node, node.value);
19
+ },
20
+ TemplateElement(node) {
21
+ check(node, node.value.cooked);
22
+ },
23
+ JSXText(node) {
24
+ check(node, node.value);
25
+ },
26
+ };
27
+ },
28
+ };