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
@@ -2146,7 +2146,7 @@ var package_default;
2146
2146
  var init_package = __esm(() => {
2147
2147
  package_default = {
2148
2148
  name: "oh-my-opencode",
2149
- version: "4.18.2",
2149
+ version: "4.19.1",
2150
2150
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2151
2151
  main: "./dist/index.js",
2152
2152
  types: "dist/index.d.ts",
@@ -2256,7 +2256,7 @@ var init_package = __esm(() => {
2256
2256
  "install:codex-dev": "bun run script/build-codex-install.ts && bun run script/install-codex-dev.ts",
2257
2257
  "build:codex-plugin": "npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build",
2258
2258
  "build:senpi-plugin": "bun run build:lsp-daemon && bun run build:senpi-plugin:stage",
2259
- "build:senpi-plugin:stage": "node packages/omo-senpi/plugin/scripts/stage-lsp-daemon-runtime.mjs && node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && node packages/omo-senpi/plugin/scripts/build-install.mjs",
2259
+ "build:senpi-plugin:stage": "bun run build:materialize-frontend && node packages/omo-senpi/plugin/scripts/stage-lsp-daemon-runtime.mjs && node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && node packages/omo-senpi/plugin/scripts/build-install.mjs",
2260
2260
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
2261
2261
  "build:shared-skills-assets": "bun run build:materialize-frontend && rm -rf dist/skills && cp -R packages/shared-skills/skills dist/skills",
2262
2262
  "build:lsp-tools-mcp": "npm --prefix packages/lsp-tools-mcp ci && npm --prefix packages/lsp-tools-mcp run build",
@@ -2358,18 +2358,18 @@ var init_package = __esm(() => {
2358
2358
  typescript: "^6.0.3"
2359
2359
  },
2360
2360
  optionalDependencies: {
2361
- "oh-my-opencode-darwin-arm64": "4.18.2",
2362
- "oh-my-opencode-darwin-x64": "4.18.2",
2363
- "oh-my-opencode-darwin-x64-baseline": "4.18.2",
2364
- "oh-my-opencode-linux-arm64": "4.18.2",
2365
- "oh-my-opencode-linux-arm64-musl": "4.18.2",
2366
- "oh-my-opencode-linux-x64": "4.18.2",
2367
- "oh-my-opencode-linux-x64-baseline": "4.18.2",
2368
- "oh-my-opencode-linux-x64-musl": "4.18.2",
2369
- "oh-my-opencode-linux-x64-musl-baseline": "4.18.2",
2370
- "oh-my-opencode-windows-arm64": "4.18.2",
2371
- "oh-my-opencode-windows-x64": "4.18.2",
2372
- "oh-my-opencode-windows-x64-baseline": "4.18.2"
2361
+ "oh-my-opencode-darwin-arm64": "4.19.1",
2362
+ "oh-my-opencode-darwin-x64": "4.19.1",
2363
+ "oh-my-opencode-darwin-x64-baseline": "4.19.1",
2364
+ "oh-my-opencode-linux-arm64": "4.19.1",
2365
+ "oh-my-opencode-linux-arm64-musl": "4.19.1",
2366
+ "oh-my-opencode-linux-x64": "4.19.1",
2367
+ "oh-my-opencode-linux-x64-baseline": "4.19.1",
2368
+ "oh-my-opencode-linux-x64-musl": "4.19.1",
2369
+ "oh-my-opencode-linux-x64-musl-baseline": "4.19.1",
2370
+ "oh-my-opencode-windows-arm64": "4.19.1",
2371
+ "oh-my-opencode-windows-x64": "4.19.1",
2372
+ "oh-my-opencode-windows-x64-baseline": "4.19.1"
2373
2373
  },
2374
2374
  overrides: {
2375
2375
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -7427,6 +7427,7 @@ var init_env = __esm(() => {
7427
7427
  SAFE_CODEGRAPH_RUNTIME_ENV_KEYS = new Set([
7428
7428
  "CODEGRAPH_ALLOW_UNSAFE_NODE",
7429
7429
  "CODEGRAPH_BIN",
7430
+ "CODEGRAPH_DAEMON_IDLE_TIMEOUT_MS",
7430
7431
  "CODEGRAPH_FAKE_LOG",
7431
7432
  "CODEGRAPH_NO_DAEMON",
7432
7433
  "CODEGRAPH_NODE_BIN",
@@ -7442,6 +7443,9 @@ var init_workspace = () => {};
7442
7443
  // packages/utils/src/codegraph/guidance.ts
7443
7444
  var init_guidance = () => {};
7444
7445
 
7446
+ // packages/utils/src/codegraph/manifest.ts
7447
+ var init_manifest = () => {};
7448
+
7445
7449
  // packages/utils/src/codegraph/node-support.ts
7446
7450
  function evaluateCodegraphNodeSupport(options = {}) {
7447
7451
  const nodeVersion = options.nodeVersion ?? process.versions.node;
@@ -7570,6 +7574,7 @@ var init_resolve2 = __esm(() => {
7570
7574
  var init_codegraph = __esm(() => {
7571
7575
  init_env();
7572
7576
  init_guidance();
7577
+ init_manifest();
7573
7578
  init_provision();
7574
7579
  init_process_sweep();
7575
7580
  init_resolve2();
@@ -7748,7 +7753,7 @@ function migrateModelVersions(configs, appliedMigrations) {
7748
7753
  var MODEL_VERSION_MAP, CURRENT_USER_SELECTABLE_MODELS;
7749
7754
  var init_model_versions = __esm(() => {
7750
7755
  MODEL_VERSION_MAP = {
7751
- "anthropic/claude-opus-4-4": "anthropic/claude-opus-4-7"
7756
+ "anthropic/claude-opus-4-4": "anthropic/claude-opus-4-8"
7752
7757
  };
7753
7758
  CURRENT_USER_SELECTABLE_MODELS = new Set([
7754
7759
  "anthropic/claude-opus-4-5",
@@ -9196,25 +9201,25 @@ var init_agent_model_requirements = __esm(() => {
9196
9201
  fallbackChain: [
9197
9202
  {
9198
9203
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9199
- model: "claude-opus-4-7",
9204
+ model: "claude-opus-4-8",
9200
9205
  variant: "max"
9201
9206
  },
9202
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9203
- { providers: ["kimi-for-coding"], model: "k2p5" },
9204
9207
  {
9205
9208
  providers: [
9209
+ "opencode-go",
9210
+ "kimi-for-coding",
9211
+ "moonshotai",
9206
9212
  "opencode",
9213
+ "vercel",
9207
9214
  "bailian-coding-plan",
9208
- "moonshotai",
9209
9215
  "moonshotai-cn",
9210
9216
  "firmware",
9211
9217
  "ollama-cloud",
9212
- "aihubmix",
9213
- "vercel"
9218
+ "aihubmix"
9214
9219
  ],
9215
- model: "kimi-k2.5"
9220
+ model: "kimi-k3"
9216
9221
  },
9217
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
9222
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "medium" },
9218
9223
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9219
9224
  { providers: ["opencode"], model: "big-pickle" }
9220
9225
  ],
@@ -9223,13 +9228,8 @@ var init_agent_model_requirements = __esm(() => {
9223
9228
  hephaestus: {
9224
9229
  fallbackChain: [
9225
9230
  {
9226
- providers: ["openai", "github-copilot", "vercel"],
9231
+ providers: ["openai", "github-copilot", "vercel", "opencode"],
9227
9232
  model: "gpt-5.6-sol",
9228
- variant: "high"
9229
- },
9230
- {
9231
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9232
- model: "gpt-5.5",
9233
9233
  variant: "medium"
9234
9234
  }
9235
9235
  ],
@@ -9239,8 +9239,13 @@ var init_agent_model_requirements = __esm(() => {
9239
9239
  oracle: {
9240
9240
  fallbackChain: [
9241
9241
  {
9242
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9243
- model: "gpt-5.5",
9242
+ providers: ["openai", "opencode", "vercel"],
9243
+ model: "gpt-5.6-sol",
9244
+ variant: "xhigh"
9245
+ },
9246
+ {
9247
+ providers: ["github-copilot"],
9248
+ model: "gpt-5.6-sol",
9244
9249
  variant: "high"
9245
9250
  },
9246
9251
  {
@@ -9250,7 +9255,7 @@ var init_agent_model_requirements = __esm(() => {
9250
9255
  },
9251
9256
  {
9252
9257
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9253
- model: "claude-opus-4-7",
9258
+ model: "claude-opus-4-8",
9254
9259
  variant: "max"
9255
9260
  },
9256
9261
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
@@ -9282,8 +9287,8 @@ var init_agent_model_requirements = __esm(() => {
9282
9287
  },
9283
9288
  "multimodal-looker": {
9284
9289
  fallbackChain: [
9285
- { providers: ["openai", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
9286
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9290
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "low" },
9291
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9287
9292
  { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" },
9288
9293
  { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }
9289
9294
  ]
@@ -9292,12 +9297,12 @@ var init_agent_model_requirements = __esm(() => {
9292
9297
  fallbackChain: [
9293
9298
  {
9294
9299
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9295
- model: "claude-opus-4-7",
9300
+ model: "claude-opus-4-8",
9296
9301
  variant: "max"
9297
9302
  },
9298
9303
  {
9299
9304
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9300
- model: "gpt-5.5",
9305
+ model: "gpt-5.6-sol",
9301
9306
  variant: "high"
9302
9307
  },
9303
9308
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
@@ -9315,38 +9320,43 @@ var init_agent_model_requirements = __esm(() => {
9315
9320
  },
9316
9321
  {
9317
9322
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9318
- model: "claude-opus-4-7",
9323
+ model: "claude-opus-4-8",
9319
9324
  variant: "max"
9320
9325
  },
9321
9326
  {
9322
9327
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9323
- model: "gpt-5.5",
9324
- variant: "high"
9328
+ model: "gpt-5.6-sol",
9329
+ variant: "medium"
9325
9330
  },
9326
9331
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9327
- { providers: ["kimi-for-coding"], model: "k2p5" }
9332
+ { providers: ["kimi-for-coding"], model: "kimi-k3" }
9328
9333
  ]
9329
9334
  },
9330
9335
  momus: {
9331
9336
  fallbackChain: [
9332
9337
  {
9333
9338
  providers: ["openai", "vercel"],
9334
- model: "gpt-5.6-sol",
9335
- variant: "xhigh"
9339
+ model: "gpt-5.6-terra",
9340
+ variant: "high"
9336
9341
  },
9337
9342
  {
9338
9343
  providers: ["github-copilot"],
9339
- model: "gpt-5.6-sol",
9344
+ model: "gpt-5.6-terra",
9340
9345
  variant: "high"
9341
9346
  },
9342
9347
  {
9343
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9344
- model: "gpt-5.5",
9348
+ providers: ["openai", "opencode", "vercel"],
9349
+ model: "gpt-5.6-sol",
9345
9350
  variant: "xhigh"
9346
9351
  },
9352
+ {
9353
+ providers: ["github-copilot"],
9354
+ model: "gpt-5.6-sol",
9355
+ variant: "high"
9356
+ },
9347
9357
  {
9348
9358
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9349
- model: "claude-opus-4-7",
9359
+ model: "claude-opus-4-8",
9350
9360
  variant: "max"
9351
9361
  },
9352
9362
  {
@@ -9360,10 +9370,10 @@ var init_agent_model_requirements = __esm(() => {
9360
9370
  atlas: {
9361
9371
  fallbackChain: [
9362
9372
  { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" },
9363
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9373
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9364
9374
  {
9365
9375
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9366
- model: "gpt-5.5",
9376
+ model: "gpt-5.6-sol",
9367
9377
  variant: "medium"
9368
9378
  },
9369
9379
  { providers: ["opencode-go", "vercel"], model: "minimax-m3" },
@@ -9374,10 +9384,10 @@ var init_agent_model_requirements = __esm(() => {
9374
9384
  "sisyphus-junior": {
9375
9385
  fallbackChain: [
9376
9386
  { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" },
9377
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9387
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9378
9388
  {
9379
9389
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9380
- model: "gpt-5.5",
9390
+ model: "gpt-5.6-sol",
9381
9391
  variant: "medium"
9382
9392
  },
9383
9393
  { providers: ["opencode-go", "vercel"], model: "minimax-m3" },
@@ -9403,11 +9413,11 @@ var init_category_model_requirements = __esm(() => {
9403
9413
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9404
9414
  {
9405
9415
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9406
- model: "claude-opus-4-7",
9416
+ model: "claude-opus-4-8",
9407
9417
  variant: "max"
9408
9418
  },
9409
9419
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9410
- { providers: ["kimi-for-coding"], model: "k2p5" }
9420
+ { providers: ["kimi-for-coding"], model: "kimi-k3" }
9411
9421
  ]
9412
9422
  },
9413
9423
  ultrabrain: {
@@ -9424,7 +9434,7 @@ var init_category_model_requirements = __esm(() => {
9424
9434
  },
9425
9435
  {
9426
9436
  providers: ["openai", "opencode", "vercel"],
9427
- model: "gpt-5.5",
9437
+ model: "gpt-5.6-sol",
9428
9438
  variant: "xhigh"
9429
9439
  },
9430
9440
  {
@@ -9434,7 +9444,7 @@ var init_category_model_requirements = __esm(() => {
9434
9444
  },
9435
9445
  {
9436
9446
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9437
- model: "claude-opus-4-7",
9447
+ model: "claude-opus-4-8",
9438
9448
  variant: "max"
9439
9449
  },
9440
9450
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
@@ -9459,12 +9469,12 @@ var init_category_model_requirements = __esm(() => {
9459
9469
  },
9460
9470
  {
9461
9471
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9462
- model: "gpt-5.5",
9472
+ model: "gpt-5.6-sol",
9463
9473
  variant: "medium"
9464
9474
  },
9465
9475
  {
9466
9476
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9467
- model: "claude-opus-4-7",
9477
+ model: "claude-opus-4-8",
9468
9478
  variant: "max"
9469
9479
  },
9470
9480
  {
@@ -9472,7 +9482,7 @@ var init_category_model_requirements = __esm(() => {
9472
9482
  model: "gemini-3.1-pro",
9473
9483
  variant: "high"
9474
9484
  },
9475
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9485
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9476
9486
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
9477
9487
  ]
9478
9488
  },
@@ -9485,11 +9495,11 @@ var init_category_model_requirements = __esm(() => {
9485
9495
  },
9486
9496
  {
9487
9497
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9488
- model: "claude-opus-4-7",
9498
+ model: "claude-opus-4-8",
9489
9499
  variant: "max"
9490
9500
  },
9491
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" },
9492
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9501
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "high" },
9502
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9493
9503
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
9494
9504
  ]
9495
9505
  },
@@ -9531,10 +9541,10 @@ var init_category_model_requirements = __esm(() => {
9531
9541
  },
9532
9542
  {
9533
9543
  providers: ["openai", "opencode", "vercel"],
9534
- model: "gpt-5.5",
9544
+ model: "gpt-5.6-sol",
9535
9545
  variant: "medium"
9536
9546
  },
9537
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9547
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9538
9548
  {
9539
9549
  providers: ["google", "github-copilot", "opencode", "vercel"],
9540
9550
  model: "gemini-3-flash"
@@ -9548,30 +9558,29 @@ var init_category_model_requirements = __esm(() => {
9548
9558
  fallbackChain: [
9549
9559
  {
9550
9560
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9551
- model: "claude-opus-4-7",
9561
+ model: "claude-opus-4-8",
9552
9562
  variant: "max"
9553
9563
  },
9554
9564
  {
9555
9565
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9556
- model: "gpt-5.5",
9566
+ model: "gpt-5.6-sol",
9557
9567
  variant: "high"
9558
9568
  },
9559
9569
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9560
- { providers: ["kimi-for-coding"], model: "k2p5" },
9570
+ { providers: ["kimi-for-coding"], model: "kimi-k3" },
9561
9571
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9562
- { providers: ["opencode", "bailian-coding-plan", "vercel"], model: "kimi-k2.5" },
9563
9572
  {
9564
9573
  providers: [
9565
9574
  "opencode",
9566
9575
  "bailian-coding-plan",
9576
+ "vercel",
9567
9577
  "moonshotai",
9568
9578
  "moonshotai-cn",
9569
9579
  "firmware",
9570
9580
  "ollama-cloud",
9571
- "aihubmix",
9572
- "vercel"
9581
+ "aihubmix"
9573
9582
  ],
9574
- model: "kimi-k2.5"
9583
+ model: "kimi-k3"
9575
9584
  }
9576
9585
  ]
9577
9586
  },
@@ -9581,7 +9590,7 @@ var init_category_model_requirements = __esm(() => {
9581
9590
  providers: ["google", "github-copilot", "opencode", "vercel"],
9582
9591
  model: "gemini-3-flash"
9583
9592
  },
9584
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9593
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9585
9594
  {
9586
9595
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9587
9596
  model: "claude-sonnet-4-6"
@@ -10006,7 +10015,7 @@ var CLAUDE_VERSION_DOT, GEMINI_31_PRO_PREVIEW, GEMINI_3_FLASH_PREVIEW;
10006
10015
  var init_provider_model_id_transform = __esm(() => {
10007
10016
  CLAUDE_VERSION_DOT = /claude-(\w+)-(\d+)-(\d+)/g;
10008
10017
  GEMINI_31_PRO_PREVIEW = /gemini-3\.1-pro(?!-)/g;
10009
- GEMINI_3_FLASH_PREVIEW = /gemini-3-flash(?!-)/g;
10018
+ GEMINI_3_FLASH_PREVIEW = /(?<!antigravity-)gemini-3-flash(?!-)/g;
10010
10019
  });
10011
10020
 
10012
10021
  // packages/model-core/src/known-variants.ts
@@ -10099,6 +10108,21 @@ var init_runtime_fallback_model = () => {};
10099
10108
  var SUPPLEMENTAL_MODEL_CAPABILITIES;
10100
10109
  var init_supplemental_entries = __esm(() => {
10101
10110
  SUPPLEMENTAL_MODEL_CAPABILITIES = {
10111
+ "kimi-k3": {
10112
+ id: "kimi-k3",
10113
+ family: "kimi",
10114
+ reasoning: true,
10115
+ temperature: true,
10116
+ toolCall: true,
10117
+ modalities: {
10118
+ input: ["text", "image", "video"],
10119
+ output: ["text"]
10120
+ },
10121
+ limit: {
10122
+ context: 262144,
10123
+ output: 262144
10124
+ }
10125
+ },
10102
10126
  "kimi-k2.6": {
10103
10127
  id: "kimi-k2.6",
10104
10128
  family: "kimi",
@@ -10786,7 +10810,7 @@ var init_anthropic_categories = __esm(() => {
10786
10810
  ANTHROPIC_CATEGORIES = [
10787
10811
  {
10788
10812
  name: "unspecified-high",
10789
- config: { model: "anthropic/claude-opus-4-7", variant: "max" },
10813
+ config: { model: "anthropic/claude-opus-4-8", variant: "max" },
10790
10814
  description: "Tasks that don't fit other categories, high effort required",
10791
10815
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND
10792
10816
  }
@@ -10944,7 +10968,7 @@ var init_kimi_categories = __esm(() => {
10944
10968
  KIMI_CATEGORIES = [
10945
10969
  {
10946
10970
  name: "writing",
10947
- config: { model: "kimi-for-coding/k2p5" },
10971
+ config: { model: "kimi-for-coding/kimi-k3" },
10948
10972
  description: "Documentation, prose, technical writing",
10949
10973
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
10950
10974
  }
@@ -65173,7 +65197,7 @@ var init_claude_model_mapper = __esm(() => {
65173
65197
  init_model_normalization2();
65174
65198
  CLAUDE_CODE_ALIAS_MAP = new Map([
65175
65199
  ["sonnet", `${ANTHROPIC_PREFIX}claude-sonnet-4-6`],
65176
- ["opus", `${ANTHROPIC_PREFIX}claude-opus-4-7`],
65200
+ ["opus", `${ANTHROPIC_PREFIX}claude-opus-4-8`],
65177
65201
  ["haiku", `${ANTHROPIC_PREFIX}claude-haiku-4-5`]
65178
65202
  ]);
65179
65203
  });
@@ -65980,10 +66004,10 @@ var init_openai_only_model_catalog = __esm(() => {
65980
66004
  librarian: { model: "openai/gpt-5.4-mini-fast" }
65981
66005
  };
65982
66006
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
65983
- artistry: { model: "openai/gpt-5.5", variant: "xhigh" },
66007
+ artistry: { model: "openai/gpt-5.6-sol", variant: "xhigh" },
65984
66008
  quick: { model: "openai/gpt-5.4-mini" },
65985
- "visual-engineering": { model: "openai/gpt-5.5", variant: "high" },
65986
- writing: { model: "openai/gpt-5.5", variant: "medium" }
66009
+ "visual-engineering": { model: "openai/gpt-5.6-sol", variant: "high" },
66010
+ writing: { model: "openai/gpt-5.6-sol", variant: "medium" }
65987
66011
  };
65988
66012
  });
65989
66013
 
@@ -72697,7 +72721,7 @@ var package_default2;
72697
72721
  var init_package2 = __esm(() => {
72698
72722
  package_default2 = {
72699
72723
  name: "@oh-my-opencode/omo-codex",
72700
- version: "4.18.2",
72724
+ version: "4.19.1",
72701
72725
  type: "module",
72702
72726
  private: true,
72703
72727
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75085,6 +75109,7 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
75085
75109
  const packageJsonPaths = [];
75086
75110
  await collectPackageJsonPaths(pluginRoot, pluginRoot, packageJsonPaths);
75087
75111
  const packageLock = await readPackageLock(pluginRoot);
75112
+ let rewroteAnyPackageJson = false;
75088
75113
  for (const packageJsonPath of packageJsonPaths) {
75089
75114
  const raw = await readFile5(packageJsonPath, "utf8");
75090
75115
  const parsed = JSON.parse(raw);
@@ -75120,13 +75145,16 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
75120
75145
  changed = true;
75121
75146
  }
75122
75147
  }
75123
- if (changed)
75148
+ if (changed) {
75124
75149
  await writeFile2(packageJsonPath, `${JSON.stringify(parsed, null, "\t")}
75125
75150
  `);
75151
+ rewroteAnyPackageJson = true;
75152
+ }
75126
75153
  }
75127
75154
  if (packageLock.changed)
75128
75155
  await writeFile2(packageLock.path, `${JSON.stringify(packageLock.value, null, "\t")}
75129
75156
  `);
75157
+ return rewroteAnyPackageJson;
75130
75158
  }
75131
75159
  async function readPackageLock(pluginRoot) {
75132
75160
  const path7 = join30(pluginRoot, "package-lock.json");
@@ -75432,10 +75460,11 @@ async function installCachedPlugin(input) {
75432
75460
  await rm4(tempPath, { recursive: true, force: true });
75433
75461
  try {
75434
75462
  await copyDirectory(input.sourcePath, tempPath);
75435
- await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75463
+ const rewroteLocalFileDependencies = await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75436
75464
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75437
75465
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75438
- await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75466
+ const installArgs = rewroteLocalFileDependencies ? ["install", "--omit=dev", "--no-audit", "--no-fund"] : ["ci", "--omit=dev"];
75467
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, installArgs);
75439
75468
  await removeCachedManagedNpmBinShims(tempPath);
75440
75469
  if (input.buildSource === false)
75441
75470
  await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
@@ -75739,9 +75768,16 @@ function findTomlSection(config, header) {
75739
75768
  const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75740
75769
  let offset = 0;
75741
75770
  let start = -1;
75771
+ let multilineQuote = null;
75742
75772
  for (const line of lines) {
75743
75773
  if (line.length === 0)
75744
75774
  break;
75775
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75776
+ multilineQuote = multilineScan.nextQuote;
75777
+ if (multilineScan.wasInside) {
75778
+ offset += line.length;
75779
+ continue;
75780
+ }
75745
75781
  const trimmed = line.trim();
75746
75782
  if (start === -1) {
75747
75783
  if (tomlTableHeaderMatches(trimmed, headerLine, targetHeaderPath))
@@ -75756,8 +75792,37 @@ function findTomlSection(config, header) {
75756
75792
  return { start, end: config.length, text: config.slice(start) };
75757
75793
  }
75758
75794
  function replaceOrInsertSetting(config, section, key, value) {
75759
- const linePattern = new RegExp(`^[ \\t]*${escapeRegExp(key)}[ \\t]*=.*$`, "m");
75760
- const replacement = linePattern.test(section.text) ? section.text.replace(linePattern, `${key} = ${value}`) : insertSetting(section.text, key, value);
75795
+ const targetPath = parseTomlDottedKey(key);
75796
+ if (!targetPath)
75797
+ return config;
75798
+ const lines = section.text.match(/[^\n]*\n?|$/g) ?? [];
75799
+ let offset = 0;
75800
+ let multilineQuote = null;
75801
+ for (const line of lines) {
75802
+ if (line.length === 0)
75803
+ break;
75804
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75805
+ multilineQuote = multilineScan.nextQuote;
75806
+ if (multilineScan.wasInside) {
75807
+ offset += line.length;
75808
+ continue;
75809
+ }
75810
+ const assignmentIndex = findUnquotedAssignment(line);
75811
+ if (assignmentIndex < 0) {
75812
+ offset += line.length;
75813
+ continue;
75814
+ }
75815
+ const settingPath = parseTomlDottedKey(line.slice(0, assignmentIndex).trim());
75816
+ if (!settingPath || !tomlPathMatches(settingPath, targetPath)) {
75817
+ offset += line.length;
75818
+ continue;
75819
+ }
75820
+ const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
75821
+ const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(section.text, offset + line.length, multilineScan.nextQuote) : offset + line.length;
75822
+ const sectionReplacement = section.text.slice(0, offset) + replacement2 + section.text.slice(assignmentEnd);
75823
+ return config.slice(0, section.start) + sectionReplacement + config.slice(section.end);
75824
+ }
75825
+ const replacement = insertSetting(section.text, key, value);
75761
75826
  return config.slice(0, section.start) + replacement + config.slice(section.end);
75762
75827
  }
75763
75828
  function removeSetting(config, section, key) {
@@ -75777,6 +75842,50 @@ function replaceOrInsertRootSetting(config, key, value) {
75777
75842
  return replacement;
75778
75843
  return `${replacement.trimEnd()}
75779
75844
 
75845
+ ${suffix.trimStart()}`;
75846
+ }
75847
+ function replaceOrInsertRootDottedSetting(config, keyPath, value) {
75848
+ const targetPath = parseTomlDottedKey(keyPath);
75849
+ if (!targetPath)
75850
+ return config;
75851
+ const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75852
+ let offset = 0;
75853
+ let multilineQuote = null;
75854
+ for (const line of lines) {
75855
+ if (line.length === 0)
75856
+ break;
75857
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75858
+ multilineQuote = multilineScan.nextQuote;
75859
+ if (multilineScan.wasInside) {
75860
+ offset += line.length;
75861
+ continue;
75862
+ }
75863
+ if (isTomlTableHeaderLine(line))
75864
+ break;
75865
+ const assignmentIndex = findUnquotedAssignment(line);
75866
+ if (assignmentIndex < 0) {
75867
+ offset += line.length;
75868
+ continue;
75869
+ }
75870
+ const settingPath = parseTomlDottedKey(line.slice(0, assignmentIndex).trim());
75871
+ if (!settingPath || !tomlPathMatches(settingPath, targetPath)) {
75872
+ offset += line.length;
75873
+ continue;
75874
+ }
75875
+ const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
75876
+ const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(config, offset + line.length, multilineScan.nextQuote) : offset + line.length;
75877
+ return config.slice(0, offset) + replacement2 + config.slice(assignmentEnd);
75878
+ }
75879
+ const sectionStart = findFirstTableStart(config);
75880
+ const root = config.slice(0, sectionStart).trimEnd();
75881
+ const suffix = config.slice(sectionStart);
75882
+ const replacement = `${root}${root.length > 0 ? `
75883
+ ` : ""}${keyPath} = ${value}
75884
+ `;
75885
+ if (suffix.length === 0)
75886
+ return replacement;
75887
+ return `${replacement.trimEnd()}
75888
+
75780
75889
  ${suffix.trimStart()}`;
75781
75890
  }
75782
75891
  function appendBlock(config, block) {
@@ -75789,9 +75898,16 @@ function appendBlock(config, block) {
75789
75898
  function findFirstTableStart(config) {
75790
75899
  const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75791
75900
  let offset = 0;
75901
+ let multilineQuote = null;
75792
75902
  for (const line of lines) {
75793
75903
  if (line.length === 0)
75794
75904
  break;
75905
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75906
+ multilineQuote = multilineScan.nextQuote;
75907
+ if (multilineScan.wasInside) {
75908
+ offset += line.length;
75909
+ continue;
75910
+ }
75795
75911
  if (isTomlTableHeaderLine(line))
75796
75912
  return offset;
75797
75913
  offset += line.length;
@@ -75829,6 +75945,131 @@ function isTomlTableHeaderLine(line) {
75829
75945
  const normalizedLine = stripUnquotedInlineComment(line).trim();
75830
75946
  return normalizedLine.startsWith("[") && normalizedLine.endsWith("]");
75831
75947
  }
75948
+ function scanTomlMultilineLine(line, currentQuote) {
75949
+ if (currentQuote) {
75950
+ return {
75951
+ wasInside: true,
75952
+ nextQuote: findTomlMultilineDelimiter(line, currentQuote, 0) === -1 ? currentQuote : null
75953
+ };
75954
+ }
75955
+ let quote = null;
75956
+ let index = 0;
75957
+ while (index < line.length) {
75958
+ const char = line[index];
75959
+ if (quote === '"') {
75960
+ if (char === "\\") {
75961
+ index += 2;
75962
+ continue;
75963
+ }
75964
+ if (char === '"')
75965
+ quote = null;
75966
+ index += 1;
75967
+ continue;
75968
+ }
75969
+ if (quote === "'") {
75970
+ if (char === "'")
75971
+ quote = null;
75972
+ index += 1;
75973
+ continue;
75974
+ }
75975
+ if (char === "#")
75976
+ break;
75977
+ const delimiter2 = line.startsWith('"""', index) ? '"""' : line.startsWith("'''", index) ? "'''" : null;
75978
+ if (delimiter2) {
75979
+ const closingIndex = findTomlMultilineDelimiter(line, delimiter2, index + delimiter2.length);
75980
+ return { wasInside: false, nextQuote: closingIndex === -1 ? delimiter2 : null };
75981
+ }
75982
+ if (char === '"' || char === "'")
75983
+ quote = char;
75984
+ index += 1;
75985
+ }
75986
+ return { wasInside: false, nextQuote: null };
75987
+ }
75988
+ function findTomlMultilineDelimiter(line, delimiter2, startIndex) {
75989
+ let index = line.indexOf(delimiter2, startIndex);
75990
+ while (index !== -1) {
75991
+ if (delimiter2 === "'''" || countPrecedingBackslashes(line, index) % 2 === 0)
75992
+ return index;
75993
+ index = line.indexOf(delimiter2, index + 1);
75994
+ }
75995
+ return -1;
75996
+ }
75997
+ function countPrecedingBackslashes(line, index) {
75998
+ let count = 0;
75999
+ let cursor = index - 1;
76000
+ while (cursor >= 0 && line[cursor] === "\\") {
76001
+ count += 1;
76002
+ cursor -= 1;
76003
+ }
76004
+ return count;
76005
+ }
76006
+ function findUnquotedAssignment(line) {
76007
+ return findUnquotedCharacter(line, "=", 0);
76008
+ }
76009
+ function findUnquotedComment(line, startIndex) {
76010
+ return findUnquotedCharacter(line, "#", startIndex);
76011
+ }
76012
+ function findUnquotedCharacter(line, target, startIndex) {
76013
+ let quote = null;
76014
+ let index = startIndex;
76015
+ while (index < line.length) {
76016
+ const char = line[index];
76017
+ if (quote === '"') {
76018
+ if (char === "\\") {
76019
+ index += 2;
76020
+ continue;
76021
+ }
76022
+ if (char === '"')
76023
+ quote = null;
76024
+ index += 1;
76025
+ continue;
76026
+ }
76027
+ if (quote === "'") {
76028
+ if (char === "'")
76029
+ quote = null;
76030
+ index += 1;
76031
+ continue;
76032
+ }
76033
+ if (char === '"' || char === "'") {
76034
+ quote = char;
76035
+ index += 1;
76036
+ continue;
76037
+ }
76038
+ if (char === target)
76039
+ return index;
76040
+ if (char === "#")
76041
+ return -1;
76042
+ index += 1;
76043
+ }
76044
+ return -1;
76045
+ }
76046
+ function tomlPathMatches(candidate, target) {
76047
+ return candidate.length === target.length && candidate.every((part, index) => part === target[index]);
76048
+ }
76049
+ function replaceTomlAssignmentValue(line, assignmentIndex, value) {
76050
+ const newline = line.endsWith(`
76051
+ `) ? `
76052
+ ` : "";
76053
+ const lineBody = newline ? line.slice(0, -1) : line;
76054
+ const commentIndex = findUnquotedComment(lineBody, assignmentIndex + 1);
76055
+ const comment = commentIndex === -1 ? "" : ` ${lineBody.slice(commentIndex).trimStart()}`;
76056
+ return `${lineBody.slice(0, assignmentIndex + 1)} ${value}${comment}${newline}`;
76057
+ }
76058
+ function findTomlMultilineValueEnd(text, startOffset, quote) {
76059
+ const lines = text.slice(startOffset).match(/[^\n]*\n?|$/g) ?? [];
76060
+ let offset = startOffset;
76061
+ let currentQuote = quote;
76062
+ for (const line of lines) {
76063
+ if (line.length === 0)
76064
+ break;
76065
+ const scan = scanTomlMultilineLine(line, currentQuote);
76066
+ currentQuote = scan.nextQuote;
76067
+ offset += line.length;
76068
+ if (currentQuote === null)
76069
+ return offset;
76070
+ }
76071
+ return text.length;
76072
+ }
75832
76073
  function stripUnquotedInlineComment(line) {
75833
76074
  let quote = null;
75834
76075
  let index = 0;
@@ -76159,13 +76400,137 @@ function delay(milliseconds) {
76159
76400
  return new Promise((resolveDelay) => setTimeout(resolveDelay, milliseconds));
76160
76401
  }
76161
76402
 
76403
+ // packages/omo-codex/src/install/toml-setting-reader.ts
76404
+ function hasTomlSetting(config, keyPath) {
76405
+ const targetPath = parseTomlDottedKey(keyPath);
76406
+ if (!targetPath)
76407
+ return false;
76408
+ return hasTomlAssignment(config, (tablePath, settingPath) => {
76409
+ const fullPath = [...tablePath, ...settingPath];
76410
+ return fullPath.length === targetPath.length && fullPath.every((part, index) => part === targetPath[index]);
76411
+ });
76412
+ }
76413
+ function hasTomlRootDottedKeyPrefix(config, rootKey) {
76414
+ return hasTomlAssignment(config, (tablePath, settingPath) => tablePath.length === 0 && settingPath.length > 1 && settingPath[0] === rootKey);
76415
+ }
76416
+ function hasTomlAssignment(config, predicate) {
76417
+ let tablePath = [];
76418
+ let multilineQuote = null;
76419
+ for (const line of config.split(`
76420
+ `)) {
76421
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
76422
+ multilineQuote = multilineScan.nextQuote;
76423
+ if (multilineScan.wasInside)
76424
+ continue;
76425
+ const normalizedLine = stripUnquotedInlineComment2(line).trim();
76426
+ if (normalizedLine.length === 0)
76427
+ continue;
76428
+ const headerPath = parseTomlTableHeader2(normalizedLine);
76429
+ if (headerPath) {
76430
+ tablePath = headerPath;
76431
+ continue;
76432
+ }
76433
+ if (isTomlTableHeaderLine2(normalizedLine)) {
76434
+ tablePath = null;
76435
+ continue;
76436
+ }
76437
+ if (!tablePath)
76438
+ continue;
76439
+ const assignmentIndex = findUnquotedAssignment2(normalizedLine);
76440
+ if (assignmentIndex < 0)
76441
+ continue;
76442
+ const settingPath = parseTomlDottedKey(normalizedLine.slice(0, assignmentIndex).trim());
76443
+ if (!settingPath)
76444
+ continue;
76445
+ if (predicate(tablePath, settingPath))
76446
+ return true;
76447
+ }
76448
+ return false;
76449
+ }
76450
+ function parseTomlTableHeader2(line) {
76451
+ if (!line.startsWith("[") || !line.endsWith("]") || line.startsWith("[["))
76452
+ return null;
76453
+ return parseTomlDottedKey(line.slice(1, -1).trim());
76454
+ }
76455
+ function isTomlTableHeaderLine2(line) {
76456
+ return line.startsWith("[") && line.endsWith("]");
76457
+ }
76458
+ function stripUnquotedInlineComment2(line) {
76459
+ let quote = null;
76460
+ let index = 0;
76461
+ while (index < line.length) {
76462
+ const char = line[index];
76463
+ if (quote === '"') {
76464
+ if (char === "\\") {
76465
+ index += 2;
76466
+ continue;
76467
+ }
76468
+ if (char === '"')
76469
+ quote = null;
76470
+ index += 1;
76471
+ continue;
76472
+ }
76473
+ if (quote === "'") {
76474
+ if (char === "'")
76475
+ quote = null;
76476
+ index += 1;
76477
+ continue;
76478
+ }
76479
+ if (char === '"' || char === "'") {
76480
+ quote = char;
76481
+ index += 1;
76482
+ continue;
76483
+ }
76484
+ if (char === "#")
76485
+ return line.slice(0, index);
76486
+ index += 1;
76487
+ }
76488
+ return line;
76489
+ }
76490
+ function findUnquotedAssignment2(line) {
76491
+ let quote = null;
76492
+ let index = 0;
76493
+ while (index < line.length) {
76494
+ const char = line[index];
76495
+ if (quote === '"') {
76496
+ if (char === "\\") {
76497
+ index += 2;
76498
+ continue;
76499
+ }
76500
+ if (char === '"')
76501
+ quote = null;
76502
+ index += 1;
76503
+ continue;
76504
+ }
76505
+ if (quote === "'") {
76506
+ if (char === "'")
76507
+ quote = null;
76508
+ index += 1;
76509
+ continue;
76510
+ }
76511
+ if (char === '"' || char === "'") {
76512
+ quote = char;
76513
+ index += 1;
76514
+ continue;
76515
+ }
76516
+ if (char === "=")
76517
+ return index;
76518
+ index += 1;
76519
+ }
76520
+ return -1;
76521
+ }
76522
+
76162
76523
  // packages/omo-codex/src/install/codex-config-features.ts
76163
76524
  function ensureFeatureEnabled(config, featureName) {
76164
76525
  const section = findTomlSection(config, "features");
76165
- if (!section)
76526
+ if (!section) {
76527
+ if (hasTomlRootDottedKeyPrefix(config, "features")) {
76528
+ return replaceOrInsertRootDottedSetting(config, `features.${featureName}`, "true");
76529
+ }
76166
76530
  return appendBlock(config, `[features]
76167
76531
  ${featureName} = true
76168
76532
  `);
76533
+ }
76169
76534
  return replaceOrInsertSetting(config, section, featureName, "true");
76170
76535
  }
76171
76536
 
@@ -76233,7 +76598,7 @@ function ensureAutonomousPermissions(config) {
76233
76598
  next = replaceOrInsertRootSetting(next, "sandbox_mode", JSON.stringify("danger-full-access"));
76234
76599
  next = replaceOrInsertRootSetting(next, "network_access", JSON.stringify("enabled"));
76235
76600
  for (const featureName of AUTONOMOUS_FEATURES) {
76236
- next = ensureFeatureEnabled2(next, featureName);
76601
+ next = ensureFeatureEnabled(next, featureName);
76237
76602
  }
76238
76603
  next = removeWindowsSandboxSetting(next);
76239
76604
  next = ensureNoticeEnabled(next, "hide_full_access_warning");
@@ -76251,14 +76616,6 @@ function ensureNoticeEnabled(config, key) {
76251
76616
  return appendNoticeBlock(config, key);
76252
76617
  return replaceOrInsertSetting(config, section, key, "true");
76253
76618
  }
76254
- function ensureFeatureEnabled2(config, key) {
76255
- const section = findTomlSection(config, "features");
76256
- if (section === null)
76257
- return appendBlock(config, `[features]
76258
- ${key} = true
76259
- `);
76260
- return replaceOrInsertSetting(config, section, key, "true");
76261
- }
76262
76619
  function appendNoticeBlock(config, key) {
76263
76620
  return appendBlock(config, `[notice]
76264
76621
  ${key} = true
@@ -76330,7 +76687,7 @@ function readStringArraySetting(sectionText, key) {
76330
76687
  const assignmentIndex = line.indexOf("=");
76331
76688
  if (assignmentIndex === -1)
76332
76689
  return null;
76333
- return parseTomlStringArray(stripUnquotedInlineComment2(line.slice(assignmentIndex + 1)).trim());
76690
+ return parseTomlStringArray(stripUnquotedInlineComment3(line.slice(assignmentIndex + 1)).trim());
76334
76691
  }
76335
76692
  return null;
76336
76693
  }
@@ -76374,7 +76731,7 @@ function parseTomlString(input, startIndex) {
76374
76731
  }
76375
76732
  return null;
76376
76733
  }
76377
- function stripUnquotedInlineComment2(line) {
76734
+ function stripUnquotedInlineComment3(line) {
76378
76735
  let quote = null;
76379
76736
  let index = 0;
76380
76737
  while (index < line.length) {
@@ -76588,24 +76945,27 @@ import { readFileSync as readFileSync13 } from "node:fs";
76588
76945
  import { dirname as dirname15, isAbsolute as isAbsolute8, join as join39 } from "node:path";
76589
76946
  var CODEX_AGENTS_HEADER = "agents";
76590
76947
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
76948
+ var CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY = `${CODEX_MULTI_AGENT_V2_HEADER}.max_concurrent_threads_per_session`;
76591
76949
  var CODEX_SUBAGENT_THREAD_LIMIT = 1000;
76950
+ var CODEX_MULTI_AGENT_V2_THREAD_LIMIT = 16;
76592
76951
  function ensureCodexMultiAgentV2Config(config, options = {}) {
76593
76952
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
76594
76953
  const v2Preferred = options.multiAgentVersion === "v2";
76595
76954
  const modelKnown = options.multiAgentVersion != null || readRootModel(featureFlag.config) !== null;
76596
76955
  const agentsConfig = v2Preferred ? removeAgentsMaxThreads(featureFlag.config) : modelKnown ? ensureAgentsMaxThreads(featureFlag.config) : raiseExistingAgentsMaxThreads(featureFlag.config);
76597
- const maxThreadsValue = CODEX_SUBAGENT_THREAD_LIMIT.toString();
76598
76956
  const preserveDisable = featureFlag.value === false && !v2Preferred;
76599
76957
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
76958
+ if (hasTomlSetting(featureConfig, CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY))
76959
+ return featureConfig;
76600
76960
  const section = findTomlSection(featureConfig, CODEX_MULTI_AGENT_V2_HEADER);
76601
76961
  if (!section) {
76602
76962
  const enabledSetting = preserveDisable ? `enabled = false
76603
76963
  ` : "";
76604
76964
  return appendBlock(featureConfig, `[${CODEX_MULTI_AGENT_V2_HEADER}]
76605
- ${enabledSetting}max_concurrent_threads_per_session = ${maxThreadsValue}
76965
+ ${enabledSetting}max_concurrent_threads_per_session = ${CODEX_MULTI_AGENT_V2_THREAD_LIMIT}
76606
76966
  `);
76607
76967
  }
76608
- return replaceOrInsertSetting(featureConfig, section, "max_concurrent_threads_per_session", maxThreadsValue);
76968
+ return replaceOrInsertSetting(featureConfig, section, "max_concurrent_threads_per_session", CODEX_MULTI_AGENT_V2_THREAD_LIMIT.toString());
76609
76969
  }
76610
76970
  function resolveCodexMultiAgentVersion(config, configPath) {
76611
76971
  const model = readRootModel(config);
@@ -76792,11 +77152,11 @@ async function trustedHookStatesForPlugin(input) {
76792
77152
  const manifestPath = join40(input.pluginRoot, ".codex-plugin", "plugin.json");
76793
77153
  if (!await exists(manifestPath))
76794
77154
  return [];
76795
- const manifest = JSON.parse(await readFile12(manifestPath, "utf8"));
76796
- if (!isPlainRecord3(manifest))
77155
+ const manifest2 = JSON.parse(await readFile12(manifestPath, "utf8"));
77156
+ if (!isPlainRecord3(manifest2))
76797
77157
  return [];
76798
77158
  const states = [];
76799
- for (const hookPath of hookManifestPaths2(manifest.hooks)) {
77159
+ for (const hookPath of hookManifestPaths2(manifest2.hooks)) {
76800
77160
  const hooksPath = join40(input.pluginRoot, hookPath);
76801
77161
  if (!await exists(hooksPath))
76802
77162
  continue;
@@ -76964,6 +77324,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76964
77324
  {
76965
77325
  previous: { model: "gpt-5.5", effort: "xhigh" },
76966
77326
  current: { model: "gpt-5.6-sol", effort: "ultra" }
77327
+ },
77328
+ {
77329
+ previous: { model: "gpt-5.6-sol", effort: "ultra" },
77330
+ current: { model: "gpt-5.6-terra", effort: "high" }
76967
77331
  }
76968
77332
  ]
76969
77333
  ],
@@ -76973,6 +77337,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76973
77337
  {
76974
77338
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
76975
77339
  current: { model: "gpt-5.6-sol", effort: "max" }
77340
+ },
77341
+ {
77342
+ previous: { model: "gpt-5.6-sol", effort: "max" },
77343
+ current: { model: "gpt-5.6-sol", effort: "high" }
76976
77344
  }
76977
77345
  ]
76978
77346
  ],
@@ -76982,6 +77350,37 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76982
77350
  {
76983
77351
  previous: { model: "gpt-5.6-sol", effort: "high" },
76984
77352
  current: { model: "gpt-5.6-luna", effort: "max" }
77353
+ },
77354
+ {
77355
+ previous: { model: "gpt-5.6-luna", effort: "max" },
77356
+ current: { model: "gpt-5.6-terra", effort: "high" }
77357
+ }
77358
+ ]
77359
+ ],
77360
+ [
77361
+ "lazycodex-worker-high",
77362
+ [
77363
+ {
77364
+ previous: { model: "gpt-5.6-sol", effort: "max" },
77365
+ current: { model: "gpt-5.6-sol", effort: "medium" }
77366
+ }
77367
+ ]
77368
+ ],
77369
+ [
77370
+ "lazycodex-code-reviewer",
77371
+ [
77372
+ {
77373
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
77374
+ current: { model: "gpt-5.6-terra", effort: "medium" }
77375
+ }
77376
+ ]
77377
+ ],
77378
+ [
77379
+ "lazycodex-clone-fidelity-reviewer",
77380
+ [
77381
+ {
77382
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
77383
+ current: { model: "gpt-5.6-terra", effort: "high" }
76985
77384
  }
76986
77385
  ]
76987
77386
  ],
@@ -77000,6 +77399,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
77000
77399
  {
77001
77400
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
77002
77401
  current: { model: "gpt-5.6-sol", effort: "high" }
77402
+ },
77403
+ {
77404
+ previous: { model: "gpt-5.6-sol", effort: "high" },
77405
+ current: { model: "gpt-5.6-sol", effort: "low" }
77003
77406
  }
77004
77407
  ]
77005
77408
  ]
@@ -77626,7 +78029,7 @@ function normalizeHookStatusVersion(version) {
77626
78029
 
77627
78030
  // packages/omo-codex/src/install/codex-process.ts
77628
78031
  init_bun_spawn_shim();
77629
- var WINDOWS_CMD_SHIM_COMMANDS = new Set(["npm", "npx"]);
78032
+ var WINDOWS_CMD_SHIM_COMMANDS = new Set(["codex", "npm", "npx"]);
77630
78033
  function resolveRunCommandInvocation(command, args, platform = process.platform) {
77631
78034
  if (platform !== "win32" || !WINDOWS_CMD_SHIM_COMMANDS.has(command.toLowerCase())) {
77632
78035
  return { command, args: [...args] };
@@ -78331,12 +78734,12 @@ async function runCodexInstaller(options = {}) {
78331
78734
  const agentConfigs = new Map;
78332
78735
  for (const entry of marketplace.plugins) {
78333
78736
  const sourcePath = resolvePluginSource(codexPackageRoot, entry, { pathOverride: "./plugin" });
78334
- const manifest = await readPluginManifest(sourcePath);
78335
- if (manifest.name !== entry.name) {
78336
- throw new Error(`plugin manifest name ${JSON.stringify(manifest.name)} does not match marketplace name ${JSON.stringify(entry.name)}`);
78737
+ const manifest2 = await readPluginManifest(sourcePath);
78738
+ if (manifest2.name !== entry.name) {
78739
+ throw new Error(`plugin manifest name ${JSON.stringify(manifest2.name)} does not match marketplace name ${JSON.stringify(entry.name)}`);
78337
78740
  }
78338
78741
  const version2 = resolveLazyCodexPluginVersion({
78339
- manifestVersion: manifest.version,
78742
+ manifestVersion: manifest2.version,
78340
78743
  marketplaceName: marketplace.name,
78341
78744
  pluginName: entry.name,
78342
78745
  distributionManifest,
@@ -79026,8 +79429,24 @@ import { promisify as promisify2 } from "node:util";
79026
79429
  var execFileAsync2 = promisify2(execFile4);
79027
79430
  var REQUIRED_PLUGIN_ARTIFACTS = [
79028
79431
  join58("extensions", "omo.js"),
79432
+ join58("skills", "ast-grep", "SKILL.md"),
79433
+ join58("skills", "coding-agent-sessions", "SKILL.md"),
79434
+ join58("skills", "debugging", "SKILL.md"),
79435
+ join58("skills", "frontend", "SKILL.md"),
79436
+ join58("skills", "git-master", "SKILL.md"),
79437
+ join58("skills", "init-deep", "SKILL.md"),
79438
+ join58("skills", "lsp-setup", "SKILL.md"),
79439
+ join58("skills", "programming", "SKILL.md"),
79440
+ join58("skills", "refactor", "SKILL.md"),
79441
+ join58("skills", "remove-ai-slops", "SKILL.md"),
79442
+ join58("skills", "review-work", "SKILL.md"),
79443
+ join58("skills", "start-work", "SKILL.md"),
79444
+ join58("skills", "ultimate-browsing", "SKILL.md"),
79029
79445
  join58("skills", "ultrawork", "SKILL.md"),
79030
79446
  join58("skills", "ulw-loop", "SKILL.md"),
79447
+ join58("skills", "ulw-plan", "SKILL.md"),
79448
+ join58("skills", "ulw-research", "SKILL.md"),
79449
+ join58("skills", "visual-qa", "SKILL.md"),
79031
79450
  join58("runtime", "lsp-daemon", "dist", "cli.js"),
79032
79451
  join58("runtime", "lsp-daemon", "dist", "index.js"),
79033
79452
  join58("runtime", "lsp-daemon", "dist", "index.d.ts"),
@@ -79081,6 +79500,7 @@ async function ensurePluginArtifacts(context) {
79081
79500
  throw new Error(`Packed omo-senpi plugin is missing required runtime artifacts at ${context.pluginPath}`);
79082
79501
  }
79083
79502
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "build-extension.mjs")], { cwd: context.repoRoot });
79503
+ await context.runCommand("node", [join58("packages", "omo-codex", "plugin", "scripts", "materialize-shared-upstreams.mjs")], { cwd: context.repoRoot });
79084
79504
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "sync-skills.mjs")], { cwd: context.repoRoot });
79085
79505
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "build-install.mjs")], { cwd: context.repoRoot });
79086
79506
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "stage-lsp-daemon-runtime.mjs")], { cwd: context.repoRoot });
@@ -96710,7 +97130,8 @@ var BrowserAutomationProviderSchema = exports_external.enum([
96710
97130
  "playwright-cli"
96711
97131
  ]);
96712
97132
  var BrowserAutomationConfigSchema = exports_external.object({
96713
- provider: BrowserAutomationProviderSchema.default("playwright")
97133
+ provider: BrowserAutomationProviderSchema.default("playwright"),
97134
+ playwright_mcp_args: exports_external.array(exports_external.string()).optional()
96714
97135
  });
96715
97136
  // packages/omo-opencode/src/config/schema/categories.ts
96716
97137
  var CategoryConfigSchema = exports_external.object({
@@ -96761,7 +97182,9 @@ var ClaudeCodeConfigSchema = exports_external.object({
96761
97182
  var CodegraphConfigSchema = exports_external.object({
96762
97183
  auto_init: exports_external.boolean().default(true),
96763
97184
  auto_provision: exports_external.boolean().default(true),
97185
+ daemon: exports_external.boolean().default(false),
96764
97186
  enabled: exports_external.boolean().default(true),
97187
+ excluded_roots: exports_external.array(exports_external.string()).optional(),
96765
97188
  install_dir: exports_external.string().optional(),
96766
97189
  telemetry: exports_external.boolean().optional(),
96767
97190
  watch_debounce_ms: exports_external.number().nonnegative().optional()
@@ -96772,9 +97195,7 @@ var CommentCheckerConfigSchema = exports_external.object({
96772
97195
  });
96773
97196
  // packages/omo-opencode/src/config/schema/commands.ts
96774
97197
  var BuiltinCommandNameSchema = exports_external.enum([
96775
- "ralph-loop",
96776
- "ulw-loop",
96777
- "cancel-ralph",
97198
+ "goal",
96778
97199
  "refactor",
96779
97200
  "start-work",
96780
97201
  "stop-continuation",
@@ -96784,7 +97205,7 @@ var BuiltinCommandNameSchema = exports_external.enum([
96784
97205
  // packages/omo-opencode/src/config/schema/default-mode.ts
96785
97206
  var DefaultModeConfigSchema = exports_external.object({
96786
97207
  ultrawork: exports_external.boolean().default(false),
96787
- ralph_loop: exports_external.boolean().default(false)
97208
+ goal: exports_external.boolean().default(false)
96788
97209
  });
96789
97210
  // packages/omo-opencode/src/config/schema/dynamic-context-pruning.ts
96790
97211
  var DynamicContextPruningConfigSchema = exports_external.object({
@@ -96832,6 +97253,12 @@ var ExperimentalConfigSchema = exports_external.object({
96832
97253
  max_tools: exports_external.number().int().min(1).optional(),
96833
97254
  disable_live_parent_wake_routing: exports_external.boolean().optional()
96834
97255
  });
97256
+ // packages/omo-opencode/src/config/schema/goal.ts
97257
+ var GoalConfigSchema = exports_external.object({
97258
+ enabled: exports_external.boolean().default(false),
97259
+ auto_start: exports_external.boolean().default(false),
97260
+ default_max_iterations: exports_external.number().min(1).max(1000).default(100)
97261
+ });
96835
97262
  // packages/skills-loader-core/src/config/git-env-prefix.ts
96836
97263
  var GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
96837
97264
  var GIT_ENV_PREFIX_VALIDATION_MESSAGE = 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"';
@@ -96874,7 +97301,7 @@ var HookNameSchema = exports_external.enum([
96874
97301
  "interactive-bash-session",
96875
97302
  "tool-pair-validator",
96876
97303
  "monitor-status-injector",
96877
- "ralph-loop",
97304
+ "goal",
96878
97305
  "category-skill-reminder",
96879
97306
  "compaction-context-injector",
96880
97307
  "compaction-todo-preserver",
@@ -96984,14 +97411,6 @@ var MonitorConfigSchema = exports_external.object({
96984
97411
  pattern_max_length: exports_external.number().int().min(1).default(512)
96985
97412
  });
96986
97413
 
96987
- // packages/omo-opencode/src/config/schema/ralph-loop.ts
96988
- var RalphLoopConfigSchema = exports_external.object({
96989
- enabled: exports_external.boolean().default(false),
96990
- default_max_iterations: exports_external.number().min(1).max(1000).default(100),
96991
- state_dir: exports_external.string().optional(),
96992
- default_strategy: exports_external.enum(["reset", "continue"]).default("continue")
96993
- });
96994
-
96995
97414
  // packages/omo-opencode/src/config/schema/runtime-fallback.ts
96996
97415
  var RuntimeFallbackConfigSchema = exports_external.object({
96997
97416
  enabled: exports_external.boolean().optional(),
@@ -97127,7 +97546,8 @@ var OhMyOpenCodeConfigSchema = exports_external.object({
97127
97546
  experimental: ExperimentalConfigSchema.optional(),
97128
97547
  auto_update: exports_external.boolean().optional(),
97129
97548
  skills: SkillsConfigSchema.optional(),
97130
- ralph_loop: RalphLoopConfigSchema.optional(),
97549
+ goal: GoalConfigSchema.optional(),
97550
+ ralph_loop: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
97131
97551
  runtime_fallback: exports_external.union([exports_external.boolean(), RuntimeFallbackConfigSchema]).optional(),
97132
97552
  background_task: BackgroundTaskConfigSchema.optional(),
97133
97553
  notification: NotificationConfigSchema.optional(),
@@ -97510,6 +97930,7 @@ function loadPluginConfig(directory, ctx) {
97510
97930
  }
97511
97931
  }
97512
97932
  const userMcpEnvAllowlist = config3.mcp_env_allowlist ?? [];
97933
+ const userPlaywrightMcpArgs = config3.browser_automation_engine?.playwright_mcp_args;
97513
97934
  const canonicalAncestorPathsFarthestFirst = [...canonicalAncestorPathsNearestFirst].reverse();
97514
97935
  const defaultGitMaster = OhMyOpenCodeConfigSchema.parse({}).git_master;
97515
97936
  const ancestorGitMasterOverridesFarthestFirst = [];
@@ -97542,6 +97963,16 @@ function loadPluginConfig(directory, ctx) {
97542
97963
  ...config3,
97543
97964
  mcp_env_allowlist: userMcpEnvAllowlist
97544
97965
  };
97966
+ if (config3.browser_automation_engine) {
97967
+ const {
97968
+ playwright_mcp_args: _ancestorPlaywrightMcpArgs,
97969
+ ...browserAutomationEngine
97970
+ } = config3.browser_automation_engine;
97971
+ config3 = {
97972
+ ...config3,
97973
+ browser_automation_engine: userPlaywrightMcpArgs !== undefined ? { ...browserAutomationEngine, playwright_mcp_args: userPlaywrightMcpArgs } : browserAutomationEngine
97974
+ };
97975
+ }
97545
97976
  applyDisabledProviders(config3);
97546
97977
  log2("Final merged config", {
97547
97978
  agents: config3.agents,
@@ -98013,22 +98444,170 @@ var BOULDER_FILE = "boulder.json";
98013
98444
  var BOULDER_STATE_PATH = `${BOULDER_DIR}/${BOULDER_FILE}`;
98014
98445
  var NOTEPAD_DIR = "notepads";
98015
98446
  var NOTEPAD_BASE_PATH = `${BOULDER_DIR}/${NOTEPAD_DIR}`;
98016
- // packages/boulder-state/src/top-level-task.ts
98017
- import { existsSync as existsSync37, readFileSync as readFileSync19 } from "node:fs";
98018
- var TODO_HEADING_PATTERN = /^##\s+TODOs\b/i;
98019
- var FINAL_VERIFICATION_HEADING_PATTERN = /^##\s+Final Verification Wave\b/i;
98020
- var SECOND_LEVEL_HEADING_PATTERN = /^##\s+/;
98021
- var UNCHECKED_CHECKBOX_PATTERN = /^(\s*)[-*]\s*\[\s*\]\s*(.+)$/;
98022
- var TODO_TASK_PATTERN = /^(\d+)\.\s+(.+)$/;
98023
- var FINAL_WAVE_TASK_PATTERN = /^(F\d+)\.\s+(.+)$/i;
98024
- function buildTaskRef(section, taskLabel) {
98025
- const pattern = section === "todo" ? TODO_TASK_PATTERN : FINAL_WAVE_TASK_PATTERN;
98026
- const match = taskLabel.match(pattern);
98027
- if (!match) {
98447
+ // packages/boulder-state/src/plan-checklist.ts
98448
+ var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX]?)[ \t]*\][ \t]+(.+)$/;
98449
+ var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
98450
+ var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
98451
+ var SECTION_BOUNDARY_HEADING_PATTERN = /^#{1,2}(?:[ \t]+|$)/;
98452
+ var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
98453
+ var TODO_CHECKBOX_PATTERN = /^- \[([ xX])\] ([1-9]\d*\. .+)$/;
98454
+ var FINAL_WAVE_CHECKBOX_PATTERN = /^- \[([ xX])\] (F[1-9]\d*\. .+)$/i;
98455
+ function parsePlanChecklist(markdown) {
98456
+ const lines = markdown.split(/\r?\n/);
98457
+ if (!hasStructuredSection(lines)) {
98458
+ return parseSimpleChecklist(lines);
98459
+ }
98460
+ return parseStructuredPlan(lines).checklist;
98461
+ }
98462
+ function parseCurrentTopLevelTask(markdown) {
98463
+ const lines = markdown.split(/\r?\n/);
98464
+ if (!hasStructuredSection(lines)) {
98465
+ return null;
98466
+ }
98467
+ return parseStructuredPlan(lines).nextTask;
98468
+ }
98469
+ function parseStructuredPlan(lines) {
98470
+ let remaining = 0;
98471
+ let total = 0;
98472
+ let nextTaskLabel = null;
98473
+ let nextTask = null;
98474
+ let section = "other";
98475
+ let fence = null;
98476
+ for (const line of lines) {
98477
+ if (fence !== null) {
98478
+ if (isClosingFence(line, fence)) {
98479
+ fence = null;
98480
+ }
98481
+ continue;
98482
+ }
98483
+ const openingFence = parseOpeningFence(line);
98484
+ if (openingFence !== null) {
98485
+ fence = openingFence;
98486
+ continue;
98487
+ }
98488
+ if (SECTION_BOUNDARY_HEADING_PATTERN.test(line)) {
98489
+ section = parseStructuredSectionHeading(line);
98490
+ continue;
98491
+ }
98492
+ if (section === "other") {
98493
+ continue;
98494
+ }
98495
+ const checkbox = parseStructuredTopLevelCheckbox(line, section);
98496
+ if (checkbox === null) {
98497
+ continue;
98498
+ }
98499
+ total += 1;
98500
+ if (checkbox.checked) {
98501
+ continue;
98502
+ }
98503
+ remaining += 1;
98504
+ if (nextTaskLabel === null) {
98505
+ nextTaskLabel = checkbox.label;
98506
+ nextTask = checkbox.task;
98507
+ }
98508
+ }
98509
+ return {
98510
+ checklist: {
98511
+ completed: total - remaining,
98512
+ remaining,
98513
+ total,
98514
+ nextTaskLabel
98515
+ },
98516
+ nextTask
98517
+ };
98518
+ }
98519
+ function parseSimpleChecklist(lines) {
98520
+ let remaining = 0;
98521
+ let total = 0;
98522
+ let nextTaskLabel = null;
98523
+ let fence = null;
98524
+ for (const line of lines) {
98525
+ if (fence !== null) {
98526
+ if (isClosingFence(line, fence)) {
98527
+ fence = null;
98528
+ }
98529
+ continue;
98530
+ }
98531
+ const openingFence = parseOpeningFence(line);
98532
+ if (openingFence !== null) {
98533
+ fence = openingFence;
98534
+ continue;
98535
+ }
98536
+ const checkbox = parseSimpleTopLevelCheckbox(line);
98537
+ if (checkbox === null) {
98538
+ continue;
98539
+ }
98540
+ total += 1;
98541
+ if (checkbox.checked) {
98542
+ continue;
98543
+ }
98544
+ remaining += 1;
98545
+ if (nextTaskLabel === null) {
98546
+ nextTaskLabel = checkbox.label;
98547
+ }
98548
+ }
98549
+ return { completed: total - remaining, remaining, total, nextTaskLabel };
98550
+ }
98551
+ function parseSimpleTopLevelCheckbox(line) {
98552
+ const match = line.match(SIMPLE_CHECKBOX_PATTERN);
98553
+ const marker = match?.[1];
98554
+ const label = match?.[2];
98555
+ if (marker === undefined || label === undefined) {
98556
+ return null;
98557
+ }
98558
+ return { checked: marker.toLowerCase() === "x", label };
98559
+ }
98560
+ function hasStructuredSection(lines) {
98561
+ let fence = null;
98562
+ for (const line of lines) {
98563
+ if (fence !== null) {
98564
+ if (isClosingFence(line, fence)) {
98565
+ fence = null;
98566
+ }
98567
+ continue;
98568
+ }
98569
+ const openingFence = parseOpeningFence(line);
98570
+ if (openingFence !== null) {
98571
+ fence = openingFence;
98572
+ continue;
98573
+ }
98574
+ if (parseStructuredSectionHeading(line) !== "other") {
98575
+ return true;
98576
+ }
98577
+ }
98578
+ return false;
98579
+ }
98580
+ function parseStructuredSectionHeading(line) {
98581
+ if (TODO_HEADING_PATTERN.test(line)) {
98582
+ return "todo";
98583
+ }
98584
+ if (FINAL_VERIFICATION_HEADING_PATTERN.test(line)) {
98585
+ return "final-wave";
98586
+ }
98587
+ return "other";
98588
+ }
98589
+ function parseStructuredTopLevelCheckbox(line, section) {
98590
+ const pattern = section === "todo" ? TODO_CHECKBOX_PATTERN : FINAL_WAVE_CHECKBOX_PATTERN;
98591
+ const match = line.match(pattern);
98592
+ const marker = match?.[1];
98593
+ const label = match?.[2];
98594
+ if (marker === undefined || label === undefined) {
98595
+ return null;
98596
+ }
98597
+ const task = buildTaskRef(section, label);
98598
+ if (task === null) {
98599
+ return null;
98600
+ }
98601
+ return { checked: marker.toLowerCase() === "x", label, task };
98602
+ }
98603
+ function buildTaskRef(section, label) {
98604
+ const pattern = section === "todo" ? /^([1-9]\d*)\. (.+)$/ : /^(F[1-9]\d*)\. (.+)$/i;
98605
+ const match = label.match(pattern);
98606
+ const rawLabel = match?.[1];
98607
+ const title = match?.[2];
98608
+ if (rawLabel === undefined || title === undefined) {
98028
98609
  return null;
98029
98610
  }
98030
- const rawLabel = match[1];
98031
- const title = match[2].trim();
98032
98611
  return {
98033
98612
  key: `${section}:${rawLabel.toLowerCase()}`,
98034
98613
  section,
@@ -98036,31 +98615,29 @@ function buildTaskRef(section, taskLabel) {
98036
98615
  title
98037
98616
  };
98038
98617
  }
98618
+ function parseOpeningFence(line) {
98619
+ const match = line.match(FENCE_PATTERN);
98620
+ const run = match?.[1];
98621
+ const info = match?.[2];
98622
+ const marker = run?.charAt(0);
98623
+ if (run === undefined || info === undefined || marker !== "`" && marker !== "~" || marker === "`" && info.includes("`")) {
98624
+ return null;
98625
+ }
98626
+ return { marker, length: run.length };
98627
+ }
98628
+ function isClosingFence(line, fence) {
98629
+ const run = line.match(/^[ \t]{0,3}(`{3,}|~{3,})[ \t]*$/)?.[1];
98630
+ return run?.charAt(0) === fence.marker && run.length >= fence.length;
98631
+ }
98632
+ // packages/boulder-state/src/top-level-task.ts
98633
+ import { existsSync as existsSync37, readFileSync as readFileSync19 } from "node:fs";
98039
98634
  function readCurrentTopLevelTask(planPath) {
98040
98635
  if (!existsSync37(planPath)) {
98041
98636
  return null;
98042
98637
  }
98043
98638
  try {
98044
98639
  const content = readFileSync19(planPath, "utf-8");
98045
- const lines = content.split(/\r?\n/);
98046
- let section = "other";
98047
- for (const line of lines) {
98048
- if (SECOND_LEVEL_HEADING_PATTERN.test(line)) {
98049
- section = TODO_HEADING_PATTERN.test(line) ? "todo" : FINAL_VERIFICATION_HEADING_PATTERN.test(line) ? "final-wave" : "other";
98050
- }
98051
- const uncheckedTaskMatch = line.match(UNCHECKED_CHECKBOX_PATTERN);
98052
- if (!uncheckedTaskMatch || uncheckedTaskMatch[1].length > 0) {
98053
- continue;
98054
- }
98055
- if (section !== "todo" && section !== "final-wave") {
98056
- continue;
98057
- }
98058
- const taskRef = buildTaskRef(section, uncheckedTaskMatch[2].trim());
98059
- if (taskRef) {
98060
- return taskRef;
98061
- }
98062
- }
98063
- return null;
98640
+ return parseCurrentTopLevelTask(content);
98064
98641
  } catch {
98065
98642
  return null;
98066
98643
  }
@@ -98094,69 +98671,25 @@ function resolveBoulderPlanPathForWork(directory, work) {
98094
98671
  }
98095
98672
  // packages/boulder-state/src/storage/plan-progress.ts
98096
98673
  import { existsSync as existsSync39, readFileSync as readFileSync20, readdirSync as readdirSync5, statSync as statSync5 } from "node:fs";
98097
- var TODO_HEADING_PATTERN2 = /^##\s+TODOs\b/i;
98098
- var FINAL_VERIFICATION_HEADING_PATTERN2 = /^##\s+Final Verification Wave\b/i;
98099
- var SECOND_LEVEL_HEADING_PATTERN2 = /^##\s+/;
98100
- var UNCHECKED_CHECKBOX_PATTERN2 = /^(\s*)[-*]\s*\[\s*\]\s*(.+)$/;
98101
- var CHECKED_CHECKBOX_PATTERN = /^(\s*)[-*]\s*\[[xX]\]\s*(.+)$/;
98102
- var TODO_TASK_PATTERN2 = /^\d+\.\s+/;
98103
- var FINAL_WAVE_TASK_PATTERN2 = /^F\d+\.\s+/i;
98104
98674
  function getPlanProgress(planPath) {
98105
98675
  if (!existsSync39(planPath)) {
98106
98676
  return { total: 0, completed: 0, isComplete: false };
98107
98677
  }
98108
98678
  try {
98109
98679
  const content = readFileSync20(planPath, "utf-8");
98110
- const lines = content.split(/\r?\n/);
98111
- const hasStructuredSections = lines.some((line) => TODO_HEADING_PATTERN2.test(line) || FINAL_VERIFICATION_HEADING_PATTERN2.test(line));
98112
- if (hasStructuredSections) {
98113
- return getStructuredPlanProgress(lines);
98114
- }
98115
- return getSimplePlanProgress(content);
98680
+ const checklist = parsePlanChecklist(content);
98681
+ return {
98682
+ total: checklist.total,
98683
+ completed: checklist.completed,
98684
+ isComplete: checklist.total > 0 && checklist.remaining === 0
98685
+ };
98116
98686
  } catch {
98117
98687
  return { total: 0, completed: 0, isComplete: false };
98118
98688
  }
98119
98689
  }
98120
- function getStructuredPlanProgress(lines) {
98121
- let section = "other";
98122
- let total = 0;
98123
- let completed = 0;
98124
- for (const line of lines) {
98125
- if (SECOND_LEVEL_HEADING_PATTERN2.test(line)) {
98126
- section = TODO_HEADING_PATTERN2.test(line) ? "todo" : FINAL_VERIFICATION_HEADING_PATTERN2.test(line) ? "final-wave" : "other";
98127
- continue;
98128
- }
98129
- if (section !== "todo" && section !== "final-wave") {
98130
- continue;
98131
- }
98132
- const checkedMatch = line.match(CHECKED_CHECKBOX_PATTERN);
98133
- const uncheckedMatch = checkedMatch ? null : line.match(UNCHECKED_CHECKBOX_PATTERN2);
98134
- const match = checkedMatch ?? uncheckedMatch;
98135
- if (!match || match[1].length > 0) {
98136
- continue;
98137
- }
98138
- const taskBody = match[2].trim();
98139
- const labelPattern = section === "todo" ? TODO_TASK_PATTERN2 : FINAL_WAVE_TASK_PATTERN2;
98140
- if (!labelPattern.test(taskBody)) {
98141
- continue;
98142
- }
98143
- total += 1;
98144
- if (checkedMatch) {
98145
- completed += 1;
98146
- }
98147
- }
98148
- return { total, completed, isComplete: total > 0 && completed === total };
98149
- }
98150
- function getSimplePlanProgress(content) {
98151
- const uncheckedMatches = content.match(/^[-*]\s*\[\s*\]/gm) ?? [];
98152
- const checkedMatches = content.match(/^[-*]\s*\[[xX]\]/gm) ?? [];
98153
- const total = uncheckedMatches.length + checkedMatches.length;
98154
- const completed = checkedMatches.length;
98155
- return { total, completed, isComplete: total > 0 && completed === total };
98156
- }
98157
98690
  // packages/boulder-state/src/storage/shared.ts
98158
98691
  var RESERVED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
98159
- var SESSION_ID_PREFIX_PATTERN = /^(codex|opencode):/;
98692
+ var SESSION_ID_PREFIX_PATTERN = /^(codex|opencode|senpi):/;
98160
98693
  function normalizeSessionId(sessionId, platform = "opencode") {
98161
98694
  if (SESSION_ID_PREFIX_PATTERN.test(sessionId)) {
98162
98695
  return sessionId;
@@ -98231,7 +98764,7 @@ function readBoulderState(directory) {
98231
98764
  try {
98232
98765
  const content = readFileSync21(filePath, "utf-8");
98233
98766
  const parsed = JSON.parse(content);
98234
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
98767
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || Object.keys(parsed).length === 0) {
98235
98768
  return null;
98236
98769
  }
98237
98770
  normalizeState(parsed);
@@ -100188,6 +100721,7 @@ import { readFileSync as readFileSync35 } from "node:fs";
100188
100721
  import { homedir as homedir16 } from "node:os";
100189
100722
  import { dirname as dirname29, relative as relative9 } from "node:path";
100190
100723
  init_shared();
100724
+ init_logger2();
100191
100725
  init_plugin_identity();
100192
100726
  function resolveHomeDirectory2() {
100193
100727
  return process.env.HOME ?? process.env.USERPROFILE ?? homedir16();
@@ -100276,13 +100810,45 @@ function mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst) {
100276
100810
  config3 = mergeConfigs2(config3, layer.config);
100277
100811
  }
100278
100812
  const userMcpEnvAllowlist = config3.mcp_env_allowlist ?? [];
100813
+ const userPlaywrightMcpArgs = config3.browser_automation_engine?.playwright_mcp_args;
100279
100814
  for (const layer of [...projectLayersNearestFirst].reverse()) {
100280
100815
  if (layer.config)
100281
100816
  config3 = mergeConfigs2(config3, layer.config);
100282
100817
  }
100283
100818
  config3 = { ...config3, mcp_env_allowlist: userMcpEnvAllowlist };
100819
+ if (config3.browser_automation_engine) {
100820
+ const {
100821
+ playwright_mcp_args: _projectPlaywrightMcpArgs,
100822
+ ...browserAutomationEngine
100823
+ } = config3.browser_automation_engine;
100824
+ config3 = {
100825
+ ...config3,
100826
+ browser_automation_engine: userPlaywrightMcpArgs !== undefined ? { ...browserAutomationEngine, playwright_mcp_args: userPlaywrightMcpArgs } : browserAutomationEngine
100827
+ };
100828
+ }
100284
100829
  return applyDisabledProviders(config3);
100285
100830
  }
100831
+ function migrateRalphLoopConfig(config3) {
100832
+ const legacy = config3.ralph_loop;
100833
+ if (legacy === undefined) {
100834
+ return config3;
100835
+ }
100836
+ const enabled = typeof legacy.enabled === "boolean" ? legacy.enabled : undefined;
100837
+ const defaultMaxIterations = typeof legacy.default_max_iterations === "number" ? legacy.default_max_iterations : undefined;
100838
+ if (enabled === undefined && defaultMaxIterations === undefined) {
100839
+ return config3;
100840
+ }
100841
+ log2("[config] ralph_loop is deprecated and will be removed in a future release. Use goal instead.");
100842
+ const existingGoal = config3.goal;
100843
+ return {
100844
+ ...config3,
100845
+ goal: {
100846
+ enabled: existingGoal?.enabled ?? enabled ?? false,
100847
+ auto_start: existingGoal?.auto_start ?? false,
100848
+ default_max_iterations: existingGoal?.default_max_iterations ?? defaultMaxIterations ?? 100
100849
+ }
100850
+ };
100851
+ }
100286
100852
  function validatePluginConfig(directory) {
100287
100853
  const userLayersNearestFirst = discoverUserLayers().map((layer) => parseLayerConfig(layer.path));
100288
100854
  const projectLayersNearestFirst = discoverProjectLayersNearestFirst(directory).map((layer) => parseLayerConfig(layer.path));
@@ -100292,7 +100858,7 @@ function validatePluginConfig(directory) {
100292
100858
  valid: messages.length === 0,
100293
100859
  messages,
100294
100860
  path: firstFailingPath(layers) ?? firstPath(layers),
100295
- config: mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst)
100861
+ config: migrateRalphLoopConfig(mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst))
100296
100862
  };
100297
100863
  }
100298
100864
 
@@ -101603,10 +102169,10 @@ async function gatherCodexSummary(deps = {}) {
101603
102169
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
101604
102170
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
101605
102171
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
101606
- const manifest = pluginRoot === null ? null : await readJson(join82(pluginRoot, ".codex-plugin", "plugin.json"));
102172
+ const manifest2 = pluginRoot === null ? null : await readJson(join82(pluginRoot, ".codex-plugin", "plugin.json"));
101607
102173
  const installSnapshot = pluginRoot === null ? null : await readJson(join82(pluginRoot, "lazycodex-install.json"));
101608
102174
  const configPath = join82(codexHome, "config.toml");
101609
- const pluginVersion = stringField(manifest, "version");
102175
+ const pluginVersion = stringField(manifest2, "version");
101610
102176
  return {
101611
102177
  codexPath: detection.found && "path" in detection ? detection.path : null,
101612
102178
  codexSource: detection.found ? detection.source : null,
@@ -101953,12 +102519,12 @@ async function auditBundleTargets(pluginRoot) {
101953
102519
  const broken = [];
101954
102520
  let referencedCount = 0;
101955
102521
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
101956
- const manifest = await readJson2(manifestPath);
101957
- if (manifest === null || !isRecord6(manifest["mcpServers"]))
102522
+ const manifest2 = await readJson2(manifestPath);
102523
+ if (manifest2 === null || !isRecord6(manifest2["mcpServers"]))
101958
102524
  continue;
101959
102525
  const manifestRoot = dirname32(manifestPath);
101960
102526
  const isRootManifest = resolve23(manifestRoot) === resolve23(pluginRoot);
101961
- for (const server2 of Object.values(manifest["mcpServers"])) {
102527
+ for (const server2 of Object.values(manifest2["mcpServers"])) {
101962
102528
  if (!isRecord6(server2) || !Array.isArray(server2["args"]))
101963
102529
  continue;
101964
102530
  for (const arg of server2["args"]) {
@@ -101972,11 +102538,11 @@ async function auditBundleTargets(pluginRoot) {
101972
102538
  }
101973
102539
  }
101974
102540
  for (const hookManifestPath of await findHookManifestPaths(pluginRoot)) {
101975
- const manifest = await readJson2(hookManifestPath);
101976
- if (manifest === null)
102541
+ const manifest2 = await readJson2(hookManifestPath);
102542
+ if (manifest2 === null)
101977
102543
  continue;
101978
102544
  const commands2 = [];
101979
- collectHookCommands(manifest, commands2);
102545
+ collectHookCommands(manifest2, commands2);
101980
102546
  const hookPluginRoot = dirname32(dirname32(hookManifestPath));
101981
102547
  for (const command of commands2) {
101982
102548
  for (const relativePath of extractPluginRootPaths(command)) {