oh-my-opencode 4.5.1 → 4.6.0

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 (668) hide show
  1. package/.agents/skills/opencode-qa/SKILL.md +194 -0
  2. package/.agents/skills/opencode-qa/references/cli-commands.md +188 -0
  3. package/.agents/skills/opencode-qa/references/db-investigation.md +197 -0
  4. package/.agents/skills/opencode-qa/references/events-hooks.md +110 -0
  5. package/.agents/skills/opencode-qa/references/sdk.md +96 -0
  6. package/.agents/skills/opencode-qa/references/server-api.md +200 -0
  7. package/.agents/skills/opencode-qa/references/testing-harness.md +218 -0
  8. package/.agents/skills/opencode-qa/references/tui-tmux.md +52 -0
  9. package/.agents/skills/opencode-qa/scripts/db-session-by-id.sh +53 -0
  10. package/.agents/skills/opencode-qa/scripts/db-session-by-name.sh +57 -0
  11. package/.agents/skills/opencode-qa/scripts/db-session-by-text.sh +158 -0
  12. package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -0
  13. package/.agents/skills/opencode-qa/scripts/lib/common.sh +216 -0
  14. package/.agents/skills/opencode-qa/scripts/server-smoke.sh +64 -0
  15. package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +106 -0
  16. package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +89 -0
  17. package/README.ja.md +43 -18
  18. package/README.ko.md +43 -18
  19. package/README.md +92 -24
  20. package/README.ru.md +43 -18
  21. package/README.zh-cn.md +55 -24
  22. package/bin/oh-my-opencode.js +49 -3
  23. package/bin/oh-my-opencode.test.ts +202 -0
  24. package/bin/platform.d.ts +7 -1
  25. package/bin/platform.js +23 -4
  26. package/bin/platform.test.ts +97 -10
  27. package/dist/cli/cleanup-command.d.ts +4 -0
  28. package/dist/cli/cleanup.d.ts +11 -0
  29. package/dist/cli/cli-program.d.ts +19 -0
  30. package/dist/cli/index.js +30085 -26385
  31. package/dist/cli/install-codex/codex-cache-bundled-mcps.d.ts +5 -0
  32. package/dist/cli/install-codex/codex-cache-command-shim.d.ts +1 -0
  33. package/dist/cli/install-codex/codex-cache-legacy-bins.d.ts +3 -0
  34. package/dist/cli/install-codex/codex-cache-local-dependencies.d.ts +1 -0
  35. package/dist/cli/install-codex/codex-cache-paths.d.ts +2 -0
  36. package/dist/cli/install-codex/codex-cache.d.ts +32 -0
  37. package/dist/cli/install-codex/codex-cleanup-config.d.ts +6 -0
  38. package/dist/cli/install-codex/codex-cleanup.d.ts +21 -0
  39. package/dist/cli/install-codex/codex-config-mcp.d.ts +1 -0
  40. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -0
  41. package/dist/cli/install-codex/codex-config-reasoning.d.ts +1 -0
  42. package/dist/cli/install-codex/codex-config-toml.d.ts +12 -0
  43. package/dist/cli/install-codex/codex-hook-trust.d.ts +6 -0
  44. package/dist/cli/install-codex/codex-installation-detection.d.ts +36 -0
  45. package/dist/cli/install-codex/codex-marketplace-snapshot.d.ts +15 -0
  46. package/dist/cli/install-codex/codex-marketplace.d.ts +9 -0
  47. package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +1 -0
  48. package/dist/cli/install-codex/codex-package-layout.d.ts +1 -0
  49. package/dist/cli/install-codex/codex-process.d.ts +2 -0
  50. package/dist/cli/install-codex/codex-project-local-cleanup-best-effort.d.ts +7 -0
  51. package/dist/cli/install-codex/codex-project-local-cleanup.d.ts +35 -0
  52. package/dist/cli/install-codex/git-bash.d.ts +35 -0
  53. package/dist/cli/install-codex/index.d.ts +11 -0
  54. package/dist/cli/install-codex/install-codex.d.ts +17 -0
  55. package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +12 -0
  56. package/dist/cli/install-codex/toml-section-editor.d.ts +11 -0
  57. package/dist/cli/install-codex/types.d.ts +76 -0
  58. package/dist/cli/run/event-state.d.ts +1 -0
  59. package/dist/cli/run/poll-for-completion.d.ts +1 -0
  60. package/dist/cli/run/prompt-start.d.ts +7 -0
  61. package/dist/cli/star-request.d.ts +11 -0
  62. package/dist/cli/tui-install-prompts.d.ts +3 -2
  63. package/dist/cli/types.d.ts +8 -0
  64. package/dist/config/schema/agent-names.d.ts +4 -1
  65. package/dist/config/schema/commands.d.ts +1 -2
  66. package/dist/config/schema/hooks.d.ts +0 -1
  67. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -3
  68. package/dist/create-hooks.d.ts +0 -1
  69. package/dist/create-managers.d.ts +1 -0
  70. package/dist/features/background-agent/parent-wake-message-activity.d.ts +23 -0
  71. package/dist/features/background-agent/parent-wake-notifier.d.ts +0 -1
  72. package/dist/features/boulder-state/storage.d.ts +1 -1
  73. package/dist/features/builtin-commands/templates/refactor.d.ts +1 -1
  74. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +2 -2
  75. package/dist/features/builtin-commands/types.d.ts +1 -1
  76. package/dist/features/builtin-skills/skill-file-loader.d.ts +4 -0
  77. package/dist/features/builtin-skills/skills/debugging.d.ts +2 -0
  78. package/dist/features/builtin-skills/skills/index.d.ts +5 -1
  79. package/dist/features/builtin-skills/skills/init-deep.d.ts +2 -0
  80. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +2 -0
  81. package/dist/features/builtin-skills/skills/security-research.d.ts +2 -0
  82. package/dist/features/builtin-skills/skills/security-review.d.ts +2 -0
  83. package/dist/features/opencode-runtime-skills/index.d.ts +2 -0
  84. package/dist/features/opencode-runtime-skills/runtime-skill-config.d.ts +17 -0
  85. package/dist/features/opencode-runtime-skills/skill-markdown.d.ts +7 -0
  86. package/dist/features/opencode-runtime-skills/source-server.d.ts +8 -0
  87. package/dist/hooks/claude-code-hooks/hook-text.d.ts +2 -0
  88. package/dist/hooks/index.d.ts +0 -1
  89. package/dist/hooks/session-recovery/storage/latest-assistant-message.d.ts +5 -0
  90. package/dist/hooks/session-recovery/storage/thinking-prepend.d.ts +3 -0
  91. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -18
  92. package/dist/hooks/todo-continuation-enforcer/pending-question-detection.d.ts +4 -0
  93. package/dist/index.js +1949 -1913
  94. package/dist/oh-my-opencode.schema.json +4 -2
  95. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -1
  96. package/dist/plugin/hooks/create-session-hooks.d.ts +1 -2
  97. package/dist/plugin/messages-transform.d.ts +8 -1
  98. package/dist/plugin/user-abort-interrupted-recovery-guard.d.ts +6 -0
  99. package/dist/plugin-handlers/config-handler.d.ts +2 -1
  100. package/dist/shared/external-plugin-detector.d.ts +8 -0
  101. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +1 -0
  102. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +1 -0
  103. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +8 -0
  104. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +14 -0
  105. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +7 -0
  106. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +1 -0
  107. package/dist/shared/prompt-async-gate/timing.d.ts +1 -0
  108. package/dist/shared/prompt-async-gate/types.d.ts +2 -0
  109. package/dist/shared/prompt-async-gate.d.ts +1 -1
  110. package/dist/shared/prompt-timeout-context.d.ts +2 -0
  111. package/dist/testing/create-plugin-module.d.ts +5 -1
  112. package/dist/tools/delegate-task/sync-prompt-sender.d.ts +2 -2
  113. package/package.json +38 -18
  114. package/packages/ast-grep-mcp/dist/cli.js +245 -40
  115. package/packages/git-bash-mcp/dist/cli.js +367 -0
  116. package/packages/lsp-tools-mcp/dist/cli.js +1 -1
  117. package/packages/omo-codex/marketplace.json +17 -0
  118. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +35 -0
  119. package/packages/omo-codex/plugin/.mcp.json +25 -0
  120. package/packages/omo-codex/plugin/README.md +13 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/.gitattributes +13 -0
  122. package/packages/omo-codex/plugin/components/comment-checker/.github/CODEOWNERS +12 -0
  123. package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/bug.yml +40 -0
  124. package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/feature.yml +27 -0
  125. package/packages/omo-codex/plugin/components/comment-checker/.github/branch-ruleset.json +45 -0
  126. package/packages/omo-codex/plugin/components/comment-checker/.github/dependabot.yml +16 -0
  127. package/packages/omo-codex/plugin/components/comment-checker/.github/pull_request_template.md +19 -0
  128. package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/ci.yml +47 -0
  129. package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/publish.yml +51 -0
  130. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +35 -0
  131. package/packages/omo-codex/plugin/components/comment-checker/CHANGELOG.md +33 -0
  132. package/packages/omo-codex/plugin/components/comment-checker/LICENSE +21 -0
  133. package/packages/omo-codex/plugin/components/comment-checker/NOTICE +6 -0
  134. package/packages/omo-codex/plugin/components/comment-checker/README.md +87 -0
  135. package/packages/omo-codex/plugin/components/comment-checker/biome.json +48 -0
  136. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +17 -0
  137. package/packages/omo-codex/plugin/components/comment-checker/package.json +57 -0
  138. package/packages/omo-codex/plugin/components/comment-checker/skills/comment-checker/SKILL.md +16 -0
  139. package/packages/omo-codex/plugin/components/comment-checker/src/cli.ts +12 -0
  140. package/packages/omo-codex/plugin/components/comment-checker/src/codex-hook.ts +205 -0
  141. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +361 -0
  142. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +195 -0
  143. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook-newline.test.ts +52 -0
  144. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +368 -0
  145. package/packages/omo-codex/plugin/components/comment-checker/test/fixtures/post-tool-use.json +15 -0
  146. package/packages/omo-codex/plugin/components/comment-checker/test/package-smoke.test.ts +93 -0
  147. package/packages/omo-codex/plugin/components/comment-checker/test/runner.test.ts +66 -0
  148. package/packages/omo-codex/plugin/components/comment-checker/tsconfig.build.json +12 -0
  149. package/packages/omo-codex/plugin/components/comment-checker/tsconfig.json +27 -0
  150. package/packages/omo-codex/plugin/components/comment-checker/vitest.config.ts +9 -0
  151. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +29 -0
  152. package/packages/omo-codex/plugin/components/git-bash/package.json +23 -0
  153. package/packages/omo-codex/plugin/components/git-bash/src/cli.ts +33 -0
  154. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +180 -0
  155. package/packages/omo-codex/plugin/components/git-bash/src/index.ts +10 -0
  156. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +195 -0
  157. package/packages/omo-codex/plugin/components/git-bash/tsconfig.build.json +13 -0
  158. package/packages/omo-codex/plugin/components/git-bash/tsconfig.json +25 -0
  159. package/packages/omo-codex/plugin/components/lsp/.gitattributes +13 -0
  160. package/packages/omo-codex/plugin/components/lsp/.github/CODEOWNERS +1 -0
  161. package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/bug.yml +26 -0
  162. package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/feature.yml +19 -0
  163. package/packages/omo-codex/plugin/components/lsp/.github/branch-ruleset.json +45 -0
  164. package/packages/omo-codex/plugin/components/lsp/.github/dependabot.yml +11 -0
  165. package/packages/omo-codex/plugin/components/lsp/.github/pull_request_template.md +11 -0
  166. package/packages/omo-codex/plugin/components/lsp/.github/workflows/ci.yml +56 -0
  167. package/packages/omo-codex/plugin/components/lsp/.github/workflows/publish.yml +60 -0
  168. package/packages/omo-codex/plugin/components/lsp/.mcp.json +9 -0
  169. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +25 -0
  170. package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +25 -0
  171. package/packages/omo-codex/plugin/components/lsp/LICENSE +21 -0
  172. package/packages/omo-codex/plugin/components/lsp/NOTICE +3 -0
  173. package/packages/omo-codex/plugin/components/lsp/README.md +148 -0
  174. package/packages/omo-codex/plugin/components/lsp/biome.json +48 -0
  175. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +17 -0
  176. package/packages/omo-codex/plugin/components/lsp/package.json +64 -0
  177. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +46 -0
  178. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.test.mjs +104 -0
  179. package/packages/omo-codex/plugin/components/lsp/scripts/clean-dist.mjs +5 -0
  180. package/packages/omo-codex/plugin/components/lsp/scripts/test.mjs +8 -0
  181. package/packages/omo-codex/plugin/components/lsp/skills/lsp/SKILL.md +35 -0
  182. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +44 -0
  183. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +33 -0
  184. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +277 -0
  185. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-cli.test.ts +28 -0
  186. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-errors.test.ts +55 -0
  187. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +358 -0
  188. package/packages/omo-codex/plugin/components/lsp/test/fixtures/broken.py +1 -0
  189. package/packages/omo-codex/plugin/components/lsp/test/fixtures/post-tool-use.json +15 -0
  190. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +155 -0
  191. package/packages/omo-codex/plugin/components/lsp/tsconfig.build.json +12 -0
  192. package/packages/omo-codex/plugin/components/lsp/tsconfig.json +27 -0
  193. package/packages/omo-codex/plugin/components/lsp/vitest.config.ts +9 -0
  194. package/packages/omo-codex/plugin/components/rules/.codex-plugin/plugin.json +3 -0
  195. package/packages/omo-codex/plugin/components/rules/.gitattributes +13 -0
  196. package/packages/omo-codex/plugin/components/rules/.github/CODEOWNERS +12 -0
  197. package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/bug.yml +49 -0
  198. package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/feature.yml +27 -0
  199. package/packages/omo-codex/plugin/components/rules/.github/branch-ruleset.json +45 -0
  200. package/packages/omo-codex/plugin/components/rules/.github/dependabot.yml +16 -0
  201. package/packages/omo-codex/plugin/components/rules/.github/pull_request_template.md +20 -0
  202. package/packages/omo-codex/plugin/components/rules/.github/workflows/ci.yml +47 -0
  203. package/packages/omo-codex/plugin/components/rules/.github/workflows/publish.yml +51 -0
  204. package/packages/omo-codex/plugin/components/rules/AGENTS.md +34 -0
  205. package/packages/omo-codex/plugin/components/rules/CHANGELOG.md +19 -0
  206. package/packages/omo-codex/plugin/components/rules/LICENSE +21 -0
  207. package/packages/omo-codex/plugin/components/rules/NOTICE +15 -0
  208. package/packages/omo-codex/plugin/components/rules/README.md +124 -0
  209. package/packages/omo-codex/plugin/components/rules/biome.json +48 -0
  210. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +209 -0
  211. package/packages/omo-codex/plugin/components/rules/bundled-rules/windows-git-bash.md +10 -0
  212. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +54 -0
  213. package/packages/omo-codex/plugin/components/rules/package.json +62 -0
  214. package/packages/omo-codex/plugin/components/rules/scripts/bench-codex-rules.mjs +268 -0
  215. package/packages/omo-codex/plugin/components/rules/skills/rules/SKILL.md +34 -0
  216. package/packages/omo-codex/plugin/components/rules/src/cli.ts +143 -0
  217. package/packages/omo-codex/plugin/components/rules/src/codex-hook-options.ts +4 -0
  218. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +238 -0
  219. package/packages/omo-codex/plugin/components/rules/src/config.ts +107 -0
  220. package/packages/omo-codex/plugin/components/rules/src/context-pressure.ts +26 -0
  221. package/packages/omo-codex/plugin/components/rules/src/debug-log.ts +65 -0
  222. package/packages/omo-codex/plugin/components/rules/src/dynamic-target-fingerprints.ts +98 -0
  223. package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +19 -0
  224. package/packages/omo-codex/plugin/components/rules/src/path-utils.ts +29 -0
  225. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +234 -0
  226. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +104 -0
  227. package/packages/omo-codex/plugin/components/rules/src/post-compact-claim.ts +13 -0
  228. package/packages/omo-codex/plugin/components/rules/src/post-compact-state.ts +45 -0
  229. package/packages/omo-codex/plugin/components/rules/src/rules/cache.ts +64 -0
  230. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +115 -0
  231. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +535 -0
  232. package/packages/omo-codex/plugin/components/rules/src/rules/errors.ts +13 -0
  233. package/packages/omo-codex/plugin/components/rules/src/rules/finder-cache.ts +73 -0
  234. package/packages/omo-codex/plugin/components/rules/src/rules/finder-paths.ts +47 -0
  235. package/packages/omo-codex/plugin/components/rules/src/rules/finder-sources.ts +50 -0
  236. package/packages/omo-codex/plugin/components/rules/src/rules/finder.ts +207 -0
  237. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +123 -0
  238. package/packages/omo-codex/plugin/components/rules/src/rules/matcher.ts +142 -0
  239. package/packages/omo-codex/plugin/components/rules/src/rules/ordering.ts +33 -0
  240. package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +326 -0
  241. package/packages/omo-codex/plugin/components/rules/src/rules/plugin-root.ts +55 -0
  242. package/packages/omo-codex/plugin/components/rules/src/rules/project-root.ts +30 -0
  243. package/packages/omo-codex/plugin/components/rules/src/rules/scanner.ts +162 -0
  244. package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +67 -0
  245. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +141 -0
  246. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +24 -0
  247. package/packages/omo-codex/plugin/components/rules/src/session-state-lock.ts +47 -0
  248. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +56 -0
  249. package/packages/omo-codex/plugin/components/rules/src/tool-paths.ts +192 -0
  250. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +44 -0
  251. package/packages/omo-codex/plugin/components/rules/src/transcript-search.ts +108 -0
  252. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +107 -0
  253. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +268 -0
  254. package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +243 -0
  255. package/packages/omo-codex/plugin/components/rules/test/codex-hook-performance.test.ts +99 -0
  256. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +132 -0
  257. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +156 -0
  258. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +299 -0
  259. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-lock.test.ts +46 -0
  260. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-process.test.ts +83 -0
  261. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +667 -0
  262. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +192 -0
  263. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +102 -0
  264. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +168 -0
  265. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +42 -0
  266. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +206 -0
  267. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +153 -0
  268. package/packages/omo-codex/plugin/components/rules/test/persistent-cache.test.ts +63 -0
  269. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +172 -0
  270. package/packages/omo-codex/plugin/components/rules/test/post-compact-test-fixture.ts +196 -0
  271. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +63 -0
  272. package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +198 -0
  273. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +97 -0
  274. package/packages/omo-codex/plugin/components/rules/tsconfig.build.json +12 -0
  275. package/packages/omo-codex/plugin/components/rules/tsconfig.json +27 -0
  276. package/packages/omo-codex/plugin/components/rules/vitest.config.ts +8 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/.gitattributes +13 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +43 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/CHANGELOG.md +5 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +21 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/NOTICE +5 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/README.md +55 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/biome.json +48 -0
  284. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +52 -0
  285. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +28 -0
  286. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +53 -0
  287. package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +167 -0
  288. package/packages/omo-codex/plugin/components/start-work-continuation/src/cli.ts +52 -0
  289. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +66 -0
  290. package/packages/omo-codex/plugin/components/start-work-continuation/src/directive.ts +6 -0
  291. package/packages/omo-codex/plugin/components/start-work-continuation/src/index.ts +5 -0
  292. package/packages/omo-codex/plugin/components/start-work-continuation/src/types.ts +23 -0
  293. package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +63 -0
  294. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +124 -0
  295. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +182 -0
  296. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-completed.json +19 -0
  297. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-mixed-platforms.json +27 -0
  298. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-single-codex-work.json +19 -0
  299. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-all-done.md +5 -0
  300. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-nested-checkboxes.md +11 -0
  301. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-unchecked.md +6 -0
  302. package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.build.json +12 -0
  303. package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.json +27 -0
  304. package/packages/omo-codex/plugin/components/start-work-continuation/vitest.config.ts +10 -0
  305. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +37 -0
  306. package/packages/omo-codex/plugin/components/telemetry/README.md +102 -0
  307. package/packages/omo-codex/plugin/components/telemetry/biome.json +48 -0
  308. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +16 -0
  309. package/packages/omo-codex/plugin/components/telemetry/package.json +56 -0
  310. package/packages/omo-codex/plugin/components/telemetry/src/atomic-write.ts +22 -0
  311. package/packages/omo-codex/plugin/components/telemetry/src/cli.ts +69 -0
  312. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +49 -0
  313. package/packages/omo-codex/plugin/components/telemetry/src/data-path.ts +45 -0
  314. package/packages/omo-codex/plugin/components/telemetry/src/env-flags.ts +43 -0
  315. package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +81 -0
  316. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +165 -0
  317. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +35 -0
  318. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +270 -0
  319. package/packages/omo-codex/plugin/components/telemetry/tsconfig.build.json +12 -0
  320. package/packages/omo-codex/plugin/components/telemetry/tsconfig.json +27 -0
  321. package/packages/omo-codex/plugin/components/telemetry/vitest.config.ts +8 -0
  322. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +41 -0
  323. package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +25 -0
  324. package/packages/omo-codex/plugin/components/ultrawork/LICENSE +21 -0
  325. package/packages/omo-codex/plugin/components/ultrawork/NOTICE +5 -0
  326. package/packages/omo-codex/plugin/components/ultrawork/README.md +60 -0
  327. package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +18 -0
  328. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +82 -0
  329. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +222 -0
  330. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +65 -0
  331. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +69 -0
  332. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +164 -0
  333. package/packages/omo-codex/plugin/components/ultrawork/biome.json +48 -0
  334. package/packages/omo-codex/plugin/components/ultrawork/directive.md +290 -0
  335. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +16 -0
  336. package/packages/omo-codex/plugin/components/ultrawork/package.json +54 -0
  337. package/packages/omo-codex/plugin/components/ultrawork/src/cli.ts +50 -0
  338. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +84 -0
  339. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +3 -0
  340. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +275 -0
  341. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +103 -0
  342. package/packages/omo-codex/plugin/components/ultrawork/tsconfig.build.json +12 -0
  343. package/packages/omo-codex/plugin/components/ultrawork/tsconfig.json +27 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/.gitattributes +13 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +48 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +7 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/LICENSE +21 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/NOTICE +6 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/README.md +74 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +48 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +29 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/package.json +55 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/.gitkeep +0 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +44 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/agents/openai.yaml +6 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +230 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/src/.gitkeep +0 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +155 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +95 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +156 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +63 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +94 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +40 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +129 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +139 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +177 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +122 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +88 -0
  369. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +73 -0
  370. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +113 -0
  371. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +124 -0
  372. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +102 -0
  373. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +81 -0
  374. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +270 -0
  375. package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +277 -0
  376. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +213 -0
  377. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +375 -0
  378. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +250 -0
  379. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +407 -0
  380. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +169 -0
  381. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +156 -0
  382. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +275 -0
  383. package/packages/omo-codex/plugin/components/ulw-loop/test/evidence-criteria-gate.test.ts +100 -0
  384. package/packages/omo-codex/plugin/components/ulw-loop/test/evidence.test.ts +263 -0
  385. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/.gitkeep +0 -0
  386. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/codex-goal-snapshot.json +1 -0
  387. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-brief.md +5 -0
  388. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-plan.json +108 -0
  389. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +18 -0
  390. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/steering-proposal.json +8 -0
  391. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/user-prompt-submit.json +10 -0
  392. package/packages/omo-codex/plugin/components/ulw-loop/test/goal-status.test.ts +327 -0
  393. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +261 -0
  394. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +62 -0
  395. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-crud.test.ts +256 -0
  396. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +239 -0
  397. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +203 -0
  398. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +180 -0
  399. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +353 -0
  400. package/packages/omo-codex/plugin/components/ulw-loop/test/types.test.ts +79 -0
  401. package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.build.json +12 -0
  402. package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.json +27 -0
  403. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +10 -0
  404. package/packages/omo-codex/plugin/hooks/hooks.json +160 -0
  405. package/packages/omo-codex/plugin/package-lock.json +1769 -0
  406. package/packages/omo-codex/plugin/package.json +28 -0
  407. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +65 -0
  408. package/packages/omo-codex/plugin/scripts/build-components.mjs +24 -0
  409. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +46 -0
  410. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +87 -0
  411. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +75 -0
  412. package/packages/omo-codex/plugin/skills/comment-checker/SKILL.md +16 -0
  413. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +116 -0
  414. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +108 -0
  415. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +130 -0
  416. package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
  417. package/packages/omo-codex/plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
  418. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +116 -0
  419. package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +94 -0
  420. package/packages/omo-codex/plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
  421. package/packages/omo-codex/plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
  422. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  423. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +252 -0
  424. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
  425. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +260 -0
  426. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +248 -0
  427. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +234 -0
  428. package/packages/omo-codex/plugin/skills/debugging/references/tools/ghidra.md +212 -0
  429. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
  430. package/packages/omo-codex/plugin/skills/debugging/references/tools/pwndbg.md +263 -0
  431. package/packages/omo-codex/plugin/skills/debugging/references/tools/pwntools.md +265 -0
  432. package/packages/omo-codex/plugin/skills/frontend-ui-ux/SKILL.md +77 -0
  433. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +325 -0
  434. package/packages/omo-codex/plugin/skills/lsp/SKILL.md +35 -0
  435. package/packages/omo-codex/plugin/skills/programming/SKILL.md +463 -0
  436. package/packages/omo-codex/plugin/skills/programming/references/go/README.md +90 -0
  437. package/packages/omo-codex/plugin/skills/programming/references/go/backend-stack.md +641 -0
  438. package/packages/omo-codex/plugin/skills/programming/references/go/bootstrap.md +328 -0
  439. package/packages/omo-codex/plugin/skills/programming/references/go/bubbletea-v2.md +360 -0
  440. package/packages/omo-codex/plugin/skills/programming/references/go/cobra-stack.md +468 -0
  441. package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +362 -0
  442. package/packages/omo-codex/plugin/skills/programming/references/go/data-modeling.md +329 -0
  443. package/packages/omo-codex/plugin/skills/programming/references/go/error-handling.md +359 -0
  444. package/packages/omo-codex/plugin/skills/programming/references/go/golangci-strict.md +236 -0
  445. package/packages/omo-codex/plugin/skills/programming/references/go/grpc-connect.md +375 -0
  446. package/packages/omo-codex/plugin/skills/programming/references/go/libraries.md +337 -0
  447. package/packages/omo-codex/plugin/skills/programming/references/go/one-liners.md +202 -0
  448. package/packages/omo-codex/plugin/skills/programming/references/go/sqlc-pgx.md +471 -0
  449. package/packages/omo-codex/plugin/skills/programming/references/go/testing.md +467 -0
  450. package/packages/omo-codex/plugin/skills/programming/references/go/type-patterns.md +298 -0
  451. package/packages/omo-codex/plugin/skills/programming/references/python/README.md +314 -0
  452. package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +442 -0
  453. package/packages/omo-codex/plugin/skills/programming/references/python/data-modeling.md +233 -0
  454. package/packages/omo-codex/plugin/skills/programming/references/python/data-processing.md +133 -0
  455. package/packages/omo-codex/plugin/skills/programming/references/python/error-handling.md +218 -0
  456. package/packages/omo-codex/plugin/skills/programming/references/python/fastapi-stack.md +316 -0
  457. package/packages/omo-codex/plugin/skills/programming/references/python/httpx2-optimization.md +360 -0
  458. package/packages/omo-codex/plugin/skills/programming/references/python/libraries.md +307 -0
  459. package/packages/omo-codex/plugin/skills/programming/references/python/one-liners.md +268 -0
  460. package/packages/omo-codex/plugin/skills/programming/references/python/orjson-stack.md +378 -0
  461. package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +285 -0
  462. package/packages/omo-codex/plugin/skills/programming/references/python/pyproject-strict.md +232 -0
  463. package/packages/omo-codex/plugin/skills/programming/references/python/textual-tui.md +201 -0
  464. package/packages/omo-codex/plugin/skills/programming/references/python/type-patterns.md +176 -0
  465. package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +317 -0
  466. package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +299 -0
  467. package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +467 -0
  468. package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +317 -0
  469. package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +409 -0
  470. package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +375 -0
  471. package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +439 -0
  472. package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +291 -0
  473. package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +429 -0
  474. package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +354 -0
  475. package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +250 -0
  476. package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +527 -0
  477. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/README.md +289 -0
  478. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
  479. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
  480. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +195 -0
  481. package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +672 -0
  482. package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +199 -0
  483. package/packages/omo-codex/plugin/skills/programming/references/typescript/data-modeling.md +202 -0
  484. package/packages/omo-codex/plugin/skills/programming/references/typescript/error-handling.md +169 -0
  485. package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +152 -0
  486. package/packages/omo-codex/plugin/skills/programming/references/typescript/type-patterns.md +196 -0
  487. package/packages/omo-codex/plugin/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
  488. package/packages/omo-codex/plugin/skills/programming/scripts/go/new-project.py +138 -0
  489. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.editorconfig +13 -0
  490. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.golangci.yml +95 -0
  491. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
  492. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
  493. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
  494. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/ci.yml +37 -0
  495. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/config.go +24 -0
  496. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/gitignore +15 -0
  497. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
  498. package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/run.go +15 -0
  499. package/packages/omo-codex/plugin/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
  500. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-project.py +172 -0
  501. package/packages/omo-codex/plugin/skills/programming/scripts/python/new-script.py +116 -0
  502. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
  503. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
  504. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +175 -0
  505. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
  506. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +177 -0
  507. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +779 -0
  508. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +333 -0
  509. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +574 -0
  510. package/packages/omo-codex/plugin/skills/rules/SKILL.md +34 -0
  511. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +149 -0
  512. package/packages/omo-codex/plugin/skills/ulw-loop/.gitkeep +0 -0
  513. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +44 -0
  514. package/packages/omo-codex/plugin/skills/ulw-loop/agents/openai.yaml +6 -0
  515. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +230 -0
  516. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +399 -0
  517. package/packages/omo-codex/plugin/test/aggregate.test.mjs +345 -0
  518. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +66 -0
  519. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +195 -0
  520. package/packages/omo-codex/plugin/test/install-time-build-runtime.test.mjs +34 -0
  521. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +21 -0
  522. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +48 -0
  523. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +76 -0
  524. package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +66 -0
  525. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +229 -0
  526. package/packages/omo-codex/scripts/install/agents.mjs +84 -0
  527. package/packages/omo-codex/scripts/install/cache.mjs +247 -0
  528. package/packages/omo-codex/scripts/install/cli-args.mjs +112 -0
  529. package/packages/omo-codex/scripts/install/command-shim.mjs +1 -0
  530. package/packages/omo-codex/scripts/install/config.mjs +264 -0
  531. package/packages/omo-codex/scripts/install/delegated-command.mjs +25 -0
  532. package/packages/omo-codex/scripts/install/git-bash.mjs +99 -0
  533. package/packages/omo-codex/scripts/install/git-bash.test.mjs +174 -0
  534. package/packages/omo-codex/scripts/install/hook-trust.mjs +84 -0
  535. package/packages/omo-codex/scripts/install/legacy-bins.mjs +57 -0
  536. package/packages/omo-codex/scripts/install/marketplace.mjs +104 -0
  537. package/packages/omo-codex/scripts/install/mcp-runtime-cache.mjs +81 -0
  538. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +38 -0
  539. package/packages/omo-codex/scripts/install/permissions.d.mts +1 -0
  540. package/packages/omo-codex/scripts/install/permissions.mjs +26 -0
  541. package/packages/omo-codex/scripts/install/process.mjs +19 -0
  542. package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +229 -0
  543. package/packages/omo-codex/scripts/install/reasoning-config.mjs +14 -0
  544. package/packages/omo-codex/scripts/install/snapshot.mjs +54 -0
  545. package/packages/omo-codex/scripts/install/source-package-build.mjs +20 -0
  546. package/packages/omo-codex/scripts/install/toml-editor.mjs +64 -0
  547. package/packages/omo-codex/scripts/install/utils.mjs +15 -0
  548. package/packages/omo-codex/scripts/install-agent-links.test.mjs +104 -0
  549. package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -0
  550. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +30 -0
  551. package/packages/omo-codex/scripts/install-cli-args.test.mjs +146 -0
  552. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +48 -0
  553. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +62 -0
  554. package/packages/omo-codex/scripts/install-config.test.mjs +324 -0
  555. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +129 -0
  556. package/packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs +145 -0
  557. package/packages/omo-codex/scripts/install-local.mjs +275 -0
  558. package/packages/omo-codex/scripts/install-local.test.mjs +394 -0
  559. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +233 -0
  560. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +67 -0
  561. package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +277 -0
  562. package/packages/omo-codex/scripts/install-test-fixtures.mjs +58 -0
  563. package/packages/omo-codex/scripts/sync-telemetry-component.mjs +115 -0
  564. package/packages/omo-codex/scripts/sync-telemetry-component.test.mjs +94 -0
  565. package/packages/shared-skills/index.mjs +5 -0
  566. package/packages/shared-skills/package.json +14 -0
  567. package/packages/shared-skills/skills/debugging/SKILL.md +116 -0
  568. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +108 -0
  569. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +130 -0
  570. package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
  571. package/packages/shared-skills/skills/debugging/references/methodology/05-escalate.md +69 -0
  572. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +116 -0
  573. package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +94 -0
  574. package/packages/shared-skills/skills/debugging/references/methodology/09-cleanup.md +164 -0
  575. package/packages/shared-skills/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
  576. package/packages/shared-skills/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  577. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +252 -0
  578. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +484 -0
  579. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +260 -0
  580. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +248 -0
  581. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +234 -0
  582. package/packages/shared-skills/skills/debugging/references/tools/ghidra.md +212 -0
  583. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +194 -0
  584. package/packages/shared-skills/skills/debugging/references/tools/pwndbg.md +263 -0
  585. package/packages/shared-skills/skills/debugging/references/tools/pwntools.md +265 -0
  586. package/packages/shared-skills/skills/frontend-ui-ux/SKILL.md +77 -0
  587. package/packages/shared-skills/skills/init-deep/SKILL.md +309 -0
  588. package/packages/shared-skills/skills/programming/SKILL.md +463 -0
  589. package/packages/shared-skills/skills/programming/references/go/README.md +90 -0
  590. package/packages/shared-skills/skills/programming/references/go/backend-stack.md +641 -0
  591. package/packages/shared-skills/skills/programming/references/go/bootstrap.md +328 -0
  592. package/packages/shared-skills/skills/programming/references/go/bubbletea-v2.md +360 -0
  593. package/packages/shared-skills/skills/programming/references/go/cobra-stack.md +468 -0
  594. package/packages/shared-skills/skills/programming/references/go/concurrency.md +362 -0
  595. package/packages/shared-skills/skills/programming/references/go/data-modeling.md +329 -0
  596. package/packages/shared-skills/skills/programming/references/go/error-handling.md +359 -0
  597. package/packages/shared-skills/skills/programming/references/go/golangci-strict.md +236 -0
  598. package/packages/shared-skills/skills/programming/references/go/grpc-connect.md +375 -0
  599. package/packages/shared-skills/skills/programming/references/go/libraries.md +337 -0
  600. package/packages/shared-skills/skills/programming/references/go/one-liners.md +202 -0
  601. package/packages/shared-skills/skills/programming/references/go/sqlc-pgx.md +471 -0
  602. package/packages/shared-skills/skills/programming/references/go/testing.md +467 -0
  603. package/packages/shared-skills/skills/programming/references/go/type-patterns.md +298 -0
  604. package/packages/shared-skills/skills/programming/references/python/README.md +314 -0
  605. package/packages/shared-skills/skills/programming/references/python/async-anyio.md +442 -0
  606. package/packages/shared-skills/skills/programming/references/python/data-modeling.md +233 -0
  607. package/packages/shared-skills/skills/programming/references/python/data-processing.md +133 -0
  608. package/packages/shared-skills/skills/programming/references/python/error-handling.md +218 -0
  609. package/packages/shared-skills/skills/programming/references/python/fastapi-stack.md +316 -0
  610. package/packages/shared-skills/skills/programming/references/python/httpx2-optimization.md +360 -0
  611. package/packages/shared-skills/skills/programming/references/python/libraries.md +307 -0
  612. package/packages/shared-skills/skills/programming/references/python/one-liners.md +268 -0
  613. package/packages/shared-skills/skills/programming/references/python/orjson-stack.md +378 -0
  614. package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +285 -0
  615. package/packages/shared-skills/skills/programming/references/python/pyproject-strict.md +232 -0
  616. package/packages/shared-skills/skills/programming/references/python/textual-tui.md +201 -0
  617. package/packages/shared-skills/skills/programming/references/python/type-patterns.md +176 -0
  618. package/packages/shared-skills/skills/programming/references/rust/README.md +317 -0
  619. package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +299 -0
  620. package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +467 -0
  621. package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +317 -0
  622. package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +409 -0
  623. package/packages/shared-skills/skills/programming/references/rust/concurrency.md +375 -0
  624. package/packages/shared-skills/skills/programming/references/rust/libraries.md +439 -0
  625. package/packages/shared-skills/skills/programming/references/rust/one-liners.md +291 -0
  626. package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +429 -0
  627. package/packages/shared-skills/skills/programming/references/rust/type-state.md +354 -0
  628. package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +250 -0
  629. package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +527 -0
  630. package/packages/shared-skills/skills/programming/references/rust-ub/README.md +289 -0
  631. package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
  632. package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
  633. package/packages/shared-skills/skills/programming/references/typescript/README.md +195 -0
  634. package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +672 -0
  635. package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +199 -0
  636. package/packages/shared-skills/skills/programming/references/typescript/data-modeling.md +202 -0
  637. package/packages/shared-skills/skills/programming/references/typescript/error-handling.md +169 -0
  638. package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +152 -0
  639. package/packages/shared-skills/skills/programming/references/typescript/type-patterns.md +196 -0
  640. package/packages/shared-skills/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
  641. package/packages/shared-skills/skills/programming/scripts/go/new-project.py +138 -0
  642. package/packages/shared-skills/skills/programming/scripts/go/templates/.editorconfig +13 -0
  643. package/packages/shared-skills/skills/programming/scripts/go/templates/.golangci.yml +95 -0
  644. package/packages/shared-skills/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
  645. package/packages/shared-skills/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
  646. package/packages/shared-skills/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
  647. package/packages/shared-skills/skills/programming/scripts/go/templates/ci.yml +37 -0
  648. package/packages/shared-skills/skills/programming/scripts/go/templates/config.go +24 -0
  649. package/packages/shared-skills/skills/programming/scripts/go/templates/gitignore +15 -0
  650. package/packages/shared-skills/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
  651. package/packages/shared-skills/skills/programming/scripts/go/templates/run.go +15 -0
  652. package/packages/shared-skills/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
  653. package/packages/shared-skills/skills/programming/scripts/python/new-project.py +172 -0
  654. package/packages/shared-skills/skills/programming/scripts/python/new-script.py +116 -0
  655. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
  656. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
  657. package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +175 -0
  658. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
  659. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +177 -0
  660. package/packages/shared-skills/skills/refactor/SKILL.md +763 -0
  661. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +317 -0
  662. package/packages/shared-skills/skills/review-work/SKILL.md +574 -0
  663. package/packages/shared-skills/skills/start-work/SKILL.md +149 -0
  664. package/packages/shared-skills/skills/ulw-plan/SKILL.md +383 -0
  665. package/postinstall.mjs +6 -2
  666. package/dist/features/builtin-commands/templates/init-deep.d.ts +0 -1
  667. package/dist/features/builtin-skills/skills/ai-slop-remover.d.ts +0 -2
  668. package/dist/hooks/context-window-monitor.d.ts +0 -19
@@ -0,0 +1,345 @@
1
+ import assert from "node:assert/strict";
2
+ import { readdir, readFile, stat } from "node:fs/promises";
3
+ import { basename, dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ async function readJson(relativePath) {
10
+ return JSON.parse(await readFile(join(root, relativePath), "utf8"));
11
+ }
12
+
13
+ async function readComponentHookManifests() {
14
+ const components = await readdir(join(root, "components"), { withFileTypes: true });
15
+ const manifests = [];
16
+ for (const entry of components) {
17
+ if (!entry.isDirectory()) continue;
18
+ const source = join("components", entry.name, "hooks", "hooks.json");
19
+ manifests.push({ source, hooks: await readJson(source) });
20
+ }
21
+ return manifests.sort((left, right) => left.source.localeCompare(right.source));
22
+ }
23
+
24
+ function collectCommandHooks(hooks, source) {
25
+ const config = hooks.hooks;
26
+ if (typeof config !== "object" || config === null || Array.isArray(config)) {
27
+ throw new TypeError(`Invalid hooks manifest: ${source}`);
28
+ }
29
+ const commandHooks = [];
30
+ for (const [eventName, groups] of Object.entries(config)) {
31
+ if (!Array.isArray(groups)) {
32
+ throw new TypeError(`Invalid hook groups in ${source}:${eventName}`);
33
+ }
34
+ groups.forEach((group, groupIndex) => {
35
+ if (typeof group !== "object" || group === null || !Array.isArray(group.hooks)) {
36
+ throw new TypeError(`Invalid hook group in ${source}:${eventName}:${groupIndex}`);
37
+ }
38
+ group.hooks.forEach((handler, handlerIndex) => {
39
+ if (typeof handler !== "object" || handler === null || handler.type !== "command") return;
40
+ commandHooks.push({ source, eventName, groupIndex, handlerIndex, handler });
41
+ });
42
+ });
43
+ }
44
+ return commandHooks;
45
+ }
46
+
47
+ function hookLocation({ source, eventName, groupIndex, handlerIndex, handler }) {
48
+ return `${source}:${eventName}:${groupIndex}:${handlerIndex}:${handler.command}`;
49
+ }
50
+
51
+ function findSpawnAgentTypes(content) {
52
+ const agentTypes = new Set();
53
+ const regex = /spawn_agent\(agent_type="([^"]+)"/g;
54
+ for (const match of content.matchAll(regex)) {
55
+ agentTypes.add(match[1]);
56
+ }
57
+ return [...agentTypes].sort();
58
+ }
59
+
60
+ test("#given aggregate plugin manifest #when inspected #then it owns the omo namespace", async () => {
61
+ // given
62
+ const manifest = await readJson(".codex-plugin/plugin.json");
63
+
64
+ // when
65
+ const hookPath = manifest.hooks;
66
+ const skillsPath = manifest.skills;
67
+ const mcpPath = manifest.mcpServers;
68
+
69
+ // then
70
+ assert.equal(manifest.name, "omo");
71
+ assert.equal(hookPath, "./hooks/hooks.json");
72
+ assert.equal(skillsPath, "./skills/");
73
+ assert.equal(mcpPath, "./.mcp.json");
74
+ });
75
+
76
+ test("#given aggregate plugin metadata #when inspected #then ulw-loop is the public loop name", async () => {
77
+ // given
78
+ const manifestText = await readFile(join(root, ".codex-plugin", "plugin.json"), "utf8");
79
+ const manifest = JSON.parse(manifestText);
80
+
81
+ // when
82
+ const longDescription = String(manifest.interface?.longDescription ?? "");
83
+
84
+ // then
85
+ assert.match(longDescription, /ulw-loop/);
86
+ });
87
+
88
+ test("#given isolated components #when hooks are inspected #then commands stay inside component roots", async () => {
89
+ // given
90
+ const hooks = await readJson("hooks/hooks.json");
91
+ const text = JSON.stringify(hooks);
92
+
93
+ // when
94
+ const componentMarkers = [
95
+ "components/comment-checker/dist/cli.js",
96
+ "components/lsp/dist/cli.js",
97
+ "components/rules/dist/cli.js",
98
+ "components/start-work-continuation/dist/cli.js",
99
+ "components/telemetry/dist/cli.js",
100
+ "components/ulw-loop/dist/cli.js",
101
+ "components/ultrawork/dist/cli.js",
102
+ ];
103
+
104
+ // then
105
+ for (const marker of componentMarkers) {
106
+ assert.match(text, new RegExp(marker.replaceAll("/", "\\/")));
107
+ }
108
+ assert.doesNotMatch(text, /codex-(comment-checker|lsp|rules|telemetry|ulw-loop|ultrawork)@/);
109
+ });
110
+
111
+ test("#given aggregate hook commands #when inspected #then every command exposes a Codex status message", async () => {
112
+ // given
113
+ const hooks = await readJson("hooks/hooks.json");
114
+
115
+ // when
116
+ const commandHooks = collectCommandHooks(hooks, "hooks/hooks.json");
117
+ const missingStatusMessages = commandHooks
118
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || handler.statusMessage.trim() === "")
119
+ .map(hookLocation);
120
+
121
+ // then
122
+ assert.deepEqual(missingStatusMessages, []);
123
+ });
124
+
125
+ test("#given component hook commands #when inspected #then standalone packages expose Codex status messages", async () => {
126
+ // given
127
+ const componentHooks = await readComponentHookManifests();
128
+
129
+ // when
130
+ const missingStatusMessages = componentHooks
131
+ .flatMap(({ source, hooks }) => collectCommandHooks(hooks, source))
132
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || handler.statusMessage.trim() === "")
133
+ .map(hookLocation);
134
+
135
+ // then
136
+ assert.deepEqual(missingStatusMessages, []);
137
+ });
138
+
139
+ test("#given hook status messages #when inspected #then labels describe OMO responsibilities instead of the hook runner", async () => {
140
+ // given
141
+ const aggregateHooks = await readJson("hooks/hooks.json");
142
+ const componentHooks = await readComponentHookManifests();
143
+
144
+ // when
145
+ const commandHooks = [
146
+ ...collectCommandHooks(aggregateHooks, "hooks/hooks.json"),
147
+ ...componentHooks.flatMap(({ source, hooks }) => collectCommandHooks(hooks, source)),
148
+ ];
149
+ const genericStatusMessages = commandHooks
150
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || /\bhook\b/i.test(handler.statusMessage))
151
+ .map(hookLocation);
152
+
153
+ // then
154
+ assert.deepEqual(genericStatusMessages, []);
155
+ });
156
+
157
+ test("#given aggregate OMO plugin is enabled #when hooks are inspected #then shell guidance and ulw-loop guard are registered", async () => {
158
+ // given
159
+ const hooks = await readJson("hooks/hooks.json");
160
+ const text = JSON.stringify(hooks);
161
+
162
+ // when
163
+ const preToolUseGroups = hooks.hooks.PreToolUse;
164
+
165
+ // then
166
+ assert.match(text, /components\/git-bash\/dist\/cli\.js/);
167
+ assert.match(text, /Recommending Git Bash Mcp/);
168
+ assert.match(text, /hook post-compact/);
169
+ assert.match(text, /Resetting Git Bash Mcp Reminder/);
170
+ assert.match(text, /components\/ulw-loop\/dist\/cli\.js/);
171
+ assert.match(text, /hook pre-tool-use/);
172
+ assert.deepEqual(preToolUseGroups.map((group) => group.matcher), ["^Bash$", "^create_goal$"]);
173
+ });
174
+
175
+ test("#given aggregate MCP config #when inspected #then code MCPs reference package runtimes without package names", async () => {
176
+ // given
177
+ const packageJson = await readJson("package.json");
178
+ const mcp = await readJson(".mcp.json");
179
+ const lspSources = await readdir(join(root, "components", "lsp", "src"));
180
+ const bundledMcpBuildScript = await readFile(join(root, "scripts", "build-bundled-mcp-runtimes.mjs"), "utf8");
181
+
182
+ // when
183
+ const lspServer = mcp.mcpServers.lsp;
184
+ const astGrepServer = mcp.mcpServers.ast_grep;
185
+ const gitBashServer = mcp.mcpServers.git_bash;
186
+ const codeMcpNames = Object.keys(mcp.mcpServers)
187
+ .filter((name) => name === "lsp" || name === "ast_grep" || name === "git_bash")
188
+ .sort();
189
+ const componentLocalMcpSources = lspSources.filter((name) => name.startsWith("lazy-mcp") || name === "lazy-lsp-mcp.ts");
190
+
191
+ // then
192
+ assert.deepEqual(codeMcpNames, ["ast_grep", "git_bash", "lsp"]);
193
+ assert.equal(packageJson.workspaces.includes("components/lsp/packages/lsp-tools-mcp"), false);
194
+ assert.equal(packageJson.workspaces.includes("components/ast-grep/packages/ast-grep-mcp"), false);
195
+ assert.deepEqual(packageJson.dependencies, { "@oh-my-opencode/shared-skills": "file:../../shared-skills" });
196
+ assert.match(bundledMcpBuildScript, /ast-grep-mcp/);
197
+ assert.match(bundledMcpBuildScript, /git-bash-mcp/);
198
+ assert.doesNotMatch(packageJson.scripts.build, /--workspaces/);
199
+ assert.equal(lspServer.command, "node");
200
+ assert.deepEqual(lspServer.args, ["../../lsp-tools-mcp/dist/cli.js", "mcp"]);
201
+ assert.equal(lspServer.cwd, ".");
202
+ assert.equal(astGrepServer.command, "node");
203
+ assert.deepEqual(astGrepServer.args, ["../../ast-grep-mcp/dist/cli.js", "mcp"]);
204
+ assert.equal(astGrepServer.cwd, ".");
205
+ assert.equal(gitBashServer.command, "node");
206
+ assert.deepEqual(gitBashServer.args, ["../../git-bash-mcp/dist/cli.js", "mcp"]);
207
+ assert.equal(gitBashServer.cwd, ".");
208
+ assert.deepEqual(componentLocalMcpSources, []);
209
+ });
210
+
211
+ test("#given package-level MCP CLIs #when package metadata is inspected #then bin names use the omo prefix", async () => {
212
+ // given
213
+ const lspPackageJson = await readJson("../../lsp-tools-mcp/package.json");
214
+ const astGrepPackageJson = await readJson("../../ast-grep-mcp/package.json");
215
+ const gitBashPackageJson = await readJson("../../git-bash-mcp/package.json");
216
+
217
+ // when
218
+ const binNames = [
219
+ ...Object.keys(lspPackageJson.bin ?? {}),
220
+ ...Object.keys(astGrepPackageJson.bin ?? {}),
221
+ ...Object.keys(gitBashPackageJson.bin ?? {}),
222
+ ].sort();
223
+
224
+ // then
225
+ assert.deepEqual(binNames, ["omo-ast-grep", "omo-git-bash", "omo-lsp"]);
226
+ for (const name of binNames) {
227
+ assert.match(name, /^omo-/);
228
+ }
229
+ });
230
+
231
+ test("#given aggregate plugin build script #when inspected #then hook status and telemetry sync run before workspace builds", async () => {
232
+ // given
233
+ const packageJson = await readJson("package.json");
234
+ const telemetrySyncScript = await readFile(join(root, "..", "scripts", "sync-telemetry-component.mjs"), "utf8");
235
+
236
+ // when
237
+ const buildScript = packageJson.scripts.build;
238
+
239
+ // then
240
+ assert.equal(
241
+ buildScript,
242
+ "node scripts/sync-hook-status-messages.mjs && node scripts/build-bundled-mcp-runtimes.mjs && node scripts/sync-skills.mjs && node ../scripts/sync-telemetry-component.mjs && node scripts/build-components.mjs",
243
+ );
244
+ assert.match(telemetrySyncScript, /syncTelemetryComponent/);
245
+ });
246
+
247
+ test("#given omo-codex package build script #when inspected #then delegates to the aggregate plugin package", async () => {
248
+ // given
249
+ const packageJson = JSON.parse(await readFile(join(root, "..", "package.json"), "utf8"));
250
+
251
+ // when
252
+ const buildPluginScript = packageJson.scripts["build:plugin"];
253
+
254
+ // then
255
+ assert.equal(buildPluginScript, "bun run --cwd plugin build");
256
+ });
257
+
258
+ test("#given component directories #when scanned #then only intentional resource roots declare plugin manifests", async () => {
259
+ // given
260
+ const components = await readdir(join(root, "components"), { withFileTypes: true });
261
+ const expectedComponentManifests = new Map([["rules", { hooks: "./hooks/hooks.json" }]]);
262
+
263
+ // when
264
+ const componentNames = components.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
265
+
266
+ // then
267
+ assert.deepEqual(componentNames, [
268
+ "comment-checker",
269
+ "git-bash",
270
+ "lsp",
271
+ "rules",
272
+ "start-work-continuation",
273
+ "telemetry",
274
+ "ultrawork",
275
+ "ulw-loop",
276
+ ]);
277
+ for (const name of componentNames) {
278
+ const expectedManifest = expectedComponentManifests.get(name);
279
+ if (expectedManifest !== undefined) {
280
+ assert.deepEqual(await readJson(join("components", name, ".codex-plugin", "plugin.json")), expectedManifest);
281
+ continue;
282
+ }
283
+
284
+ await assert.rejects(
285
+ readFile(join(root, "components", name, ".codex-plugin", "plugin.json"), "utf8"),
286
+ /code: 'ENOENT'|ENOENT/,
287
+ );
288
+ }
289
+ });
290
+
291
+ test("#given bundled Codex agents #when components/ultrawork/agents directory is scanned #then planner support TOMLs are present and match expected schema keys", async () => {
292
+ const agentsDir = join(root, "components", "ultrawork", "agents");
293
+ const entries = (await readdir(agentsDir, { withFileTypes: true }))
294
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".toml"))
295
+ .map((entry) => entry.name)
296
+ .sort();
297
+
298
+ assert.deepEqual(entries, [
299
+ "codex-ultrawork-reviewer.toml",
300
+ "explorer.toml",
301
+ "librarian.toml",
302
+ "metis.toml",
303
+ "momus.toml",
304
+ "plan.toml",
305
+ ]);
306
+
307
+ for (const fileName of entries) {
308
+ const content = await readFile(join(agentsDir, fileName), "utf8");
309
+ assert.match(content, /^name\s*=\s*".+"$/m);
310
+ assert.match(content, /^description\s*=\s*".+"$/m);
311
+ assert.match(content, /^nickname_candidates\s*=\s*\[.+\]$/m);
312
+ assert.match(content, /^model\s*=\s*".+"$/m);
313
+ assert.match(content, /^model_reasoning_effort\s*=\s*".+"$/m);
314
+ assert.match(content, /^developer_instructions\s*=\s*"""/m);
315
+ }
316
+ });
317
+
318
+ test("#given synced skills with Codex compatibility guidance #when a bundled agent_type is referenced #then a matching TOML is bundled", async () => {
319
+ const skillsDir = join(root, "skills");
320
+ const skillEntries = await readdir(skillsDir, { withFileTypes: true });
321
+ const skillFiles = skillEntries
322
+ .filter((entry) => entry.isDirectory())
323
+ .map((entry) => join(skillsDir, entry.name, "SKILL.md"));
324
+
325
+ const referencedAgentTypes = new Set();
326
+ for (const skillPath of skillFiles) {
327
+ const content = await readFile(skillPath, "utf8");
328
+ for (const agentType of findSpawnAgentTypes(content)) {
329
+ if (agentType === "worker" || agentType === "codex-ultrawork-reviewer") {
330
+ continue;
331
+ }
332
+ referencedAgentTypes.add(agentType);
333
+ }
334
+ }
335
+
336
+ const expected = [...referencedAgentTypes].sort();
337
+ assert.deepEqual(expected, ["explorer", "librarian", "metis", "momus", "plan"]);
338
+
339
+ for (const agentType of expected) {
340
+ const tomlPath = join(root, "components", "ultrawork", "agents", `${agentType}.toml`);
341
+ const fileStat = await stat(tomlPath);
342
+ assert.equal(fileStat.isFile(), true);
343
+ assert.equal(basename(tomlPath), `${agentType}.toml`);
344
+ }
345
+ });
@@ -0,0 +1,66 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ const EXPECTED_COMPONENT_BINS = new Map([
10
+ ["comment-checker", "omo-comment-checker"],
11
+ ["lsp", "omo-lsp"],
12
+ ["rules", "omo-rules"],
13
+ ["start-work-continuation", "omo-start-work-continuation"],
14
+ ["telemetry", "omo-telemetry"],
15
+ ["ultrawork", "omo-ultrawork"],
16
+ ["ulw-loop", "omo"],
17
+ ]);
18
+
19
+ const EXPECTED_USAGE_PREFIXES = new Map([
20
+ ["comment-checker", "Usage: omo-comment-checker "],
21
+ ["lsp", "Usage: omo-lsp "],
22
+ ["rules", "Usage: omo-rules "],
23
+ ["start-work-continuation", "Usage: omo-start-work-continuation "],
24
+ ["telemetry", "Usage: omo-telemetry "],
25
+ ["ultrawork", "Usage: omo-ultrawork "],
26
+ ]);
27
+
28
+ async function readJson(relativePath) {
29
+ return JSON.parse(await readFile(join(root, relativePath), "utf8"));
30
+ }
31
+
32
+ test("#given aggregate component package metadata #when bin names are inspected #then local component CLIs use the OMO prefix", async () => {
33
+ // given
34
+ const components = [...EXPECTED_COMPONENT_BINS.entries()];
35
+
36
+ // when
37
+ const mismatches = [];
38
+ for (const [component, expectedName] of components) {
39
+ const packageJson = await readJson(join("components", component, "package.json"));
40
+ const bin = packageJson.bin ?? {};
41
+ const binNames = Object.keys(bin).sort();
42
+ if (bin[expectedName] !== "./dist/cli.js" || binNames.some((name) => name.startsWith("codex-"))) {
43
+ mismatches.push({ component, expectedName, bin });
44
+ }
45
+ }
46
+
47
+ // then
48
+ assert.deepEqual(mismatches, []);
49
+ });
50
+
51
+ test("#given component CLI sources #when usage text is inspected #then user-facing command names use OMO names", async () => {
52
+ // given
53
+ const components = [...EXPECTED_USAGE_PREFIXES.entries()];
54
+
55
+ // when
56
+ const mismatches = [];
57
+ for (const [component, expectedUsage] of components) {
58
+ const source = await readFile(join(root, "components", component, "src", "cli.ts"), "utf8");
59
+ if (!source.includes(expectedUsage) || /Usage: codex-/.test(source)) {
60
+ mismatches.push({ component, expectedUsage });
61
+ }
62
+ }
63
+
64
+ // then
65
+ assert.deepEqual(mismatches, []);
66
+ });
@@ -0,0 +1,195 @@
1
+ import assert from "node:assert/strict";
2
+ import { access, readdir, readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ import {
8
+ formatLazyCodexHookStatusMessage,
9
+ normalizeLazyCodexHookStatusLabel,
10
+ parseLazyCodexHookStatusMessage,
11
+ } from "../scripts/hook-status-message.mjs";
12
+
13
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
14
+
15
+ const AGGREGATE_EXPECTED_LABELS = new Map([
16
+ ["hooks/hooks.json:SessionStart:0:0", "Loading Project Rules"],
17
+ ["hooks/hooks.json:SessionStart:1:0", "Recording Session Telemetry"],
18
+ ["hooks/hooks.json:UserPromptSubmit:0:0", "Loading Project Rules"],
19
+ ["hooks/hooks.json:UserPromptSubmit:1:0", "Checking Ultrawork Trigger"],
20
+ ["hooks/hooks.json:UserPromptSubmit:2:0", "Checking Ulw-Loop Steering"],
21
+ ["hooks/hooks.json:PreToolUse:0:0", "Enforcing Unlimited Goal Budget"],
22
+ ["hooks/hooks.json:PostToolUse:0:0", "Checking Comments"],
23
+ ["hooks/hooks.json:PostToolUse:0:1", "Checking LSP Diagnostics"],
24
+ ["hooks/hooks.json:PostToolUse:1:0", "Matching Project Rules"],
25
+ ["hooks/hooks.json:PostCompact:0:0", "Resetting Project Rule Cache"],
26
+ ["hooks/hooks.json:Stop:0:0", "Checking Start-Work Continuation"],
27
+ ["hooks/hooks.json:SubagentStop:0:0", "Checking Start-Work Continuation"],
28
+ ]);
29
+
30
+ const COMPONENT_EXPECTED_LABELS = new Map([
31
+ ["components/comment-checker/hooks/hooks.json:PostToolUse:0:0", "Checking Comments"],
32
+ ["components/lsp/hooks/hooks.json:PostToolUse:0:0", "Checking LSP Diagnostics"],
33
+ ["components/rules/hooks/hooks.json:SessionStart:0:0", "Loading Project Rules"],
34
+ ["components/rules/hooks/hooks.json:UserPromptSubmit:0:0", "Loading Project Rules"],
35
+ ["components/rules/hooks/hooks.json:PostToolUse:0:0", "Matching Project Rules"],
36
+ ["components/rules/hooks/hooks.json:PostCompact:0:0", "Resetting Project Rule Cache"],
37
+ ["components/telemetry/hooks/hooks.json:SessionStart:0:0", "Recording Session Telemetry"],
38
+ ["components/ultrawork/hooks/hooks.json:UserPromptSubmit:0:0", "Checking Ultrawork Trigger"],
39
+ ["components/ulw-loop/hooks/hooks.json:UserPromptSubmit:0:0", "Checking Ulw-Loop Steering"],
40
+ ["components/ulw-loop/hooks/hooks.json:PreToolUse:0:0", "Enforcing Unlimited Ulw-Loop Budget"],
41
+ ["components/start-work-continuation/hooks/hooks.json:Stop:0:0", "Checking Start-Work Continuation"],
42
+ ["components/start-work-continuation/hooks/hooks.json:SubagentStop:0:0", "Checking Start-Work Continuation"],
43
+ ]);
44
+
45
+ async function readJson(relativePath) {
46
+ return JSON.parse(await readFile(join(root, relativePath), "utf8"));
47
+ }
48
+
49
+ async function exists(relativePath) {
50
+ try {
51
+ await access(join(root, relativePath));
52
+ return true;
53
+ } catch (error) {
54
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
55
+ throw error;
56
+ }
57
+ }
58
+
59
+ async function readComponentHookManifests() {
60
+ const components = await readdir(join(root, "components"), { withFileTypes: true });
61
+ const manifests = [];
62
+ for (const entry of components) {
63
+ if (!entry.isDirectory()) continue;
64
+ const source = join("components", entry.name, "hooks", "hooks.json");
65
+ if (!(await exists(source))) continue;
66
+ const packageJson = await readJson(join("components", entry.name, "package.json"));
67
+ manifests.push({ source, version: packageJson.version, hooks: await readJson(source) });
68
+ }
69
+ return manifests.sort((left, right) => left.source.localeCompare(right.source));
70
+ }
71
+
72
+ async function readComponentVersions() {
73
+ const components = await readdir(join(root, "components"), { withFileTypes: true });
74
+ const versions = new Map();
75
+ for (const entry of components) {
76
+ if (!entry.isDirectory()) continue;
77
+ const packageJson = await readJson(join("components", entry.name, "package.json"));
78
+ versions.set(entry.name, packageJson.version);
79
+ }
80
+ return versions;
81
+ }
82
+
83
+ function hookOwnerVersion(hook, aggregateVersion, componentVersions) {
84
+ const command = hook.command;
85
+ for (const [componentName, version] of componentVersions.entries()) {
86
+ if (command.includes(`/components/${componentName}/dist/cli.js`)) return version;
87
+ }
88
+ return aggregateVersion;
89
+ }
90
+
91
+ function collectCommandHooks(hooks, source, version) {
92
+ const commandHooks = [];
93
+ const normalizedSource = source.replaceAll("\\", "/");
94
+ for (const [eventName, groups] of Object.entries(hooks.hooks)) {
95
+ groups.forEach((group, groupIndex) => {
96
+ group.hooks.forEach((handler, handlerIndex) => {
97
+ if (handler.type !== "command") return;
98
+ commandHooks.push({
99
+ id: `${normalizedSource}:${eventName}:${groupIndex}:${handlerIndex}`,
100
+ version,
101
+ command: handler.command,
102
+ statusMessage: handler.statusMessage,
103
+ });
104
+ });
105
+ });
106
+ }
107
+ return commandHooks;
108
+ }
109
+
110
+ test("#given hook status label #when formatting #then prefixes LazyCodex with version", () => {
111
+ // given
112
+ const version = "0.1.0";
113
+ const label = "Checking Comments";
114
+
115
+ // when
116
+ const message = formatLazyCodexHookStatusMessage(version, label);
117
+
118
+ // then
119
+ assert.equal(message, "LazyCodex(0.1.0): Checking Comments");
120
+ });
121
+
122
+ test("#given hook status label with blank version #when formatting #then prefixes LazyCodex with local version", () => {
123
+ // given
124
+ const version = " ";
125
+ const label = "Checking Comments";
126
+
127
+ // when
128
+ const message = formatLazyCodexHookStatusMessage(version, label);
129
+
130
+ // then
131
+ assert.equal(message, "LazyCodex(local): Checking Comments");
132
+ });
133
+
134
+ test("#given loose legacy status label #when normalizing #then removes OMO wording and title-cases label", () => {
135
+ // given
136
+ const version = "0.1.0";
137
+ const label = " checking OMO comments ";
138
+
139
+ // when
140
+ const normalized = normalizeLazyCodexHookStatusLabel(label);
141
+ const message = formatLazyCodexHookStatusMessage(version, label);
142
+
143
+ // then
144
+ assert.equal(normalized, "Checking Comments");
145
+ assert.equal(message, "LazyCodex(0.1.0): Checking Comments");
146
+ });
147
+
148
+ test("#given aggregate comment-checker hook #when status is inspected #then it uses LazyCodex comments label", async () => {
149
+ // given
150
+ const aggregateHooks = await readJson("hooks/hooks.json");
151
+ const componentVersions = await readComponentVersions();
152
+
153
+ // when
154
+ const hooks = collectCommandHooks(aggregateHooks, "hooks/hooks.json", "0.1.0");
155
+ const commentCheckerHook = hooks.find((hook) => hook.id === "hooks/hooks.json:PostToolUse:0:0");
156
+
157
+ // then
158
+ assert.equal(commentCheckerHook?.statusMessage, formatLazyCodexHookStatusMessage(componentVersions.get("comment-checker"), "Checking Comments"));
159
+ assert.doesNotMatch(JSON.stringify(aggregateHooks), /checking\s+OMO\s+comments/i);
160
+ });
161
+
162
+ test("#given aggregate and component hooks #when status messages are inspected #then all use the LazyCodex formatter", async () => {
163
+ // given
164
+ const aggregateVersion = (await readJson(".codex-plugin/plugin.json")).version;
165
+ const aggregateHooks = await readJson("hooks/hooks.json");
166
+ const componentManifests = await readComponentHookManifests();
167
+ const componentVersions = await readComponentVersions();
168
+
169
+ // when
170
+ const commandHooks = [
171
+ ...collectCommandHooks(aggregateHooks, "hooks/hooks.json", aggregateVersion).map((hook) => ({
172
+ ...hook,
173
+ version: hookOwnerVersion(hook, aggregateVersion, componentVersions),
174
+ })),
175
+ ...componentManifests.flatMap((manifest) => collectCommandHooks(manifest.hooks, manifest.source, manifest.version)),
176
+ ];
177
+ const expectedLabels = new Map([...AGGREGATE_EXPECTED_LABELS, ...COMPONENT_EXPECTED_LABELS]);
178
+ const mismatches = commandHooks
179
+ .map((hook) => {
180
+ const parsed = parseLazyCodexHookStatusMessage(hook.statusMessage);
181
+ const label = parsed?.label;
182
+ const expected = label === undefined ? undefined : formatLazyCodexHookStatusMessage(hook.version, label);
183
+ return { ...hook, expected, parsed };
184
+ })
185
+ .filter((hook) => hook.expected === undefined || hook.statusMessage !== hook.expected || hook.parsed === null)
186
+ .map((hook) => `${hook.id}: expected ${hook.expected ?? "<missing expectation>"} but got ${hook.statusMessage}`);
187
+
188
+ // then
189
+ assert.deepEqual(mismatches, []);
190
+ const actualLabels = new Set(commandHooks.map((hook) => parseLazyCodexHookStatusMessage(hook.statusMessage)?.label));
191
+ assert.deepEqual([...expectedLabels.values()].filter((label) => !actualLabels.has(label)), []);
192
+ for (const hook of commandHooks) {
193
+ assert.doesNotMatch(hook.statusMessage, /\bOMO\b/i);
194
+ }
195
+ });
@@ -0,0 +1,34 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ test("#given aggregate build scripts #when inspected #then install-time build does not invoke Bun", async () => {
10
+ // given
11
+ const buildComponentsScript = await readFile(join(root, "scripts", "build-components.mjs"), "utf8");
12
+ const buildBundledMcpRuntimesScript = await readFile(join(root, "scripts", "build-bundled-mcp-runtimes.mjs"), "utf8");
13
+
14
+ // when
15
+ const installTimeBuildScripts = [buildComponentsScript, buildBundledMcpRuntimesScript].join("\n");
16
+
17
+ // then
18
+ assert.doesNotMatch(installTimeBuildScripts, /spawnSync\("bun"/);
19
+ assert.doesNotMatch(installTimeBuildScripts, /\bbun\s+run\b/);
20
+ });
21
+
22
+ test("#given aggregate build scripts #when inspected #then npm subprocesses resolve on Windows", async () => {
23
+ // given
24
+ const buildComponentsScript = await readFile(join(root, "scripts", "build-components.mjs"), "utf8");
25
+ const buildBundledMcpRuntimesScript = await readFile(join(root, "scripts", "build-bundled-mcp-runtimes.mjs"), "utf8");
26
+
27
+ // when
28
+ const installTimeBuildScripts = [buildComponentsScript, buildBundledMcpRuntimesScript].join("\n");
29
+
30
+ // then
31
+ assert.match(installTimeBuildScripts, /process\.platform === "win32"/);
32
+ assert.match(installTimeBuildScripts, /shell: process\.platform === "win32"/);
33
+ assert.doesNotMatch(installTimeBuildScripts, /npm\.cmd/);
34
+ });
@@ -0,0 +1,21 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ test("#given aggregate MCP config #when inspected #then registers research and structural-search MCPs", async () => {
10
+ // given
11
+ const mcp = JSON.parse(await readFile(join(root, ".mcp.json"), "utf8"));
12
+
13
+ // when
14
+ const serverNames = Object.keys(mcp.mcpServers).sort();
15
+
16
+ // then
17
+ assert.deepEqual(serverNames, ["ast_grep", "context7", "git_bash", "grep_app", "lsp"]);
18
+ assert.equal(mcp.mcpServers.grep_app.url, "https://mcp.grep.app");
19
+ assert.equal(mcp.mcpServers.context7.url, "https://mcp.context7.com/mcp");
20
+ assert.deepEqual(mcp.mcpServers.ast_grep.args, ["../../ast-grep-mcp/dist/cli.js", "mcp"]);
21
+ });