oh-my-opencode 4.18.2 → 4.19.1

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 (307) hide show
  1. package/.agents/command/omomomo.md +1 -1
  2. package/.agents/skills/omomomo/SKILL.md +1 -1
  3. package/.opencode/command/omomomo.md +1 -1
  4. package/README.ja.md +6 -6
  5. package/README.ko.md +6 -6
  6. package/README.md +8 -8
  7. package/README.ru.md +6 -6
  8. package/README.zh-cn.md +6 -6
  9. package/dist/agents/atlas/agent.d.ts +7 -6
  10. package/dist/agents/gpt-prompt-identity.d.ts +3 -0
  11. package/dist/agents/sisyphus/gpt-5-5.d.ts +1 -1
  12. package/dist/agents/sisyphus/gpt-task-system-guide.d.ts +1 -0
  13. package/dist/agents/sisyphus/index.d.ts +5 -0
  14. package/dist/agents/sisyphus/kimi-k3.d.ts +19 -0
  15. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  16. package/dist/agents/sisyphus-junior/agent.d.ts +8 -4
  17. package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +2 -2
  18. package/dist/agents/sisyphus-junior/index.d.ts +2 -0
  19. package/dist/agents/sisyphus-junior/kimi-k3.d.ts +12 -0
  20. package/dist/agents/types.d.ts +2 -2
  21. package/dist/cli/index.js +781 -215
  22. package/dist/cli-node/index.js +781 -215
  23. package/dist/config/index.d.ts +1 -1
  24. package/dist/config/schema/agent-overrides.d.ts +48 -48
  25. package/dist/config/schema/browser-automation.d.ts +1 -0
  26. package/dist/config/schema/categories.d.ts +6 -6
  27. package/dist/config/schema/codegraph.d.ts +2 -0
  28. package/dist/config/schema/commands.d.ts +1 -3
  29. package/dist/config/schema/default-mode.d.ts +1 -1
  30. package/dist/config/schema/fallback-models.d.ts +5 -5
  31. package/dist/config/schema/goal.d.ts +7 -0
  32. package/dist/config/schema/hooks.d.ts +1 -1
  33. package/dist/config/schema/oh-my-opencode-config.d.ts +56 -58
  34. package/dist/config/schema/ralph-loop.d.ts +1 -1
  35. package/dist/config/schema.d.ts +1 -1
  36. package/dist/create-hooks.d.ts +1 -1
  37. package/dist/features/builtin-commands/templates/goal.d.ts +1 -0
  38. package/dist/features/builtin-commands/templates/stop-continuation.d.ts +1 -1
  39. package/dist/features/builtin-commands/types.d.ts +1 -1
  40. package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
  41. package/dist/hooks/codegraph-bootstrap/hook.d.ts +3 -2
  42. package/dist/hooks/goal/command-arguments.d.ts +13 -0
  43. package/dist/hooks/goal/controller.d.ts +26 -0
  44. package/dist/hooks/goal/index.d.ts +23 -0
  45. package/dist/hooks/goal/prompt.d.ts +3 -0
  46. package/dist/hooks/goal/store.d.ts +8 -0
  47. package/dist/hooks/goal/tools.d.ts +10 -0
  48. package/dist/hooks/goal/types.d.ts +93 -0
  49. package/dist/hooks/goal/validation.d.ts +4 -0
  50. package/dist/hooks/index.d.ts +1 -0
  51. package/dist/hooks/keyword-detector/hook.d.ts +1 -2
  52. package/dist/hooks/ralph-loop/types.d.ts +1 -1
  53. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  54. package/dist/hooks/start-work/notepad-scaffold.d.ts +10 -0
  55. package/dist/index.js +5398 -5109
  56. package/dist/oh-my-opencode.schema.json +34 -19
  57. package/dist/plugin/chat-message/loop-commands.d.ts +1 -1
  58. package/dist/plugin/chat-message/types.d.ts +23 -10
  59. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -1
  60. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -2
  61. package/dist/plugin/hooks/create-transform-hooks.d.ts +0 -2
  62. package/dist/plugin/stop-continuation.d.ts +2 -2
  63. package/dist/shared/omo-process-sweep.d.ts +18 -0
  64. package/dist/shared/system-directive.d.ts +0 -1
  65. package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
  66. package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
  67. package/dist/skills/ulw-plan/SKILL.md +31 -8
  68. package/dist/skills/ulw-plan/references/full-workflow.md +117 -6
  69. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  70. package/dist/skills/ulw-research/SKILL.md +3 -3
  71. package/dist/testing/create-plugin-module.d.ts +1 -0
  72. package/dist/tools/delegate-task/types.d.ts +0 -1
  73. package/dist/tui.js +138 -80
  74. package/package.json +14 -14
  75. package/packages/git-bash-mcp/dist/cli.js +54 -8
  76. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +60 -0
  77. package/packages/lsp-core/src/lsp/client.ts +14 -1
  78. package/packages/lsp-core/src/lsp/fixtures/diagnostics-freshness-contract-probe.ts +2 -2
  79. package/packages/lsp-core/src/mcp.ts +9 -0
  80. package/packages/lsp-daemon/dist/cli.js +319 -51
  81. package/packages/lsp-daemon/dist/client.js +136 -48
  82. package/packages/lsp-daemon/dist/daemon-client.d.ts +0 -10
  83. package/packages/lsp-daemon/dist/daemon-client.js +4 -34
  84. package/packages/lsp-daemon/dist/daemon-failure-result.d.ts +3 -0
  85. package/packages/lsp-daemon/dist/daemon-failure-result.js +38 -0
  86. package/packages/lsp-daemon/dist/daemon-request-error.d.ts +14 -0
  87. package/packages/lsp-daemon/dist/daemon-request-error.js +26 -0
  88. package/packages/lsp-daemon/dist/daemon-server.js +5 -1
  89. package/packages/lsp-daemon/dist/index.js +137 -48
  90. package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
  91. package/packages/lsp-daemon/dist/proxy.js +1 -0
  92. package/packages/lsp-daemon/dist/version-reap.d.ts +26 -0
  93. package/packages/lsp-daemon/dist/version-reap.js +182 -0
  94. package/packages/lsp-tools-mcp/dist/cli.js +61 -10
  95. package/packages/lsp-tools-mcp/dist/lsp/manager.js +6 -1
  96. package/packages/lsp-tools-mcp/dist/mcp.js +61 -10
  97. package/packages/lsp-tools-mcp/dist/tools.js +6 -1
  98. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  99. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +416 -25
  100. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  101. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  102. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +22 -2
  103. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +7 -6
  104. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +638 -267
  105. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +178 -89
  106. package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
  107. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
  108. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +3 -1
  109. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +98 -32
  110. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +5 -0
  111. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +15 -6
  112. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +6 -2
  113. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +1 -0
  114. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +1 -1
  115. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +148 -0
  116. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +31 -2
  117. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +1 -1
  118. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +65 -1
  119. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +3 -7
  120. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +1 -1
  121. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +57 -3
  122. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +41 -0
  123. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +109 -8
  124. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +2 -2
  125. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +43 -0
  126. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  127. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  128. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  129. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  130. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  131. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  132. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +1 -0
  133. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  134. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +80 -40
  135. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  136. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  137. package/packages/omo-codex/plugin/components/rules/dist/cli.js +11 -0
  138. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  139. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  140. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +11 -0
  141. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +60 -0
  142. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +8 -0
  143. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +147 -60
  144. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  145. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  146. package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +3 -71
  147. package/packages/omo-codex/plugin/components/start-work-continuation/src/plan-checklist.ts +171 -0
  148. package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +198 -23
  149. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +4 -3
  150. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +6 -5
  151. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-scaffold.md +15 -0
  152. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  153. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  154. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  155. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  156. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -10
  157. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +2 -2
  158. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
  159. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  160. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  161. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +2 -2
  162. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +3 -3
  163. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  164. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
  165. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  166. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  167. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +31 -8
  168. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +117 -6
  169. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  170. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
  171. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +42 -0
  172. package/packages/omo-codex/plugin/components/ulw-loop/README.md +6 -4
  173. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.d.ts +21 -0
  174. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +64 -0
  175. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +15 -2
  176. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +1 -1
  177. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +2 -1
  178. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  179. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +3 -3
  180. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +3 -0
  181. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +85 -0
  182. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +0 -1
  183. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -33
  184. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +998 -593
  185. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +1 -0
  186. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -1
  187. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +2 -0
  188. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +6 -0
  189. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +1 -0
  190. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +3 -0
  191. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +1 -0
  192. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +4 -0
  193. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  194. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +10 -2
  195. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +1 -1
  196. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.d.ts +15 -0
  197. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +84 -0
  198. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +5 -0
  199. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +81 -0
  200. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +7 -59
  201. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +12 -4
  202. package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.d.ts +9 -0
  203. package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.js +122 -0
  204. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  205. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  206. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -6
  207. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +84 -0
  208. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +13 -2
  209. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +1 -1
  210. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +1 -1
  211. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +3 -3
  212. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +49 -0
  213. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +13 -45
  214. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -0
  215. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +2 -0
  216. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +7 -0
  217. package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +4 -0
  218. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +4 -1
  219. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +20 -2
  220. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +1 -1
  221. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +125 -0
  222. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +59 -0
  223. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +6 -58
  224. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +12 -4
  225. package/packages/omo-codex/plugin/components/ulw-loop/src/validation-batch.ts +122 -0
  226. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +76 -0
  227. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +111 -0
  228. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +67 -0
  229. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +57 -0
  230. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +1 -0
  231. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +152 -0
  232. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +29 -0
  233. package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch-checkpoint.test.ts +147 -0
  234. package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch.test.ts +73 -0
  235. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  236. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  237. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  238. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  239. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  240. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  241. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  242. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  243. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  244. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  245. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  246. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -2
  247. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  248. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -2
  249. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  250. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -2
  251. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  252. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  253. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  254. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  255. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  256. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  257. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  258. package/packages/omo-codex/plugin/package-lock.json +41 -41
  259. package/packages/omo-codex/plugin/package.json +1 -1
  260. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +32 -28
  261. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +17 -45
  262. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +455 -0
  263. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +3 -18
  264. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +43 -0
  265. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
  266. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -6
  267. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +31 -8
  268. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +117 -6
  269. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  270. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +11 -11
  271. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +26 -0
  272. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +41 -0
  273. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +2 -2
  274. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +6 -6
  275. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +3 -3
  276. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +62 -0
  277. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +271 -14
  278. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +3 -18
  279. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +0 -5
  280. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +293 -0
  281. package/packages/omo-codex/scripts/install-config.test.mjs +10 -10
  282. package/packages/omo-codex/scripts/install-dist/install-local.mjs +401 -22
  283. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +39 -2
  284. package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +4 -1
  285. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
  286. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
  287. package/packages/shared-skills/skills/ulw-plan/SKILL.md +31 -8
  288. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +117 -6
  289. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  290. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
  291. package/dist/features/builtin-commands/templates/ralph-loop.d.ts +0 -3
  292. package/dist/skills/ultraresearch/SKILL.md +0 -10
  293. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +0 -273
  294. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -12
  295. package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -107
  296. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +0 -128
  297. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +0 -11
  298. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +0 -268
  299. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +0 -11
  300. package/packages/shared-skills/skills/ultraresearch/SKILL.md +0 -10
  301. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/SKILL.md +0 -0
  302. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -0
  303. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -0
  304. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/SKILL.md +0 -0
  305. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/agents/openai.yaml +0 -0
  306. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/SKILL.md +0 -0
  307. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/agents/openai.yaml +0 -0
@@ -47,7 +47,7 @@ describe("runCodegraphServe MCP unavailable facade", () => {
47
47
  result: {
48
48
  capabilities: { tools: { listChanged: false } },
49
49
  protocolVersion: "2025-06-18",
50
- serverInfo: { name: "codegraph", version: "1.0.1" },
50
+ serverInfo: { name: "codegraph", version: "1.4.1" },
51
51
  },
52
52
  });
53
53
  });
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { runCodegraphServe } from "../src/serve.ts";
5
5
 
6
6
  describe("runCodegraphServe provisioning", () => {
7
- it("#given CodeGraph is unresolved #when serving MCP #then provisions CodeGraph before spawning", async () => {
7
+ it("#given CodeGraph is unresolved and daemon is off by default #when serving MCP #then provisions CodeGraph before spawning with CODEGRAPH_NO_DAEMON=1", async () => {
8
8
  // given
9
9
  const binPath = join("/tmp/home/.omo/codegraph", "bin", "codegraph");
10
10
  const calls: Array<{
@@ -20,7 +20,6 @@ describe("runCodegraphServe provisioning", () => {
20
20
  env: { PATH: "/bin" },
21
21
  homeDir: "/tmp/home",
22
22
  nodeVersion: "22.14.0",
23
- buildEnv: () => ({}),
24
23
  resolve: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
25
24
  ensureProvisioned: (options) =>
26
25
  Promise.resolve({
@@ -41,8 +40,63 @@ describe("runCodegraphServe provisioning", () => {
41
40
  {
42
41
  args: ["serve", "--mcp"],
43
42
  command: binPath,
44
- env: { CODEGRAPH_NO_DAEMON: "1", PATH: "/bin" },
43
+ env: {
44
+ CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
45
+ CODEGRAPH_NO_DAEMON: "1",
46
+ CODEGRAPH_NO_DOWNLOAD: "1",
47
+ CODEGRAPH_TELEMETRY: "0",
48
+ DO_NOT_TRACK: "1",
49
+ PATH: "/bin",
50
+ },
45
51
  },
46
52
  ]);
47
53
  });
54
+
55
+ it("#given CodeGraph is unresolved and codegraph.daemon=true #when serving MCP #then provisions CodeGraph and omits CODEGRAPH_NO_DAEMON so the daemon may run", async () => {
56
+ // given
57
+ const binPath = join("/tmp/home/.omo/codegraph", "bin", "codegraph");
58
+ const calls: Array<{
59
+ readonly args: readonly string[];
60
+ readonly command: string;
61
+ readonly env: Record<string, string | undefined>;
62
+ }> = [];
63
+ const stderr: string[] = [];
64
+
65
+ // when
66
+ const exitCode = await runCodegraphServe({
67
+ config: { codegraph: { daemon: true, enabled: true }, sources: [], warnings: [] },
68
+ env: { PATH: "/bin" },
69
+ homeDir: "/tmp/home",
70
+ nodeVersion: "22.14.0",
71
+ resolve: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
72
+ ensureProvisioned: (options) =>
73
+ Promise.resolve({
74
+ binPath: join(options.installDir ?? "/tmp/home/.omo/codegraph", "bin", "codegraph"),
75
+ provisioned: true,
76
+ }),
77
+ runProcess: (command, args, options) => {
78
+ calls.push({ args, command, env: options.env });
79
+ return Promise.resolve(0);
80
+ },
81
+ stderr: { write: (chunk: string) => stderr.push(chunk) },
82
+ });
83
+
84
+ // then
85
+ expect(exitCode).toBe(0);
86
+ expect(stderr).toEqual([]);
87
+ expect(calls).toEqual([
88
+ {
89
+ args: ["serve", "--mcp"],
90
+ command: binPath,
91
+ env: {
92
+ CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
93
+ CODEGRAPH_NO_DOWNLOAD: "1",
94
+ CODEGRAPH_TELEMETRY: "0",
95
+ DO_NOT_TRACK: "1",
96
+ PATH: "/bin",
97
+ },
98
+ },
99
+ ]);
100
+ expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
101
+ });
48
102
  });
@@ -122,6 +122,47 @@ describe("runCodegraphServe unavailable CodeGraph paths", () => {
122
122
  rmSync(workspace, { recursive: true, force: true });
123
123
  }
124
124
  });
125
+
126
+ it("#given the unavailable facade with held-open stdio and a dead parent #when the watchdog polls #then the placeholder server settles without waiting for stdin EOF", async () => {
127
+ // given
128
+ // win32: the real-timer watchdog + PassThrough.destroy() teardown race leaves
129
+ // the read loop's async iterator pending on Windows, so this held-open-stdin
130
+ // case cannot settle under bun:test (which has no fake timers). The watchdog
131
+ // settle path IS covered deterministically by mcp-stdio-core's fake-timer test
132
+ // (passes on win32) and by real-process QA (task-13-*); production settles via
133
+ // stdin EOF, exercised by the other tests in this file that run on win32.
134
+ if (process.platform === "win32") return;
135
+ // Client stdio is held open and never sees EOF, so the parent-liveness
136
+ // watchdog is the only settle path for the placeholder server.
137
+ const stdin = new PassThrough();
138
+ const stdout = new PassThrough();
139
+ stdout.resume();
140
+ const stderr: string[] = [];
141
+
142
+ try {
143
+ // when
144
+ const exitCode = await runCodegraphServe({
145
+ config: { codegraph: { enabled: false }, sources: [], warnings: [] },
146
+ env: {},
147
+ stdin,
148
+ stdout,
149
+ stderr: { write: (chunk: string) => stderr.push(chunk) },
150
+ parentWatchdog: { pollIntervalMs: 10, probeAlive: () => false },
151
+ });
152
+
153
+ // then
154
+ expect(exitCode).toBe(0);
155
+ expect(stderr).toEqual([
156
+ "CodeGraph MCP skipped: disabled by OMO SOT config. Set [codex].codegraph.enabled=true to enable it.\n",
157
+ ]);
158
+ } finally {
159
+ // The held-open streams are never ended by the test; destroy them so the
160
+ // bun test runner's event loop can drain and exit (an undestroyed
161
+ // PassThrough keeps the process alive on win32 and hangs the suite).
162
+ stdin.destroy();
163
+ stdout.destroy();
164
+ }
165
+ });
125
166
  });
126
167
 
127
168
  function closedMcpStdio(): { readonly stdin: PassThrough; readonly stdout: PassThrough } {
@@ -27,12 +27,6 @@ describe("runCodegraphServe", () => {
27
27
  env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
28
28
  nodeVersion: "22.14.0",
29
29
  homeDir: "/tmp/home",
30
- buildEnv: ({ homeDir }) => ({
31
- CODEGRAPH_INSTALL_DIR: `${homeDir}/.omo/codegraph`,
32
- CODEGRAPH_NO_DOWNLOAD: "1",
33
- CODEGRAPH_TELEMETRY: "0",
34
- DO_NOT_TRACK: "1",
35
- }),
36
30
  resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
37
31
  runProcess: (
38
32
  command: string,
@@ -53,7 +47,7 @@ describe("runCodegraphServe", () => {
53
47
  command: "node",
54
48
  cwd: resolve(runCwd),
55
49
  env: {
56
- CODEGRAPH_INSTALL_DIR: "/tmp/home/.omo/codegraph",
50
+ CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
57
51
  CODEGRAPH_NO_DAEMON: "1",
58
52
  CODEGRAPH_NO_DOWNLOAD: "1",
59
53
  CODEGRAPH_TELEMETRY: "0",
@@ -67,6 +61,58 @@ describe("runCodegraphServe", () => {
67
61
  expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
68
62
  });
69
63
 
64
+ it("#given codegraph.daemon=true #when serving MCP #then CODEGRAPH_NO_DAEMON is omitted so the daemon may run", async () => {
65
+ // given
66
+ const runCwd = componentRoot;
67
+ const calls: Array<{
68
+ readonly args: readonly string[];
69
+ readonly command: string;
70
+ readonly cwd: string;
71
+ readonly env: Record<string, string | undefined>;
72
+ readonly stdio: "pipe";
73
+ }> = [];
74
+
75
+ // when
76
+ const exitCode = await runCodegraphServe({
77
+ config: { codegraph: { daemon: true, enabled: true }, sources: [], warnings: [] },
78
+ cwd: runCwd,
79
+ env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
80
+ nodeVersion: "22.14.0",
81
+ homeDir: "/tmp/home",
82
+ resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
83
+ runProcess: (
84
+ command: string,
85
+ args: readonly string[],
86
+ options: { readonly cwd: string; readonly env: Record<string, string | undefined>; readonly stdio: "pipe" },
87
+ ) => {
88
+ calls.push({ args, command, cwd: options.cwd, env: options.env, stdio: options.stdio });
89
+ return Promise.resolve(7);
90
+ },
91
+ stderr: { write: () => undefined },
92
+ });
93
+
94
+ // then
95
+ expect(exitCode).toBe(7);
96
+ expect(calls).toEqual([
97
+ {
98
+ args: ["shim.js", "serve", "--mcp"],
99
+ command: "node",
100
+ cwd: resolve(runCwd),
101
+ env: {
102
+ CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
103
+ CODEGRAPH_NO_DOWNLOAD: "1",
104
+ CODEGRAPH_TELEMETRY: "0",
105
+ DO_NOT_TRACK: "1",
106
+ HOME: "/tmp/home",
107
+ },
108
+ stdio: "pipe",
109
+ },
110
+ ]);
111
+ expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
112
+ expect(calls[0]?.env["CUSTOM"]).toBeUndefined();
113
+ expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
114
+ });
115
+
70
116
  it("#given an unsupported local Node but the unsafe override is set #when serving MCP #then it still spawns codegraph", async () => {
71
117
  // given
72
118
  const spawned: string[] = [];
@@ -136,7 +182,7 @@ describe("runCodegraphServe", () => {
136
182
  expect(spawned).toEqual([{ args: ["serve", "--mcp"], command: commandPath }]);
137
183
  });
138
184
 
139
- it("#given Windows Codex SOT install_dir has codegraph.cmd #when serving MCP #then it resolves there and exports CODEGRAPH_INSTALL_DIR", async () => {
185
+ it("#given Windows Codex SOT install_dir has codegraph.cmd and daemon is off by default #when serving MCP #then it resolves there, exports CODEGRAPH_INSTALL_DIR, and pins CODEGRAPH_NO_DAEMON=1", async () => {
140
186
  await withProcessPlatform("win32", async () => {
141
187
  // given
142
188
  const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-"));
@@ -191,6 +237,61 @@ describe("runCodegraphServe", () => {
191
237
  });
192
238
  });
193
239
 
240
+ it("#given Windows Codex SOT install_dir with codegraph.daemon=true #when serving MCP #then CODEGRAPH_NO_DAEMON is omitted so the daemon may run", async () => {
241
+ await withProcessPlatform("win32", async () => {
242
+ // given
243
+ const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-daemon-"));
244
+ const installDir = join(tempRoot, "custom-codegraph");
245
+ const binPath = join(installDir, "bin", "codegraph.cmd");
246
+ const calls: Array<{
247
+ readonly args: readonly string[];
248
+ readonly command: string;
249
+ readonly env: Record<string, string | undefined>;
250
+ }> = [];
251
+
252
+ try {
253
+ mkdirSync(join(installDir, "bin"), { recursive: true });
254
+ writeFileSync(binPath, "");
255
+
256
+ // when
257
+ const exitCode = await runCodegraphServe({
258
+ config: { codegraph: { daemon: true, enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
259
+ env: { HOME: "/tmp/home" },
260
+ nodeVersion: "22.14.0",
261
+ homeDir: "/tmp/home",
262
+ resolve: (options) => {
263
+ const provisioned = options.provisioned?.();
264
+ return { argsPrefix: [], command: provisioned ?? "missing", exists: provisioned !== null && provisioned !== undefined, source: "provisioned" };
265
+ },
266
+ runProcess: (command, args, options) => {
267
+ calls.push({ args, command, env: options.env });
268
+ return Promise.resolve(0);
269
+ },
270
+ stderr: { write: () => undefined },
271
+ });
272
+
273
+ // then
274
+ expect(exitCode).toBe(0);
275
+ expect(calls).toEqual([
276
+ {
277
+ args: ["serve", "--mcp"],
278
+ command: binPath,
279
+ env: {
280
+ CODEGRAPH_INSTALL_DIR: installDir,
281
+ CODEGRAPH_NO_DOWNLOAD: "1",
282
+ CODEGRAPH_TELEMETRY: "0",
283
+ DO_NOT_TRACK: "1",
284
+ HOME: "/tmp/home",
285
+ },
286
+ },
287
+ ]);
288
+ expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
289
+ } finally {
290
+ rmSync(tempRoot, { recursive: true, force: true });
291
+ }
292
+ });
293
+ });
294
+
194
295
  it("#given project cwd is under a configured excluded root #when serving MCP #then it exposes an unavailable stub without spawning CodeGraph", async () => {
195
296
  // given
196
297
  const excludedRoot = mkdtempSync(join(componentRoot, ".tmp-codegraph-excluded-"));
@@ -52,7 +52,7 @@ describe("CodeGraph SessionStart worker Node support", () => {
52
52
  const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-provision-home-"));
53
53
  const binPath = join(homeDir, ".omo", "codegraph", "bin", "codegraph");
54
54
  const calls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
55
- const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.0.1" }> = [];
55
+ const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.4.1" }> = [];
56
56
  const outcomes: unknown[] = [];
57
57
 
58
58
  try {
@@ -90,7 +90,7 @@ describe("CodeGraph SessionStart worker Node support", () => {
90
90
  { args: ["init"], command: binPath },
91
91
  ]);
92
92
  expect(provisionCalls).toEqual([
93
- { installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.0.1" },
93
+ { installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.4.1" },
94
94
  ]);
95
95
  expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "provisioned", timedOut: false }]);
96
96
  } finally {
@@ -152,6 +152,49 @@ describe("CodeGraph SessionStart worker flow", () => {
152
152
  }
153
153
  });
154
154
 
155
+ it("#given codegraph.daemon=true #when the indexing worker runs #then its env stays daemon-less with CODEGRAPH_NO_DAEMON=1", async () => {
156
+ // given
157
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-daemon-"));
158
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-daemon-home-"));
159
+ const calls: { readonly args: readonly string[]; readonly command: string; readonly env: Record<string, string> }[] = [];
160
+ try {
161
+ // when
162
+ const result = await runCodegraphSessionStartWorker({
163
+ config: { codegraph: { daemon: true, enabled: true, install_dir: "/tmp/codegraph-install" }, sources: [], trustedCodegraphInstallDir: "/tmp/codegraph-install", warnings: [] },
164
+ nodeVersion: "22.14.0",
165
+ cwd: workspace,
166
+ env: { HOME: homeDir },
167
+ logOutcome: () => undefined,
168
+ deps: {
169
+ ensureGitignored: () => true,
170
+ ensureProvisioned: () => Promise.resolve({ binPath: "/tmp/codegraph", provisioned: true }),
171
+ prepareWorkspace: () => ({
172
+ dataDir: join(homeDir, ".omo/codegraph/projects/test"),
173
+ dataRoot: join(homeDir, ".omo/codegraph"),
174
+ linked: true,
175
+ mode: "global-linked",
176
+ projectLink: join(workspace, ".codegraph"),
177
+ }),
178
+ resolveCommand: () => ({ argsPrefix: [], command: "/tmp/codegraph", exists: true, source: "path" }),
179
+ runCommand: (_projectRoot, command, args, options) => {
180
+ calls.push({ args, command, env: options.env });
181
+ return Promise.resolve({ exitCode: 0, stdout: calls.length === 1 ? '{"initialized":true}' : "", timedOut: false });
182
+ },
183
+ },
184
+ });
185
+
186
+ // then
187
+ expect(result).toEqual({ action: "synced" });
188
+ expect(calls.length).toBeGreaterThan(0);
189
+ for (const call of calls) {
190
+ expect(call.env["CODEGRAPH_NO_DAEMON"]).toBe("1");
191
+ }
192
+ } finally {
193
+ rmSync(workspace, { recursive: true, force: true });
194
+ rmSync(homeDir, { recursive: true, force: true });
195
+ }
196
+ });
197
+
155
198
  it("#given ambient provider tokens #when default worker runner spawns CodeGraph #then child env only gets safe and controlled variables", async () => {
156
199
  // given
157
200
  const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-env-"));
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.18.2) Checking Comments"
11
+ "statusMessage": "(OmO 4.19.1) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.18.2",
3
+ "version": "4.19.1",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 4.18.2) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.19.1) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 4.18.2) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.19.1) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.18.2",
3
+ "version": "4.19.1",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 4.18.2) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.19.1) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.18.2",
3
+ "version": "4.19.1",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -22,4 +22,5 @@ Conventions for humans and agents working on this repository.
22
22
  - LSP server processes are owned by `LspManager`.
23
23
  - Tool execution acquires clients through `withLspClient(...)` unless it only reports static status.
24
24
  - `lsp.rename` mutates files by applying workspace edits; keep it sequential at the MCP caller level.
25
+ - `.mcp.json` sets `lsp` MCP server `startup_timeout_sec: 10` to bound startup; preserve the bound on edits.
25
26
  - Do not add pi-coding-agent or omo source dependencies. This package is standalone.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "4.18.2",
4
- "inputDigest": "sha256:5f242410eb12245b588135e29137ee9e7a0fdb2346469bdfdb75727b2abaf248",
3
+ "version": "4.19.1",
4
+ "inputDigest": "sha256:b64d94982c0d046c8e6ab9bf7628f1f18be57ac6418179257b2fda95228dc38a",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "cli.js",
12
- "sha256": "e92c3fee5795bf44de9504b0e85c2be208c78a31e966ec9a7a807d621431c74a"
12
+ "sha256": "f46b15e830f85d0d6f46e0b36c726de2fd56adc43b1cd4660430db86352a8f37"
13
13
  },
14
14
  {
15
15
  "path": "codex-hook-cli.d.ts",
@@ -212,6 +212,78 @@ function errorCode(error) {
212
212
  function isPlainRecord(value) {
213
213
  return typeof value === "object" && value !== null && !Array.isArray(value);
214
214
  }
215
+
216
+ class DaemonRequestError extends Error {
217
+ requestWritten;
218
+ constructor(message, requestWritten) {
219
+ super(message);
220
+ this.name = "DaemonRequestError";
221
+ this.requestWritten = requestWritten;
222
+ }
223
+ }
224
+
225
+ class DaemonAuthenticationRejectedError extends DaemonRequestError {
226
+ constructor() {
227
+ super("daemon authentication failed before dispatch", true);
228
+ this.name = "DaemonAuthenticationRejectedError";
229
+ }
230
+ }
231
+
232
+ class DaemonRequestCancelledError extends DaemonRequestError {
233
+ constructor(requestWritten) {
234
+ super("daemon request cancelled", requestWritten);
235
+ this.name = "DaemonRequestCancelledError";
236
+ }
237
+ }
238
+
239
+ class DaemonRequestTimedOutError extends DaemonRequestError {
240
+ timeoutMs;
241
+ constructor(requestWritten, timeoutMs) {
242
+ super("daemon request timed out", requestWritten);
243
+ this.name = "DaemonRequestTimedOutError";
244
+ this.timeoutMs = timeoutMs;
245
+ }
246
+ }
247
+ function daemonFailureResult(paths, error) {
248
+ if (error instanceof DaemonRequestCancelledError)
249
+ return daemonCancelledResult(paths);
250
+ if (error instanceof DaemonRequestTimedOutError)
251
+ return daemonTimedOutResult(paths, error.timeoutMs);
252
+ return daemonUnreachableResult(paths, error);
253
+ }
254
+ function daemonCancelledResult(paths) {
255
+ const text = [
256
+ "LSP daemon request cancelled: the caller aborted this request (for example, the turn was interrupted).",
257
+ "The daemon stays available; no LSP work was applied. Retry when you are ready.",
258
+ `Socket: ${paths.socket}`
259
+ ].join(`
260
+ `);
261
+ return { content: [{ type: "text", text }], isError: true };
262
+ }
263
+ function daemonTimedOutResult(paths, timeoutMs) {
264
+ const text = [
265
+ `LSP daemon request timed out after ${timeoutMs}ms: the daemon did not respond in time.`,
266
+ "The daemon stays available but may be busy. Retry when you are ready.",
267
+ `Socket: ${paths.socket}`,
268
+ `Logs: ${paths.log}`
269
+ ].join(`
270
+ `);
271
+ return { content: [{ type: "text", text }], isError: true };
272
+ }
273
+ function daemonUnreachableResult(paths, error) {
274
+ const text = [
275
+ `LSP daemon unreachable: ${errorText(error)}.`,
276
+ "The MCP server is a thin proxy and never runs language servers in-process.",
277
+ `Socket: ${paths.socket}`,
278
+ `Logs: ${paths.log}`,
279
+ "The daemon is auto-started on demand and will be retried on the next request."
280
+ ].join(`
281
+ `);
282
+ return { content: [{ type: "text", text }], isError: true };
283
+ }
284
+ function errorText(error) {
285
+ return error instanceof Error ? error.message : String(error);
286
+ }
215
287
  var OMO_DAEMON_PROTOCOL_VERSION = 1;
216
288
  var AUTH_ERROR_CODE = -32001;
217
289
  function authEnvelope(token) {
@@ -3134,8 +3206,13 @@ class LspClient extends LspClientConnection {
3134
3206
  if (!pushFallbackOnly)
3135
3207
  continue;
3136
3208
  const remainingMs = deadlineAt - Date.now();
3137
- if (remainingMs <= 0)
3209
+ if (remainingMs <= 0) {
3210
+ if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
3211
+ const cached = this.documents.getPullCache(snapshot);
3212
+ return { items: cached === null ? [] : [...cached.diagnostics] };
3213
+ }
3138
3214
  return this.freshnessTimeout(absPath);
3215
+ }
3139
3216
  const waitMs = push.status === "wait" ? Math.min(push.waitMs, remainingMs) : remainingMs;
3140
3217
  await waitForDiagnosticsActivity(this.documents.waitForDiagnosticsActivity(snapshot, waitMs), signal);
3141
3218
  }
@@ -4995,29 +5072,6 @@ var LSP_MCP_TOOLS = [
4995
5072
  var CONTEXT_KEY = "_context";
4996
5073
  var DEFAULT_REQUEST_TIMEOUT_MS = 30000;
4997
5074
  var nextProxyRequestId = 1;
4998
-
4999
- class DaemonRequestError extends Error {
5000
- requestWritten;
5001
- constructor(message, requestWritten) {
5002
- super(message);
5003
- this.name = "DaemonRequestError";
5004
- this.requestWritten = requestWritten;
5005
- }
5006
- }
5007
-
5008
- class DaemonAuthenticationRejectedError extends DaemonRequestError {
5009
- constructor() {
5010
- super("daemon authentication failed before dispatch", true);
5011
- this.name = "DaemonAuthenticationRejectedError";
5012
- }
5013
- }
5014
-
5015
- class DaemonRequestCancelledError extends DaemonRequestError {
5016
- constructor(requestWritten) {
5017
- super("daemon request cancelled", requestWritten);
5018
- this.name = "DaemonRequestCancelledError";
5019
- }
5020
- }
5021
5075
  async function callToolViaDaemon(name, args, options) {
5022
5076
  const context = requireContext(options.context);
5023
5077
  const paths = options.paths ?? daemonPaths();
@@ -5046,7 +5100,7 @@ async function callToolViaDaemon(name, args, options) {
5046
5100
  break;
5047
5101
  }
5048
5102
  }
5049
- return daemonUnreachableResult(paths, lastError);
5103
+ return daemonFailureResult(paths, lastError);
5050
5104
  }
5051
5105
  function callDiagnosticsViaDaemon(filePath, options) {
5052
5106
  return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
@@ -5080,17 +5134,6 @@ function ensureDaemonAvailable(paths, ensure, signal) {
5080
5134
  Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve9()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
5081
5135
  });
5082
5136
  }
5083
- function daemonUnreachableResult(paths, error) {
5084
- const text2 = [
5085
- `LSP daemon unreachable: ${errorText(error)}.`,
5086
- "The MCP server is a thin proxy and never runs language servers in-process.",
5087
- `Socket: ${paths.socket}`,
5088
- `Logs: ${paths.log}`,
5089
- "The daemon is auto-started on demand and will be retried on the next request."
5090
- ].join(`
5091
- `);
5092
- return { content: [{ type: "text", text: text2 }], isError: true };
5093
- }
5094
5137
  function sendToolCall(paths, token, name, args, options) {
5095
5138
  return new Promise((resolve9, reject) => {
5096
5139
  const socket = connect(paths.socket);
@@ -5130,7 +5173,7 @@ function sendToolCall(paths, token, name, args, options) {
5130
5173
  };
5131
5174
  const timer = setTimeout(() => {
5132
5175
  sendCancel();
5133
- finish(() => reject(new DaemonRequestError("daemon request timed out", requestWritten)));
5176
+ finish(() => reject(new DaemonRequestTimedOutError(requestWritten, options.timeoutMs)));
5134
5177
  }, options.timeoutMs);
5135
5178
  timer.unref();
5136
5179
  if (options.signal?.aborted) {
@@ -5189,9 +5232,6 @@ function allocateProxyRequestId() {
5189
5232
  function isRetryableTool(name) {
5190
5233
  return name !== "rename" && name !== "lsp_rename";
5191
5234
  }
5192
- function errorText(error) {
5193
- return error instanceof Error ? error.message : String(error);
5194
- }
5195
5235
  var OMO_LSP_DAEMON_CLI2 = "OMO_LSP_DAEMON_CLI";
5196
5236
  var OMO_LSP_DAEMON_VERSION2 = "OMO_LSP_DAEMON_VERSION";
5197
5237
  var DAEMON_VERSION_PATTERN2 = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 4.18.2) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.19.1) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 4.18.2) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.19.1) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.18.2",
3
+ "version": "4.19.1",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -3854,6 +3854,17 @@ var POST_COMPACT_MIN_RESERVED_TOKENS = 8000;
3854
3854
  var POST_COMPACT_MIN_GUIDE_CHARS = 500;
3855
3855
  var FALLBACK_CONTEXT_WINDOW_TOKENS = 200000;
3856
3856
  var MODEL_CONTEXT_BUDGETS = [
3857
+ { slug: "gpt-5.6-sol", contextWindowTokens: 372000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
3858
+ {
3859
+ slug: "gpt-5.6-terra",
3860
+ contextWindowTokens: 372000,
3861
+ effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
3862
+ },
3863
+ {
3864
+ slug: "gpt-5.6-luna",
3865
+ contextWindowTokens: 372000,
3866
+ effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
3867
+ },
3857
3868
  { slug: "gpt-5.5", contextWindowTokens: 272000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
3858
3869
  { slug: "gpt-5.4-mini", contextWindowTokens: 272000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
3859
3870
  {