oh-my-opencode 4.5.1 → 4.5.12

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 (584) hide show
  1. package/README.ja.md +33 -18
  2. package/README.ko.md +33 -18
  3. package/README.md +82 -24
  4. package/README.ru.md +33 -18
  5. package/README.zh-cn.md +45 -24
  6. package/bin/oh-my-opencode.js +47 -2
  7. package/bin/oh-my-opencode.test.ts +174 -0
  8. package/bin/platform.d.ts +6 -0
  9. package/bin/platform.js +19 -0
  10. package/bin/platform.test.ts +66 -1
  11. package/dist/cli/cli-program.d.ts +18 -0
  12. package/dist/cli/index.js +28472 -26159
  13. package/dist/cli/install-codex/codex-cache-bundled-mcps.d.ts +5 -0
  14. package/dist/cli/install-codex/codex-cache-command-shim.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-cache-legacy-bins.d.ts +3 -0
  16. package/dist/cli/install-codex/codex-cache-local-dependencies.d.ts +1 -0
  17. package/dist/cli/install-codex/codex-cache-paths.d.ts +2 -0
  18. package/dist/cli/install-codex/codex-cache.d.ts +31 -0
  19. package/dist/cli/install-codex/codex-config-toml.d.ts +11 -0
  20. package/dist/cli/install-codex/codex-hook-trust.d.ts +6 -0
  21. package/dist/cli/install-codex/codex-marketplace-snapshot.d.ts +15 -0
  22. package/dist/cli/install-codex/codex-marketplace.d.ts +9 -0
  23. package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +1 -0
  24. package/dist/cli/install-codex/codex-process.d.ts +2 -0
  25. package/dist/cli/install-codex/index.d.ts +7 -0
  26. package/dist/cli/install-codex/install-codex.d.ts +17 -0
  27. package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +12 -0
  28. package/dist/cli/install-codex/toml-section-editor.d.ts +9 -0
  29. package/dist/cli/install-codex/types.d.ts +56 -0
  30. package/dist/cli/star-request.d.ts +2 -0
  31. package/dist/cli/tui-install-prompts.d.ts +3 -2
  32. package/dist/cli/types.d.ts +8 -0
  33. package/dist/config/schema/agent-names.d.ts +4 -1
  34. package/dist/config/schema/commands.d.ts +1 -2
  35. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -3
  36. package/dist/create-managers.d.ts +1 -0
  37. package/dist/features/background-agent/parent-wake-message-activity.d.ts +23 -0
  38. package/dist/features/background-agent/parent-wake-notifier.d.ts +0 -1
  39. package/dist/features/boulder-state/storage.d.ts +1 -1
  40. package/dist/features/builtin-commands/templates/refactor.d.ts +1 -1
  41. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +2 -2
  42. package/dist/features/builtin-commands/types.d.ts +1 -1
  43. package/dist/features/builtin-skills/skill-file-loader.d.ts +4 -0
  44. package/dist/features/builtin-skills/skills/index.d.ts +4 -1
  45. package/dist/features/builtin-skills/skills/init-deep.d.ts +2 -0
  46. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +2 -0
  47. package/dist/features/builtin-skills/skills/security-research.d.ts +2 -0
  48. package/dist/features/builtin-skills/skills/security-review.d.ts +2 -0
  49. package/dist/features/opencode-runtime-skills/index.d.ts +2 -0
  50. package/dist/features/opencode-runtime-skills/runtime-skill-config.d.ts +17 -0
  51. package/dist/features/opencode-runtime-skills/skill-markdown.d.ts +7 -0
  52. package/dist/features/opencode-runtime-skills/source-server.d.ts +8 -0
  53. package/dist/hooks/claude-code-hooks/hook-text.d.ts +2 -0
  54. package/dist/hooks/session-recovery/storage/latest-assistant-message.d.ts +5 -0
  55. package/dist/hooks/session-recovery/storage/thinking-prepend.d.ts +3 -0
  56. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -18
  57. package/dist/hooks/todo-continuation-enforcer/pending-question-detection.d.ts +4 -0
  58. package/dist/index.js +1684 -1801
  59. package/dist/oh-my-opencode.schema.json +4 -2
  60. package/dist/plugin-handlers/config-handler.d.ts +2 -1
  61. package/dist/shared/external-plugin-detector.d.ts +8 -0
  62. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +1 -0
  63. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +1 -0
  64. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +8 -0
  65. package/dist/shared/prompt-timeout-context.d.ts +2 -0
  66. package/dist/testing/create-plugin-module.d.ts +5 -1
  67. package/dist/tools/delegate-task/sync-prompt-sender.d.ts +2 -2
  68. package/package.json +31 -16
  69. package/packages/ast-grep-mcp/dist/cli.js +245 -40
  70. package/packages/lsp-tools-mcp/dist/cli.js +1 -1
  71. package/packages/omo-codex/marketplace.json +17 -0
  72. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +35 -0
  73. package/packages/omo-codex/plugin/.mcp.json +14 -0
  74. package/packages/omo-codex/plugin/README.md +13 -0
  75. package/packages/omo-codex/plugin/components/comment-checker/.gitattributes +13 -0
  76. package/packages/omo-codex/plugin/components/comment-checker/.github/CODEOWNERS +12 -0
  77. package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/bug.yml +40 -0
  78. package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/feature.yml +27 -0
  79. package/packages/omo-codex/plugin/components/comment-checker/.github/branch-ruleset.json +45 -0
  80. package/packages/omo-codex/plugin/components/comment-checker/.github/dependabot.yml +16 -0
  81. package/packages/omo-codex/plugin/components/comment-checker/.github/pull_request_template.md +19 -0
  82. package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/ci.yml +47 -0
  83. package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/publish.yml +51 -0
  84. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +35 -0
  85. package/packages/omo-codex/plugin/components/comment-checker/CHANGELOG.md +33 -0
  86. package/packages/omo-codex/plugin/components/comment-checker/LICENSE +21 -0
  87. package/packages/omo-codex/plugin/components/comment-checker/NOTICE +6 -0
  88. package/packages/omo-codex/plugin/components/comment-checker/README.md +87 -0
  89. package/packages/omo-codex/plugin/components/comment-checker/biome.json +48 -0
  90. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +17 -0
  91. package/packages/omo-codex/plugin/components/comment-checker/package.json +57 -0
  92. package/packages/omo-codex/plugin/components/comment-checker/skills/comment-checker/SKILL.md +16 -0
  93. package/packages/omo-codex/plugin/components/comment-checker/src/cli.ts +12 -0
  94. package/packages/omo-codex/plugin/components/comment-checker/src/codex-hook.ts +205 -0
  95. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +361 -0
  96. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +195 -0
  97. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook-newline.test.ts +52 -0
  98. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +368 -0
  99. package/packages/omo-codex/plugin/components/comment-checker/test/fixtures/post-tool-use.json +15 -0
  100. package/packages/omo-codex/plugin/components/comment-checker/test/package-smoke.test.ts +93 -0
  101. package/packages/omo-codex/plugin/components/comment-checker/test/runner.test.ts +66 -0
  102. package/packages/omo-codex/plugin/components/comment-checker/tsconfig.build.json +12 -0
  103. package/packages/omo-codex/plugin/components/comment-checker/tsconfig.json +27 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/vitest.config.ts +9 -0
  105. package/packages/omo-codex/plugin/components/lsp/.gitattributes +13 -0
  106. package/packages/omo-codex/plugin/components/lsp/.github/CODEOWNERS +1 -0
  107. package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/bug.yml +26 -0
  108. package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/feature.yml +19 -0
  109. package/packages/omo-codex/plugin/components/lsp/.github/branch-ruleset.json +45 -0
  110. package/packages/omo-codex/plugin/components/lsp/.github/dependabot.yml +11 -0
  111. package/packages/omo-codex/plugin/components/lsp/.github/pull_request_template.md +11 -0
  112. package/packages/omo-codex/plugin/components/lsp/.github/workflows/ci.yml +56 -0
  113. package/packages/omo-codex/plugin/components/lsp/.github/workflows/publish.yml +60 -0
  114. package/packages/omo-codex/plugin/components/lsp/.mcp.json +9 -0
  115. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +25 -0
  116. package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +25 -0
  117. package/packages/omo-codex/plugin/components/lsp/LICENSE +21 -0
  118. package/packages/omo-codex/plugin/components/lsp/NOTICE +3 -0
  119. package/packages/omo-codex/plugin/components/lsp/README.md +148 -0
  120. package/packages/omo-codex/plugin/components/lsp/biome.json +48 -0
  121. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +17 -0
  122. package/packages/omo-codex/plugin/components/lsp/package.json +64 -0
  123. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +46 -0
  124. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.test.mjs +104 -0
  125. package/packages/omo-codex/plugin/components/lsp/scripts/clean-dist.mjs +5 -0
  126. package/packages/omo-codex/plugin/components/lsp/scripts/test.mjs +8 -0
  127. package/packages/omo-codex/plugin/components/lsp/skills/lsp/SKILL.md +35 -0
  128. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +44 -0
  129. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +285 -0
  130. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +358 -0
  131. package/packages/omo-codex/plugin/components/lsp/test/fixtures/broken.py +1 -0
  132. package/packages/omo-codex/plugin/components/lsp/test/fixtures/post-tool-use.json +15 -0
  133. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +153 -0
  134. package/packages/omo-codex/plugin/components/lsp/tsconfig.build.json +12 -0
  135. package/packages/omo-codex/plugin/components/lsp/tsconfig.json +27 -0
  136. package/packages/omo-codex/plugin/components/lsp/vitest.config.ts +9 -0
  137. package/packages/omo-codex/plugin/components/rules/.codex-plugin/plugin.json +3 -0
  138. package/packages/omo-codex/plugin/components/rules/.gitattributes +13 -0
  139. package/packages/omo-codex/plugin/components/rules/.github/CODEOWNERS +12 -0
  140. package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/bug.yml +49 -0
  141. package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/feature.yml +27 -0
  142. package/packages/omo-codex/plugin/components/rules/.github/branch-ruleset.json +45 -0
  143. package/packages/omo-codex/plugin/components/rules/.github/dependabot.yml +16 -0
  144. package/packages/omo-codex/plugin/components/rules/.github/pull_request_template.md +20 -0
  145. package/packages/omo-codex/plugin/components/rules/.github/workflows/ci.yml +47 -0
  146. package/packages/omo-codex/plugin/components/rules/.github/workflows/publish.yml +51 -0
  147. package/packages/omo-codex/plugin/components/rules/AGENTS.md +34 -0
  148. package/packages/omo-codex/plugin/components/rules/CHANGELOG.md +19 -0
  149. package/packages/omo-codex/plugin/components/rules/LICENSE +21 -0
  150. package/packages/omo-codex/plugin/components/rules/NOTICE +15 -0
  151. package/packages/omo-codex/plugin/components/rules/README.md +124 -0
  152. package/packages/omo-codex/plugin/components/rules/biome.json +48 -0
  153. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +209 -0
  154. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +54 -0
  155. package/packages/omo-codex/plugin/components/rules/package.json +62 -0
  156. package/packages/omo-codex/plugin/components/rules/scripts/bench-codex-rules.mjs +268 -0
  157. package/packages/omo-codex/plugin/components/rules/skills/rules/SKILL.md +34 -0
  158. package/packages/omo-codex/plugin/components/rules/src/cli.ts +143 -0
  159. package/packages/omo-codex/plugin/components/rules/src/codex-hook-options.ts +4 -0
  160. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +238 -0
  161. package/packages/omo-codex/plugin/components/rules/src/config.ts +107 -0
  162. package/packages/omo-codex/plugin/components/rules/src/context-pressure.ts +26 -0
  163. package/packages/omo-codex/plugin/components/rules/src/debug-log.ts +65 -0
  164. package/packages/omo-codex/plugin/components/rules/src/dynamic-target-fingerprints.ts +98 -0
  165. package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +19 -0
  166. package/packages/omo-codex/plugin/components/rules/src/path-utils.ts +29 -0
  167. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +234 -0
  168. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +104 -0
  169. package/packages/omo-codex/plugin/components/rules/src/post-compact-claim.ts +13 -0
  170. package/packages/omo-codex/plugin/components/rules/src/post-compact-state.ts +45 -0
  171. package/packages/omo-codex/plugin/components/rules/src/rules/cache.ts +64 -0
  172. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +115 -0
  173. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +535 -0
  174. package/packages/omo-codex/plugin/components/rules/src/rules/errors.ts +13 -0
  175. package/packages/omo-codex/plugin/components/rules/src/rules/finder-cache.ts +73 -0
  176. package/packages/omo-codex/plugin/components/rules/src/rules/finder-paths.ts +47 -0
  177. package/packages/omo-codex/plugin/components/rules/src/rules/finder-sources.ts +50 -0
  178. package/packages/omo-codex/plugin/components/rules/src/rules/finder.ts +207 -0
  179. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +123 -0
  180. package/packages/omo-codex/plugin/components/rules/src/rules/matcher.ts +142 -0
  181. package/packages/omo-codex/plugin/components/rules/src/rules/ordering.ts +33 -0
  182. package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +326 -0
  183. package/packages/omo-codex/plugin/components/rules/src/rules/plugin-root.ts +55 -0
  184. package/packages/omo-codex/plugin/components/rules/src/rules/project-root.ts +30 -0
  185. package/packages/omo-codex/plugin/components/rules/src/rules/scanner.ts +162 -0
  186. package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +67 -0
  187. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +141 -0
  188. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +24 -0
  189. package/packages/omo-codex/plugin/components/rules/src/session-state-lock.ts +47 -0
  190. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +56 -0
  191. package/packages/omo-codex/plugin/components/rules/src/tool-paths.ts +192 -0
  192. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +44 -0
  193. package/packages/omo-codex/plugin/components/rules/src/transcript-search.ts +108 -0
  194. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +107 -0
  195. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +268 -0
  196. package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +243 -0
  197. package/packages/omo-codex/plugin/components/rules/test/codex-hook-performance.test.ts +99 -0
  198. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +132 -0
  199. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +156 -0
  200. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +299 -0
  201. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-lock.test.ts +46 -0
  202. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-process.test.ts +83 -0
  203. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +667 -0
  204. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +192 -0
  205. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +102 -0
  206. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +168 -0
  207. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +42 -0
  208. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +206 -0
  209. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +151 -0
  210. package/packages/omo-codex/plugin/components/rules/test/persistent-cache.test.ts +63 -0
  211. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +172 -0
  212. package/packages/omo-codex/plugin/components/rules/test/post-compact-test-fixture.ts +196 -0
  213. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +63 -0
  214. package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +198 -0
  215. package/packages/omo-codex/plugin/components/rules/tsconfig.build.json +12 -0
  216. package/packages/omo-codex/plugin/components/rules/tsconfig.json +27 -0
  217. package/packages/omo-codex/plugin/components/rules/vitest.config.ts +8 -0
  218. package/packages/omo-codex/plugin/components/start-work-continuation/.gitattributes +13 -0
  219. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +43 -0
  220. package/packages/omo-codex/plugin/components/start-work-continuation/CHANGELOG.md +5 -0
  221. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +21 -0
  222. package/packages/omo-codex/plugin/components/start-work-continuation/NOTICE +5 -0
  223. package/packages/omo-codex/plugin/components/start-work-continuation/README.md +55 -0
  224. package/packages/omo-codex/plugin/components/start-work-continuation/biome.json +48 -0
  225. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +51 -0
  226. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +28 -0
  227. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +53 -0
  228. package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +167 -0
  229. package/packages/omo-codex/plugin/components/start-work-continuation/src/cli.ts +52 -0
  230. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +66 -0
  231. package/packages/omo-codex/plugin/components/start-work-continuation/src/directive.ts +6 -0
  232. package/packages/omo-codex/plugin/components/start-work-continuation/src/index.ts +5 -0
  233. package/packages/omo-codex/plugin/components/start-work-continuation/src/types.ts +23 -0
  234. package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +63 -0
  235. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +124 -0
  236. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +160 -0
  237. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-completed.json +19 -0
  238. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-mixed-platforms.json +27 -0
  239. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-single-codex-work.json +19 -0
  240. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-all-done.md +5 -0
  241. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-nested-checkboxes.md +11 -0
  242. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-unchecked.md +6 -0
  243. package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.build.json +12 -0
  244. package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.json +27 -0
  245. package/packages/omo-codex/plugin/components/start-work-continuation/vitest.config.ts +10 -0
  246. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +37 -0
  247. package/packages/omo-codex/plugin/components/telemetry/README.md +102 -0
  248. package/packages/omo-codex/plugin/components/telemetry/biome.json +48 -0
  249. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +16 -0
  250. package/packages/omo-codex/plugin/components/telemetry/package.json +56 -0
  251. package/packages/omo-codex/plugin/components/telemetry/src/atomic-write.ts +22 -0
  252. package/packages/omo-codex/plugin/components/telemetry/src/cli.ts +69 -0
  253. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +49 -0
  254. package/packages/omo-codex/plugin/components/telemetry/src/data-path.ts +45 -0
  255. package/packages/omo-codex/plugin/components/telemetry/src/env-flags.ts +43 -0
  256. package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +81 -0
  257. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +165 -0
  258. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +35 -0
  259. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +270 -0
  260. package/packages/omo-codex/plugin/components/telemetry/tsconfig.build.json +12 -0
  261. package/packages/omo-codex/plugin/components/telemetry/tsconfig.json +27 -0
  262. package/packages/omo-codex/plugin/components/telemetry/vitest.config.ts +8 -0
  263. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +41 -0
  264. package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +25 -0
  265. package/packages/omo-codex/plugin/components/ultrawork/LICENSE +21 -0
  266. package/packages/omo-codex/plugin/components/ultrawork/NOTICE +5 -0
  267. package/packages/omo-codex/plugin/components/ultrawork/README.md +60 -0
  268. package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +17 -0
  269. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +82 -0
  270. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +221 -0
  271. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +65 -0
  272. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +69 -0
  273. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +163 -0
  274. package/packages/omo-codex/plugin/components/ultrawork/biome.json +48 -0
  275. package/packages/omo-codex/plugin/components/ultrawork/directive.md +264 -0
  276. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +16 -0
  277. package/packages/omo-codex/plugin/components/ultrawork/package.json +54 -0
  278. package/packages/omo-codex/plugin/components/ultrawork/src/cli.ts +50 -0
  279. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +84 -0
  280. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +3 -0
  281. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +252 -0
  282. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +78 -0
  283. package/packages/omo-codex/plugin/components/ultrawork/tsconfig.build.json +12 -0
  284. package/packages/omo-codex/plugin/components/ultrawork/tsconfig.json +27 -0
  285. package/packages/omo-codex/plugin/components/ulw-loop/.gitattributes +13 -0
  286. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +48 -0
  287. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +7 -0
  288. package/packages/omo-codex/plugin/components/ulw-loop/LICENSE +21 -0
  289. package/packages/omo-codex/plugin/components/ulw-loop/NOTICE +6 -0
  290. package/packages/omo-codex/plugin/components/ulw-loop/README.md +74 -0
  291. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +48 -0
  292. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +29 -0
  293. package/packages/omo-codex/plugin/components/ulw-loop/package.json +55 -0
  294. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/.gitkeep +0 -0
  295. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +222 -0
  296. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/agents/openai.yaml +6 -0
  297. package/packages/omo-codex/plugin/components/ulw-loop/src/.gitkeep +0 -0
  298. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +155 -0
  299. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +95 -0
  300. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +156 -0
  301. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +63 -0
  302. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +94 -0
  303. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +40 -0
  304. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +129 -0
  305. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +139 -0
  306. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +177 -0
  307. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +122 -0
  308. package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +88 -0
  309. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +73 -0
  310. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +113 -0
  311. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +124 -0
  312. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +102 -0
  313. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +81 -0
  314. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +270 -0
  315. package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +277 -0
  316. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +213 -0
  317. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +375 -0
  318. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +250 -0
  319. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +407 -0
  320. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +169 -0
  321. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +156 -0
  322. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +275 -0
  323. package/packages/omo-codex/plugin/components/ulw-loop/test/evidence-criteria-gate.test.ts +100 -0
  324. package/packages/omo-codex/plugin/components/ulw-loop/test/evidence.test.ts +263 -0
  325. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/.gitkeep +0 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/codex-goal-snapshot.json +1 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-brief.md +5 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-plan.json +108 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +18 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/steering-proposal.json +8 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/user-prompt-submit.json +10 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/test/goal-status.test.ts +327 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +164 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +62 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-crud.test.ts +256 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +239 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +203 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +180 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +353 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/test/types.test.ts +79 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.build.json +12 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.json +27 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +10 -0
  344. package/packages/omo-codex/plugin/hooks/hooks.json +138 -0
  345. package/packages/omo-codex/plugin/package-lock.json +1750 -0
  346. package/packages/omo-codex/plugin/package.json +26 -0
  347. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +50 -0
  348. package/packages/omo-codex/plugin/scripts/build-components.mjs +23 -0
  349. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +46 -0
  350. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +75 -0
  351. package/packages/omo-codex/plugin/skills/comment-checker/SKILL.md +16 -0
  352. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +116 -0
  353. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +108 -0
  354. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +130 -0
  355. package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
  356. package/packages/omo-codex/plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
  357. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +116 -0
  358. package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +94 -0
  359. package/packages/omo-codex/plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
  360. package/packages/omo-codex/plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
  361. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  362. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +252 -0
  363. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
  364. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +260 -0
  365. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +248 -0
  366. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +234 -0
  367. package/packages/omo-codex/plugin/skills/debugging/references/tools/ghidra.md +212 -0
  368. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
  369. package/packages/omo-codex/plugin/skills/debugging/references/tools/pwndbg.md +263 -0
  370. package/packages/omo-codex/plugin/skills/debugging/references/tools/pwntools.md +265 -0
  371. package/packages/omo-codex/plugin/skills/frontend-ui-ux/SKILL.md +77 -0
  372. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +325 -0
  373. package/packages/omo-codex/plugin/skills/lsp/SKILL.md +35 -0
  374. package/packages/omo-codex/plugin/skills/programming/SKILL.md +463 -0
  375. package/packages/omo-codex/plugin/skills/programming/references/go/README.md +90 -0
  376. package/packages/omo-codex/plugin/skills/programming/references/go/backend-stack.md +641 -0
  377. package/packages/omo-codex/plugin/skills/programming/references/go/bootstrap.md +328 -0
  378. package/packages/omo-codex/plugin/skills/programming/references/go/bubbletea-v2.md +360 -0
  379. package/packages/omo-codex/plugin/skills/programming/references/go/cobra-stack.md +468 -0
  380. package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +362 -0
  381. package/packages/omo-codex/plugin/skills/programming/references/go/data-modeling.md +329 -0
  382. package/packages/omo-codex/plugin/skills/programming/references/go/error-handling.md +359 -0
  383. package/packages/omo-codex/plugin/skills/programming/references/go/golangci-strict.md +236 -0
  384. package/packages/omo-codex/plugin/skills/programming/references/go/grpc-connect.md +375 -0
  385. package/packages/omo-codex/plugin/skills/programming/references/go/libraries.md +337 -0
  386. package/packages/omo-codex/plugin/skills/programming/references/go/one-liners.md +202 -0
  387. package/packages/omo-codex/plugin/skills/programming/references/go/sqlc-pgx.md +471 -0
  388. package/packages/omo-codex/plugin/skills/programming/references/go/testing.md +467 -0
  389. package/packages/omo-codex/plugin/skills/programming/references/go/type-patterns.md +298 -0
  390. package/packages/omo-codex/plugin/skills/programming/references/python/README.md +314 -0
  391. package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +442 -0
  392. package/packages/omo-codex/plugin/skills/programming/references/python/data-modeling.md +233 -0
  393. package/packages/omo-codex/plugin/skills/programming/references/python/data-processing.md +133 -0
  394. package/packages/omo-codex/plugin/skills/programming/references/python/error-handling.md +218 -0
  395. package/packages/omo-codex/plugin/skills/programming/references/python/fastapi-stack.md +316 -0
  396. package/packages/omo-codex/plugin/skills/programming/references/python/httpx2-optimization.md +360 -0
  397. package/packages/omo-codex/plugin/skills/programming/references/python/libraries.md +307 -0
  398. package/packages/omo-codex/plugin/skills/programming/references/python/one-liners.md +268 -0
  399. package/packages/omo-codex/plugin/skills/programming/references/python/orjson-stack.md +378 -0
  400. package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +285 -0
  401. package/packages/omo-codex/plugin/skills/programming/references/python/pyproject-strict.md +232 -0
  402. package/packages/omo-codex/plugin/skills/programming/references/python/textual-tui.md +201 -0
  403. package/packages/omo-codex/plugin/skills/programming/references/python/type-patterns.md +176 -0
  404. package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +317 -0
  405. package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +299 -0
  406. package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +467 -0
  407. package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +317 -0
  408. package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +409 -0
  409. package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +375 -0
  410. package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +439 -0
  411. package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +291 -0
  412. package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +429 -0
  413. package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +354 -0
  414. package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +250 -0
  415. package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +527 -0
  416. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/README.md +289 -0
  417. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
  418. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
  419. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +195 -0
  420. package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +672 -0
  421. package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +199 -0
  422. package/packages/omo-codex/plugin/skills/programming/references/typescript/data-modeling.md +202 -0
  423. package/packages/omo-codex/plugin/skills/programming/references/typescript/error-handling.md +169 -0
  424. package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +152 -0
  425. package/packages/omo-codex/plugin/skills/programming/references/typescript/type-patterns.md +196 -0
  426. package/packages/omo-codex/plugin/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
  427. package/packages/omo-codex/plugin/skills/programming/scripts/go/new-project.py +138 -0
  428. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.editorconfig +13 -0
  429. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.golangci.yml +95 -0
  430. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
  431. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
  432. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
  433. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/ci.yml +37 -0
  434. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/config.go +24 -0
  435. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/gitignore +15 -0
  436. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
  437. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/run.go +15 -0
  438. package/packages/omo-codex/plugin/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
  439. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-project.py +172 -0
  440. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-script.py +116 -0
  441. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
  442. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
  443. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +175 -0
  444. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
  445. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +177 -0
  446. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +779 -0
  447. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +333 -0
  448. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +549 -0
  449. package/packages/omo-codex/plugin/skills/rules/SKILL.md +34 -0
  450. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +129 -0
  451. package/packages/omo-codex/plugin/skills/ulw-loop/.gitkeep +0 -0
  452. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +222 -0
  453. package/packages/omo-codex/plugin/skills/ulw-loop/agents/openai.yaml +6 -0
  454. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +399 -0
  455. package/packages/omo-codex/plugin/test/aggregate.test.mjs +330 -0
  456. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +66 -0
  457. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +150 -0
  458. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +199 -0
  459. package/packages/omo-codex/scripts/install/agents.mjs +84 -0
  460. package/packages/omo-codex/scripts/install/cache.mjs +245 -0
  461. package/packages/omo-codex/scripts/install/command-shim.mjs +1 -0
  462. package/packages/omo-codex/scripts/install/config.mjs +229 -0
  463. package/packages/omo-codex/scripts/install/hook-trust.mjs +84 -0
  464. package/packages/omo-codex/scripts/install/legacy-bins.mjs +57 -0
  465. package/packages/omo-codex/scripts/install/marketplace.mjs +104 -0
  466. package/packages/omo-codex/scripts/install/mcp-runtime-cache.mjs +77 -0
  467. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +32 -0
  468. package/packages/omo-codex/scripts/install/process.mjs +19 -0
  469. package/packages/omo-codex/scripts/install/snapshot.mjs +54 -0
  470. package/packages/omo-codex/scripts/install/toml-editor.mjs +47 -0
  471. package/packages/omo-codex/scripts/install/utils.mjs +15 -0
  472. package/packages/omo-codex/scripts/install-agent-links.test.mjs +104 -0
  473. package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -0
  474. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +30 -0
  475. package/packages/omo-codex/scripts/install-config.test.mjs +118 -0
  476. package/packages/omo-codex/scripts/install-local.mjs +192 -0
  477. package/packages/omo-codex/scripts/install-local.test.mjs +379 -0
  478. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +173 -0
  479. package/packages/omo-codex/scripts/install-test-fixtures.mjs +58 -0
  480. package/packages/omo-codex/scripts/sync-telemetry-component.mjs +115 -0
  481. package/packages/omo-codex/scripts/sync-telemetry-component.test.mjs +94 -0
  482. package/packages/shared-skills/index.mjs +5 -0
  483. package/packages/shared-skills/package.json +14 -0
  484. package/packages/shared-skills/skills/debugging/SKILL.md +116 -0
  485. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +108 -0
  486. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +130 -0
  487. package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
  488. package/packages/shared-skills/skills/debugging/references/methodology/05-escalate.md +69 -0
  489. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +116 -0
  490. package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +94 -0
  491. package/packages/shared-skills/skills/debugging/references/methodology/09-cleanup.md +164 -0
  492. package/packages/shared-skills/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
  493. package/packages/shared-skills/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  494. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +252 -0
  495. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +484 -0
  496. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +260 -0
  497. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +248 -0
  498. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +234 -0
  499. package/packages/shared-skills/skills/debugging/references/tools/ghidra.md +212 -0
  500. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +194 -0
  501. package/packages/shared-skills/skills/debugging/references/tools/pwndbg.md +263 -0
  502. package/packages/shared-skills/skills/debugging/references/tools/pwntools.md +265 -0
  503. package/packages/shared-skills/skills/frontend-ui-ux/SKILL.md +77 -0
  504. package/packages/shared-skills/skills/init-deep/SKILL.md +309 -0
  505. package/packages/shared-skills/skills/programming/SKILL.md +463 -0
  506. package/packages/shared-skills/skills/programming/references/go/README.md +90 -0
  507. package/packages/shared-skills/skills/programming/references/go/backend-stack.md +641 -0
  508. package/packages/shared-skills/skills/programming/references/go/bootstrap.md +328 -0
  509. package/packages/shared-skills/skills/programming/references/go/bubbletea-v2.md +360 -0
  510. package/packages/shared-skills/skills/programming/references/go/cobra-stack.md +468 -0
  511. package/packages/shared-skills/skills/programming/references/go/concurrency.md +362 -0
  512. package/packages/shared-skills/skills/programming/references/go/data-modeling.md +329 -0
  513. package/packages/shared-skills/skills/programming/references/go/error-handling.md +359 -0
  514. package/packages/shared-skills/skills/programming/references/go/golangci-strict.md +236 -0
  515. package/packages/shared-skills/skills/programming/references/go/grpc-connect.md +375 -0
  516. package/packages/shared-skills/skills/programming/references/go/libraries.md +337 -0
  517. package/packages/shared-skills/skills/programming/references/go/one-liners.md +202 -0
  518. package/packages/shared-skills/skills/programming/references/go/sqlc-pgx.md +471 -0
  519. package/packages/shared-skills/skills/programming/references/go/testing.md +467 -0
  520. package/packages/shared-skills/skills/programming/references/go/type-patterns.md +298 -0
  521. package/packages/shared-skills/skills/programming/references/python/README.md +314 -0
  522. package/packages/shared-skills/skills/programming/references/python/async-anyio.md +442 -0
  523. package/packages/shared-skills/skills/programming/references/python/data-modeling.md +233 -0
  524. package/packages/shared-skills/skills/programming/references/python/data-processing.md +133 -0
  525. package/packages/shared-skills/skills/programming/references/python/error-handling.md +218 -0
  526. package/packages/shared-skills/skills/programming/references/python/fastapi-stack.md +316 -0
  527. package/packages/shared-skills/skills/programming/references/python/httpx2-optimization.md +360 -0
  528. package/packages/shared-skills/skills/programming/references/python/libraries.md +307 -0
  529. package/packages/shared-skills/skills/programming/references/python/one-liners.md +268 -0
  530. package/packages/shared-skills/skills/programming/references/python/orjson-stack.md +378 -0
  531. package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +285 -0
  532. package/packages/shared-skills/skills/programming/references/python/pyproject-strict.md +232 -0
  533. package/packages/shared-skills/skills/programming/references/python/textual-tui.md +201 -0
  534. package/packages/shared-skills/skills/programming/references/python/type-patterns.md +176 -0
  535. package/packages/shared-skills/skills/programming/references/rust/README.md +317 -0
  536. package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +299 -0
  537. package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +467 -0
  538. package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +317 -0
  539. package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +409 -0
  540. package/packages/shared-skills/skills/programming/references/rust/concurrency.md +375 -0
  541. package/packages/shared-skills/skills/programming/references/rust/libraries.md +439 -0
  542. package/packages/shared-skills/skills/programming/references/rust/one-liners.md +291 -0
  543. package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +429 -0
  544. package/packages/shared-skills/skills/programming/references/rust/type-state.md +354 -0
  545. package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +250 -0
  546. package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +527 -0
  547. package/packages/shared-skills/skills/programming/references/rust-ub/README.md +289 -0
  548. package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
  549. package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
  550. package/packages/shared-skills/skills/programming/references/typescript/README.md +195 -0
  551. package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +672 -0
  552. package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +199 -0
  553. package/packages/shared-skills/skills/programming/references/typescript/data-modeling.md +202 -0
  554. package/packages/shared-skills/skills/programming/references/typescript/error-handling.md +169 -0
  555. package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +152 -0
  556. package/packages/shared-skills/skills/programming/references/typescript/type-patterns.md +196 -0
  557. package/packages/shared-skills/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
  558. package/packages/shared-skills/skills/programming/scripts/go/new-project.py +138 -0
  559. package/packages/shared-skills/skills/programming/scripts/go/templates/.editorconfig +13 -0
  560. package/packages/shared-skills/skills/programming/scripts/go/templates/.golangci.yml +95 -0
  561. package/packages/shared-skills/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
  562. package/packages/shared-skills/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
  563. package/packages/shared-skills/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
  564. package/packages/shared-skills/skills/programming/scripts/go/templates/ci.yml +37 -0
  565. package/packages/shared-skills/skills/programming/scripts/go/templates/config.go +24 -0
  566. package/packages/shared-skills/skills/programming/scripts/go/templates/gitignore +15 -0
  567. package/packages/shared-skills/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
  568. package/packages/shared-skills/skills/programming/scripts/go/templates/run.go +15 -0
  569. package/packages/shared-skills/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
  570. package/packages/shared-skills/skills/programming/scripts/python/new-project.py +172 -0
  571. package/packages/shared-skills/skills/programming/scripts/python/new-script.py +116 -0
  572. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
  573. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
  574. package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +175 -0
  575. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
  576. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +177 -0
  577. package/packages/shared-skills/skills/refactor/SKILL.md +763 -0
  578. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +317 -0
  579. package/packages/shared-skills/skills/review-work/SKILL.md +549 -0
  580. package/packages/shared-skills/skills/start-work/SKILL.md +129 -0
  581. package/packages/shared-skills/skills/ulw-plan/SKILL.md +383 -0
  582. package/postinstall.mjs +6 -2
  583. package/dist/features/builtin-commands/templates/init-deep.d.ts +0 -1
  584. package/dist/features/builtin-skills/skills/ai-slop-remover.d.ts +0 -2
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env bash
2
+ # No-excuse rule checker for Rust files.
3
+ # Mirrors the philosophy of python-programmer / typescript-programmer scripts:
4
+ # only rules that can be enforced via pure text matching live here.
5
+ # Everything semantic is on clippy + miri + nextest.
6
+
7
+ set -euo pipefail
8
+
9
+ if [ $# -eq 0 ]; then
10
+ echo "Usage: $0 <file.rs> [file.rs ...]" >&2
11
+ exit 2
12
+ fi
13
+
14
+ violations=0
15
+ report() {
16
+ local file="$1"
17
+ local line="$2"
18
+ local rule="$3"
19
+ local detail="$4"
20
+ echo "::error file=${file},line=${line}::[${rule}] ${detail}" >&2
21
+ violations=$((violations + 1))
22
+ }
23
+
24
+ is_test_path() {
25
+ local path="$1"
26
+ case "$path" in
27
+ */tests/*|*/benches/*|*/examples/*|*/build.rs|*_test.rs|tests/*|benches/*|examples/*) return 0 ;;
28
+ esac
29
+ # In-file #[cfg(test)] modules are handled per-line below.
30
+ return 1
31
+ }
32
+
33
+ for file in "$@"; do
34
+ [ -f "$file" ] || continue
35
+ case "$file" in
36
+ *.rs) ;;
37
+ *) continue ;;
38
+ esac
39
+
40
+ if is_test_path "$file"; then
41
+ # Test files are exempt from unwrap/expect/todo rules.
42
+ # Still enforce unsafe-comment, allow-comment, panic-in-lib rules below
43
+ # by setting a marker - keeping the loop unified.
44
+ in_test_file=1
45
+ else
46
+ in_test_file=0
47
+ fi
48
+
49
+ # Track #[cfg(test)] regions for per-line exemptions.
50
+ in_cfg_test=0
51
+ cfg_test_brace_depth=0
52
+ line_no=0
53
+
54
+ while IFS= read -r raw_line || [ -n "$raw_line" ]; do
55
+ line_no=$((line_no + 1))
56
+ line="$raw_line"
57
+
58
+ # Crude #[cfg(test)] region tracker: when we see #[cfg(test)] on a
59
+ # line followed by a mod with `{`, count braces until depth returns
60
+ # to zero. This is approximate but matches typical formatting.
61
+ if [[ "$line" =~ \#\[cfg\(test\)\] ]]; then
62
+ in_cfg_test=1
63
+ cfg_test_brace_depth=0
64
+ fi
65
+ if [ "$in_cfg_test" -eq 1 ]; then
66
+ opens=$(printf '%s' "$line" | tr -cd '{' | wc -c)
67
+ closes=$(printf '%s' "$line" | tr -cd '}' | wc -c)
68
+ cfg_test_brace_depth=$((cfg_test_brace_depth + opens - closes))
69
+ if [ "$cfg_test_brace_depth" -le 0 ] && [[ ! "$line" =~ \#\[cfg\(test\)\] ]]; then
70
+ in_cfg_test=0
71
+ fi
72
+ fi
73
+
74
+ exempt=0
75
+ [ "$in_test_file" -eq 1 ] && exempt=1
76
+ [ "$in_cfg_test" -eq 1 ] && exempt=1
77
+
78
+ # Strip line comments before pattern checks - so doc comments and
79
+ # explanatory prose do not trip the regexes.
80
+ code_only="${line%%//*}"
81
+
82
+ if [ "$exempt" -eq 0 ]; then
83
+ # .unwrap()
84
+ if [[ "$code_only" =~ \.unwrap\(\) ]]; then
85
+ # Allow if previous line had // SAFE-UNWRAP: comment
86
+ prev_line=$(sed -n "$((line_no - 1))p" "$file" 2>/dev/null || true)
87
+ if [[ ! "$prev_line" =~ //[[:space:]]*SAFE-UNWRAP: ]]; then
88
+ report "$file" "$line_no" "unwrap" ".unwrap() outside tests - use ? / ok_or / pattern match or annotate previous line with // SAFE-UNWRAP: <reason>"
89
+ fi
90
+ fi
91
+
92
+ # .expect("...")
93
+ if [[ "$code_only" =~ \.expect\( ]]; then
94
+ prev_line=$(sed -n "$((line_no - 1))p" "$file" 2>/dev/null || true)
95
+ if [[ ! "$prev_line" =~ //[[:space:]]*SAFE-EXPECT: ]]; then
96
+ report "$file" "$line_no" "expect" ".expect() outside tests - use ? or annotate previous line with // SAFE-EXPECT: <reason>"
97
+ fi
98
+ fi
99
+
100
+ # todo!() / unimplemented!() / unreachable!()
101
+ if [[ "$code_only" =~ (todo!|unimplemented!|unreachable!|unreachable_unchecked!) ]]; then
102
+ report "$file" "$line_no" "placeholder-macro" "todo!/unimplemented!/unreachable! in committed code"
103
+ fi
104
+
105
+ # Box<dyn Error
106
+ if [[ "$code_only" =~ Box\<dyn[[:space:]]+Error ]]; then
107
+ report "$file" "$line_no" "box-dyn-error" "Box<dyn Error> in non-test code - use anyhow::Error (apps) or thiserror enum (libs)"
108
+ fi
109
+
110
+ # panic!( in lib
111
+ if [[ "$file" == */src/lib.rs || "$file" == */src/*/mod.rs || ( "$file" == */src/*.rs && "$file" != */src/main.rs && "$file" != */src/bin/* ) ]]; then
112
+ if [[ "$code_only" =~ panic!\( ]]; then
113
+ report "$file" "$line_no" "lib-panic" "panic!() in library code - return Result"
114
+ fi
115
+ fi
116
+ fi
117
+
118
+ # unsafe { without preceding // SAFETY: in the last 5 lines (always enforced)
119
+ if [[ "$code_only" =~ unsafe[[:space:]]*\{ ]]; then
120
+ start=$((line_no > 5 ? line_no - 5 : 1))
121
+ window=$(sed -n "${start},${line_no}p" "$file" 2>/dev/null || true)
122
+ if [[ ! "$window" =~ //[[:space:]]*SAFETY: ]]; then
123
+ report "$file" "$line_no" "unsafe-no-safety-comment" "unsafe block without // SAFETY: comment in preceding 5 lines"
124
+ fi
125
+ fi
126
+
127
+ # #[allow(clippy::...)] without preceding // CLIPPY-ALLOW: justification
128
+ if [[ "$code_only" =~ \#\[allow\(clippy:: ]]; then
129
+ prev_line=$(sed -n "$((line_no - 1))p" "$file" 2>/dev/null || true)
130
+ if [[ ! "$prev_line" =~ //[[:space:]]*CLIPPY-ALLOW: ]]; then
131
+ report "$file" "$line_no" "unjustified-clippy-allow" "#[allow(clippy::...)] without // CLIPPY-ALLOW: <reason> on previous line"
132
+ fi
133
+ fi
134
+
135
+ # Narrowing numeric `as` casts - heuristic flag for human review.
136
+ # Catches the common shapes; precise type analysis belongs to clippy::cast_possible_truncation.
137
+ if [[ "$code_only" =~ as[[:space:]]+(u8|u16|u32|i8|i16|i32) ]] && \
138
+ [[ "$code_only" =~ (u16|u32|u64|u128|usize|i16|i32|i64|i128|isize)[[:space:]]+as[[:space:]]+(u8|u16|u32|i8|i16|i32) ]]; then
139
+ report "$file" "$line_no" "narrowing-as-cast" "possible narrowing 'as' cast - use TryFrom / try_into() for fallible conversion"
140
+ fi
141
+ done < "$file"
142
+ done
143
+
144
+ if [ "$violations" -gt 0 ]; then
145
+ echo "" >&2
146
+ echo "rust-programmer: ${violations} violation(s). Fix before declaring work done." >&2
147
+ echo "" >&2
148
+ echo "Then run the full toolchain gate:" >&2
149
+ echo " cargo +stable fmt --all -- --check" >&2
150
+ echo " cargo +stable clippy --all-targets --all-features -- -D warnings" >&2
151
+ echo " cargo nextest run --all-targets --all-features" >&2
152
+ echo " cargo +nightly miri nextest run --all-features # if unsafe touched" >&2
153
+ echo " cargo machete" >&2
154
+ echo " cargo deny check" >&2
155
+ exit 1
156
+ fi
157
+
158
+ echo "rust-programmer: no-excuse rules passed for $# file(s)."
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env -S uv run --script
2
+ # /// script
3
+ # requires-python = ">=3.11"
4
+ # dependencies = [
5
+ # "typer",
6
+ # "rich",
7
+ # ]
8
+ # ///
9
+
10
+ # ─── How to run ───
11
+ # 1. Install uv (if not installed):
12
+ # curl -LsSf https://astral.sh/uv/install.sh | sh
13
+ # 2. Run:
14
+ # uv run new-project.py myproject
15
+ # uv run new-project.py myproject --path ./workspace
16
+ # ──────────────────
17
+ #
18
+ # Creates a new Rust project with strict lints, deny.toml, rustfmt.toml,
19
+ # rust-toolchain.toml, and .cargo/config.toml pre-configured.
20
+
21
+ from __future__ import annotations
22
+
23
+ import subprocess
24
+ import sys
25
+ from pathlib import Path
26
+
27
+ import typer
28
+ from rich.console import Console
29
+
30
+ console = Console(stderr=True)
31
+
32
+ # ── Embedded config contents ─────────────────────────────────────────────
33
+
34
+ RUST_TOOLCHAIN_TOML = """\
35
+ [toolchain]
36
+ channel = "stable"
37
+ components = ["rustfmt", "clippy", "rust-src"]
38
+ profile = "default"
39
+ """
40
+
41
+ CARGO_TOML_LINTS = """
42
+ [lints.rust]
43
+ unsafe_op_in_unsafe_fn = "deny"
44
+ missing_docs = "warn"
45
+ missing_debug_implementations = "warn"
46
+ unreachable_pub = "warn"
47
+ unused_must_use = "deny"
48
+ elided_lifetimes_in_paths = "warn"
49
+ non_ascii_idents = "deny"
50
+ trivial_numeric_casts = "warn"
51
+ unused_lifetimes = "warn"
52
+ single_use_lifetimes = "warn"
53
+
54
+ [lints.clippy]
55
+ all = { level = "deny", priority = -1 }
56
+ pedantic = { level = "warn", priority = -1 }
57
+ nursery = { level = "warn", priority = -1 }
58
+ cargo = { level = "warn", priority = -1 }
59
+ undocumented_unsafe_blocks = "deny"
60
+ multiple_unsafe_ops_per_block = "deny"
61
+ unwrap_used = "deny"
62
+ expect_used = "deny"
63
+ panic = "deny"
64
+ todo = "deny"
65
+ unimplemented = "deny"
66
+ dbg_macro = "deny"
67
+ print_stdout = "warn"
68
+ print_stderr = "warn"
69
+ module_name_repetitions = { level = "allow" }
70
+ must_use_candidate = { level = "allow" }
71
+ missing_errors_doc = { level = "allow" }
72
+ missing_panics_doc = { level = "allow" }
73
+ """
74
+
75
+ CARGO_CONFIG_TOML = """\
76
+ [build]
77
+ rustflags = ["-C", "link-arg=-fuse-ld=lld"]
78
+
79
+ [target.x86_64-unknown-linux-gnu]
80
+ linker = "clang"
81
+ rustflags = ["-C", "link-arg=-fuse-ld=lld"]
82
+
83
+ [target.aarch64-apple-darwin]
84
+ rustflags = []
85
+ """
86
+
87
+ DENY_TOML = """\
88
+ [advisories]
89
+ vulnerability = "deny"
90
+ unmaintained = "warn"
91
+ yanked = "deny"
92
+
93
+ [licenses]
94
+ unlicensed = "deny"
95
+ allow = ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "Unicode-3.0", "Zlib"]
96
+
97
+ [bans]
98
+ multiple-versions = "warn"
99
+ wildcards = "deny"
100
+
101
+ [sources]
102
+ unknown-registry = "deny"
103
+ unknown-git = "deny"
104
+ """
105
+
106
+ RUSTFMT_TOML = """\
107
+ edition = "2024"
108
+ max_width = 100
109
+ use_field_init_shorthand = true
110
+ use_try_shorthand = true
111
+ """
112
+
113
+ # ── Main ─────────────────────────────────────────────────────────────────
114
+
115
+ app = typer.Typer(add_completion=False)
116
+
117
+
118
+ @app.command()
119
+ def main(
120
+ name: str = typer.Argument(help="Name of the new Rust project"),
121
+ path: Path = typer.Option(
122
+ Path.cwd(),
123
+ "--path",
124
+ "-p",
125
+ help="Parent directory where the project folder is created",
126
+ ),
127
+ ) -> None:
128
+ """Scaffold a new Rust project with strict lints and tooling configs."""
129
+ project_dir = path / name
130
+
131
+ # ── cargo init ───────────────────────────────────────────────────
132
+ console.print(f"[bold green]Creating[/] project [cyan]{name}[/] at [dim]{project_dir}[/]")
133
+ try:
134
+ subprocess.run(
135
+ ["cargo", "init", str(project_dir), "--name", name],
136
+ check=True,
137
+ capture_output=True,
138
+ text=True,
139
+ )
140
+ except FileNotFoundError:
141
+ console.print("[bold red]Error:[/] cargo not found. Install Rust via https://rustup.rs")
142
+ sys.exit(1)
143
+ except subprocess.CalledProcessError as exc:
144
+ console.print(f"[bold red]cargo init failed:[/]\n{exc.stderr}")
145
+ sys.exit(1)
146
+
147
+ # ── rust-toolchain.toml ──────────────────────────────────────────
148
+ (project_dir / "rust-toolchain.toml").write_text(RUST_TOOLCHAIN_TOML)
149
+ console.print(" [dim]wrote[/] rust-toolchain.toml")
150
+
151
+ # ── Append [lints] to Cargo.toml ─────────────────────────────────
152
+ cargo_toml = project_dir / "Cargo.toml"
153
+ with cargo_toml.open("a") as f:
154
+ f.write(CARGO_TOML_LINTS)
155
+ console.print(" [dim]appended[/] [lints] to Cargo.toml")
156
+
157
+ # ── .cargo/config.toml ───────────────────────────────────────────
158
+ cargo_config_dir = project_dir / ".cargo"
159
+ cargo_config_dir.mkdir(parents=True, exist_ok=True)
160
+ (cargo_config_dir / "config.toml").write_text(CARGO_CONFIG_TOML)
161
+ console.print(" [dim]wrote[/] .cargo/config.toml")
162
+
163
+ # ── deny.toml ────────────────────────────────────────────────────
164
+ (project_dir / "deny.toml").write_text(DENY_TOML)
165
+ console.print(" [dim]wrote[/] deny.toml")
166
+
167
+ # ── rustfmt.toml ─────────────────────────────────────────────────
168
+ (project_dir / "rustfmt.toml").write_text(RUSTFMT_TOML)
169
+ console.print(" [dim]wrote[/] rustfmt.toml")
170
+
171
+ console.print(f"\n[bold green]Done![/] cd {project_dir} && cargo check")
172
+
173
+
174
+ if __name__ == "__main__":
175
+ app()
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Check TypeScript files for no-excuse violations.
4
+ *
5
+ * Rules:
6
+ * no-any-assertion - `as any`
7
+ * no-unknown-assertion - `as unknown`
8
+ * no-ts-ignore - `@ts-ignore` comments
9
+ * no-ts-expect-error - `@ts-expect-error` comments
10
+ * no-enum - `enum` declarations
11
+ * no-non-null-assertion - `x!` postfix operator
12
+ * no-throw-literal - `throw "string"` / `throw 123`
13
+ * no-mutable-export - `export let` / `export var`
14
+ * no-any-annotation - `: any` in annotations (opt out: `// no-excuse-ok: any`)
15
+ * no-explicit-any-return - `(): any` return types (opt out: `// no-excuse-ok: any`)
16
+ * empty-catch - `catch { }` or `catch (e) { }` with empty body
17
+ * catch-without-narrowing - catch block that uses error without instanceof narrowing
18
+ *
19
+ * Usage:
20
+ * bun run scripts/check-no-excuse-rules.ts <file-or-dir>...
21
+ *
22
+ * Exit codes:
23
+ * 0 - no violations
24
+ * 1 - violations found
25
+ * 2 - input error
26
+ */
27
+
28
+ import fs from "node:fs"
29
+ import path from "node:path"
30
+ import process from "node:process"
31
+ import ts from "typescript"
32
+
33
+ type RuleId =
34
+ | "no-any-assertion"
35
+ | "no-unknown-assertion"
36
+ | "no-ts-ignore"
37
+ | "no-ts-expect-error"
38
+ | "no-enum"
39
+ | "no-non-null-assertion"
40
+ | "no-throw-literal"
41
+ | "no-mutable-export"
42
+ | "no-any-annotation"
43
+ | "no-explicit-any-return"
44
+ | "empty-catch"
45
+ | "catch-without-narrowing"
46
+
47
+ type Violation = {
48
+ readonly ruleId: RuleId
49
+ readonly filePath: string
50
+ readonly line: number
51
+ readonly column: number
52
+ readonly message: string
53
+ }
54
+
55
+ const INCLUDED_EXTENSIONS = new Set([".ts", ".tsx", ".mts", ".cts"])
56
+ const IGNORED_DIRECTORIES = new Set([
57
+ ".git", ".next", ".nuxt", ".turbo", ".yarn",
58
+ "coverage", "dist", "build", "node_modules",
59
+ ])
60
+
61
+ const OPT_OUT_RE = /\/\/\s*no-excuse-ok:\s*any/
62
+ const CATCH_OK_RE = /\/\/\s*no-excuse-ok:\s*catch/
63
+
64
+ function isIncludedFile(filePath: string): boolean {
65
+ return INCLUDED_EXTENSIONS.has(path.extname(filePath).toLowerCase())
66
+ }
67
+
68
+ function isDeclarationFile(filePath: string): boolean {
69
+ return filePath.endsWith(".d.ts") || filePath.endsWith(".d.mts") || filePath.endsWith(".d.cts")
70
+ }
71
+
72
+ function discoverFiles(inputs: string[]): string[] {
73
+ const files: string[] = []
74
+ for (const input of inputs) {
75
+ const resolved = path.resolve(input)
76
+ if (!fs.existsSync(resolved)) {
77
+ console.error(`Path does not exist: ${resolved}`)
78
+ process.exit(2)
79
+ }
80
+ if (fs.statSync(resolved).isFile()) {
81
+ if (isIncludedFile(resolved) && !isDeclarationFile(resolved)) files.push(resolved)
82
+ continue
83
+ }
84
+ const walk = (dir: string): void => {
85
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
86
+ if (entry.isDirectory()) {
87
+ if (!IGNORED_DIRECTORIES.has(entry.name)) walk(path.join(dir, entry.name))
88
+ } else if (isIncludedFile(entry.name) && !isDeclarationFile(entry.name)) {
89
+ files.push(path.join(dir, entry.name))
90
+ }
91
+ }
92
+ }
93
+ walk(resolved)
94
+ }
95
+ return files
96
+ }
97
+
98
+ function getLineText(sourceFile: ts.SourceFile, line: number): string {
99
+ const lineStarts = sourceFile.getLineStarts()
100
+ const start = lineStarts[line]
101
+ const end = line + 1 < lineStarts.length ? lineStarts[line + 1] : sourceFile.getEnd()
102
+ return sourceFile.text.slice(start, end)
103
+ }
104
+
105
+ function analyzeFile(filePath: string): Violation[] {
106
+ const source = fs.readFileSync(filePath, "utf-8")
107
+ const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true)
108
+ const violations: Violation[] = []
109
+
110
+ function pos(node: ts.Node): { line: number; column: number } {
111
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))
112
+ return { line: line + 1, column: character + 1 }
113
+ }
114
+
115
+ function lineHasOptOut(node: ts.Node): boolean {
116
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))
117
+ return OPT_OUT_RE.test(getLineText(sourceFile, line))
118
+ }
119
+
120
+ function visit(node: ts.Node): void {
121
+ // ── as any / as unknown ──
122
+ if (ts.isAsExpression(node)) {
123
+ const typeText = node.type.getText(sourceFile)
124
+ if (typeText === "any") {
125
+ const p = pos(node)
126
+ violations.push({ ruleId: "no-any-assertion", filePath, ...p, message: "`as any` — narrow with type guards or redesign the types" })
127
+ }
128
+ if (typeText === "unknown") {
129
+ const p = pos(node)
130
+ violations.push({ ruleId: "no-unknown-assertion", filePath, ...p, message: "`as unknown` — redesign the types" })
131
+ }
132
+ }
133
+
134
+ // ── enum ──
135
+ if (ts.isEnumDeclaration(node)) {
136
+ const p = pos(node)
137
+ violations.push({ ruleId: "no-enum", filePath, ...p, message: "`enum` — use `as const` object + literal union type" })
138
+ }
139
+
140
+ // ── x! non-null assertion ──
141
+ if (ts.isNonNullExpression(node)) {
142
+ const p = pos(node)
143
+ violations.push({ ruleId: "no-non-null-assertion", filePath, ...p, message: "`x!` — use narrowing or optional chaining" })
144
+ }
145
+
146
+ // ── throw "literal" ──
147
+ if (ts.isThrowStatement(node) && node.expression) {
148
+ const expr = node.expression
149
+ if (ts.isStringLiteral(expr) || ts.isNumericLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {
150
+ const p = pos(node)
151
+ violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw literal` — throw an Error subclass" })
152
+ }
153
+ if (ts.isTemplateExpression(expr)) {
154
+ const p = pos(node)
155
+ violations.push({ ruleId: "no-throw-literal", filePath, ...p, message: "`throw template` — throw an Error subclass" })
156
+ }
157
+ }
158
+
159
+ // ── export let / export var ──
160
+ if (ts.isVariableStatement(node)) {
161
+ const hasExport = node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)
162
+ if (hasExport) {
163
+ const flags = node.declarationList.flags
164
+ if (!(flags & ts.NodeFlags.Const)) {
165
+ const p = pos(node)
166
+ violations.push({ ruleId: "no-mutable-export", filePath, ...p, message: "`export let/var` — use `export const`" })
167
+ }
168
+ }
169
+ }
170
+
171
+ // ── : any in annotations ──
172
+ if (ts.isTypeReferenceNode(node) || node.kind === ts.SyntaxKind.AnyKeyword) {
173
+ if (node.kind === ts.SyntaxKind.AnyKeyword && !lineHasOptOut(node)) {
174
+ const parent = node.parent
175
+ // Skip `as any` — already caught by no-any-assertion
176
+ if (parent && ts.isAsExpression(parent)) {
177
+ // already handled
178
+ } else if (parent && (
179
+ ts.isParameter(parent) ||
180
+ ts.isVariableDeclaration(parent) ||
181
+ ts.isPropertyDeclaration(parent) ||
182
+ ts.isPropertySignature(parent)
183
+ )) {
184
+ const p = pos(node)
185
+ violations.push({ ruleId: "no-any-annotation", filePath, ...p, message: "`: any` annotation — use `unknown` and narrow" })
186
+ } else if (parent && (
187
+ ts.isFunctionDeclaration(parent) ||
188
+ ts.isMethodDeclaration(parent) ||
189
+ ts.isArrowFunction(parent) ||
190
+ ts.isFunctionExpression(parent)
191
+ )) {
192
+ const p = pos(node)
193
+ violations.push({ ruleId: "no-explicit-any-return", filePath, ...p, message: "`(): any` return — use a specific type" })
194
+ }
195
+ }
196
+ }
197
+
198
+ // ── empty catch / catch without narrowing ──
199
+ if (ts.isCatchClause(node)) {
200
+ const catchLine = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line
201
+ const catchLineText = getLineText(sourceFile, catchLine)
202
+ if (!CATCH_OK_RE.test(catchLineText)) {
203
+ const body = node.block
204
+ const stmts = body.statements
205
+
206
+ if (stmts.length === 0) {
207
+ // Empty catch — swallows everything silently
208
+ const p = pos(node)
209
+ violations.push({ ruleId: "empty-catch", filePath, ...p, message: "empty `catch` block — handle, re-throw, or remove the try/catch" })
210
+ } else if (node.variableDeclaration) {
211
+ // Has a bound variable — check if it's narrowed with instanceof
212
+ const varName = node.variableDeclaration.name.getText(sourceFile)
213
+ const blockText = body.getText(sourceFile)
214
+ const hasInstanceof = blockText.includes(`instanceof`)
215
+ const hasRethrow = blockText.includes(`throw ${varName}`) || blockText.includes(`throw new`)
216
+ if (!hasInstanceof && !hasRethrow) {
217
+ const p = pos(node)
218
+ violations.push({ ruleId: "catch-without-narrowing", filePath, ...p, message: "`catch` without `instanceof` narrowing or re-throw — narrow the error type or re-throw" })
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ ts.forEachChild(node, visit)
225
+ }
226
+
227
+ visit(sourceFile)
228
+
229
+ // ── @ts-ignore / @ts-expect-error in comments ──
230
+ const commentRanges = [
231
+ ...(ts.getLeadingCommentRanges(source, 0) ?? []),
232
+ ]
233
+ // Scan all comments via regex for reliability
234
+ const commentRegex = /\/\/\s*@ts-(ignore|expect-error)/g
235
+ let match: RegExpExecArray | null
236
+ while ((match = commentRegex.exec(source)) !== null) {
237
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(match.index)
238
+ const kind = match[1]
239
+ violations.push({
240
+ ruleId: kind === "ignore" ? "no-ts-ignore" : "no-ts-expect-error",
241
+ filePath,
242
+ line: line + 1,
243
+ column: character + 1,
244
+ message: `\`@ts-${kind}\` — fix the underlying type`,
245
+ })
246
+ }
247
+
248
+ return violations
249
+ }
250
+
251
+ function formatViolation(v: Violation): string {
252
+ return `${v.filePath}:${v.line}:${v.column}: [${v.ruleId}] ${v.message}`
253
+ }
254
+
255
+ function main(): void {
256
+ const args = process.argv.slice(2)
257
+ if (args.length === 0) {
258
+ console.error("usage: check-no-excuse-rules.ts <file-or-dir>...")
259
+ process.exit(2)
260
+ }
261
+
262
+ const files = discoverFiles(args)
263
+ if (files.length === 0) {
264
+ console.error("No TypeScript files found.")
265
+ process.exit(2)
266
+ }
267
+
268
+ const violations = files.flatMap((f) => analyzeFile(f))
269
+
270
+ if (violations.length === 0) {
271
+ console.log(`No violations in ${files.length} file(s).`)
272
+ return
273
+ }
274
+
275
+ for (const v of violations) {
276
+ console.error(formatViolation(v))
277
+ }
278
+ console.error(`\n${violations.length} violation(s) in ${files.length} file(s).`)
279
+ process.exit(1)
280
+ }
281
+
282
+ main()