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,285 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { stdin as processStdin } from "node:process";
3
+
4
+ import { disposeDefaultLspManager } from "../../../../../lsp-tools-mcp/dist/lsp/manager.js";
5
+ import { executeLspDiagnostics } from "../../../../../lsp-tools-mcp/dist/tools.js";
6
+
7
+ export type DiagnosticsRunner = (filePath: string) => Promise<string>;
8
+
9
+ export interface CodexPostToolUseInput {
10
+ tool_name?: unknown;
11
+ tool_input?: unknown;
12
+ tool_response?: unknown;
13
+ transcript_path?: unknown;
14
+ }
15
+
16
+ interface DiagnosticBlock {
17
+ filePath: string;
18
+ diagnostics: string;
19
+ }
20
+
21
+ interface PostToolUseHookOutput {
22
+ decision: "block";
23
+ reason: string;
24
+ hookSpecificOutput: {
25
+ hookEventName: "PostToolUse";
26
+ additionalContext: string;
27
+ };
28
+ }
29
+
30
+ const MUTATION_TOOL_NAMES = new Set(["apply_patch", "write", "edit", "multiedit", "multi_edit"]);
31
+ const CLEAN_DIAGNOSTICS_TEXT = "No diagnostics found";
32
+ const UNSUPPORTED_EXTENSION_TEXT = "No LSP server configured for extension:";
33
+ const DIAGNOSTIC_START_PATTERN = /(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/g;
34
+ const DIAGNOSTIC_CHUNK_PATTERN = /^(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/;
35
+ const DEFAULT_MAX_HOOK_FEEDBACK_CHARS = 8000;
36
+ const CONTEXT_PRESSURE_MAX_HOOK_FEEDBACK_CHARS = 1200;
37
+ const MAX_CONCURRENT_DIAGNOSTICS = 4;
38
+ const CONTEXT_PRESSURE_MARKERS = [
39
+ "context compacted",
40
+ "context_length_exceeded",
41
+ "skill descriptions were shortened",
42
+ "context_too_large",
43
+ "codex ran out of room in the model's context window",
44
+ "your input exceeds the context window",
45
+ "long threads and multiple compactions",
46
+ ] as const;
47
+
48
+ export async function runLspDiagnosticsText(filePath: string): Promise<string> {
49
+ const result = await executeLspDiagnostics({ filePath, severity: "error" });
50
+ return result.content.map((block) => block.text).join("\n");
51
+ }
52
+
53
+ export async function runLspPostToolUseHook(
54
+ input: CodexPostToolUseInput,
55
+ runDiagnostics: DiagnosticsRunner = runLspDiagnosticsText,
56
+ ): Promise<string> {
57
+ const filePaths = extractMutatedFilePaths(input);
58
+ if (filePaths.length === 0) return "";
59
+
60
+ const blocks: DiagnosticBlock[] = [];
61
+ for (const { filePath, diagnostics } of await collectDiagnostics(filePaths, runDiagnostics)) {
62
+ if (isCleanDiagnostics(diagnostics)) continue;
63
+ blocks.push({ filePath, diagnostics });
64
+ }
65
+
66
+ if (blocks.length === 0) return "";
67
+
68
+ const rawReason = blocks.map(formatDiagnosticBlock).join("\n\n");
69
+ const reason = limitHookText(rawReason, hookFeedbackLimit(input.transcript_path));
70
+ const output: PostToolUseHookOutput = {
71
+ decision: "block",
72
+ reason,
73
+ hookSpecificOutput: {
74
+ hookEventName: "PostToolUse",
75
+ additionalContext: reason,
76
+ },
77
+ };
78
+ return `${JSON.stringify(output)}\n`;
79
+ }
80
+
81
+ async function collectDiagnostics(
82
+ filePaths: readonly string[],
83
+ runDiagnostics: DiagnosticsRunner,
84
+ ): Promise<DiagnosticBlock[]> {
85
+ const results: DiagnosticBlock[] = [];
86
+ let nextIndex = 0;
87
+ const workerCount = Math.min(MAX_CONCURRENT_DIAGNOSTICS, filePaths.length);
88
+ async function worker(): Promise<void> {
89
+ for (;;) {
90
+ const index = nextIndex;
91
+ nextIndex += 1;
92
+ const filePath = filePaths[index];
93
+ if (filePath === undefined) return;
94
+ results[index] = { filePath, diagnostics: (await runDiagnostics(filePath)).trim() };
95
+ }
96
+ }
97
+ await Promise.all(Array.from({ length: workerCount }, () => worker()));
98
+ return results;
99
+ }
100
+
101
+ function formatDiagnosticBlock({ filePath, diagnostics }: DiagnosticBlock): string {
102
+ return `LSP diagnostics after editing ${filePath}:\n\n${formatDiagnosticsForDisplay(diagnostics)}`;
103
+ }
104
+
105
+ function formatDiagnosticsForDisplay(diagnostics: string): string {
106
+ const chunks = splitDiagnosticChunks(diagnostics);
107
+ if (!chunks.some(isDiagnosticChunk)) return chunks.join("\n").trim();
108
+ return chunks.map(formatDiagnosticChunk).join("\n");
109
+ }
110
+
111
+ function splitDiagnosticChunks(diagnostics: string): string[] {
112
+ const normalized = diagnostics.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
113
+ if (normalized.length === 0) return [];
114
+
115
+ const matches = Array.from(normalized.matchAll(DIAGNOSTIC_START_PATTERN));
116
+ const firstMatch = matches[0];
117
+ if (firstMatch?.index === undefined) return [normalized];
118
+
119
+ const chunks: string[] = [];
120
+ const leadingText = normalized.slice(0, firstMatch.index).trim();
121
+ if (leadingText.length > 0) chunks.push(leadingText);
122
+
123
+ for (const [index, match] of matches.entries()) {
124
+ if (match.index === undefined) continue;
125
+ const nextMatch = matches[index + 1];
126
+ const end = nextMatch?.index ?? normalized.length;
127
+ const chunk = normalized.slice(match.index, end).trim();
128
+ if (chunk.length > 0) chunks.push(chunk);
129
+ }
130
+
131
+ return chunks;
132
+ }
133
+
134
+ function formatDiagnosticChunk(chunk: string): string {
135
+ const lines = chunk.split("\n");
136
+ const firstLine = lines[0];
137
+ if (firstLine === undefined) return "";
138
+ if (!isDiagnosticChunk(firstLine)) return chunk;
139
+ const followingLines = lines.slice(1).map((line) => ` ${line}`);
140
+ return [`- ${firstLine}`, ...followingLines].join("\n");
141
+ }
142
+
143
+ function isDiagnosticChunk(chunk: string): boolean {
144
+ return DIAGNOSTIC_CHUNK_PATTERN.test(chunk);
145
+ }
146
+
147
+ function hookFeedbackLimit(transcriptPath: unknown): number {
148
+ return isContextPressureTranscript(transcriptPath)
149
+ ? CONTEXT_PRESSURE_MAX_HOOK_FEEDBACK_CHARS
150
+ : DEFAULT_MAX_HOOK_FEEDBACK_CHARS;
151
+ }
152
+
153
+ function isContextPressureTranscript(transcriptPath: unknown): boolean {
154
+ if (typeof transcriptPath !== "string") return false;
155
+ try {
156
+ return hasContextPressureMarker(readFileSync(transcriptPath, "utf8"));
157
+ } catch (error) {
158
+ if (error instanceof Error) return false;
159
+ throw error;
160
+ }
161
+ }
162
+
163
+ function hasContextPressureMarker(text: string): boolean {
164
+ const normalizedText = text.toLowerCase();
165
+ return CONTEXT_PRESSURE_MARKERS.some((marker) => normalizedText.includes(marker));
166
+ }
167
+
168
+ function limitHookText(text: string, maxChars: number): string {
169
+ if (text.length <= maxChars) return text;
170
+ const marker = `\n\n[Truncated hook output to ${maxChars} chars to avoid Codex context overflow.]`;
171
+ if (marker.length >= maxChars) return marker.slice(0, maxChars);
172
+ const head = text.slice(0, maxChars - marker.length).replace(/[ \t\r\n]+$/, "");
173
+ return `${head}${marker}`;
174
+ }
175
+
176
+ export function extractMutatedFilePaths(input: CodexPostToolUseInput): string[] {
177
+ if (!isMutationTool(input.tool_name)) return [];
178
+ if (isFailedToolResponse(input.tool_response)) return [];
179
+
180
+ const toolInput = isRecord(input.tool_input) ? input.tool_input : {};
181
+ const paths = new Set<string>();
182
+ addStringValue(paths, toolInput["path"]);
183
+ addStringValue(paths, toolInput["filePath"]);
184
+ addStringValue(paths, toolInput["file_path"]);
185
+ addStringArray(paths, toolInput["paths"]);
186
+ addStringArray(paths, toolInput["filePaths"]);
187
+ addStringArray(paths, toolInput["file_paths"]);
188
+ addPatchPayloads(paths, toolInput);
189
+ addPatchFiles(paths, toolInput["files"]);
190
+ addPatchFiles(paths, toolInput["changes"]);
191
+ return [...paths];
192
+ }
193
+
194
+ export async function runPostToolUseHookCli(stdin: NodeJS.ReadStream = processStdin): Promise<void> {
195
+ try {
196
+ const raw = await readStdin(stdin);
197
+ if (!raw.trim()) return;
198
+ const parsed: unknown = JSON.parse(raw);
199
+ const input = isRecord(parsed) ? parsed : {};
200
+ const output = await runLspPostToolUseHook(input);
201
+ if (output) process.stdout.write(output);
202
+ } finally {
203
+ await disposeDefaultLspManager();
204
+ }
205
+ }
206
+
207
+ function isMutationTool(value: unknown): boolean {
208
+ if (typeof value !== "string") return false;
209
+ return MUTATION_TOOL_NAMES.has(value.toLowerCase());
210
+ }
211
+
212
+ function isCleanDiagnostics(diagnostics: string): boolean {
213
+ return (
214
+ diagnostics.length === 0 ||
215
+ diagnostics === CLEAN_DIAGNOSTICS_TEXT ||
216
+ diagnostics.startsWith(UNSUPPORTED_EXTENSION_TEXT)
217
+ );
218
+ }
219
+
220
+ function isFailedToolResponse(value: unknown): boolean {
221
+ if (!isRecord(value)) return false;
222
+ return (
223
+ value["isError"] === true || value["is_error"] === true || value["error"] === true || value["status"] === "error"
224
+ );
225
+ }
226
+
227
+ function addStringValue(paths: Set<string>, value: unknown): void {
228
+ if (typeof value === "string" && value.length > 0) {
229
+ paths.add(value);
230
+ }
231
+ }
232
+
233
+ function addStringArray(paths: Set<string>, value: unknown): void {
234
+ if (!Array.isArray(value)) return;
235
+ for (const item of value) {
236
+ addStringValue(paths, item);
237
+ }
238
+ }
239
+
240
+ function addPatchPayloads(paths: Set<string>, input: Record<string, unknown>): void {
241
+ addPatchInput(paths, input["input"]);
242
+ addPatchInput(paths, input["patch"]);
243
+ addPatchInput(paths, input["command"]);
244
+ }
245
+
246
+ function addPatchInput(paths: Set<string>, value: unknown): void {
247
+ if (typeof value !== "string") return;
248
+ for (const line of value.split("\n")) {
249
+ const path = extractPatchHeaderPath(line);
250
+ if (path !== undefined) paths.add(path);
251
+ }
252
+ }
253
+
254
+ function extractPatchHeaderPath(line: string): string | undefined {
255
+ const prefixes = ["*** Add File: ", "*** Update File: ", "*** Move to: "] as const;
256
+ for (const prefix of prefixes) {
257
+ if (line.startsWith(prefix)) return line.slice(prefix.length).trim();
258
+ }
259
+ return undefined;
260
+ }
261
+
262
+ function addPatchFiles(paths: Set<string>, value: unknown): void {
263
+ if (!Array.isArray(value)) return;
264
+ for (const item of value) {
265
+ if (!isRecord(item)) continue;
266
+ addStringValue(paths, item["path"]);
267
+ addStringValue(paths, item["filePath"]);
268
+ addStringValue(paths, item["file_path"]);
269
+ addStringValue(paths, item["movePath"]);
270
+ addStringValue(paths, item["move_path"]);
271
+ }
272
+ }
273
+
274
+ function isRecord(value: unknown): value is Record<string, unknown> {
275
+ return typeof value === "object" && value !== null && !Array.isArray(value);
276
+ }
277
+
278
+ async function readStdin(stdin: NodeJS.ReadStream): Promise<string> {
279
+ stdin.setEncoding("utf8");
280
+ let raw = "";
281
+ for await (const chunk of stdin) {
282
+ raw += chunk;
283
+ }
284
+ return raw;
285
+ }
@@ -0,0 +1,358 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+
7
+ import { extractMutatedFilePaths, runLspPostToolUseHook } from "../src/codex-hook.js";
8
+
9
+ const tempDirs: string[] = [];
10
+
11
+ afterEach(() => {
12
+ for (const tempDir of tempDirs.splice(0)) {
13
+ rmSync(tempDir, { recursive: true, force: true });
14
+ }
15
+ });
16
+
17
+ describe("codex PostToolUse hook", () => {
18
+ it("extracts files from Codex apply_patch command payloads", () => {
19
+ const paths = extractMutatedFilePaths({
20
+ tool_name: "apply_patch",
21
+ tool_input: {
22
+ command: [
23
+ "*** Begin Patch",
24
+ "*** Add File: src/new.ts",
25
+ "+export const value = 1;",
26
+ "*** Update File: src/existing.ts",
27
+ "@@",
28
+ "-export const old = true;",
29
+ "+export const old = false;",
30
+ "*** End Patch",
31
+ ].join("\n"),
32
+ },
33
+ tool_response: "Success. Updated files.",
34
+ });
35
+
36
+ expect(paths).toEqual(["src/new.ts", "src/existing.ts"]);
37
+ });
38
+
39
+ it("extracts files from edit-style tool input aliases", () => {
40
+ const paths = extractMutatedFilePaths({
41
+ tool_name: "Edit",
42
+ tool_input: { file_path: "src/edit.ts" },
43
+ tool_response: { ok: true },
44
+ });
45
+
46
+ expect(paths).toEqual(["src/edit.ts"]);
47
+ });
48
+
49
+ it("#given post-edit diagnostics contain one error #when the hook blocks #then it keeps the blocked output shape", async () => {
50
+ // given
51
+ const output = await runLspPostToolUseHook(
52
+ {
53
+ tool_name: "apply_patch",
54
+ tool_input: {
55
+ command: "*** Begin Patch\n*** Update File: src/broken.ts\n@@\n+missing();\n*** End Patch\n",
56
+ },
57
+ tool_response: "Success. Updated files.",
58
+ },
59
+ async (filePath) => {
60
+ expect(filePath).toBe("src/broken.ts");
61
+ return "error[typescript] (2304) at 1:1: Cannot find name 'missing'.";
62
+ },
63
+ );
64
+
65
+ // when
66
+ const parsed: unknown = JSON.parse(output);
67
+
68
+ // then
69
+ expect(JSON.parse(output)).toEqual({
70
+ decision: "block",
71
+ hookSpecificOutput: {
72
+ hookEventName: "PostToolUse",
73
+ additionalContext:
74
+ "LSP diagnostics after editing src/broken.ts:\n\n" +
75
+ "- error[typescript] (2304) at 1:1: Cannot find name 'missing'.",
76
+ },
77
+ reason:
78
+ "LSP diagnostics after editing src/broken.ts:\n\n" +
79
+ "- error[typescript] (2304) at 1:1: Cannot find name 'missing'.",
80
+ });
81
+ expect(parsed).toHaveProperty("decision", "block");
82
+ });
83
+
84
+ it("#given adjacent TypeScript diagnostics #when the hook blocks #then it renders each diagnostic on its own bullet line", async () => {
85
+ // given
86
+ const output = await runLspPostToolUseHook(
87
+ {
88
+ tool_name: "apply_patch",
89
+ tool_input: {
90
+ command: "*** Begin Patch\n*** Update File: src/broken.ts\n@@\n+missing();\n*** End Patch\n",
91
+ },
92
+ tool_response: "Success. Updated files.",
93
+ },
94
+ async () =>
95
+ "error[typescript] (2307) at 5:7: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.error[typescript] (2307) at 6:49: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.error[typescript] (2307) at 10:7: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.",
96
+ );
97
+
98
+ // when
99
+ const parsed: unknown = JSON.parse(output);
100
+ if (!isPostToolUseHookOutput(parsed)) throw new TypeError("Expected PostToolUse hook output");
101
+
102
+ // then
103
+ expect(parsed.reason).toBe(
104
+ [
105
+ "LSP diagnostics after editing src/broken.ts:",
106
+ "",
107
+ "- error[typescript] (2307) at 5:7: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.",
108
+ "- error[typescript] (2307) at 6:49: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.",
109
+ "- error[typescript] (2307) at 10:7: Cannot find module 'openclaw/plugin-sdk/config-runtime' or its corresponding type declarations.",
110
+ ].join("\n"),
111
+ );
112
+ expect(parsed.hookSpecificOutput.additionalContext).toBe(parsed.reason);
113
+ });
114
+
115
+ it("#given plain non-diagnostic feedback #when the hook blocks #then it preserves the text after the readable header", async () => {
116
+ // given
117
+ const output = await runLspPostToolUseHook(
118
+ {
119
+ tool_name: "write",
120
+ tool_input: { path: "src/broken.ts" },
121
+ tool_response: { ok: true },
122
+ },
123
+ async () => "language server failed before diagnostics could be collected",
124
+ );
125
+
126
+ // when
127
+ const parsed: unknown = JSON.parse(output);
128
+ if (!isPostToolUseHookOutput(parsed)) throw new TypeError("Expected PostToolUse hook output");
129
+
130
+ // then
131
+ expect(parsed.reason).toBe(
132
+ "LSP diagnostics after editing src/broken.ts:\n\nlanguage server failed before diagnostics could be collected",
133
+ );
134
+ expect(parsed.hookSpecificOutput.additionalContext).toBe(parsed.reason);
135
+ });
136
+
137
+ it("#given plain non-diagnostic feedback with CRLF and bare CR #when the hook blocks #then it normalizes line endings", async () => {
138
+ // given
139
+ const output = await runLspPostToolUseHook(
140
+ {
141
+ tool_name: "write",
142
+ tool_input: { path: "src/broken.ts" },
143
+ tool_response: { ok: true },
144
+ },
145
+ async () => "\r\nlanguage server failed\r\n retry detail\rbefore diagnostics could be collected\r\n",
146
+ );
147
+
148
+ // when
149
+ const parsed: unknown = JSON.parse(output);
150
+ if (!isPostToolUseHookOutput(parsed)) throw new TypeError("Expected PostToolUse hook output");
151
+
152
+ // then
153
+ expect(parsed.reason).toBe(
154
+ "LSP diagnostics after editing src/broken.ts:\n\nlanguage server failed\n retry detail\nbefore diagnostics could be collected",
155
+ );
156
+ expect(parsed.reason).not.toContain("\r");
157
+ expect(parsed.hookSpecificOutput.additionalContext).toBe(parsed.reason);
158
+ });
159
+
160
+ it("#given multiple edited files #when only one file has diagnostics #then it injects only files with diagnostics", async () => {
161
+ // given
162
+ const checkedFilePaths: string[] = [];
163
+ const output = await runLspPostToolUseHook(
164
+ {
165
+ tool_name: "MultiEdit",
166
+ tool_input: {
167
+ file_paths: ["src/clean.ts", "README.md", "src/broken.ts", "src/broken.ts"],
168
+ },
169
+ tool_response: { ok: true },
170
+ },
171
+ async (filePath) => {
172
+ checkedFilePaths.push(filePath);
173
+ if (filePath === "src/broken.ts") {
174
+ return "error[typescript] (2322) at 1:7: Type 'number' is not assignable to type 'string'.";
175
+ }
176
+ if (filePath === "README.md") {
177
+ return "No LSP server configured for extension: .md";
178
+ }
179
+ return "No diagnostics found";
180
+ },
181
+ );
182
+
183
+ // when
184
+ const expectedDiagnostics =
185
+ "LSP diagnostics after editing src/broken.ts:\n\n" +
186
+ "- error[typescript] (2322) at 1:7: Type 'number' is not assignable to type 'string'.";
187
+
188
+ // then
189
+ expect(checkedFilePaths).toEqual(["src/clean.ts", "README.md", "src/broken.ts"]);
190
+ expect(JSON.parse(output)).toEqual({
191
+ decision: "block",
192
+ hookSpecificOutput: {
193
+ hookEventName: "PostToolUse",
194
+ additionalContext: expectedDiagnostics,
195
+ },
196
+ reason: expectedDiagnostics,
197
+ });
198
+ });
199
+
200
+ it("#given multiple edited files #when diagnostics resolve out of order #then starts bounded concurrent diagnostics and preserves output order", async () => {
201
+ // given
202
+ const calls: string[] = [];
203
+ const resolvers = new Map<string, (value: string) => void>();
204
+ const outputPromise = runLspPostToolUseHook(
205
+ {
206
+ tool_name: "MultiEdit",
207
+ tool_input: { file_paths: ["src/a.ts", "src/b.ts"] },
208
+ tool_response: { ok: true },
209
+ },
210
+ (filePath) =>
211
+ new Promise<string>((resolve) => {
212
+ calls.push(filePath);
213
+ resolvers.set(filePath, resolve);
214
+ }),
215
+ );
216
+
217
+ // when
218
+ const startedBeforeRelease = [...calls];
219
+ const resolveB = resolvers.get("src/b.ts");
220
+ const resolveA = resolvers.get("src/a.ts");
221
+ if (resolveB === undefined || resolveA === undefined) throw new TypeError("Expected both diagnostics to start");
222
+ resolveB("error[typescript] (1000) at 1:1: src/b.ts failed.");
223
+ await Promise.resolve();
224
+ resolveA("error[typescript] (1000) at 1:1: src/a.ts failed.");
225
+ const parsed: unknown = JSON.parse(await outputPromise);
226
+ if (!isPostToolUseHookOutput(parsed)) throw new TypeError("Expected PostToolUse hook output");
227
+
228
+ // then
229
+ expect(startedBeforeRelease).toEqual(["src/a.ts", "src/b.ts"]);
230
+ expect(parsed.reason.indexOf("src/a.ts")).toBeLessThan(parsed.reason.indexOf("src/b.ts"));
231
+ });
232
+
233
+ it("#given six edited files #when diagnostics run #then at most four are active concurrently", async () => {
234
+ // given
235
+ const calls: string[] = [];
236
+ const resolvers = new Map<string, (value: string) => void>();
237
+ const filePaths = ["src/a.ts", "src/b.ts", "src/c.ts", "src/d.ts", "src/e.ts", "src/f.ts"];
238
+ const outputPromise = runLspPostToolUseHook(
239
+ {
240
+ tool_name: "MultiEdit",
241
+ tool_input: { file_paths: filePaths },
242
+ tool_response: { ok: true },
243
+ },
244
+ (filePath) =>
245
+ new Promise<string>((resolve) => {
246
+ calls.push(filePath);
247
+ resolvers.set(filePath, resolve);
248
+ }),
249
+ );
250
+
251
+ // when
252
+ const initialCalls = [...calls];
253
+ for (const filePath of filePaths) {
254
+ resolvers.get(filePath)?.("No diagnostics found");
255
+ await Promise.resolve();
256
+ }
257
+ await outputPromise;
258
+
259
+ // then
260
+ expect(initialCalls).toEqual(["src/a.ts", "src/b.ts", "src/c.ts", "src/d.ts"]);
261
+ });
262
+
263
+ it("does not run diagnostics for failed mutation tool responses", async () => {
264
+ const output = await runLspPostToolUseHook(
265
+ {
266
+ tool_name: "apply_patch",
267
+ tool_input: {
268
+ command: "*** Begin Patch\n*** Update File: src/broken.ts\n@@\n+missing();\n*** End Patch\n",
269
+ },
270
+ tool_response: { isError: true },
271
+ },
272
+ async () => {
273
+ throw new Error("diagnostics should not run after failed mutations");
274
+ },
275
+ );
276
+
277
+ expect(output).toBe("");
278
+ });
279
+
280
+ it("is silent for clean diagnostics and unsupported extensions", async () => {
281
+ const output = await runLspPostToolUseHook(
282
+ {
283
+ tool_name: "apply_patch",
284
+ tool_input: {
285
+ command: "*** Begin Patch\n*** Update File: README.md\n@@\n+hello\n*** End Patch\n",
286
+ },
287
+ tool_response: "Success. Updated files.",
288
+ },
289
+ async () => "No LSP server configured for extension: .md",
290
+ );
291
+
292
+ expect(output).toBe("");
293
+ });
294
+
295
+ it("#given Codex canonical context-window transcript and large diagnostics #when the hook blocks #then it caps injected feedback", async () => {
296
+ const root = mkdtempSync(path.join(tmpdir(), "codex-lsp-context-pressure-"));
297
+ tempDirs.push(root);
298
+ const transcriptPath = path.join(root, "transcript.jsonl");
299
+ writeFileSync(
300
+ transcriptPath,
301
+ [
302
+ "context_length_exceeded",
303
+ "Codex ran out of room in the model's context window. Start a new thread before retrying.",
304
+ "",
305
+ ].join("\n"),
306
+ );
307
+ const largeDiagnostics = [
308
+ "error[typescript] (2322) at 1:1: Type 'number' is not assignable to type 'string'.",
309
+ "x".repeat(10_000),
310
+ ].join("\n");
311
+
312
+ const output = await runLspPostToolUseHook(
313
+ {
314
+ tool_name: "apply_patch",
315
+ tool_input: {
316
+ command:
317
+ "*** Begin Patch\n*** Update File: src/broken.ts\n@@\n+const value: string = 1;\n*** End Patch\n",
318
+ },
319
+ tool_response: "Success. Updated files.",
320
+ transcript_path: transcriptPath,
321
+ },
322
+ async () => largeDiagnostics,
323
+ );
324
+
325
+ const parsed: unknown = JSON.parse(output);
326
+ if (!isPostToolUseHookOutput(parsed)) throw new TypeError("Expected PostToolUse hook output");
327
+
328
+ expect(parsed.reason.length).toBeLessThanOrEqual(1200);
329
+ expect(parsed.reason).toContain("LSP diagnostics after editing src/broken.ts");
330
+ expect(parsed.reason).toContain("[Truncated hook output");
331
+ expect(parsed.hookSpecificOutput.additionalContext).toBe(parsed.reason);
332
+ });
333
+ });
334
+
335
+ interface PostToolUseHookOutput {
336
+ readonly decision: "block";
337
+ readonly reason: string;
338
+ readonly hookSpecificOutput: {
339
+ readonly hookEventName: "PostToolUse";
340
+ readonly additionalContext: string;
341
+ };
342
+ }
343
+
344
+ function isPostToolUseHookOutput(value: unknown): value is PostToolUseHookOutput {
345
+ if (!isRecord(value)) return false;
346
+ const hookSpecificOutput = value["hookSpecificOutput"];
347
+ return (
348
+ value["decision"] === "block" &&
349
+ typeof value["reason"] === "string" &&
350
+ isRecord(hookSpecificOutput) &&
351
+ hookSpecificOutput["hookEventName"] === "PostToolUse" &&
352
+ typeof hookSpecificOutput["additionalContext"] === "string"
353
+ );
354
+ }
355
+
356
+ function isRecord(value: unknown): value is Record<string, unknown> {
357
+ return typeof value === "object" && value !== null && !Array.isArray(value);
358
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "session_id": "00000000-0000-0000-0000-000000000000",
3
+ "turn_id": "00000000-0000-0000-0000-000000000001",
4
+ "transcript_path": "/tmp/codex-lsp-transcript.jsonl",
5
+ "cwd": ".",
6
+ "hook_event_name": "PostToolUse",
7
+ "model": "gpt-5.5",
8
+ "permission_mode": "default",
9
+ "tool_name": "apply_patch",
10
+ "tool_input": {
11
+ "command": "*** Begin Patch\n*** Update File: test/fixtures/broken.py\n@@\n-value: str = 1\n+value: str = 1\n*** End Patch\n"
12
+ },
13
+ "tool_response": "Success. Updated files.",
14
+ "tool_use_id": "toolu_000000000000000000000000"
15
+ }