oh-my-opencode 4.16.2 → 4.17.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 (234) hide show
  1. package/.agents/command/omomomo.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +3 -3
  3. package/.agents/skills/omomomo/SKILL.md +1 -1
  4. package/.agents/skills/pre-publish-review/SKILL.md +3 -0
  5. package/.opencode/command/omomomo.md +1 -1
  6. package/.opencode/skills/hyperplan/SKILL.md +3 -3
  7. package/.opencode/skills/pre-publish-review/SKILL.md +3 -0
  8. package/README.ja.md +4 -4
  9. package/README.ko.md +4 -4
  10. package/README.md +4 -4
  11. package/README.ru.md +4 -4
  12. package/README.zh-cn.md +4 -4
  13. package/dist/agents/hephaestus/agent.d.ts +1 -1
  14. package/dist/agents/hephaestus/gpt-5-6.d.ts +2 -0
  15. package/dist/agents/momus-gpt-5-6.d.ts +1 -0
  16. package/dist/agents/types.d.ts +2 -0
  17. package/dist/cli/index.js +947 -567
  18. package/dist/cli-node/index.js +947 -567
  19. package/dist/features/background-agent/error-classifier.d.ts +5 -0
  20. package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -1
  21. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  22. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
  23. package/dist/index.js +523 -81
  24. package/dist/plugin/chat-message/types.d.ts +4 -0
  25. package/dist/plugin/command-execute-before.d.ts +1 -0
  26. package/dist/plugin/stop-continuation.d.ts +17 -0
  27. package/dist/shared/live-server-route.d.ts +1 -1
  28. package/dist/skills/remove-ai-slops/SKILL.md +2 -2
  29. package/dist/skills/review-work/SKILL.md +1 -1
  30. package/dist/skills/start-work/SKILL.md +5 -2
  31. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  32. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  33. package/dist/skills/ulw-research/SKILL.md +2 -2
  34. package/dist/skills/visual-qa/SKILL.md +1 -1
  35. package/dist/tui.js +195 -41
  36. package/package.json +15 -14
  37. package/packages/git-bash-mcp/package.json +27 -0
  38. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
  39. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +465 -248
  40. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  43. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  44. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  46. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  48. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
  49. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
  50. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
  51. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  52. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
  53. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  54. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
  55. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  56. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  57. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
  58. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +93 -0
  59. package/packages/omo-codex/plugin/components/rules/dist/cli.js +43 -24
  60. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  61. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  62. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +2 -1
  63. package/packages/omo-codex/plugin/components/rules/src/dynamic-target-fingerprints.ts +15 -6
  64. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +7 -2
  65. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +2 -2
  66. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +32 -0
  67. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +106 -0
  68. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  69. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  70. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
  71. package/packages/omo-codex/plugin/components/teammode/AGENTS.md +12 -9
  72. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  73. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  74. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +136 -76
  75. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +94 -23
  76. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +94 -14
  77. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-transport.mjs +55 -0
  78. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +72 -18
  79. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +23 -0
  80. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  81. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +23 -40
  83. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  84. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +3 -3
  85. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +7 -7
  86. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
  87. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
  88. package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +7 -5
  89. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
  90. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +20 -48
  91. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +17 -29
  92. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +20 -50
  93. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +22 -43
  94. package/packages/omo-codex/plugin/components/ultrawork/directive.md +55 -28
  95. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  96. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  97. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +55 -28
  98. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  99. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  100. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -0
  101. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
  102. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  103. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
  104. package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
  105. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +55 -28
  106. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
  107. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  108. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
  109. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
  110. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
  111. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
  112. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
  113. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
  114. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
  115. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
  116. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
  118. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
  119. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
  120. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
  121. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
  122. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
  123. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
  124. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
  126. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +29 -27
  127. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
  128. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
  129. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
  130. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
  131. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
  132. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
  133. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
  134. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
  135. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
  136. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
  137. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
  138. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
  139. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
  140. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
  141. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
  142. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
  143. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
  144. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
  145. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
  146. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
  147. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  148. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  149. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  150. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  151. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  152. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  153. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  154. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  155. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  156. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
  157. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  158. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  159. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  160. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  161. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  162. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  163. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  164. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
  165. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  166. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
  167. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  168. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  169. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  170. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  171. package/packages/omo-codex/plugin/package-lock.json +13 -13
  172. package/packages/omo-codex/plugin/package.json +1 -1
  173. package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -2
  174. package/packages/omo-codex/plugin/scripts/entry-guard.mjs +26 -0
  175. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +3 -1
  176. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  177. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +39 -4
  178. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +24 -4
  179. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +3 -3
  180. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +2 -2
  181. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +2 -2
  182. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +14 -6
  183. package/packages/omo-codex/plugin/scripts/sync-version.mjs +4 -2
  184. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +3 -3
  185. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +3 -3
  186. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +5 -5
  187. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +9 -3
  188. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +6 -3
  189. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +136 -76
  190. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +94 -23
  191. package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +94 -14
  192. package/packages/omo-codex/plugin/skills/teammode/scripts/team-transport.mjs +55 -0
  193. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +72 -18
  194. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +55 -28
  195. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
  196. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +29 -27
  197. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  198. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  199. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -4
  200. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +4 -4
  201. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +116 -10
  202. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
  203. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
  204. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
  205. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +4 -2
  206. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +33 -0
  207. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  208. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  209. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
  210. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +160 -23
  211. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +71 -0
  212. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +32 -0
  213. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +20 -2
  214. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
  215. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -2
  216. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +345 -0
  217. package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
  218. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
  219. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  220. package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
  221. package/packages/omo-codex/scripts/install-dist/install-local.mjs +508 -286
  222. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +111 -1
  223. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
  224. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  225. package/packages/shared-skills/skills/start-work/SKILL.md +5 -2
  226. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  227. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  228. package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
  229. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  230. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  231. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
  232. package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
  233. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  234. /package/packages/omo-codex/plugin/components/rules/bundled-rules/{hephaestus.md → hephaestus/gpt-5.5.md} +0 -0
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 4.16.2) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 4.17.0) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.16.2) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 4.17.0) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.16.2) Loading Project Rules",
10
+ "statusMessage": "(OmO 4.17.0) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -1,28 +1,37 @@
1
1
  {
2
- "version": "2026-06-04.gpt-5.5-400k-reviewer-high",
2
+ "version": "2026-07-11.gpt-5.6-sol-372k-high",
3
3
  "current": {
4
- "model": "gpt-5.5",
5
- "model_context_window": 400000,
4
+ "model": "gpt-5.6-sol",
5
+ "model_context_window": 372000,
6
6
  "model_reasoning_effort": "high",
7
7
  "plan_mode_reasoning_effort": "xhigh"
8
8
  },
9
9
  "roles": {
10
10
  "default": {
11
- "model": "gpt-5.5",
12
- "model_context_window": 400000,
11
+ "model": "gpt-5.6-sol",
12
+ "model_context_window": 372000,
13
13
  "model_reasoning_effort": "high",
14
14
  "plan_mode_reasoning_effort": "xhigh"
15
15
  },
16
16
  "verifier": {
17
- "model": "gpt-5.5",
17
+ "model": "gpt-5.6-sol",
18
18
  "model_reasoning_effort": "high"
19
19
  },
20
20
  "worker": {
21
- "model": "gpt-5.5",
21
+ "model": "gpt-5.6-sol",
22
22
  "model_reasoning_effort": "high"
23
23
  }
24
24
  },
25
25
  "managedProfiles": [
26
+ {
27
+ "version": "legacy.gpt-5.5-400k-reviewer-high",
28
+ "match": {
29
+ "model": "gpt-5.5",
30
+ "model_context_window": 400000,
31
+ "model_reasoning_effort": "high",
32
+ "plan_mode_reasoning_effort": "xhigh"
33
+ }
34
+ },
26
35
  {
27
36
  "version": "legacy.gpt-5.5-1m",
28
37
  "match": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.16.1",
3
+ "version": "4.16.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "4.16.1",
9
+ "version": "4.16.3",
10
10
  "workspaces": [
11
11
  "components/codegraph",
12
12
  "components/comment-checker",
@@ -93,7 +93,7 @@
93
93
  },
94
94
  "components/codegraph": {
95
95
  "name": "@sisyphuslabs/codex-codegraph",
96
- "version": "4.16.1",
96
+ "version": "4.16.3",
97
97
  "bin": {
98
98
  "omo-codegraph": "dist/cli.js"
99
99
  },
@@ -112,7 +112,7 @@
112
112
  },
113
113
  "components/comment-checker": {
114
114
  "name": "@code-yeongyu/codex-comment-checker",
115
- "version": "4.16.1",
115
+ "version": "4.16.3",
116
116
  "license": "MIT",
117
117
  "bin": {
118
118
  "omo-comment-checker": "dist/cli.js"
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "components/git-bash": {
135
135
  "name": "@sisyphuslabs/codex-git-bash-hook",
136
- "version": "4.16.1",
136
+ "version": "4.16.3",
137
137
  "bin": {
138
138
  "omo-git-bash-hook": "dist/cli.js"
139
139
  },
@@ -148,7 +148,7 @@
148
148
  },
149
149
  "components/lazycodex-executor-verify": {
150
150
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
151
- "version": "4.16.1",
151
+ "version": "4.16.3",
152
152
  "license": "MIT",
153
153
  "bin": {
154
154
  "lazycodex-executor-verify": "dist/cli.js"
@@ -165,7 +165,7 @@
165
165
  },
166
166
  "components/lsp": {
167
167
  "name": "@code-yeongyu/codex-lsp",
168
- "version": "4.16.1",
168
+ "version": "4.16.3",
169
169
  "license": "MIT",
170
170
  "dependencies": {
171
171
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
@@ -185,7 +185,7 @@
185
185
  },
186
186
  "components/rules": {
187
187
  "name": "@code-yeongyu/codex-rules",
188
- "version": "4.16.1",
188
+ "version": "4.16.3",
189
189
  "license": "MIT",
190
190
  "dependencies": {
191
191
  "picomatch": "^4.0.3"
@@ -207,7 +207,7 @@
207
207
  },
208
208
  "components/start-work-continuation": {
209
209
  "name": "@code-yeongyu/codex-start-work-continuation",
210
- "version": "4.16.1",
210
+ "version": "4.16.3",
211
211
  "license": "MIT",
212
212
  "bin": {
213
213
  "omo-start-work-continuation": "dist/cli.js"
@@ -224,7 +224,7 @@
224
224
  },
225
225
  "components/teammode": {
226
226
  "name": "@sisyphuslabs/codex-teammode",
227
- "version": "4.16.1",
227
+ "version": "4.16.3",
228
228
  "devDependencies": {
229
229
  "@types/node": "^25.9.3",
230
230
  "bun-types": "^1.3.1",
@@ -237,7 +237,7 @@
237
237
  },
238
238
  "components/telemetry": {
239
239
  "name": "@code-yeongyu/codex-telemetry",
240
- "version": "4.16.1",
240
+ "version": "4.16.3",
241
241
  "license": "MIT",
242
242
  "bin": {
243
243
  "omo-telemetry": "dist/cli.js"
@@ -255,7 +255,7 @@
255
255
  },
256
256
  "components/ultrawork": {
257
257
  "name": "@code-yeongyu/codex-ultrawork",
258
- "version": "4.16.1",
258
+ "version": "4.16.3",
259
259
  "license": "MIT",
260
260
  "bin": {
261
261
  "omo-ultrawork": "dist/cli.js"
@@ -273,7 +273,7 @@
273
273
  },
274
274
  "components/ulw-loop": {
275
275
  "name": "@code-yeongyu/codex-ulw-loop",
276
- "version": "4.16.1",
276
+ "version": "4.16.3",
277
277
  "license": "MIT",
278
278
  "bin": {
279
279
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.16.2",
3
+ "version": "4.17.0",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { spawn, spawnSync } from "node:child_process";
4
- import { pathToFileURL } from "node:url";
4
+ import { isCliEntry } from "./entry-guard.mjs";
5
5
  import {
6
6
  DEFAULT_LOCK_STALE_MS,
7
7
  acquireLock,
@@ -296,8 +296,15 @@ function resolveUpdateContext({ env }) {
296
296
 
297
297
  async function runConfigMigration({ env, sessionModel = null, requireSessionModel = false }) {
298
298
  if (env.LAZYCODEX_CONFIG_MIGRATION_DISABLED === "1" || env.OMO_CODEX_CONFIG_MIGRATION_DISABLED === "1") return [];
299
+ // The two migrations are independent; a SoT seeding failure must never
300
+ // block the config.toml repair (which can be the difference between a
301
+ // working and a fully broken GPT-5.6 session).
299
302
  try {
300
303
  await migrateOmoSotConfig({ env, seed: true });
304
+ } catch (error) {
305
+ if (!(error instanceof Error)) throw error;
306
+ }
307
+ try {
301
308
  const result = await migrateCodexConfig({ env, sessionModel, requireSessionModel });
302
309
  if (result.modeChanged.length === 0) return [];
303
310
  return [
@@ -309,7 +316,7 @@ async function runConfigMigration({ env, sessionModel = null, requireSessionMode
309
316
  }
310
317
  }
311
318
 
312
- if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
319
+ if (isCliEntry(import.meta.url)) {
313
320
  (async () => {
314
321
  const sessionModel = await readSessionModelFromStdin(process.stdin);
315
322
  const { notices } = await runAutoUpdateCheck({
@@ -0,0 +1,26 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ /**
5
+ * True when the module identified by `importMetaUrl` is the process CLI
6
+ * entrypoint (`node <script>`).
7
+ *
8
+ * A plain `import.meta.url === pathToFileURL(process.argv[1]).href` check
9
+ * breaks when the script is reached through a symlink: Node resolves
10
+ * `import.meta.url` to the real path by default, while `process.argv[1]`
11
+ * keeps the symlinked spelling, so the two never match and the CLI body is
12
+ * silently skipped (exit 0, no output). Seen in the wild with a symlinked
13
+ * plugin cache dir, which turned every SessionStart hook into a no-op.
14
+ *
15
+ * @param {string} importMetaUrl the caller's `import.meta.url`
16
+ */
17
+ export function isCliEntry(importMetaUrl) {
18
+ const argv1 = process.argv[1];
19
+ if (argv1 === undefined) return false;
20
+ if (importMetaUrl === pathToFileURL(argv1).href) return true;
21
+ try {
22
+ return importMetaUrl === pathToFileURL(realpathSync(argv1)).href;
23
+ } catch {
24
+ return false;
25
+ }
26
+ }
@@ -2,6 +2,8 @@ import { execFileSync } from "node:child_process";
2
2
  import { dirname, join } from "node:path";
3
3
  import { fileURLToPath, pathToFileURL } from "node:url";
4
4
 
5
+ import { isCliEntry } from "./entry-guard.mjs";
6
+
5
7
  const pluginScriptsDir = dirname(fileURLToPath(import.meta.url));
6
8
  const repoRoot = join(pluginScriptsDir, "..", "..", "..", "..");
7
9
  const sharedSkillsScripts = join(repoRoot, "packages", "shared-skills", "scripts");
@@ -35,7 +37,7 @@ export async function materializeSharedUpstreams({ strict }) {
35
37
  return materializeFrontendRefs({ strict });
36
38
  }
37
39
 
38
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
40
+ if (isCliEntry(import.meta.url)) {
39
41
  // The root build materializes once up front and sets this so downstream codex-plugin
40
42
  // builds in the same run do not re-run it; concurrent runs would contend on git's
41
43
  // submodule index.lock and race writes into packages/shared-skills/skills.
@@ -3,24 +3,33 @@ import { dirname, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
 
5
5
  export const FALLBACK_CATALOG = {
6
- version: "fallback.gpt-5.5-400k-reviewer-high",
6
+ version: "fallback.gpt-5.6-sol-372k-high",
7
7
  current: {
8
- model: "gpt-5.5",
9
- model_context_window: 400_000,
8
+ model: "gpt-5.6-sol",
9
+ model_context_window: 372_000,
10
10
  model_reasoning_effort: "high",
11
11
  plan_mode_reasoning_effort: "xhigh",
12
12
  },
13
13
  roles: {
14
14
  default: {
15
- model: "gpt-5.5",
16
- model_context_window: 400_000,
15
+ model: "gpt-5.6-sol",
16
+ model_context_window: 372_000,
17
17
  model_reasoning_effort: "high",
18
18
  plan_mode_reasoning_effort: "xhigh",
19
19
  },
20
- verifier: { model: "gpt-5.5", model_reasoning_effort: "high" },
21
- worker: { model: "gpt-5.5", model_reasoning_effort: "high" },
20
+ verifier: { model: "gpt-5.6-sol", model_reasoning_effort: "high" },
21
+ worker: { model: "gpt-5.6-sol", model_reasoning_effort: "high" },
22
22
  },
23
23
  managedProfiles: [
24
+ {
25
+ version: "legacy.gpt-5.5-400k-reviewer-high",
26
+ match: {
27
+ model: "gpt-5.5",
28
+ model_context_window: 400_000,
29
+ model_reasoning_effort: "high",
30
+ plan_mode_reasoning_effort: "xhigh",
31
+ },
32
+ },
24
33
  {
25
34
  version: "legacy.gpt-5.5-1m",
26
35
  match: {
@@ -24,7 +24,7 @@
24
24
  */
25
25
  import { readFileSync } from "node:fs";
26
26
  import { homedir } from "node:os";
27
- import { join } from "node:path";
27
+ import { dirname, isAbsolute, join } from "node:path";
28
28
 
29
29
  const MANAGED_COMMENT_MARKER = "openai/codex#26753";
30
30
  const MANAGED_DISABLE_COMMENT = [
@@ -42,6 +42,7 @@ const MANAGED_DISABLE_COMMENT = [
42
42
  * requireSessionModel?: boolean,
43
43
  * env?: NodeJS.ProcessEnv,
44
44
  * modelsCachePath?: string,
45
+ * configPath?: string,
45
46
  * }} [options]
46
47
  */
47
48
  export function forceDisableMultiAgentV2(config, options = {}) {
@@ -55,8 +56,9 @@ export function forceDisableMultiAgentV2(config, options = {}) {
55
56
  options.multiAgentVersion !== undefined
56
57
  ? options.multiAgentVersion
57
58
  : resolveMultiAgentVersionFromConfig(normalized, options);
59
+ const effectiveModel = sessionModel || readRootModel(normalized);
58
60
 
59
- if (prefersMultiAgentV2(multiAgentVersion, sessionModel)) {
61
+ if (prefersMultiAgentV2(multiAgentVersion, effectiveModel)) {
60
62
  return clearMultiAgentV2DisableForReservedSchema(normalized);
61
63
  }
62
64
 
@@ -68,6 +70,15 @@ export function forceDisableMultiAgentV2(config, options = {}) {
68
70
  return normalized;
69
71
  }
70
72
 
73
+ // No model evidence at all (no session model AND no root `model` in
74
+ // config.toml — Codex Desktop selects the model in the UI): config alone
75
+ // cannot prove the session is not a GPT-5.6 reserved-schema model, and
76
+ // writing `enabled = false` would 400 every turn on those sessions
77
+ // (#6002). Leave the enable state untouched.
78
+ if (multiAgentVersion == null && !sessionModel && !readRootModel(normalized)) {
79
+ return normalized;
80
+ }
81
+
71
82
  // Unknown catalog entry for an explicit session model: skip force-disable
72
83
  // rather than assume the legacy encrypted-V2 failure mode.
73
84
  if (sessionModel && multiAgentVersion == null) {
@@ -92,13 +103,17 @@ export function prefersMultiAgentV2(multiAgentVersion, sessionModel) {
92
103
  * Resolve the effective model against Codex `models_cache.json`.
93
104
  * Prefers SessionStart `model` over the root `model` in config.toml.
94
105
  * @param {string} config
95
- * @param {{ sessionModel?: string | null, env?: NodeJS.ProcessEnv, modelsCachePath?: string }} [options]
106
+ * @param {{ sessionModel?: string | null, env?: NodeJS.ProcessEnv, modelsCachePath?: string, configPath?: string }} [options]
96
107
  * @returns {"v1" | "v2" | null}
97
108
  */
98
109
  export function resolveMultiAgentVersionFromConfig(config, options = {}) {
99
110
  const model = normalizeModel(options.sessionModel) || readRootModel(config);
100
111
  if (!model) return null;
101
- return resolveMultiAgentVersionForModel(model, options);
112
+ const version = resolveMultiAgentVersionForModel(model, {
113
+ ...options,
114
+ modelsCachePath: options.modelsCachePath?.trim() || resolveModelCatalogPath(readRootModelCatalogPath(config), options) || undefined,
115
+ });
116
+ return version ?? (isGpt56Family(model) ? "v2" : null);
102
117
  }
103
118
 
104
119
  /**
@@ -130,6 +145,26 @@ export function readRootModel(config) {
130
145
  return single?.[1] ?? null;
131
146
  }
132
147
 
148
+ // Codex documents `model_catalog_json` as a COMPLETE replacement for the
149
+ // fetched models_cache.json (codex-rs/core/src/config/mod.rs load_model_catalog
150
+ // -> load_catalog_json -> ModelsResponse). When set, Codex resolves the model
151
+ // only from that file, so the guard must too — otherwise Codex and the guard
152
+ // disagree on the multi-agent version (lazycodex#120).
153
+ export function readRootModelCatalogPath(config) {
154
+ const double = config.match(/^\s*model_catalog_json\s*=\s*"([^"]+)"/m);
155
+ if (double) return double[1];
156
+ const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
157
+ return single?.[1] ?? null;
158
+ }
159
+
160
+ function resolveModelCatalogPath(configuredPath, options) {
161
+ const trimmed = normalizeModel(configuredPath);
162
+ if (!trimmed) return null;
163
+ if (isAbsolute(trimmed)) return trimmed;
164
+ const baseDir = options.configPath ? dirname(options.configPath) : options.env?.CODEX_HOME?.trim() || join(homedir(), ".codex");
165
+ return join(baseDir, trimmed);
166
+ }
167
+
133
168
  function normalizeModel(value) {
134
169
  if (typeof value !== "string") return null;
135
170
  const trimmed = value.trim();
@@ -1,4 +1,4 @@
1
- import { prefersMultiAgentV2, resolveMultiAgentVersionFromConfig } from "./multi-agent-v2-guard.mjs";
1
+ import { prefersMultiAgentV2, readRootModel, resolveMultiAgentVersionFromConfig } from "./multi-agent-v2-guard.mjs";
2
2
 
3
3
  const CODEX_AGENTS_HEADER = "[agents]";
4
4
  const CODEX_MULTI_AGENT_V2_HEADER = "[features.multi_agent_v2]";
@@ -11,6 +11,12 @@ const CODEX_SUBAGENT_THREAD_LIMIT = "1000";
11
11
  * enabled in config, skip `agents.max_threads` because Codex rejects that key
12
12
  * while features.multi_agent_v2 is enabled.
13
13
  *
14
+ * When no model is resolvable at all (no session model and no root `model`
15
+ * in config.toml — Codex Desktop selects the model in the UI), never
16
+ * introduce `agents.max_threads`: it hard-fails thread/start on
17
+ * MultiAgentV2 sessions. An existing cap is still raised in place so the
18
+ * legacy low-cap repair keeps working and a hand-removed key stays removed.
19
+ *
14
20
  * @param {string} config
15
21
  * @param {{ multiAgentVersion?: string | null, sessionModel?: string | null, env?: NodeJS.ProcessEnv, modelsCachePath?: string }} [options]
16
22
  */
@@ -22,20 +28,34 @@ export function ensureSubagentConcurrencyLimit(config, options = {}) {
22
28
  const v2Preferred = prefersMultiAgentV2(multiAgentVersion, options.sessionModel) || isMultiAgentV2Enabled(config);
23
29
 
24
30
  let result = config;
25
- if (!v2Preferred) {
26
- result = ensureAgentsMaxThreads(result);
27
- } else {
31
+ if (v2Preferred) {
28
32
  result = removeAgentsMaxThreads(result);
33
+ } else if (multiAgentVersion == null && !hasModelEvidence(config, options)) {
34
+ result = raiseExistingAgentsMaxThreads(result);
35
+ } else {
36
+ result = ensureAgentsMaxThreads(result);
29
37
  }
30
38
  return ensureMultiAgentV2ThreadLimit(result);
31
39
  }
32
40
 
41
+ function hasModelEvidence(config, options) {
42
+ const sessionModel = typeof options.sessionModel === "string" ? options.sessionModel.trim() : "";
43
+ return sessionModel.length > 0 || readRootModel(config) !== null;
44
+ }
45
+
33
46
  function isMultiAgentV2Enabled(config) {
34
47
  const section = findSection(config, CODEX_MULTI_AGENT_V2_HEADER);
35
48
  if (!section) return false;
36
49
  return /^\s*enabled\s*=\s*true[ \t]*(?:#[^\n]*)?$/m.test(section.text);
37
50
  }
38
51
 
52
+ function raiseExistingAgentsMaxThreads(config) {
53
+ const section = findSection(config, CODEX_AGENTS_HEADER);
54
+ if (!section) return config;
55
+ if (!/^\s*max_threads\s*=/m.test(section.text)) return config;
56
+ return replaceOrInsertSetting(config, section, "max_threads", CODEX_SUBAGENT_THREAD_LIMIT);
57
+ }
58
+
39
59
  function ensureAgentsMaxThreads(config) {
40
60
  const section = findSection(config, CODEX_AGENTS_HEADER);
41
61
  if (!section) return appendBlock(config, `${CODEX_AGENTS_HEADER}\nmax_threads = ${CODEX_SUBAGENT_THREAD_LIMIT}\n`);
@@ -2,8 +2,8 @@
2
2
 
3
3
  import { mkdir, readFile, writeFile } from "node:fs/promises";
4
4
  import { dirname } from "node:path";
5
- import { pathToFileURL } from "node:url";
6
5
 
6
+ import { isCliEntry } from "./entry-guard.mjs";
7
7
  import { FALLBACK_CATALOG, readModelCatalog } from "./migrate-codex-config/catalog.mjs";
8
8
  import { configPaths } from "./migrate-codex-config/config-paths.mjs";
9
9
  import { removeStaleContext7PlaceholderMcpServer } from "./migrate-codex-config/context7-placeholder-guard.mjs";
@@ -76,7 +76,7 @@ export async function migrateConfigFile(
76
76
  reasoningApplied = config !== before;
77
77
  }
78
78
 
79
- const multiAgentOptions = { env, sessionModel, requireSessionModel };
79
+ const multiAgentOptions = { env, sessionModel, requireSessionModel, configPath };
80
80
  const multiAgentVersion = resolveMultiAgentVersionFromConfig(config, multiAgentOptions);
81
81
  const afterMultiAgentGuard = forceDisableMultiAgentV2(config, {
82
82
  ...multiAgentOptions,
@@ -145,7 +145,7 @@ async function readConfig(configPath) {
145
145
  }
146
146
  }
147
147
 
148
- if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
148
+ if (isCliEntry(import.meta.url)) {
149
149
  migrateCodexConfig().catch((error) => {
150
150
  if (!(error instanceof Error)) throw error;
151
151
  process.exit(0);
@@ -3,8 +3,8 @@
3
3
  import { access, mkdir, readFile, writeFile } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
5
  import { dirname, join } from "node:path";
6
- import { pathToFileURL } from "node:url";
7
6
 
7
+ import { isCliEntry } from "./entry-guard.mjs";
8
8
  import { addCodexCodegraphValues, hasOwn, isRecord, recordAt } from "./migrate-omo-sot/editor.mjs";
9
9
  import { parseJsonc } from "./migrate-omo-sot/jsonc.mjs";
10
10
  import { SCAFFOLD } from "./migrate-omo-sot/scaffold.mjs";
@@ -109,7 +109,7 @@ function isValidCodegraphValue(key, value) {
109
109
  return typeof value === "boolean";
110
110
  }
111
111
 
112
- if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
112
+ if (isCliEntry(import.meta.url)) {
113
113
  migrateOmoSotConfig({ seed: process.argv.includes("--seed") })
114
114
  .then((result) => {
115
115
  for (const warning of result.warnings) process.stderr.write(`${warning}\n`);
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { access, readdir, readFile, writeFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
- import { pathToFileURL } from "node:url";
5
4
  import { fileURLToPath } from "node:url";
6
5
 
6
+ import { isCliEntry } from "./entry-guard.mjs";
7
7
  import { formatLazyCodexHookStatusMessage, normalizeLazyCodexHookStatusLabel } from "./hook-status-message.mjs";
8
8
 
9
9
  const defaultRoot = dirname(dirname(fileURLToPath(import.meta.url)));
@@ -102,6 +102,6 @@ export async function syncHookStatusMessages(root = defaultRoot, options = {}) {
102
102
  }
103
103
  }
104
104
 
105
- if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
105
+ if (isCliEntry(import.meta.url)) {
106
106
  await syncHookStatusMessages();
107
107
  }
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { cp, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
- import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ import { isCliEntry } from "./entry-guard.mjs";
5
7
  import { sharedSkillsRootPath } from "@oh-my-opencode/shared-skills";
6
8
 
7
9
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
@@ -36,7 +38,7 @@ function shouldCopySkillSource(source) {
36
38
 
37
39
  const opencodeOnlyOrchestrationPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
38
40
 
39
- const codexHarnessToolCompatibility = `## Codex Harness Tool Compatibility
41
+ export const codexHarnessToolCompatibility = `## Codex Harness Tool Compatibility
40
42
 
41
43
  This skill may include examples copied from the OpenCode harness. In Codex, do not call OpenCode-only tools such as \`call_omo_agent(...)\`, \`task(...)\`, \`background_output(...)\`, or \`team_*(...)\` literally. Translate those examples to Codex native tools:
42
44
 
@@ -48,15 +50,15 @@ This skill may include examples copied from the OpenCode harness. In Codex, do n
48
50
  | \`task(subagent_type="oracle", ...)\` for final verification | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"lazycodex-gate-reviewer","fork_context":false})\` |
49
51
  | \`task(category="...", ...)\` for implementation or QA | \`multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})\` |
50
52
  | \`background_output(task_id="...")\` | \`multi_agent_v1.wait_agent(...)\` for mailbox signals |
51
- | \`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\` |
53
+ | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\` and \`multi_agent_v1.wait_agent\`; use \`multi_agent_v1.send_input\` and \`multi_agent_v1.close_agent\` only when exposed in the active tools list |
52
54
 
53
55
  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\`, \`lazycodex-code-reviewer\`, \`lazycodex-qa-executor\`, and \`lazycodex-gate-reviewer\` - pass the matching name as \`agent_type\` so the child gets that role's model and instructions. 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.
54
56
 
55
- Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If \`multi_agent_v1.*\` tools exist, use the table above as written. If instead a flat \`spawn_agent\` with a required \`task_name\` exists (\`multi_agent_v2\`), rewrite every \`multi_agent_v1.*\` example: \`multi_agent_v1.spawn_agent({...,"fork_context":false})\` becomes \`spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})\` (\`"all"\` only when full parent history is truly required); \`send_input\` becomes \`send_message\`; do not call \`close_agent\`/\`resume_agent\` (finished agents end on their own; \`followup_task\` re-tasks one, \`interrupt_agent\` stops one); \`wait_agent\` takes only \`timeout_ms\` and returns on any child mailbox activity. \`agent_type\` works the same on both surfaces. If a code block below conflicts with this section, this section wins.
57
+ Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If \`multi_agent_v1.*\` tools exist, use the table above as written. If instead a flat \`spawn_agent\` with a required \`task_name\` exists (\`multi_agent_v2\`), rewrite every \`multi_agent_v1.*\` example: \`multi_agent_v1.spawn_agent({...,"fork_context":false})\` becomes \`spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})\` (\`"all"\` only when full parent history is truly required); \`send_input\` becomes \`send_message\`; do not call \`close_agent\`/\`resume_agent\` (finished agents end on their own; \`followup_task\` re-tasks one, \`interrupt_agent\` stops one); \`wait_agent\` takes only \`timeout_ms\` and returns on any child mailbox activity. On the v2 surface \`agent_type\` may be ABSENT from the spawn schema (verified 2026-07-11: only \`fork_turns\`/\`message\`/\`task_name\`) — when absent, omit it and describe the role inside \`message\`; installed role TOMLs cannot be selected on that surface. If a code block below conflicts with this section, this section wins.
56
58
 
57
59
  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.
58
60
 
59
- 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.
61
+ 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; back off between waits (double the timeout up to ~5 minutes) instead of spinning short cycles. 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.
60
62
 
61
63
  `;
62
64
 
@@ -154,6 +156,12 @@ failed, investigate the underlying uncertainty with the \`debugging\` skill when
154
156
  runtime behavior may be wrong, fix with evidence, and rerun the affected lane
155
157
  before claiming completion, creating or handing off a PR, or merging.
156
158
 
159
+ A rejecting lane must name its blockers inline in its final message — each
160
+ blocker cites the violated goal criterion or requirement plus an evidence
161
+ pointer. A bare REJECT/FAIL token without findings is not a verdict; treat it
162
+ as an inconclusive lane (one bounded respawn, then record it inconclusive with
163
+ that reason).
164
+
157
165
  When reviewing a PR or branch, collect diff, file contents, and verification
158
166
  results from a dedicated review worktree attached to that branch. Never
159
167
  checkout, test, or edit the review branch in the main worktree.
@@ -263,6 +271,6 @@ async function syncSkills() {
263
271
  }
264
272
  }
265
273
 
266
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
274
+ if (isCliEntry(import.meta.url)) {
267
275
  await syncSkills();
268
276
  }
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { readdir, readFile, writeFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
- import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ import { isCliEntry } from "./entry-guard.mjs";
5
7
 
6
8
  const scriptDir = dirname(fileURLToPath(import.meta.url));
7
9
  const defaultPluginRoot = dirname(scriptDir);
@@ -88,7 +90,7 @@ export async function syncVersion(options = {}) {
88
90
  return { version, targets, changed };
89
91
  }
90
92
 
91
- if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
93
+ if (isCliEntry(import.meta.url)) {
92
94
  const result = await syncVersion();
93
95
  console.log(`Synced OMO Codex manifests to version ${result.version} (${result.changed.length} updated)`);
94
96
  }
@@ -14,15 +14,15 @@ This skill may include examples copied from the OpenCode harness. In Codex, do n
14
14
  | `task(subagent_type="oracle", ...)` for final verification | `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"lazycodex-gate-reviewer","fork_context":false})` |
15
15
  | `task(category="...", ...)` for implementation or QA | `multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})` |
16
16
  | `background_output(task_id="...")` | `multi_agent_v1.wait_agent(...)` for mailbox signals |
17
- | `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` |
17
+ | `team_*(...)` | Use Codex native subagents via `multi_agent_v1.spawn_agent` and `multi_agent_v1.wait_agent`; use `multi_agent_v1.send_input` and `multi_agent_v1.close_agent` only when exposed in the active tools list |
18
18
 
19
19
  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`, `lazycodex-code-reviewer`, `lazycodex-qa-executor`, and `lazycodex-gate-reviewer` - pass the matching name as `agent_type` so the child gets that role's model and instructions. 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.
20
20
 
21
- Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If `multi_agent_v1.*` tools exist, use the table above as written. If instead a flat `spawn_agent` with a required `task_name` exists (`multi_agent_v2`), rewrite every `multi_agent_v1.*` example: `multi_agent_v1.spawn_agent({...,"fork_context":false})` becomes `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})` (`"all"` only when full parent history is truly required); `send_input` becomes `send_message`; do not call `close_agent`/`resume_agent` (finished agents end on their own; `followup_task` re-tasks one, `interrupt_agent` stops one); `wait_agent` takes only `timeout_ms` and returns on any child mailbox activity. `agent_type` works the same on both surfaces. If a code block below conflicts with this section, this section wins.
21
+ Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If `multi_agent_v1.*` tools exist, use the table above as written. If instead a flat `spawn_agent` with a required `task_name` exists (`multi_agent_v2`), rewrite every `multi_agent_v1.*` example: `multi_agent_v1.spawn_agent({...,"fork_context":false})` becomes `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})` (`"all"` only when full parent history is truly required); `send_input` becomes `send_message`; do not call `close_agent`/`resume_agent` (finished agents end on their own; `followup_task` re-tasks one, `interrupt_agent` stops one); `wait_agent` takes only `timeout_ms` and returns on any child mailbox activity. On the v2 surface `agent_type` may be ABSENT from the spawn schema (verified 2026-07-11: only `fork_turns`/`message`/`task_name`) — when absent, omit it and describe the role inside `message`; installed role TOMLs cannot be selected on that surface. If a code block below conflicts with this section, this section wins.
22
22
 
23
23
  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.
24
24
 
25
- 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.
25
+ 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; back off between waits (double the timeout up to ~5 minutes) instead of spinning short cycles. 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.
26
26
 
27
27
  # /init-deep
28
28