oh-my-opencode 4.8.0 → 4.9.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 (512) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/agents/sisyphus/claude-fable-5.d.ts +19 -0
  3. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +3 -1
  4. package/dist/agents/sisyphus/claude-opus-4-8.d.ts +19 -0
  5. package/dist/agents/sisyphus/index.d.ts +4 -0
  6. package/dist/agents/types.d.ts +2 -2
  7. package/dist/cli/doctor/checks/codex.d.ts +1 -0
  8. package/dist/cli/doctor/checks/tools-gh.d.ts +8 -1
  9. package/dist/cli/doctor/index.d.ts +1 -0
  10. package/dist/cli/doctor/types.d.ts +2 -0
  11. package/dist/cli/index.js +1922 -785
  12. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -1
  13. package/dist/cli/install-codex/codex-config-plugins.d.ts +1 -0
  14. package/dist/cli/install-codex/codex-config-toml.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-installer-bin-dir.d.ts +8 -0
  16. package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +11 -0
  17. package/dist/cli/install-codex/install-codex.d.ts +1 -8
  18. package/dist/cli/install-codex/lsp-daemon-reaper.d.ts +5 -0
  19. package/dist/cli/run/runnable-agent-resolver.d.ts +11 -0
  20. package/dist/cli/sparkshell-condense.d.ts +10 -0
  21. package/dist/cli/sparkshell-parse.d.ts +3 -0
  22. package/dist/cli/sparkshell-session-context.d.ts +20 -0
  23. package/dist/cli/sparkshell-spark.d.ts +23 -0
  24. package/dist/cli/sparkshell.d.ts +8 -1
  25. package/dist/cli-node/index.js +92552 -0
  26. package/dist/config/schema/agent-names.d.ts +2 -0
  27. package/dist/config/schema/hooks.d.ts +0 -2
  28. package/dist/config/schema/keyword-detector.d.ts +0 -6
  29. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -4
  30. package/dist/create-hooks.d.ts +0 -2
  31. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  32. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +2 -0
  33. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -0
  34. package/dist/features/background-agent/parent-wake-session-history.d.ts +4 -0
  35. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -0
  36. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  37. package/dist/features/builtin-skills/index.d.ts +1 -1
  38. package/dist/features/builtin-skills/skills.d.ts +4 -0
  39. package/dist/features/opencode-runtime-skills/source-server.d.ts +16 -1
  40. package/dist/features/opencode-skill-loader/skill-definition-record.d.ts +2 -0
  41. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  42. package/dist/features/team-mode/types.d.ts +1 -0
  43. package/dist/features/tmux-subagent/failed-readiness-cache.d.ts +28 -0
  44. package/dist/features/tmux-subagent/manager.d.ts +1 -9
  45. package/dist/features/tmux-subagent/resolve-server-url.d.ts +3 -0
  46. package/dist/hooks/anthropic-context-window-limit-recovery/executor.d.ts +1 -1
  47. package/dist/hooks/index.d.ts +0 -1
  48. package/dist/hooks/keyword-detector/constants.d.ts +0 -4
  49. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +1 -1
  50. package/dist/index.js +9001 -1795
  51. package/dist/oh-my-opencode.schema.json +2 -4
  52. package/dist/plugin/chat-params.d.ts +1 -8
  53. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -2
  54. package/dist/plugin/hooks/create-session-hooks.d.ts +0 -2
  55. package/dist/plugin/hooks/create-transform-hooks.d.ts +1 -2
  56. package/dist/plugin/messages-transform.d.ts +0 -1
  57. package/dist/shared/model-availability.d.ts +10 -2
  58. package/package.json +25 -18
  59. package/packages/ast-grep-mcp/dist/cli.js +2 -10
  60. package/packages/git-bash-mcp/dist/cli.js +11 -4
  61. package/packages/lsp-daemon/dist/cli.d.ts +2 -0
  62. package/packages/lsp-daemon/dist/cli.js +3711 -0
  63. package/packages/lsp-daemon/dist/daemon-client.d.ts +19 -0
  64. package/packages/lsp-daemon/dist/daemon-client.js +114 -0
  65. package/packages/lsp-daemon/dist/daemon-server.d.ts +12 -0
  66. package/packages/lsp-daemon/dist/daemon-server.js +106 -0
  67. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +21 -0
  68. package/packages/lsp-daemon/dist/ensure-daemon.js +97 -0
  69. package/packages/lsp-daemon/dist/index.d.ts +5 -0
  70. package/packages/lsp-daemon/dist/index.js +3573 -0
  71. package/packages/lsp-daemon/dist/lock.d.ts +7 -0
  72. package/packages/lsp-daemon/dist/lock.js +61 -0
  73. package/packages/lsp-daemon/dist/package.json +6 -0
  74. package/packages/lsp-daemon/dist/paths.d.ts +11 -0
  75. package/packages/lsp-daemon/dist/paths.js +49 -0
  76. package/packages/lsp-daemon/dist/proxy.d.ts +10 -0
  77. package/packages/lsp-daemon/dist/proxy.js +61 -0
  78. package/packages/lsp-daemon/dist/request-routing.d.ts +9 -0
  79. package/packages/lsp-daemon/dist/request-routing.js +44 -0
  80. package/packages/lsp-daemon/dist/run-daemon.d.ts +1 -0
  81. package/packages/lsp-daemon/dist/run-daemon.js +11 -0
  82. package/packages/lsp-daemon/dist/socket-jsonrpc.d.ts +5 -0
  83. package/packages/lsp-daemon/dist/socket-jsonrpc.js +25 -0
  84. package/packages/lsp-daemon/package.json +38 -0
  85. package/packages/lsp-tools-mcp/dist/cli.js +0 -0
  86. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +40 -17
  87. package/packages/lsp-tools-mcp/dist/lsp/client.js +11 -9
  88. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +5 -5
  89. package/packages/lsp-tools-mcp/dist/lsp/directory-diagnostics.js +5 -3
  90. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.d.ts +1 -0
  91. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.js +8 -0
  92. package/packages/lsp-tools-mcp/dist/lsp/infer-extension.js +3 -2
  93. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.js +1 -0
  94. package/packages/lsp-tools-mcp/dist/lsp/server-definitions.js +12 -0
  95. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.d.ts +12 -0
  96. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.js +51 -0
  97. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +2 -1
  98. package/packages/lsp-tools-mcp/dist/request-context.d.ts +7 -0
  99. package/packages/lsp-tools-mcp/dist/request-context.js +14 -0
  100. package/packages/lsp-tools-mcp/dist/tools.js +44 -1
  101. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +46 -33
  102. package/packages/omo-codex/plugin/.mcp.json +1 -1
  103. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.d.ts +7 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.js +173 -0
  105. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.d.ts +2 -0
  106. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +10 -0
  107. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.d.ts +22 -0
  108. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.js +165 -0
  109. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.d.ts +1 -0
  110. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.js +1 -0
  111. package/packages/omo-codex/plugin/components/comment-checker/dist/core.d.ts +5 -0
  112. package/packages/omo-codex/plugin/components/comment-checker/dist/core.js +4 -0
  113. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.d.ts +6 -0
  114. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.js +10 -0
  115. package/packages/omo-codex/plugin/components/comment-checker/dist/record.d.ts +2 -0
  116. package/packages/omo-codex/plugin/components/comment-checker/dist/record.js +11 -0
  117. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.d.ts +3 -0
  118. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.js +104 -0
  119. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.d.ts +26 -0
  120. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.js +144 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/dist/types.d.ts +43 -0
  122. package/packages/omo-codex/plugin/components/comment-checker/dist/types.js +1 -0
  123. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  124. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/git-bash/dist/cli.d.ts +2 -0
  126. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +29 -0
  127. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.d.ts +28 -0
  128. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +137 -0
  129. package/packages/omo-codex/plugin/components/git-bash/dist/index.d.ts +1 -0
  130. package/packages/omo-codex/plugin/components/git-bash/dist/index.js +1 -0
  131. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  132. package/packages/omo-codex/plugin/components/git-bash/package.json +5 -2
  133. package/packages/omo-codex/plugin/components/lsp/.mcp.json +1 -1
  134. package/packages/omo-codex/plugin/components/lsp/dist/cli.d.ts +2 -0
  135. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +42 -0
  136. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.d.ts +2 -0
  137. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.js +40 -0
  138. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.d.ts +16 -0
  139. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +180 -0
  140. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.d.ts +12 -0
  141. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +95 -0
  142. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.d.ts +6 -0
  143. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.js +79 -0
  144. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  145. package/packages/omo-codex/plugin/components/lsp/package.json +7 -7
  146. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-daemon.mjs +68 -0
  147. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +45 -22
  148. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  149. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +6 -2
  151. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +4 -0
  152. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +68 -0
  153. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +8 -20
  154. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +69 -96
  155. package/packages/omo-codex/plugin/components/rules/dist/cli.d.ts +2 -0
  156. package/packages/omo-codex/plugin/components/rules/dist/cli.js +118 -0
  157. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.d.ts +5 -0
  158. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.js +1 -0
  159. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.d.ts +47 -0
  160. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.js +127 -0
  161. package/packages/omo-codex/plugin/components/rules/dist/config.d.ts +2 -0
  162. package/packages/omo-codex/plugin/components/rules/dist/config.js +100 -0
  163. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.d.ts +2 -0
  164. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.js +26 -0
  165. package/packages/omo-codex/plugin/components/rules/dist/debug-log.d.ts +8 -0
  166. package/packages/omo-codex/plugin/components/rules/dist/debug-log.js +36 -0
  167. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.d.ts +7 -0
  168. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.js +65 -0
  169. package/packages/omo-codex/plugin/components/rules/dist/event-budget.d.ts +3 -0
  170. package/packages/omo-codex/plugin/components/rules/dist/event-budget.js +14 -0
  171. package/packages/omo-codex/plugin/components/rules/dist/hook-output.d.ts +2 -0
  172. package/packages/omo-codex/plugin/components/rules/dist/hook-output.js +24 -0
  173. package/packages/omo-codex/plugin/components/rules/dist/path-utils.d.ts +4 -0
  174. package/packages/omo-codex/plugin/components/rules/dist/path-utils.js +24 -0
  175. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.d.ts +13 -0
  176. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.js +172 -0
  177. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.d.ts +6 -0
  178. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.js +74 -0
  179. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.d.ts +4 -0
  180. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.js +6 -0
  181. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.d.ts +1 -0
  182. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.js +32 -0
  183. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.d.ts +13 -0
  184. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.js +29 -0
  185. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.d.ts +9 -0
  186. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.js +51 -0
  187. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.d.ts +70 -0
  188. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.js +101 -0
  189. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.d.ts +5 -0
  190. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.js +60 -0
  191. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.d.ts +6 -0
  192. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.js +61 -0
  193. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.d.ts +7 -0
  194. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.js +60 -0
  195. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.d.ts +11 -0
  196. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.js +75 -0
  197. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.d.ts +6 -0
  198. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.js +29 -0
  199. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.d.ts +44 -0
  200. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.js +1 -0
  201. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.d.ts +5 -0
  202. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.js +85 -0
  203. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.d.ts +6 -0
  204. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.js +12 -0
  205. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.d.ts +14 -0
  206. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.js +51 -0
  207. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.d.ts +6 -0
  208. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.js +33 -0
  209. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.d.ts +5 -0
  210. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.js +40 -0
  211. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.d.ts +28 -0
  212. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.js +146 -0
  213. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.d.ts +7 -0
  214. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.js +112 -0
  215. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.d.ts +18 -0
  216. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.js +93 -0
  217. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.d.ts +3 -0
  218. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.js +27 -0
  219. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.d.ts +7 -0
  220. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.js +30 -0
  221. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.d.ts +2 -0
  222. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.js +237 -0
  223. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.d.ts +3 -0
  224. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.js +31 -0
  225. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.d.ts +1 -0
  226. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.js +48 -0
  227. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.d.ts +1 -0
  228. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.js +23 -0
  229. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.d.ts +14 -0
  230. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.js +111 -0
  231. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.d.ts +3 -0
  232. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.js +9 -0
  233. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.d.ts +18 -0
  234. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.js +59 -0
  235. package/packages/omo-codex/plugin/components/rules/dist/rules/types.d.ts +126 -0
  236. package/packages/omo-codex/plugin/components/rules/dist/rules/types.js +8 -0
  237. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.d.ts +6 -0
  238. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.js +20 -0
  239. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.d.ts +3 -0
  240. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.js +41 -0
  241. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.d.ts +10 -0
  242. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.js +90 -0
  243. package/packages/omo-codex/plugin/components/rules/dist/static-injection.d.ts +3 -0
  244. package/packages/omo-codex/plugin/components/rules/dist/static-injection.js +128 -0
  245. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.d.ts +6 -0
  246. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.js +168 -0
  247. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.d.ts +4 -0
  248. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.js +49 -0
  249. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.d.ts +4 -0
  250. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.js +91 -0
  251. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  252. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  253. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +4 -2
  254. package/packages/omo-codex/plugin/components/rules/src/config.ts +13 -0
  255. package/packages/omo-codex/plugin/components/rules/src/event-budget.ts +17 -0
  256. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +4 -1
  257. package/packages/omo-codex/plugin/components/rules/src/post-compact-directive.ts +39 -0
  258. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +16 -0
  259. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -0
  260. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +7 -8
  261. package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +17 -0
  262. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +4 -0
  263. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +53 -4
  264. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +127 -7
  265. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +9 -1
  266. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +4 -2
  267. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +7 -2
  268. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +9 -9
  269. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +10 -4
  270. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +241 -0
  271. package/packages/omo-codex/plugin/components/rules/test/event-budget.test.ts +168 -0
  272. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +20 -0
  273. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -0
  274. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +86 -3
  275. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +15 -15
  276. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.d.ts +16 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.js +146 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.d.ts +2 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +49 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.d.ts +2 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.js +80 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.d.ts +1 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.js +2 -0
  284. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.d.ts +5 -0
  285. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.js +3 -0
  286. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.d.ts +20 -0
  287. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.js +1 -0
  288. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  289. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  290. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +24 -2
  291. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.d.ts +1 -0
  292. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.js +18 -0
  293. package/packages/omo-codex/plugin/components/telemetry/dist/cli.d.ts +2 -0
  294. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +62 -0
  295. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.d.ts +15 -0
  296. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.js +42 -0
  297. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.d.ts +10 -0
  298. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.js +35 -0
  299. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.d.ts +12 -0
  300. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.js +108 -0
  301. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.d.ts +4 -0
  302. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.js +31 -0
  303. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.d.ts +8 -0
  304. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.js +68 -0
  305. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.d.ts +21 -0
  306. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +133 -0
  307. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.d.ts +8 -0
  308. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.js +29 -0
  309. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  310. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  311. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +5 -13
  312. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +61 -185
  313. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  314. package/packages/omo-codex/plugin/components/ultrawork/directive.md +122 -117
  315. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.d.ts +2 -0
  316. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +48 -0
  317. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.d.ts +7 -0
  318. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.js +122 -0
  319. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.d.ts +1 -0
  320. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.js +2 -0
  321. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  322. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  323. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +20 -11
  324. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -11
  325. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +2 -5
  326. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -71
  327. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +16 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +200 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.d.ts +17 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +97 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.d.ts +4 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +183 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +6 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +55 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +12 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +145 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.d.ts +2 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +39 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +13 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +100 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +26 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +97 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +28 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +145 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.d.ts +34 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.js +1 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +16 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +41 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +95 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.js +1 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +31 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +119 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +12 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +69 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +16 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +59 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +48 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +119 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +8 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +89 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +6 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +123 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +16 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +70 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.d.ts +10 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.js +13 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +63 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.js +1 -0
  369. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +6 -0
  370. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +292 -0
  371. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.d.ts +5 -0
  372. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.js +5 -0
  373. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
  374. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  375. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -14
  376. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +24 -25
  377. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -3
  378. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +2 -1
  379. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -1
  380. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +95 -0
  381. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +0 -96
  382. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +23 -0
  383. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +46 -0
  384. package/packages/omo-codex/plugin/hooks/hooks.json +16 -16
  385. package/packages/omo-codex/plugin/package-lock.json +10 -9
  386. package/packages/omo-codex/plugin/package.json +27 -26
  387. package/packages/omo-codex/plugin/scripts/auto-update.mjs +64 -15
  388. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +16 -0
  389. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +104 -0
  390. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +23 -6
  391. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +23 -11
  392. package/packages/omo-codex/plugin/scripts/sync-version.mjs +94 -0
  393. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -9
  394. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  395. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +93 -0
  396. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +11 -0
  397. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +17 -13
  398. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +139 -0
  399. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +60 -0
  400. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +61 -0
  401. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +71 -0
  402. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +48 -0
  403. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +51 -0
  404. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +57 -0
  405. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +57 -0
  406. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +57 -0
  407. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +60 -0
  408. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +59 -0
  409. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +66 -0
  410. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +62 -0
  411. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +71 -0
  412. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +53 -0
  413. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +59 -0
  414. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +51 -0
  415. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +62 -0
  416. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +77 -0
  417. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +70 -0
  418. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +49 -0
  419. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  420. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  421. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/tsconfig.json +17 -0
  422. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  423. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +9 -9
  424. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -10
  425. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +20 -22
  426. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +38 -61
  427. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +135 -677
  428. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -14
  429. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +24 -25
  430. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +20 -11
  431. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -11
  432. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -9
  433. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  434. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +1 -1
  435. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +5 -5
  436. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +6 -6
  437. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +194 -0
  438. package/packages/omo-codex/plugin/test/auto-update.test.mjs +17 -0
  439. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +15 -44
  440. package/packages/omo-codex/plugin/test/lsp-prebuild-layouts.test.mjs +140 -0
  441. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +261 -0
  442. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +9 -31
  443. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +68 -4
  444. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +119 -0
  445. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +11 -112
  446. package/packages/omo-codex/plugin/test/sync-version.test.mjs +68 -0
  447. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +126 -0
  448. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +2 -2
  449. package/packages/omo-codex/scripts/install/bin-dir.mjs +20 -0
  450. package/packages/omo-codex/scripts/install/bin-links.mjs +43 -6
  451. package/packages/omo-codex/scripts/install/cache.mjs +4 -0
  452. package/packages/omo-codex/scripts/install/config.mjs +5 -3
  453. package/packages/omo-codex/scripts/install/delegated-command.mjs +5 -1
  454. package/packages/omo-codex/scripts/install/git-bash-mcp-env.mjs +28 -0
  455. package/packages/omo-codex/scripts/install/git-bash.mjs +12 -4
  456. package/packages/omo-codex/scripts/install/git-bash.test.mjs +39 -4
  457. package/packages/omo-codex/scripts/install/hook-targets.mjs +46 -0
  458. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +22 -10
  459. package/packages/omo-codex/scripts/install/process.mjs +1 -0
  460. package/packages/omo-codex/scripts/install-bin-links.test.mjs +131 -3
  461. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +91 -0
  462. package/packages/omo-codex/scripts/install-config.test.mjs +50 -44
  463. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +78 -0
  464. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +93 -0
  465. package/packages/omo-codex/scripts/install-hook-targets.test.mjs +100 -0
  466. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +3 -1
  467. package/packages/omo-codex/scripts/install-local.mjs +7 -18
  468. package/packages/omo-codex/scripts/install-local.test.mjs +34 -1
  469. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  470. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +93 -0
  471. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +11 -0
  472. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +17 -13
  473. package/packages/shared-skills/skills/lsp-setup/SKILL.md +139 -0
  474. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +60 -0
  475. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +61 -0
  476. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +71 -0
  477. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +48 -0
  478. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +51 -0
  479. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +57 -0
  480. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +57 -0
  481. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +57 -0
  482. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +60 -0
  483. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +59 -0
  484. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +66 -0
  485. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +62 -0
  486. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +71 -0
  487. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +53 -0
  488. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +59 -0
  489. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +51 -0
  490. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +62 -0
  491. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +77 -0
  492. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +70 -0
  493. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +49 -0
  494. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  495. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  496. package/packages/shared-skills/skills/lsp-setup/scripts/tsconfig.json +17 -0
  497. package/packages/shared-skills/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  498. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  499. package/packages/shared-skills/skills/review-work/SKILL.md +10 -14
  500. package/packages/shared-skills/skills/start-work/SKILL.md +30 -59
  501. package/packages/shared-skills/skills/ultraresearch/SKILL.md +126 -667
  502. package/dist/hooks/anthropic-effort/hook.d.ts +0 -26
  503. package/dist/hooks/anthropic-effort/index.d.ts +0 -1
  504. package/dist/hooks/keyword-detector/analyze/default.d.ts +0 -12
  505. package/dist/hooks/keyword-detector/analyze/index.d.ts +0 -1
  506. package/dist/hooks/keyword-detector/search/default.d.ts +0 -12
  507. package/dist/hooks/keyword-detector/search/index.d.ts +0 -1
  508. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -12
  509. package/dist/hooks/thinking-block-validator/index.d.ts +0 -1
  510. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +0 -18
  511. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +0 -29
  512. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +0 -151
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "LazyCodex(0.1.0): Loading Project Rules"
10
+ "statusMessage": "LazyCodex(4.9.0): Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  },
@@ -17,7 +17,7 @@
17
17
  "type": "command",
18
18
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
19
19
  "timeout": 5,
20
- "statusMessage": "LazyCodex(0.1.0): Recording Session Telemetry"
20
+ "statusMessage": "LazyCodex(4.9.0): Recording Session Telemetry"
21
21
  }
22
22
  ]
23
23
  },
@@ -28,7 +28,7 @@
28
28
  "type": "command",
29
29
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
30
30
  "timeout": 5,
31
- "statusMessage": "LazyCodex(0.1.0): Checking Auto Update"
31
+ "statusMessage": "LazyCodex(4.9.0): Checking Auto Update"
32
32
  }
33
33
  ]
34
34
  }
@@ -40,7 +40,7 @@
40
40
  "type": "command",
41
41
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
42
42
  "timeout": 10,
43
- "statusMessage": "LazyCodex(0.1.0): Loading Project Rules"
43
+ "statusMessage": "LazyCodex(4.9.0): Loading Project Rules"
44
44
  }
45
45
  ]
46
46
  },
@@ -50,7 +50,7 @@
50
50
  "type": "command",
51
51
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
52
52
  "timeout": 5,
53
- "statusMessage": "LazyCodex(0.1.0): Checking Ultrawork Trigger"
53
+ "statusMessage": "LazyCodex(4.9.0): Checking Ultrawork Trigger"
54
54
  }
55
55
  ]
56
56
  },
@@ -60,7 +60,7 @@
60
60
  "type": "command",
61
61
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
62
62
  "timeout": 10,
63
- "statusMessage": "LazyCodex(0.1.0): Checking Ulw-Loop Steering"
63
+ "statusMessage": "LazyCodex(4.9.0): Checking Ulw-Loop Steering"
64
64
  }
65
65
  ]
66
66
  }
@@ -73,7 +73,7 @@
73
73
  "type": "command",
74
74
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
75
75
  "timeout": 5,
76
- "statusMessage": "LazyCodex(0.1.0): Recommending Git Bash Mcp"
76
+ "statusMessage": "LazyCodex(4.9.0): Recommending Git Bash Mcp"
77
77
  }
78
78
  ]
79
79
  },
@@ -84,7 +84,7 @@
84
84
  "type": "command",
85
85
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
86
86
  "timeout": 5,
87
- "statusMessage": "LazyCodex(0.1.0): Enforcing Unlimited Goal Budget"
87
+ "statusMessage": "LazyCodex(4.9.0): Enforcing Unlimited Goal Budget"
88
88
  }
89
89
  ]
90
90
  }
@@ -97,13 +97,13 @@
97
97
  "type": "command",
98
98
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
99
99
  "timeout": 30,
100
- "statusMessage": "LazyCodex(0.1.0): Checking Comments"
100
+ "statusMessage": "LazyCodex(4.9.0): Checking Comments"
101
101
  },
102
102
  {
103
103
  "type": "command",
104
104
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
105
105
  "timeout": 60,
106
- "statusMessage": "LazyCodex(0.1.0): Checking LSP Diagnostics"
106
+ "statusMessage": "LazyCodex(4.9.0): Checking LSP Diagnostics"
107
107
  }
108
108
  ]
109
109
  },
@@ -114,7 +114,7 @@
114
114
  "type": "command",
115
115
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
116
116
  "timeout": 10,
117
- "statusMessage": "LazyCodex(0.1.0): Matching Project Rules"
117
+ "statusMessage": "LazyCodex(4.9.0): Matching Project Rules"
118
118
  }
119
119
  ]
120
120
  }
@@ -127,7 +127,7 @@
127
127
  "type": "command",
128
128
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
129
129
  "timeout": 5,
130
- "statusMessage": "LazyCodex(0.1.0): Resetting Git Bash Mcp Reminder"
130
+ "statusMessage": "LazyCodex(4.9.0): Resetting Git Bash Mcp Reminder"
131
131
  }
132
132
  ]
133
133
  },
@@ -138,7 +138,7 @@
138
138
  "type": "command",
139
139
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
140
140
  "timeout": 10,
141
- "statusMessage": "LazyCodex(0.1.0): Resetting Project Rule Cache"
141
+ "statusMessage": "LazyCodex(4.9.0): Resetting Project Rule Cache"
142
142
  }
143
143
  ]
144
144
  },
@@ -149,7 +149,7 @@
149
149
  "type": "command",
150
150
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
151
151
  "timeout": 5,
152
- "statusMessage": "LazyCodex(0.1.0): Resetting LSP Diagnostics Cache"
152
+ "statusMessage": "LazyCodex(4.9.0): Resetting LSP Diagnostics Cache"
153
153
  }
154
154
  ]
155
155
  }
@@ -161,7 +161,7 @@
161
161
  "type": "command",
162
162
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
163
163
  "timeout": 10,
164
- "statusMessage": "LazyCodex(0.1.0): Checking Start-Work Continuation"
164
+ "statusMessage": "LazyCodex(4.9.0): Checking Start-Work Continuation"
165
165
  }
166
166
  ]
167
167
  }
@@ -173,7 +173,7 @@
173
173
  "type": "command",
174
174
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
175
175
  "timeout": 10,
176
- "statusMessage": "LazyCodex(0.1.0): Checking Start-Work Continuation"
176
+ "statusMessage": "LazyCodex(4.9.0): Checking Start-Work Continuation"
177
177
  }
178
178
  ]
179
179
  }
@@ -21,18 +21,19 @@
21
21
  "@oh-my-opencode/shared-skills": "file:../../shared-skills"
22
22
  }
23
23
  },
24
- "../../lsp-tools-mcp": {
25
- "name": "@code-yeongyu/lsp-tools-mcp",
24
+ "../../lsp-daemon": {
25
+ "name": "@code-yeongyu/lsp-daemon",
26
26
  "version": "0.1.0",
27
27
  "license": "MIT",
28
28
  "bin": {
29
- "omo-lsp": "dist/cli.js"
29
+ "omo-lsp-daemon": "dist/cli.js"
30
30
  },
31
31
  "devDependencies": {
32
- "@biomejs/biome": "2.4.15",
33
- "@types/node": "^25.7.0",
32
+ "@biomejs/biome": "2.4.16",
33
+ "@code-yeongyu/lsp-tools-mcp": "file:../lsp-tools-mcp",
34
+ "@types/node": "^25.9.2",
34
35
  "typescript": "^6.0.3",
35
- "vitest": "^4.1.5"
36
+ "vitest": "^4.1.8"
36
37
  },
37
38
  "engines": {
38
39
  "node": ">=20.0.0"
@@ -81,7 +82,7 @@
81
82
  "version": "0.2.0",
82
83
  "license": "MIT",
83
84
  "dependencies": {
84
- "@code-yeongyu/lsp-tools-mcp": "file:../../../../lsp-tools-mcp"
85
+ "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
85
86
  },
86
87
  "bin": {
87
88
  "omo-lsp": "dist/cli.js"
@@ -405,8 +406,8 @@
405
406
  "node": ">=18"
406
407
  }
407
408
  },
408
- "node_modules/@code-yeongyu/lsp-tools-mcp": {
409
- "resolved": "../../lsp-tools-mcp",
409
+ "node_modules/@code-yeongyu/lsp-daemon": {
410
+ "resolved": "../../lsp-daemon",
410
411
  "link": true
411
412
  },
412
413
  "node_modules/@emnapi/core": {
@@ -1,28 +1,29 @@
1
1
  {
2
- "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "0.1.0",
4
- "description": "Aggregate Codex plugin root for OMO components.",
5
- "type": "module",
6
- "packageManager": "npm@11.12.1",
7
- "private": true,
8
- "workspaces": [
9
- "components/comment-checker",
10
- "components/git-bash",
11
- "components/rules",
12
- "components/lsp",
13
- "components/telemetry",
14
- "components/start-work-continuation",
15
- "components/ulw-loop",
16
- "components/ultrawork"
17
- ],
18
- "dependencies": {
19
- "@oh-my-opencode/shared-skills": "file:../../shared-skills"
20
- },
21
- "scripts": {
22
- "build": "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",
23
- "check": "npm run build && npm test",
24
- "sync:hooks": "node scripts/sync-hook-status-messages.mjs",
25
- "sync:skills": "node scripts/sync-skills.mjs",
26
- "test": "node --test test/*.test.mjs"
27
- }
2
+ "name": "@sisyphuslabs/omo-codex-plugin",
3
+ "version": "4.9.0",
4
+ "description": "Aggregate Codex plugin root for OMO components.",
5
+ "type": "module",
6
+ "packageManager": "npm@11.12.1",
7
+ "private": true,
8
+ "workspaces": [
9
+ "components/comment-checker",
10
+ "components/git-bash",
11
+ "components/rules",
12
+ "components/lsp",
13
+ "components/telemetry",
14
+ "components/start-work-continuation",
15
+ "components/ulw-loop",
16
+ "components/ultrawork"
17
+ ],
18
+ "dependencies": {
19
+ "@oh-my-opencode/shared-skills": "file:../../shared-skills"
20
+ },
21
+ "scripts": {
22
+ "build": "node scripts/sync-version.mjs && 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",
23
+ "sync:version": "node scripts/sync-version.mjs",
24
+ "check": "npm run build && npm test",
25
+ "sync:hooks": "node scripts/sync-hook-status-messages.mjs",
26
+ "sync:skills": "node scripts/sync-skills.mjs",
27
+ "test": "node --test test/*.test.mjs"
28
+ }
28
29
  }
@@ -37,9 +37,11 @@ export function resolveAutoUpdatePlan({ env = process.env, now = Date.now(), las
37
37
  return { shouldRun: false, reason: "retry-throttled" };
38
38
  }
39
39
 
40
+ const currentVersion = resolveCurrentVersion(env);
41
+ const latestVersion = resolveLatestVersion(env);
40
42
  const updatePlan = resolveLazyCodexUpdatePlan({
41
- currentVersion: resolveCurrentVersion(env),
42
- latestVersion: resolveLatestVersion(env),
43
+ currentVersion,
44
+ latestVersion,
43
45
  command: resolveCommand(env),
44
46
  args: resolveArgs(env),
45
47
  });
@@ -49,6 +51,8 @@ export function resolveAutoUpdatePlan({ env = process.env, now = Date.now(), las
49
51
  shouldRun: true,
50
52
  command: updatePlan.command,
51
53
  args: updatePlan.args,
54
+ currentVersion,
55
+ latestVersion,
52
56
  env: {
53
57
  ...env,
54
58
  LAZYCODEX_AUTO_UPDATE_DISABLED: "1",
@@ -94,7 +98,8 @@ export async function runLazyCodexManualUpdate({ env = process.env, dryRun = fal
94
98
  export async function runAutoUpdateCheck({ env = process.env, now = Date.now() } = {}) {
95
99
  await runConfigMigration({ env });
96
100
  const statePath = resolveStatePath(env);
97
- const state = await readState(statePath);
101
+ const notices = [];
102
+ const state = await settlePendingNotice({ env, now, statePath, state: await readState(statePath), notices });
98
103
  const plan = resolveAutoUpdatePlan({
99
104
  env,
100
105
  now,
@@ -107,17 +112,18 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
107
112
  if (plan.reason === "up-to-date") {
108
113
  await writeState(statePath, { ...state, lastCheckedAt: now, lastStatus: "success" });
109
114
  }
110
- return { started: false, reason: plan.reason };
115
+ return { started: false, reason: plan.reason, notices };
111
116
  }
112
117
 
113
118
  const lockStaleMs = parsePositiveInteger(env.LAZYCODEX_AUTO_UPDATE_LOCK_STALE_MS, DEFAULT_LOCK_STALE_MS);
114
119
  const lock = await acquireLock(resolveLockPath(env, statePath), now, lockStaleMs);
115
120
  if (lock === null) {
116
121
  await appendUpdateLog(env, now, "locked");
117
- return { started: false, reason: "locked" };
122
+ return { started: false, reason: "locked", notices };
118
123
  }
119
124
  try {
120
125
  await appendUpdateLog(env, now, "started", { command: plan.command, args: plan.args });
126
+ const pendingNotice = { fromVersion: plan.currentVersion, toVersion: plan.latestVersion, startedAt: now };
121
127
  if (env.LAZYCODEX_AUTO_UPDATE_WAIT === "1") {
122
128
  const invocation = resolveSpawnInvocation(plan.command, plan.args);
123
129
  const result = spawnSync(invocation.command, invocation.args, {
@@ -126,10 +132,13 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
126
132
  });
127
133
  const status = result.status ?? (result.error === undefined ? 0 : 1);
128
134
  await appendUpdateLog(env, now, "finished", { status });
129
- await writeState(statePath, status === 0
130
- ? { lastCheckedAt: now, lastAttemptedAt: now, lastStatus: "success" }
131
- : { lastAttemptedAt: now, lastStatus: "failed" });
132
- return { started: true, status };
135
+ if (status === 0) {
136
+ await writeState(statePath, { lastCheckedAt: now, lastAttemptedAt: now, lastStatus: "success", pendingNotice });
137
+ await recordUpdateStartedNotice({ env, now, notices, pendingNotice });
138
+ } else {
139
+ await writeState(statePath, { lastAttemptedAt: now, lastStatus: "failed" });
140
+ }
141
+ return { started: true, status, notices };
133
142
  }
134
143
 
135
144
  const invocation = resolveSpawnInvocation(plan.command, plan.args);
@@ -138,14 +147,44 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
138
147
  stdio: "ignore",
139
148
  detached: true,
140
149
  });
141
- await writeState(statePath, { lastAttemptedAt: now, lastStatus: "started" });
150
+ await writeState(statePath, { lastAttemptedAt: now, lastStatus: "started", pendingNotice });
151
+ await recordUpdateStartedNotice({ env, now, notices, pendingNotice });
142
152
  child.unref();
143
- return { started: true };
153
+ return { started: true, notices };
144
154
  } finally {
145
155
  await lock.release();
146
156
  }
147
157
  }
148
158
 
159
+ async function settlePendingNotice({ env, now, statePath, state, notices }) {
160
+ const pendingNotice = state.pendingNotice;
161
+ if (pendingNotice === undefined) return state;
162
+ const current = parseVersion(resolveCurrentVersion(env));
163
+ const target = parseVersion(pendingNotice.toVersion);
164
+ if (current !== null && target !== null && compareVersions(current, target) < 0) return state;
165
+ const nextState = { ...state };
166
+ delete nextState.pendingNotice;
167
+ await writeState(statePath, nextState);
168
+ if (current !== null && target !== null) {
169
+ notices.push(`[LazyCodex] Auto-update completed: v${pendingNotice.fromVersion} -> v${pendingNotice.toVersion}. This session is already running the new version. Tell the user the auto-update was applied.`);
170
+ await appendUpdateLog(env, now, "notified", {
171
+ kind: "update-completed",
172
+ fromVersion: pendingNotice.fromVersion,
173
+ toVersion: pendingNotice.toVersion,
174
+ });
175
+ }
176
+ return nextState;
177
+ }
178
+
179
+ async function recordUpdateStartedNotice({ env, now, notices, pendingNotice }) {
180
+ notices.push(`[LazyCodex] Auto-update started in the background: v${pendingNotice.fromVersion} -> v${pendingNotice.toVersion}. Tell the user a new LazyCodex version is installing and that they should start a new Codex session after it completes to apply it.`);
181
+ await appendUpdateLog(env, now, "notified", {
182
+ kind: "update-started",
183
+ fromVersion: pendingNotice.fromVersion,
184
+ toVersion: pendingNotice.toVersion,
185
+ });
186
+ }
187
+
149
188
  async function runConfigMigration({ env }) {
150
189
  if (env.LAZYCODEX_CONFIG_MIGRATION_DISABLED === "1" || env.OMO_CODEX_CONFIG_MIGRATION_DISABLED === "1") return;
151
190
  try {
@@ -264,8 +303,18 @@ function parsePositiveInteger(value, fallback) {
264
303
  }
265
304
 
266
305
  if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
267
- runAutoUpdateCheck().catch((error) => {
268
- console.error(error instanceof Error ? error.message : String(error));
269
- process.exit(0);
270
- });
306
+ runAutoUpdateCheck()
307
+ .then(({ notices }) => {
308
+ if (notices.length === 0) return;
309
+ console.log(JSON.stringify({
310
+ hookSpecificOutput: {
311
+ hookEventName: "SessionStart",
312
+ additionalContext: notices.join("\n\n"),
313
+ },
314
+ }));
315
+ })
316
+ .catch((error) => {
317
+ console.error(error instanceof Error ? error.message : String(error));
318
+ process.exit(0);
319
+ });
271
320
  }
@@ -13,6 +13,12 @@ const runtimes = [
13
13
  packageRoot: join(repoPackagesRoot, "lsp-tools-mcp"),
14
14
  requiredOutputs: ["dist/cli.js", "dist/tools.js"],
15
15
  },
16
+ {
17
+ label: "lsp-daemon",
18
+ packageRoot: join(repoPackagesRoot, "lsp-daemon"),
19
+ requiredOutputs: ["dist/cli.js", "dist/index.js", "dist/index.d.ts"],
20
+ install: true,
21
+ },
16
22
  {
17
23
  label: "ast-grep-mcp",
18
24
  packageRoot: join(repoPackagesRoot, "ast-grep-mcp"),
@@ -41,6 +47,16 @@ function buildRuntime(runtime) {
41
47
  return;
42
48
  }
43
49
 
50
+ if (runtime.install === true && !existsSync(join(runtime.packageRoot, "node_modules"))) {
51
+ const install = spawnSync("npm", ["ci"], {
52
+ cwd: runtime.packageRoot,
53
+ shell: process.platform === "win32",
54
+ stdio: "inherit",
55
+ });
56
+ if (install.error !== undefined) throw install.error;
57
+ if (install.status !== 0) process.exit(install.status ?? 1);
58
+ }
59
+
44
60
  const result = spawnSync("npm", ["run", "build"], {
45
61
  cwd: runtime.packageRoot,
46
62
  shell: process.platform === "win32",
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Runtime migration: force `[features.multi_agent_v2]` to `enabled = false`.
3
+ *
4
+ * Runs on every Codex SessionStart (via auto-update's config migration) so
5
+ * multi-agent V2 stays off regardless of how it was turned on: an
6
+ * installer-forced `enabled = true`, a missing `enabled` key the runtime
7
+ * would resolve per model, or the `[features]` boolean shorthand
8
+ * `multi_agent_v2 = true` (removed here because a boolean key and a
9
+ * `[features.multi_agent_v2]` table for the same name are conflicting TOML).
10
+ *
11
+ * Upstream basis: openai/codex#26753 — with the flag on, EVERY turn fails
12
+ * with a 400 ("spawn_agent declares encrypted parameters but is not
13
+ * configured for encrypted tool use by this model"), even on prompts that
14
+ * never touch subagents. OpenAI closed it NOT_PLANNED stating V2 is under
15
+ * development, not recommended, and bug reports are not accepted. Same
16
+ * failure class still being reported (openai/codex#27205).
17
+ */
18
+ const MANAGED_COMMENT_MARKER = "openai/codex#26753";
19
+ const MANAGED_DISABLE_COMMENT = [
20
+ "# Managed by LazyCodex: multi_agent_v2 is re-disabled on every Codex session start",
21
+ `# because enabling it fails every turn with HTTP 400 (${MANAGED_COMMENT_MARKER}).`,
22
+ "# Opt out: LAZYCODEX_CONFIG_MIGRATION_DISABLED=1 (or OMO_CODEX_CONFIG_MIGRATION_DISABLED=1).",
23
+ "",
24
+ ].join("\n");
25
+
26
+ export function forceDisableMultiAgentV2(config) {
27
+ let result = removeEnabledFeaturesShorthand(config);
28
+ const section = findSection(result, "[features.multi_agent_v2]");
29
+
30
+ if (!section) {
31
+ if (hasDisabledFeaturesShorthand(result)) return result;
32
+ return ensureManagedComment(appendDisabledSection(result));
33
+ }
34
+
35
+ const enabledTruePattern = /^(\s*)enabled\s*=\s*true[ \t]*(#[^\n]*)?$/m;
36
+ if (enabledTruePattern.test(section.text)) {
37
+ const patched = section.text.replace(enabledTruePattern, (_match, indent, comment) => comment ? `${indent}enabled = false ${comment}` : `${indent}enabled = false`);
38
+ return ensureManagedComment(result.slice(0, section.start) + patched + result.slice(section.end));
39
+ }
40
+
41
+ if (/^\s*enabled\s*=\s*false[ \t]*(?:#[^\n]*)?$/m.test(section.text)) return result;
42
+
43
+ const headerEnd = section.text.indexOf("\n");
44
+ const insertAt = headerEnd === -1 ? section.text.length : headerEnd + 1;
45
+ const patched = `${section.text.slice(0, insertAt)}${headerEnd === -1 ? "\n" : ""}enabled = false\n${section.text.slice(insertAt)}`;
46
+ return ensureManagedComment(result.slice(0, section.start) + patched + result.slice(section.end));
47
+ }
48
+
49
+ function ensureManagedComment(config) {
50
+ if (config.includes(MANAGED_COMMENT_MARKER)) return config;
51
+ const section = findSection(config, "[features.multi_agent_v2]");
52
+ if (!section) return config;
53
+ return config.slice(0, section.start) + MANAGED_DISABLE_COMMENT + config.slice(section.start);
54
+ }
55
+
56
+ function removeEnabledFeaturesShorthand(config) {
57
+ const section = findSection(config, "[features]");
58
+ if (!section) return config;
59
+
60
+ const shorthandPattern = /^\s*multi_agent_v2\s*=\s*true[ \t]*(?:#[^\n]*)?[ \t]*\n?/m;
61
+ if (!shorthandPattern.test(section.text)) return config;
62
+
63
+ const patched = section.text.replace(shorthandPattern, "");
64
+ return config.slice(0, section.start) + patched + config.slice(section.end);
65
+ }
66
+
67
+ function hasDisabledFeaturesShorthand(config) {
68
+ const section = findSection(config, "[features]");
69
+ if (!section) return false;
70
+ return /^\s*multi_agent_v2\s*=\s*false[ \t]*(?:#[^\n]*)?$/m.test(section.text);
71
+ }
72
+
73
+ function appendDisabledSection(config) {
74
+ const trimmed = config.trimEnd();
75
+ const prefix = trimmed.length === 0 ? "" : `${trimmed}\n\n`;
76
+ return `${prefix}[features.multi_agent_v2]\nenabled = false\n`;
77
+ }
78
+
79
+ // Strips a trailing # comment from a TOML line fragment (best-effort; quoted keys containing # are out of scope).
80
+ function stripTrailingComment(line) {
81
+ const idx = line.indexOf("#");
82
+ return idx === -1 ? line : line.slice(0, idx).trim();
83
+ }
84
+
85
+ function findSection(config, headerLine) {
86
+ const lines = config.match(/[^\n]*\n?|$/g) ?? [];
87
+ let offset = 0;
88
+ let start = -1;
89
+ for (const line of lines) {
90
+ if (line.length === 0) break;
91
+ const trimmed = line.trim();
92
+ if (start === -1) {
93
+ if (stripTrailingComment(trimmed) === headerLine) start = offset;
94
+ } else {
95
+ const bare = stripTrailingComment(trimmed);
96
+ if (bare.startsWith("[") && bare.endsWith("]")) {
97
+ return { start, end: offset, text: config.slice(start, offset) };
98
+ }
99
+ }
100
+ offset += line.length;
101
+ }
102
+ if (start === -1) return null;
103
+ return { start, end: config.length, text: config.slice(start) };
104
+ }
@@ -6,6 +6,7 @@ import { pathToFileURL } from "node:url";
6
6
 
7
7
  import { FALLBACK_CATALOG, readModelCatalog } from "./migrate-codex-config/catalog.mjs";
8
8
  import { configPaths } from "./migrate-codex-config/config-paths.mjs";
9
+ import { forceDisableMultiAgentV2 } from "./migrate-codex-config/multi-agent-v2-guard.mjs";
9
10
  import { ensureCodexReasoningConfig as applyReasoningProfile, readRootSettings } from "./migrate-codex-config/root-settings.mjs";
10
11
  import { readState, resolveStatePath, writeState } from "./migrate-codex-config/state.mjs";
11
12
 
@@ -41,12 +42,28 @@ export async function migrateCodexConfig({ env = process.env, cwd = process.cwd(
41
42
  export async function migrateConfigFile(configPath, { catalog = FALLBACK_CATALOG, previousState } = {}) {
42
43
  const before = await readConfig(configPath);
43
44
  const decision = shouldApplyCatalog(before, catalog, previousState);
44
- if (!decision.apply) return { changed: false, written: readRootSettings(before), managed: decision.managed };
45
- const after = ensureCodexReasoningConfig(before, catalog.current);
46
- if (after === before) return { changed: false, written: catalog.current, managed: true };
47
- await mkdir(dirname(configPath), { recursive: true });
48
- await writeFile(configPath, `${after.trimEnd()}\n`);
49
- return { changed: true, written: catalog.current, managed: true };
45
+
46
+ let config = before;
47
+ let reasoningApplied = false;
48
+
49
+ if (decision.apply) {
50
+ config = ensureCodexReasoningConfig(config, catalog.current);
51
+ reasoningApplied = config !== before;
52
+ }
53
+
54
+ const afterMultiAgentGuard = forceDisableMultiAgentV2(config);
55
+ const multiAgentChanged = afterMultiAgentGuard !== config;
56
+ if (multiAgentChanged) config = afterMultiAgentGuard;
57
+
58
+ const changed = reasoningApplied || multiAgentChanged;
59
+ if (changed) {
60
+ await mkdir(dirname(configPath), { recursive: true });
61
+ await writeFile(configPath, `${config.trimEnd()}\n`);
62
+ }
63
+
64
+ const written = decision.apply ? catalog.current : readRootSettings(config);
65
+ const managed = decision.apply ? true : decision.managed;
66
+ return { changed, written, managed };
50
67
  }
51
68
 
52
69
  function shouldApplyCatalog(config, catalog, previousState) {
@@ -24,21 +24,23 @@ This skill may include examples copied from the OpenCode harness. In Codex, do n
24
24
 
25
25
  | OpenCode example | Codex tool to use |
26
26
  | --- | --- |
27
- | \`call_omo_agent(subagent_type="explore", ...)\` | \`spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})\` |
28
- | \`call_omo_agent(subagent_type="librarian", ...)\` | \`spawn_agent({"task_name":"...","message":"TASK: act as a librarian. ...","fork_turns":"none"})\` |
29
- | \`task(subagent_type="plan", ...)\` | \`spawn_agent({"task_name":"...","message":"TASK: act as a planning agent. ...","fork_turns":"none"})\` |
30
- | \`task(subagent_type="oracle", ...)\` for final verification | \`spawn_agent({"task_name":"...","message":"TASK: act as a rigorous reviewer. ...","fork_turns":"none"})\` |
31
- | \`task(category="...", ...)\` for implementation or QA | \`spawn_agent({"task_name":"...","message":"TASK: act as an implementation or QA worker. ...","fork_turns":"none"})\` |
32
- | \`background_output(task_id="...")\` | \`wait_agent(...)\` for mailbox signals; after a timeout, run one \`list_agents\` check for the named child if reassurance is needed |
33
- | \`team_*(...)\` | Use Codex native subagents plus \`send_message\`, \`followup_task\`, \`wait_agent\`, and \`close_agent\` |
27
+ | \`call_omo_agent(subagent_type="explore", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. ...","agent_type":"explorer","fork_context":false})\` |
28
+ | \`call_omo_agent(subagent_type="librarian", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a librarian. ...","agent_type":"librarian","fork_context":false})\` |
29
+ | \`task(subagent_type="plan", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a planning agent. ...","agent_type":"plan","fork_context":false})\` |
30
+ | \`task(subagent_type="oracle", ...)\` for final verification | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"codex-ultrawork-reviewer","fork_context":false})\` |
31
+ | \`task(category="...", ...)\` for implementation or QA | \`multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})\` |
32
+ | \`background_output(task_id="...")\` | \`multi_agent_v1.wait_agent(...)\` for mailbox signals |
33
+ | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\`, \`multi_agent_v1.send_input\`, \`multi_agent_v1.wait_agent\`, and \`multi_agent_v1.close_agent\` |
34
34
 
35
- Codex full-history forks inherit parent context, so role-specific behavior must be described in a self-contained \`message\` and usually should use a non-full-history fork mode such as \`fork_turns="none"\`. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's \`message\`. If a code block below conflicts with this section, this section wins.
35
+ Role-specific behavior must be described in a self-contained \`message\`. Use \`fork_context: false\` to start the child with only the initial prompt (no parent history); use \`fork_context: true\` only when full parent history is truly required. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's \`message\`. OMO installs these selectable agent roles into \`~/.codex/agents/\`: \`explorer\`, \`librarian\`, \`plan\`, \`momus\`, \`metis\`, and \`codex-ultrawork-reviewer\` — pass the matching name as \`agent_type\` so the child gets that role's model and instructions. On \`multi_agent_v2\` sessions the same \`agent_type\` applies (the OMO installer exposes it) with \`fork_turns\` instead of \`fork_context\`. If the spawn tool exposes no \`agent_type\` parameter, omit it and describe the role inside \`message\`. If a code block below conflicts with this section, this section wins.
36
36
 
37
- For work likely to exceed one wait cycle, require the child to send \`WORKING: <task> - <current phase>\` before long passes and \`BLOCKED: <reason>\` only when progress stops. A \`wait_agent\` timeout only means no new mailbox update arrived. Treat a running child or latest \`WORKING:\` message as alive. Do not use \`list_agents\` as a polling loop. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly \`BLOCKED:\`, or no longer running.
37
+ For work likely to exceed one wait cycle, require the child to send \`WORKING: <task> - <current phase>\` before long passes and \`BLOCKED: <reason>\` only when progress stops. A \`multi_agent_v1.wait_agent\` timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly \`BLOCKED:\`, or no longer running.
38
38
 
39
39
  `;
40
40
 
41
41
  const codexCompatibilityEndMarkers = [
42
+ "For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `multi_agent_v1.wait_agent` timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.\n\n",
43
+ "Role-specific behavior must be described in a self-contained `message`. Use `fork_context: false` to start the child with only the initial prompt (no parent history); use `fork_context: true` only when full parent history is truly required. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
42
44
  "For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `wait_agent` timeout only means no new mailbox update arrived. Treat a running child or latest `WORKING:` message as alive. Do not use `list_agents` as a polling loop. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.\n\n",
43
45
  "Codex full-history forks inherit parent context, so role-specific behavior must be described in a self-contained `message` and usually should use a non-full-history fork mode such as `fork_turns=\"none\"`. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
44
46
  "When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
@@ -46,7 +48,7 @@ const codexCompatibilityEndMarkers = [
46
48
  ];
47
49
 
48
50
  function findCodexCompatibilitySectionEnd(content, searchStart) {
49
- const structuralEndPattern = /\n(?:---|#{1,6}\s)/g;
51
+ const structuralEndPattern = /\n(?:---|export\s+const\s+|#{1,6}\s)/g;
50
52
  structuralEndPattern.lastIndex = searchStart;
51
53
  const structuralEnd = structuralEndPattern.exec(content);
52
54
  if (structuralEnd) return structuralEnd.index + 1;
@@ -71,11 +73,21 @@ function removeCodexCompatibilityGuidance(content) {
71
73
  }
72
74
  }
73
75
 
76
+ function hasKnownGeneratedCodexCompatibilityGuidance(content, compatibilityIndex) {
77
+ return codexCompatibilityEndMarkers.some((marker) => content.indexOf(marker, compatibilityIndex) !== -1);
78
+ }
79
+
74
80
  export function insertCodexCompatibilityGuidance(content) {
75
81
  if (!opencodeOnlyOrchestrationPattern.test(content)) return content;
76
82
  const firstExampleIndex = content.search(opencodeOnlyOrchestrationPattern);
77
83
  const compatibilityIndex = content.indexOf("## Codex Harness Tool Compatibility");
78
- if (compatibilityIndex !== -1 && compatibilityIndex < firstExampleIndex) return content;
84
+ if (
85
+ compatibilityIndex !== -1 &&
86
+ compatibilityIndex < firstExampleIndex &&
87
+ !hasKnownGeneratedCodexCompatibilityGuidance(content, compatibilityIndex)
88
+ ) {
89
+ return content;
90
+ }
79
91
 
80
92
  const contentWithoutGuidance = removeCodexCompatibilityGuidance(content);
81
93