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
package/dist/cli/index.js CHANGED
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "oh-my-opencode",
2148
- version: "4.18.2",
2148
+ version: "4.19.1",
2149
2149
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -2255,7 +2255,7 @@ var init_package = __esm(() => {
2255
2255
  "install:codex-dev": "bun run script/build-codex-install.ts && bun run script/install-codex-dev.ts",
2256
2256
  "build:codex-plugin": "npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build",
2257
2257
  "build:senpi-plugin": "bun run build:lsp-daemon && bun run build:senpi-plugin:stage",
2258
- "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",
2258
+ "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",
2259
2259
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
2260
2260
  "build:shared-skills-assets": "bun run build:materialize-frontend && rm -rf dist/skills && cp -R packages/shared-skills/skills dist/skills",
2261
2261
  "build:lsp-tools-mcp": "npm --prefix packages/lsp-tools-mcp ci && npm --prefix packages/lsp-tools-mcp run build",
@@ -2357,18 +2357,18 @@ var init_package = __esm(() => {
2357
2357
  typescript: "^6.0.3"
2358
2358
  },
2359
2359
  optionalDependencies: {
2360
- "oh-my-opencode-darwin-arm64": "4.18.2",
2361
- "oh-my-opencode-darwin-x64": "4.18.2",
2362
- "oh-my-opencode-darwin-x64-baseline": "4.18.2",
2363
- "oh-my-opencode-linux-arm64": "4.18.2",
2364
- "oh-my-opencode-linux-arm64-musl": "4.18.2",
2365
- "oh-my-opencode-linux-x64": "4.18.2",
2366
- "oh-my-opencode-linux-x64-baseline": "4.18.2",
2367
- "oh-my-opencode-linux-x64-musl": "4.18.2",
2368
- "oh-my-opencode-linux-x64-musl-baseline": "4.18.2",
2369
- "oh-my-opencode-windows-arm64": "4.18.2",
2370
- "oh-my-opencode-windows-x64": "4.18.2",
2371
- "oh-my-opencode-windows-x64-baseline": "4.18.2"
2360
+ "oh-my-opencode-darwin-arm64": "4.19.1",
2361
+ "oh-my-opencode-darwin-x64": "4.19.1",
2362
+ "oh-my-opencode-darwin-x64-baseline": "4.19.1",
2363
+ "oh-my-opencode-linux-arm64": "4.19.1",
2364
+ "oh-my-opencode-linux-arm64-musl": "4.19.1",
2365
+ "oh-my-opencode-linux-x64": "4.19.1",
2366
+ "oh-my-opencode-linux-x64-baseline": "4.19.1",
2367
+ "oh-my-opencode-linux-x64-musl": "4.19.1",
2368
+ "oh-my-opencode-linux-x64-musl-baseline": "4.19.1",
2369
+ "oh-my-opencode-windows-arm64": "4.19.1",
2370
+ "oh-my-opencode-windows-x64": "4.19.1",
2371
+ "oh-my-opencode-windows-x64-baseline": "4.19.1"
2372
2372
  },
2373
2373
  overrides: {
2374
2374
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -7426,6 +7426,7 @@ var init_env = __esm(() => {
7426
7426
  SAFE_CODEGRAPH_RUNTIME_ENV_KEYS = new Set([
7427
7427
  "CODEGRAPH_ALLOW_UNSAFE_NODE",
7428
7428
  "CODEGRAPH_BIN",
7429
+ "CODEGRAPH_DAEMON_IDLE_TIMEOUT_MS",
7429
7430
  "CODEGRAPH_FAKE_LOG",
7430
7431
  "CODEGRAPH_NO_DAEMON",
7431
7432
  "CODEGRAPH_NODE_BIN",
@@ -7441,6 +7442,9 @@ var init_workspace = () => {};
7441
7442
  // packages/utils/src/codegraph/guidance.ts
7442
7443
  var init_guidance = () => {};
7443
7444
 
7445
+ // packages/utils/src/codegraph/manifest.ts
7446
+ var init_manifest = () => {};
7447
+
7444
7448
  // packages/utils/src/codegraph/node-support.ts
7445
7449
  function evaluateCodegraphNodeSupport(options = {}) {
7446
7450
  const nodeVersion = options.nodeVersion ?? process.versions.node;
@@ -7569,6 +7573,7 @@ var init_resolve2 = __esm(() => {
7569
7573
  var init_codegraph = __esm(() => {
7570
7574
  init_env();
7571
7575
  init_guidance();
7576
+ init_manifest();
7572
7577
  init_provision();
7573
7578
  init_process_sweep();
7574
7579
  init_resolve2();
@@ -7747,7 +7752,7 @@ function migrateModelVersions(configs, appliedMigrations) {
7747
7752
  var MODEL_VERSION_MAP, CURRENT_USER_SELECTABLE_MODELS;
7748
7753
  var init_model_versions = __esm(() => {
7749
7754
  MODEL_VERSION_MAP = {
7750
- "anthropic/claude-opus-4-4": "anthropic/claude-opus-4-7"
7755
+ "anthropic/claude-opus-4-4": "anthropic/claude-opus-4-8"
7751
7756
  };
7752
7757
  CURRENT_USER_SELECTABLE_MODELS = new Set([
7753
7758
  "anthropic/claude-opus-4-5",
@@ -9195,25 +9200,25 @@ var init_agent_model_requirements = __esm(() => {
9195
9200
  fallbackChain: [
9196
9201
  {
9197
9202
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9198
- model: "claude-opus-4-7",
9203
+ model: "claude-opus-4-8",
9199
9204
  variant: "max"
9200
9205
  },
9201
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9202
- { providers: ["kimi-for-coding"], model: "k2p5" },
9203
9206
  {
9204
9207
  providers: [
9208
+ "opencode-go",
9209
+ "kimi-for-coding",
9210
+ "moonshotai",
9205
9211
  "opencode",
9212
+ "vercel",
9206
9213
  "bailian-coding-plan",
9207
- "moonshotai",
9208
9214
  "moonshotai-cn",
9209
9215
  "firmware",
9210
9216
  "ollama-cloud",
9211
- "aihubmix",
9212
- "vercel"
9217
+ "aihubmix"
9213
9218
  ],
9214
- model: "kimi-k2.5"
9219
+ model: "kimi-k3"
9215
9220
  },
9216
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
9221
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "medium" },
9217
9222
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9218
9223
  { providers: ["opencode"], model: "big-pickle" }
9219
9224
  ],
@@ -9222,13 +9227,8 @@ var init_agent_model_requirements = __esm(() => {
9222
9227
  hephaestus: {
9223
9228
  fallbackChain: [
9224
9229
  {
9225
- providers: ["openai", "github-copilot", "vercel"],
9230
+ providers: ["openai", "github-copilot", "vercel", "opencode"],
9226
9231
  model: "gpt-5.6-sol",
9227
- variant: "high"
9228
- },
9229
- {
9230
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9231
- model: "gpt-5.5",
9232
9232
  variant: "medium"
9233
9233
  }
9234
9234
  ],
@@ -9238,8 +9238,13 @@ var init_agent_model_requirements = __esm(() => {
9238
9238
  oracle: {
9239
9239
  fallbackChain: [
9240
9240
  {
9241
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9242
- model: "gpt-5.5",
9241
+ providers: ["openai", "opencode", "vercel"],
9242
+ model: "gpt-5.6-sol",
9243
+ variant: "xhigh"
9244
+ },
9245
+ {
9246
+ providers: ["github-copilot"],
9247
+ model: "gpt-5.6-sol",
9243
9248
  variant: "high"
9244
9249
  },
9245
9250
  {
@@ -9249,7 +9254,7 @@ var init_agent_model_requirements = __esm(() => {
9249
9254
  },
9250
9255
  {
9251
9256
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9252
- model: "claude-opus-4-7",
9257
+ model: "claude-opus-4-8",
9253
9258
  variant: "max"
9254
9259
  },
9255
9260
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
@@ -9281,8 +9286,8 @@ var init_agent_model_requirements = __esm(() => {
9281
9286
  },
9282
9287
  "multimodal-looker": {
9283
9288
  fallbackChain: [
9284
- { providers: ["openai", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
9285
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9289
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "low" },
9290
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9286
9291
  { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" },
9287
9292
  { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }
9288
9293
  ]
@@ -9291,12 +9296,12 @@ var init_agent_model_requirements = __esm(() => {
9291
9296
  fallbackChain: [
9292
9297
  {
9293
9298
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9294
- model: "claude-opus-4-7",
9299
+ model: "claude-opus-4-8",
9295
9300
  variant: "max"
9296
9301
  },
9297
9302
  {
9298
9303
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9299
- model: "gpt-5.5",
9304
+ model: "gpt-5.6-sol",
9300
9305
  variant: "high"
9301
9306
  },
9302
9307
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
@@ -9314,38 +9319,43 @@ var init_agent_model_requirements = __esm(() => {
9314
9319
  },
9315
9320
  {
9316
9321
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9317
- model: "claude-opus-4-7",
9322
+ model: "claude-opus-4-8",
9318
9323
  variant: "max"
9319
9324
  },
9320
9325
  {
9321
9326
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9322
- model: "gpt-5.5",
9323
- variant: "high"
9327
+ model: "gpt-5.6-sol",
9328
+ variant: "medium"
9324
9329
  },
9325
9330
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9326
- { providers: ["kimi-for-coding"], model: "k2p5" }
9331
+ { providers: ["kimi-for-coding"], model: "kimi-k3" }
9327
9332
  ]
9328
9333
  },
9329
9334
  momus: {
9330
9335
  fallbackChain: [
9331
9336
  {
9332
9337
  providers: ["openai", "vercel"],
9333
- model: "gpt-5.6-sol",
9334
- variant: "xhigh"
9338
+ model: "gpt-5.6-terra",
9339
+ variant: "high"
9335
9340
  },
9336
9341
  {
9337
9342
  providers: ["github-copilot"],
9338
- model: "gpt-5.6-sol",
9343
+ model: "gpt-5.6-terra",
9339
9344
  variant: "high"
9340
9345
  },
9341
9346
  {
9342
- providers: ["openai", "github-copilot", "opencode", "vercel"],
9343
- model: "gpt-5.5",
9347
+ providers: ["openai", "opencode", "vercel"],
9348
+ model: "gpt-5.6-sol",
9344
9349
  variant: "xhigh"
9345
9350
  },
9351
+ {
9352
+ providers: ["github-copilot"],
9353
+ model: "gpt-5.6-sol",
9354
+ variant: "high"
9355
+ },
9346
9356
  {
9347
9357
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9348
- model: "claude-opus-4-7",
9358
+ model: "claude-opus-4-8",
9349
9359
  variant: "max"
9350
9360
  },
9351
9361
  {
@@ -9359,10 +9369,10 @@ var init_agent_model_requirements = __esm(() => {
9359
9369
  atlas: {
9360
9370
  fallbackChain: [
9361
9371
  { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" },
9362
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9372
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9363
9373
  {
9364
9374
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9365
- model: "gpt-5.5",
9375
+ model: "gpt-5.6-sol",
9366
9376
  variant: "medium"
9367
9377
  },
9368
9378
  { providers: ["opencode-go", "vercel"], model: "minimax-m3" },
@@ -9373,10 +9383,10 @@ var init_agent_model_requirements = __esm(() => {
9373
9383
  "sisyphus-junior": {
9374
9384
  fallbackChain: [
9375
9385
  { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" },
9376
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9386
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9377
9387
  {
9378
9388
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9379
- model: "gpt-5.5",
9389
+ model: "gpt-5.6-sol",
9380
9390
  variant: "medium"
9381
9391
  },
9382
9392
  { providers: ["opencode-go", "vercel"], model: "minimax-m3" },
@@ -9402,11 +9412,11 @@ var init_category_model_requirements = __esm(() => {
9402
9412
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9403
9413
  {
9404
9414
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9405
- model: "claude-opus-4-7",
9415
+ model: "claude-opus-4-8",
9406
9416
  variant: "max"
9407
9417
  },
9408
9418
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9409
- { providers: ["kimi-for-coding"], model: "k2p5" }
9419
+ { providers: ["kimi-for-coding"], model: "kimi-k3" }
9410
9420
  ]
9411
9421
  },
9412
9422
  ultrabrain: {
@@ -9423,7 +9433,7 @@ var init_category_model_requirements = __esm(() => {
9423
9433
  },
9424
9434
  {
9425
9435
  providers: ["openai", "opencode", "vercel"],
9426
- model: "gpt-5.5",
9436
+ model: "gpt-5.6-sol",
9427
9437
  variant: "xhigh"
9428
9438
  },
9429
9439
  {
@@ -9433,7 +9443,7 @@ var init_category_model_requirements = __esm(() => {
9433
9443
  },
9434
9444
  {
9435
9445
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9436
- model: "claude-opus-4-7",
9446
+ model: "claude-opus-4-8",
9437
9447
  variant: "max"
9438
9448
  },
9439
9449
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
@@ -9458,12 +9468,12 @@ var init_category_model_requirements = __esm(() => {
9458
9468
  },
9459
9469
  {
9460
9470
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9461
- model: "gpt-5.5",
9471
+ model: "gpt-5.6-sol",
9462
9472
  variant: "medium"
9463
9473
  },
9464
9474
  {
9465
9475
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9466
- model: "claude-opus-4-7",
9476
+ model: "claude-opus-4-8",
9467
9477
  variant: "max"
9468
9478
  },
9469
9479
  {
@@ -9471,7 +9481,7 @@ var init_category_model_requirements = __esm(() => {
9471
9481
  model: "gemini-3.1-pro",
9472
9482
  variant: "high"
9473
9483
  },
9474
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9484
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9475
9485
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
9476
9486
  ]
9477
9487
  },
@@ -9484,11 +9494,11 @@ var init_category_model_requirements = __esm(() => {
9484
9494
  },
9485
9495
  {
9486
9496
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9487
- model: "claude-opus-4-7",
9497
+ model: "claude-opus-4-8",
9488
9498
  variant: "max"
9489
9499
  },
9490
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" },
9491
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9500
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.6-sol", variant: "high" },
9501
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9492
9502
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
9493
9503
  ]
9494
9504
  },
@@ -9530,10 +9540,10 @@ var init_category_model_requirements = __esm(() => {
9530
9540
  },
9531
9541
  {
9532
9542
  providers: ["openai", "opencode", "vercel"],
9533
- model: "gpt-5.5",
9543
+ model: "gpt-5.6-sol",
9534
9544
  variant: "medium"
9535
9545
  },
9536
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9546
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9537
9547
  {
9538
9548
  providers: ["google", "github-copilot", "opencode", "vercel"],
9539
9549
  model: "gemini-3-flash"
@@ -9547,30 +9557,29 @@ var init_category_model_requirements = __esm(() => {
9547
9557
  fallbackChain: [
9548
9558
  {
9549
9559
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9550
- model: "claude-opus-4-7",
9560
+ model: "claude-opus-4-8",
9551
9561
  variant: "max"
9552
9562
  },
9553
9563
  {
9554
9564
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9555
- model: "gpt-5.5",
9565
+ model: "gpt-5.6-sol",
9556
9566
  variant: "high"
9557
9567
  },
9558
9568
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
9559
- { providers: ["kimi-for-coding"], model: "k2p5" },
9569
+ { providers: ["kimi-for-coding"], model: "kimi-k3" },
9560
9570
  { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
9561
- { providers: ["opencode", "bailian-coding-plan", "vercel"], model: "kimi-k2.5" },
9562
9571
  {
9563
9572
  providers: [
9564
9573
  "opencode",
9565
9574
  "bailian-coding-plan",
9575
+ "vercel",
9566
9576
  "moonshotai",
9567
9577
  "moonshotai-cn",
9568
9578
  "firmware",
9569
9579
  "ollama-cloud",
9570
- "aihubmix",
9571
- "vercel"
9580
+ "aihubmix"
9572
9581
  ],
9573
- model: "kimi-k2.5"
9582
+ model: "kimi-k3"
9574
9583
  }
9575
9584
  ]
9576
9585
  },
@@ -9580,7 +9589,7 @@ var init_category_model_requirements = __esm(() => {
9580
9589
  providers: ["google", "github-copilot", "opencode", "vercel"],
9581
9590
  model: "gemini-3-flash"
9582
9591
  },
9583
- { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
9592
+ { providers: ["opencode-go", "vercel"], model: "kimi-k3" },
9584
9593
  {
9585
9594
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9586
9595
  model: "claude-sonnet-4-6"
@@ -10005,7 +10014,7 @@ var CLAUDE_VERSION_DOT, GEMINI_31_PRO_PREVIEW, GEMINI_3_FLASH_PREVIEW;
10005
10014
  var init_provider_model_id_transform = __esm(() => {
10006
10015
  CLAUDE_VERSION_DOT = /claude-(\w+)-(\d+)-(\d+)/g;
10007
10016
  GEMINI_31_PRO_PREVIEW = /gemini-3\.1-pro(?!-)/g;
10008
- GEMINI_3_FLASH_PREVIEW = /gemini-3-flash(?!-)/g;
10017
+ GEMINI_3_FLASH_PREVIEW = /(?<!antigravity-)gemini-3-flash(?!-)/g;
10009
10018
  });
10010
10019
 
10011
10020
  // packages/model-core/src/known-variants.ts
@@ -10098,6 +10107,21 @@ var init_runtime_fallback_model = () => {};
10098
10107
  var SUPPLEMENTAL_MODEL_CAPABILITIES;
10099
10108
  var init_supplemental_entries = __esm(() => {
10100
10109
  SUPPLEMENTAL_MODEL_CAPABILITIES = {
10110
+ "kimi-k3": {
10111
+ id: "kimi-k3",
10112
+ family: "kimi",
10113
+ reasoning: true,
10114
+ temperature: true,
10115
+ toolCall: true,
10116
+ modalities: {
10117
+ input: ["text", "image", "video"],
10118
+ output: ["text"]
10119
+ },
10120
+ limit: {
10121
+ context: 262144,
10122
+ output: 262144
10123
+ }
10124
+ },
10101
10125
  "kimi-k2.6": {
10102
10126
  id: "kimi-k2.6",
10103
10127
  family: "kimi",
@@ -10785,7 +10809,7 @@ var init_anthropic_categories = __esm(() => {
10785
10809
  ANTHROPIC_CATEGORIES = [
10786
10810
  {
10787
10811
  name: "unspecified-high",
10788
- config: { model: "anthropic/claude-opus-4-7", variant: "max" },
10812
+ config: { model: "anthropic/claude-opus-4-8", variant: "max" },
10789
10813
  description: "Tasks that don't fit other categories, high effort required",
10790
10814
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND
10791
10815
  }
@@ -10943,7 +10967,7 @@ var init_kimi_categories = __esm(() => {
10943
10967
  KIMI_CATEGORIES = [
10944
10968
  {
10945
10969
  name: "writing",
10946
- config: { model: "kimi-for-coding/k2p5" },
10970
+ config: { model: "kimi-for-coding/kimi-k3" },
10947
10971
  description: "Documentation, prose, technical writing",
10948
10972
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
10949
10973
  }
@@ -65172,7 +65196,7 @@ var init_claude_model_mapper = __esm(() => {
65172
65196
  init_model_normalization2();
65173
65197
  CLAUDE_CODE_ALIAS_MAP = new Map([
65174
65198
  ["sonnet", `${ANTHROPIC_PREFIX}claude-sonnet-4-6`],
65175
- ["opus", `${ANTHROPIC_PREFIX}claude-opus-4-7`],
65199
+ ["opus", `${ANTHROPIC_PREFIX}claude-opus-4-8`],
65176
65200
  ["haiku", `${ANTHROPIC_PREFIX}claude-haiku-4-5`]
65177
65201
  ]);
65178
65202
  });
@@ -65924,10 +65948,10 @@ var init_openai_only_model_catalog = __esm(() => {
65924
65948
  librarian: { model: "openai/gpt-5.4-mini-fast" }
65925
65949
  };
65926
65950
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
65927
- artistry: { model: "openai/gpt-5.5", variant: "xhigh" },
65951
+ artistry: { model: "openai/gpt-5.6-sol", variant: "xhigh" },
65928
65952
  quick: { model: "openai/gpt-5.4-mini" },
65929
- "visual-engineering": { model: "openai/gpt-5.5", variant: "high" },
65930
- writing: { model: "openai/gpt-5.5", variant: "medium" }
65953
+ "visual-engineering": { model: "openai/gpt-5.6-sol", variant: "high" },
65954
+ writing: { model: "openai/gpt-5.6-sol", variant: "medium" }
65931
65955
  };
65932
65956
  });
65933
65957
 
@@ -72641,7 +72665,7 @@ var package_default2;
72641
72665
  var init_package2 = __esm(() => {
72642
72666
  package_default2 = {
72643
72667
  name: "@oh-my-opencode/omo-codex",
72644
- version: "4.18.2",
72668
+ version: "4.19.1",
72645
72669
  type: "module",
72646
72670
  private: true,
72647
72671
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75029,6 +75053,7 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
75029
75053
  const packageJsonPaths = [];
75030
75054
  await collectPackageJsonPaths(pluginRoot, pluginRoot, packageJsonPaths);
75031
75055
  const packageLock = await readPackageLock(pluginRoot);
75056
+ let rewroteAnyPackageJson = false;
75032
75057
  for (const packageJsonPath of packageJsonPaths) {
75033
75058
  const raw = await readFile5(packageJsonPath, "utf8");
75034
75059
  const parsed = JSON.parse(raw);
@@ -75064,13 +75089,16 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
75064
75089
  changed = true;
75065
75090
  }
75066
75091
  }
75067
- if (changed)
75092
+ if (changed) {
75068
75093
  await writeFile2(packageJsonPath, `${JSON.stringify(parsed, null, "\t")}
75069
75094
  `);
75095
+ rewroteAnyPackageJson = true;
75096
+ }
75070
75097
  }
75071
75098
  if (packageLock.changed)
75072
75099
  await writeFile2(packageLock.path, `${JSON.stringify(packageLock.value, null, "\t")}
75073
75100
  `);
75101
+ return rewroteAnyPackageJson;
75074
75102
  }
75075
75103
  async function readPackageLock(pluginRoot) {
75076
75104
  const path7 = join30(pluginRoot, "package-lock.json");
@@ -75376,10 +75404,11 @@ async function installCachedPlugin(input) {
75376
75404
  await rm4(tempPath, { recursive: true, force: true });
75377
75405
  try {
75378
75406
  await copyDirectory(input.sourcePath, tempPath);
75379
- await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75407
+ const rewroteLocalFileDependencies = await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75380
75408
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75381
75409
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75382
- await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75410
+ const installArgs = rewroteLocalFileDependencies ? ["install", "--omit=dev", "--no-audit", "--no-fund"] : ["ci", "--omit=dev"];
75411
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, installArgs);
75383
75412
  await removeCachedManagedNpmBinShims(tempPath);
75384
75413
  if (input.buildSource === false)
75385
75414
  await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
@@ -75683,9 +75712,16 @@ function findTomlSection(config, header) {
75683
75712
  const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75684
75713
  let offset = 0;
75685
75714
  let start = -1;
75715
+ let multilineQuote = null;
75686
75716
  for (const line of lines) {
75687
75717
  if (line.length === 0)
75688
75718
  break;
75719
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75720
+ multilineQuote = multilineScan.nextQuote;
75721
+ if (multilineScan.wasInside) {
75722
+ offset += line.length;
75723
+ continue;
75724
+ }
75689
75725
  const trimmed = line.trim();
75690
75726
  if (start === -1) {
75691
75727
  if (tomlTableHeaderMatches(trimmed, headerLine, targetHeaderPath))
@@ -75700,8 +75736,37 @@ function findTomlSection(config, header) {
75700
75736
  return { start, end: config.length, text: config.slice(start) };
75701
75737
  }
75702
75738
  function replaceOrInsertSetting(config, section, key, value) {
75703
- const linePattern = new RegExp(`^[ \\t]*${escapeRegExp(key)}[ \\t]*=.*$`, "m");
75704
- const replacement = linePattern.test(section.text) ? section.text.replace(linePattern, `${key} = ${value}`) : insertSetting(section.text, key, value);
75739
+ const targetPath = parseTomlDottedKey(key);
75740
+ if (!targetPath)
75741
+ return config;
75742
+ const lines = section.text.match(/[^\n]*\n?|$/g) ?? [];
75743
+ let offset = 0;
75744
+ let multilineQuote = null;
75745
+ for (const line of lines) {
75746
+ if (line.length === 0)
75747
+ break;
75748
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75749
+ multilineQuote = multilineScan.nextQuote;
75750
+ if (multilineScan.wasInside) {
75751
+ offset += line.length;
75752
+ continue;
75753
+ }
75754
+ const assignmentIndex = findUnquotedAssignment(line);
75755
+ if (assignmentIndex < 0) {
75756
+ offset += line.length;
75757
+ continue;
75758
+ }
75759
+ const settingPath = parseTomlDottedKey(line.slice(0, assignmentIndex).trim());
75760
+ if (!settingPath || !tomlPathMatches(settingPath, targetPath)) {
75761
+ offset += line.length;
75762
+ continue;
75763
+ }
75764
+ const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
75765
+ const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(section.text, offset + line.length, multilineScan.nextQuote) : offset + line.length;
75766
+ const sectionReplacement = section.text.slice(0, offset) + replacement2 + section.text.slice(assignmentEnd);
75767
+ return config.slice(0, section.start) + sectionReplacement + config.slice(section.end);
75768
+ }
75769
+ const replacement = insertSetting(section.text, key, value);
75705
75770
  return config.slice(0, section.start) + replacement + config.slice(section.end);
75706
75771
  }
75707
75772
  function removeSetting(config, section, key) {
@@ -75721,6 +75786,50 @@ function replaceOrInsertRootSetting(config, key, value) {
75721
75786
  return replacement;
75722
75787
  return `${replacement.trimEnd()}
75723
75788
 
75789
+ ${suffix.trimStart()}`;
75790
+ }
75791
+ function replaceOrInsertRootDottedSetting(config, keyPath, value) {
75792
+ const targetPath = parseTomlDottedKey(keyPath);
75793
+ if (!targetPath)
75794
+ return config;
75795
+ const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75796
+ let offset = 0;
75797
+ let multilineQuote = null;
75798
+ for (const line of lines) {
75799
+ if (line.length === 0)
75800
+ break;
75801
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75802
+ multilineQuote = multilineScan.nextQuote;
75803
+ if (multilineScan.wasInside) {
75804
+ offset += line.length;
75805
+ continue;
75806
+ }
75807
+ if (isTomlTableHeaderLine(line))
75808
+ break;
75809
+ const assignmentIndex = findUnquotedAssignment(line);
75810
+ if (assignmentIndex < 0) {
75811
+ offset += line.length;
75812
+ continue;
75813
+ }
75814
+ const settingPath = parseTomlDottedKey(line.slice(0, assignmentIndex).trim());
75815
+ if (!settingPath || !tomlPathMatches(settingPath, targetPath)) {
75816
+ offset += line.length;
75817
+ continue;
75818
+ }
75819
+ const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
75820
+ const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(config, offset + line.length, multilineScan.nextQuote) : offset + line.length;
75821
+ return config.slice(0, offset) + replacement2 + config.slice(assignmentEnd);
75822
+ }
75823
+ const sectionStart = findFirstTableStart(config);
75824
+ const root = config.slice(0, sectionStart).trimEnd();
75825
+ const suffix = config.slice(sectionStart);
75826
+ const replacement = `${root}${root.length > 0 ? `
75827
+ ` : ""}${keyPath} = ${value}
75828
+ `;
75829
+ if (suffix.length === 0)
75830
+ return replacement;
75831
+ return `${replacement.trimEnd()}
75832
+
75724
75833
  ${suffix.trimStart()}`;
75725
75834
  }
75726
75835
  function appendBlock(config, block) {
@@ -75733,9 +75842,16 @@ function appendBlock(config, block) {
75733
75842
  function findFirstTableStart(config) {
75734
75843
  const lines = config.match(/[^\n]*\n?|$/g) ?? [];
75735
75844
  let offset = 0;
75845
+ let multilineQuote = null;
75736
75846
  for (const line of lines) {
75737
75847
  if (line.length === 0)
75738
75848
  break;
75849
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
75850
+ multilineQuote = multilineScan.nextQuote;
75851
+ if (multilineScan.wasInside) {
75852
+ offset += line.length;
75853
+ continue;
75854
+ }
75739
75855
  if (isTomlTableHeaderLine(line))
75740
75856
  return offset;
75741
75857
  offset += line.length;
@@ -75773,6 +75889,131 @@ function isTomlTableHeaderLine(line) {
75773
75889
  const normalizedLine = stripUnquotedInlineComment(line).trim();
75774
75890
  return normalizedLine.startsWith("[") && normalizedLine.endsWith("]");
75775
75891
  }
75892
+ function scanTomlMultilineLine(line, currentQuote) {
75893
+ if (currentQuote) {
75894
+ return {
75895
+ wasInside: true,
75896
+ nextQuote: findTomlMultilineDelimiter(line, currentQuote, 0) === -1 ? currentQuote : null
75897
+ };
75898
+ }
75899
+ let quote = null;
75900
+ let index = 0;
75901
+ while (index < line.length) {
75902
+ const char = line[index];
75903
+ if (quote === '"') {
75904
+ if (char === "\\") {
75905
+ index += 2;
75906
+ continue;
75907
+ }
75908
+ if (char === '"')
75909
+ quote = null;
75910
+ index += 1;
75911
+ continue;
75912
+ }
75913
+ if (quote === "'") {
75914
+ if (char === "'")
75915
+ quote = null;
75916
+ index += 1;
75917
+ continue;
75918
+ }
75919
+ if (char === "#")
75920
+ break;
75921
+ const delimiter2 = line.startsWith('"""', index) ? '"""' : line.startsWith("'''", index) ? "'''" : null;
75922
+ if (delimiter2) {
75923
+ const closingIndex = findTomlMultilineDelimiter(line, delimiter2, index + delimiter2.length);
75924
+ return { wasInside: false, nextQuote: closingIndex === -1 ? delimiter2 : null };
75925
+ }
75926
+ if (char === '"' || char === "'")
75927
+ quote = char;
75928
+ index += 1;
75929
+ }
75930
+ return { wasInside: false, nextQuote: null };
75931
+ }
75932
+ function findTomlMultilineDelimiter(line, delimiter2, startIndex) {
75933
+ let index = line.indexOf(delimiter2, startIndex);
75934
+ while (index !== -1) {
75935
+ if (delimiter2 === "'''" || countPrecedingBackslashes(line, index) % 2 === 0)
75936
+ return index;
75937
+ index = line.indexOf(delimiter2, index + 1);
75938
+ }
75939
+ return -1;
75940
+ }
75941
+ function countPrecedingBackslashes(line, index) {
75942
+ let count = 0;
75943
+ let cursor = index - 1;
75944
+ while (cursor >= 0 && line[cursor] === "\\") {
75945
+ count += 1;
75946
+ cursor -= 1;
75947
+ }
75948
+ return count;
75949
+ }
75950
+ function findUnquotedAssignment(line) {
75951
+ return findUnquotedCharacter(line, "=", 0);
75952
+ }
75953
+ function findUnquotedComment(line, startIndex) {
75954
+ return findUnquotedCharacter(line, "#", startIndex);
75955
+ }
75956
+ function findUnquotedCharacter(line, target, startIndex) {
75957
+ let quote = null;
75958
+ let index = startIndex;
75959
+ while (index < line.length) {
75960
+ const char = line[index];
75961
+ if (quote === '"') {
75962
+ if (char === "\\") {
75963
+ index += 2;
75964
+ continue;
75965
+ }
75966
+ if (char === '"')
75967
+ quote = null;
75968
+ index += 1;
75969
+ continue;
75970
+ }
75971
+ if (quote === "'") {
75972
+ if (char === "'")
75973
+ quote = null;
75974
+ index += 1;
75975
+ continue;
75976
+ }
75977
+ if (char === '"' || char === "'") {
75978
+ quote = char;
75979
+ index += 1;
75980
+ continue;
75981
+ }
75982
+ if (char === target)
75983
+ return index;
75984
+ if (char === "#")
75985
+ return -1;
75986
+ index += 1;
75987
+ }
75988
+ return -1;
75989
+ }
75990
+ function tomlPathMatches(candidate, target) {
75991
+ return candidate.length === target.length && candidate.every((part, index) => part === target[index]);
75992
+ }
75993
+ function replaceTomlAssignmentValue(line, assignmentIndex, value) {
75994
+ const newline = line.endsWith(`
75995
+ `) ? `
75996
+ ` : "";
75997
+ const lineBody = newline ? line.slice(0, -1) : line;
75998
+ const commentIndex = findUnquotedComment(lineBody, assignmentIndex + 1);
75999
+ const comment = commentIndex === -1 ? "" : ` ${lineBody.slice(commentIndex).trimStart()}`;
76000
+ return `${lineBody.slice(0, assignmentIndex + 1)} ${value}${comment}${newline}`;
76001
+ }
76002
+ function findTomlMultilineValueEnd(text, startOffset, quote) {
76003
+ const lines = text.slice(startOffset).match(/[^\n]*\n?|$/g) ?? [];
76004
+ let offset = startOffset;
76005
+ let currentQuote = quote;
76006
+ for (const line of lines) {
76007
+ if (line.length === 0)
76008
+ break;
76009
+ const scan = scanTomlMultilineLine(line, currentQuote);
76010
+ currentQuote = scan.nextQuote;
76011
+ offset += line.length;
76012
+ if (currentQuote === null)
76013
+ return offset;
76014
+ }
76015
+ return text.length;
76016
+ }
75776
76017
  function stripUnquotedInlineComment(line) {
75777
76018
  let quote = null;
75778
76019
  let index = 0;
@@ -76103,13 +76344,137 @@ function delay(milliseconds) {
76103
76344
  return new Promise((resolveDelay) => setTimeout(resolveDelay, milliseconds));
76104
76345
  }
76105
76346
 
76347
+ // packages/omo-codex/src/install/toml-setting-reader.ts
76348
+ function hasTomlSetting(config, keyPath) {
76349
+ const targetPath = parseTomlDottedKey(keyPath);
76350
+ if (!targetPath)
76351
+ return false;
76352
+ return hasTomlAssignment(config, (tablePath, settingPath) => {
76353
+ const fullPath = [...tablePath, ...settingPath];
76354
+ return fullPath.length === targetPath.length && fullPath.every((part, index) => part === targetPath[index]);
76355
+ });
76356
+ }
76357
+ function hasTomlRootDottedKeyPrefix(config, rootKey) {
76358
+ return hasTomlAssignment(config, (tablePath, settingPath) => tablePath.length === 0 && settingPath.length > 1 && settingPath[0] === rootKey);
76359
+ }
76360
+ function hasTomlAssignment(config, predicate) {
76361
+ let tablePath = [];
76362
+ let multilineQuote = null;
76363
+ for (const line of config.split(`
76364
+ `)) {
76365
+ const multilineScan = scanTomlMultilineLine(line, multilineQuote);
76366
+ multilineQuote = multilineScan.nextQuote;
76367
+ if (multilineScan.wasInside)
76368
+ continue;
76369
+ const normalizedLine = stripUnquotedInlineComment2(line).trim();
76370
+ if (normalizedLine.length === 0)
76371
+ continue;
76372
+ const headerPath = parseTomlTableHeader2(normalizedLine);
76373
+ if (headerPath) {
76374
+ tablePath = headerPath;
76375
+ continue;
76376
+ }
76377
+ if (isTomlTableHeaderLine2(normalizedLine)) {
76378
+ tablePath = null;
76379
+ continue;
76380
+ }
76381
+ if (!tablePath)
76382
+ continue;
76383
+ const assignmentIndex = findUnquotedAssignment2(normalizedLine);
76384
+ if (assignmentIndex < 0)
76385
+ continue;
76386
+ const settingPath = parseTomlDottedKey(normalizedLine.slice(0, assignmentIndex).trim());
76387
+ if (!settingPath)
76388
+ continue;
76389
+ if (predicate(tablePath, settingPath))
76390
+ return true;
76391
+ }
76392
+ return false;
76393
+ }
76394
+ function parseTomlTableHeader2(line) {
76395
+ if (!line.startsWith("[") || !line.endsWith("]") || line.startsWith("[["))
76396
+ return null;
76397
+ return parseTomlDottedKey(line.slice(1, -1).trim());
76398
+ }
76399
+ function isTomlTableHeaderLine2(line) {
76400
+ return line.startsWith("[") && line.endsWith("]");
76401
+ }
76402
+ function stripUnquotedInlineComment2(line) {
76403
+ let quote = null;
76404
+ let index = 0;
76405
+ while (index < line.length) {
76406
+ const char = line[index];
76407
+ if (quote === '"') {
76408
+ if (char === "\\") {
76409
+ index += 2;
76410
+ continue;
76411
+ }
76412
+ if (char === '"')
76413
+ quote = null;
76414
+ index += 1;
76415
+ continue;
76416
+ }
76417
+ if (quote === "'") {
76418
+ if (char === "'")
76419
+ quote = null;
76420
+ index += 1;
76421
+ continue;
76422
+ }
76423
+ if (char === '"' || char === "'") {
76424
+ quote = char;
76425
+ index += 1;
76426
+ continue;
76427
+ }
76428
+ if (char === "#")
76429
+ return line.slice(0, index);
76430
+ index += 1;
76431
+ }
76432
+ return line;
76433
+ }
76434
+ function findUnquotedAssignment2(line) {
76435
+ let quote = null;
76436
+ let index = 0;
76437
+ while (index < line.length) {
76438
+ const char = line[index];
76439
+ if (quote === '"') {
76440
+ if (char === "\\") {
76441
+ index += 2;
76442
+ continue;
76443
+ }
76444
+ if (char === '"')
76445
+ quote = null;
76446
+ index += 1;
76447
+ continue;
76448
+ }
76449
+ if (quote === "'") {
76450
+ if (char === "'")
76451
+ quote = null;
76452
+ index += 1;
76453
+ continue;
76454
+ }
76455
+ if (char === '"' || char === "'") {
76456
+ quote = char;
76457
+ index += 1;
76458
+ continue;
76459
+ }
76460
+ if (char === "=")
76461
+ return index;
76462
+ index += 1;
76463
+ }
76464
+ return -1;
76465
+ }
76466
+
76106
76467
  // packages/omo-codex/src/install/codex-config-features.ts
76107
76468
  function ensureFeatureEnabled(config, featureName) {
76108
76469
  const section = findTomlSection(config, "features");
76109
- if (!section)
76470
+ if (!section) {
76471
+ if (hasTomlRootDottedKeyPrefix(config, "features")) {
76472
+ return replaceOrInsertRootDottedSetting(config, `features.${featureName}`, "true");
76473
+ }
76110
76474
  return appendBlock(config, `[features]
76111
76475
  ${featureName} = true
76112
76476
  `);
76477
+ }
76113
76478
  return replaceOrInsertSetting(config, section, featureName, "true");
76114
76479
  }
76115
76480
 
@@ -76177,7 +76542,7 @@ function ensureAutonomousPermissions(config) {
76177
76542
  next = replaceOrInsertRootSetting(next, "sandbox_mode", JSON.stringify("danger-full-access"));
76178
76543
  next = replaceOrInsertRootSetting(next, "network_access", JSON.stringify("enabled"));
76179
76544
  for (const featureName of AUTONOMOUS_FEATURES) {
76180
- next = ensureFeatureEnabled2(next, featureName);
76545
+ next = ensureFeatureEnabled(next, featureName);
76181
76546
  }
76182
76547
  next = removeWindowsSandboxSetting(next);
76183
76548
  next = ensureNoticeEnabled(next, "hide_full_access_warning");
@@ -76195,14 +76560,6 @@ function ensureNoticeEnabled(config, key) {
76195
76560
  return appendNoticeBlock(config, key);
76196
76561
  return replaceOrInsertSetting(config, section, key, "true");
76197
76562
  }
76198
- function ensureFeatureEnabled2(config, key) {
76199
- const section = findTomlSection(config, "features");
76200
- if (section === null)
76201
- return appendBlock(config, `[features]
76202
- ${key} = true
76203
- `);
76204
- return replaceOrInsertSetting(config, section, key, "true");
76205
- }
76206
76563
  function appendNoticeBlock(config, key) {
76207
76564
  return appendBlock(config, `[notice]
76208
76565
  ${key} = true
@@ -76274,7 +76631,7 @@ function readStringArraySetting(sectionText, key) {
76274
76631
  const assignmentIndex = line.indexOf("=");
76275
76632
  if (assignmentIndex === -1)
76276
76633
  return null;
76277
- return parseTomlStringArray(stripUnquotedInlineComment2(line.slice(assignmentIndex + 1)).trim());
76634
+ return parseTomlStringArray(stripUnquotedInlineComment3(line.slice(assignmentIndex + 1)).trim());
76278
76635
  }
76279
76636
  return null;
76280
76637
  }
@@ -76318,7 +76675,7 @@ function parseTomlString(input, startIndex) {
76318
76675
  }
76319
76676
  return null;
76320
76677
  }
76321
- function stripUnquotedInlineComment2(line) {
76678
+ function stripUnquotedInlineComment3(line) {
76322
76679
  let quote = null;
76323
76680
  let index = 0;
76324
76681
  while (index < line.length) {
@@ -76532,24 +76889,27 @@ import { readFileSync as readFileSync13 } from "fs";
76532
76889
  import { dirname as dirname15, isAbsolute as isAbsolute8, join as join39 } from "path";
76533
76890
  var CODEX_AGENTS_HEADER = "agents";
76534
76891
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
76892
+ var CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY = `${CODEX_MULTI_AGENT_V2_HEADER}.max_concurrent_threads_per_session`;
76535
76893
  var CODEX_SUBAGENT_THREAD_LIMIT = 1000;
76894
+ var CODEX_MULTI_AGENT_V2_THREAD_LIMIT = 16;
76536
76895
  function ensureCodexMultiAgentV2Config(config, options = {}) {
76537
76896
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
76538
76897
  const v2Preferred = options.multiAgentVersion === "v2";
76539
76898
  const modelKnown = options.multiAgentVersion != null || readRootModel(featureFlag.config) !== null;
76540
76899
  const agentsConfig = v2Preferred ? removeAgentsMaxThreads(featureFlag.config) : modelKnown ? ensureAgentsMaxThreads(featureFlag.config) : raiseExistingAgentsMaxThreads(featureFlag.config);
76541
- const maxThreadsValue = CODEX_SUBAGENT_THREAD_LIMIT.toString();
76542
76900
  const preserveDisable = featureFlag.value === false && !v2Preferred;
76543
76901
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
76902
+ if (hasTomlSetting(featureConfig, CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY))
76903
+ return featureConfig;
76544
76904
  const section = findTomlSection(featureConfig, CODEX_MULTI_AGENT_V2_HEADER);
76545
76905
  if (!section) {
76546
76906
  const enabledSetting = preserveDisable ? `enabled = false
76547
76907
  ` : "";
76548
76908
  return appendBlock(featureConfig, `[${CODEX_MULTI_AGENT_V2_HEADER}]
76549
- ${enabledSetting}max_concurrent_threads_per_session = ${maxThreadsValue}
76909
+ ${enabledSetting}max_concurrent_threads_per_session = ${CODEX_MULTI_AGENT_V2_THREAD_LIMIT}
76550
76910
  `);
76551
76911
  }
76552
- return replaceOrInsertSetting(featureConfig, section, "max_concurrent_threads_per_session", maxThreadsValue);
76912
+ return replaceOrInsertSetting(featureConfig, section, "max_concurrent_threads_per_session", CODEX_MULTI_AGENT_V2_THREAD_LIMIT.toString());
76553
76913
  }
76554
76914
  function resolveCodexMultiAgentVersion(config, configPath) {
76555
76915
  const model = readRootModel(config);
@@ -76736,11 +77096,11 @@ async function trustedHookStatesForPlugin(input) {
76736
77096
  const manifestPath = join40(input.pluginRoot, ".codex-plugin", "plugin.json");
76737
77097
  if (!await exists(manifestPath))
76738
77098
  return [];
76739
- const manifest = JSON.parse(await readFile12(manifestPath, "utf8"));
76740
- if (!isPlainRecord3(manifest))
77099
+ const manifest2 = JSON.parse(await readFile12(manifestPath, "utf8"));
77100
+ if (!isPlainRecord3(manifest2))
76741
77101
  return [];
76742
77102
  const states = [];
76743
- for (const hookPath of hookManifestPaths2(manifest.hooks)) {
77103
+ for (const hookPath of hookManifestPaths2(manifest2.hooks)) {
76744
77104
  const hooksPath = join40(input.pluginRoot, hookPath);
76745
77105
  if (!await exists(hooksPath))
76746
77106
  continue;
@@ -76908,6 +77268,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76908
77268
  {
76909
77269
  previous: { model: "gpt-5.5", effort: "xhigh" },
76910
77270
  current: { model: "gpt-5.6-sol", effort: "ultra" }
77271
+ },
77272
+ {
77273
+ previous: { model: "gpt-5.6-sol", effort: "ultra" },
77274
+ current: { model: "gpt-5.6-terra", effort: "high" }
76911
77275
  }
76912
77276
  ]
76913
77277
  ],
@@ -76917,6 +77281,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76917
77281
  {
76918
77282
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
76919
77283
  current: { model: "gpt-5.6-sol", effort: "max" }
77284
+ },
77285
+ {
77286
+ previous: { model: "gpt-5.6-sol", effort: "max" },
77287
+ current: { model: "gpt-5.6-sol", effort: "high" }
76920
77288
  }
76921
77289
  ]
76922
77290
  ],
@@ -76926,6 +77294,37 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76926
77294
  {
76927
77295
  previous: { model: "gpt-5.6-sol", effort: "high" },
76928
77296
  current: { model: "gpt-5.6-luna", effort: "max" }
77297
+ },
77298
+ {
77299
+ previous: { model: "gpt-5.6-luna", effort: "max" },
77300
+ current: { model: "gpt-5.6-terra", effort: "high" }
77301
+ }
77302
+ ]
77303
+ ],
77304
+ [
77305
+ "lazycodex-worker-high",
77306
+ [
77307
+ {
77308
+ previous: { model: "gpt-5.6-sol", effort: "max" },
77309
+ current: { model: "gpt-5.6-sol", effort: "medium" }
77310
+ }
77311
+ ]
77312
+ ],
77313
+ [
77314
+ "lazycodex-code-reviewer",
77315
+ [
77316
+ {
77317
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
77318
+ current: { model: "gpt-5.6-terra", effort: "medium" }
77319
+ }
77320
+ ]
77321
+ ],
77322
+ [
77323
+ "lazycodex-clone-fidelity-reviewer",
77324
+ [
77325
+ {
77326
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
77327
+ current: { model: "gpt-5.6-terra", effort: "high" }
76929
77328
  }
76930
77329
  ]
76931
77330
  ],
@@ -76944,6 +77343,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
76944
77343
  {
76945
77344
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
76946
77345
  current: { model: "gpt-5.6-sol", effort: "high" }
77346
+ },
77347
+ {
77348
+ previous: { model: "gpt-5.6-sol", effort: "high" },
77349
+ current: { model: "gpt-5.6-sol", effort: "low" }
76947
77350
  }
76948
77351
  ]
76949
77352
  ]
@@ -77570,7 +77973,7 @@ function normalizeHookStatusVersion(version) {
77570
77973
 
77571
77974
  // packages/omo-codex/src/install/codex-process.ts
77572
77975
  init_bun_spawn_shim();
77573
- var WINDOWS_CMD_SHIM_COMMANDS = new Set(["npm", "npx"]);
77976
+ var WINDOWS_CMD_SHIM_COMMANDS = new Set(["codex", "npm", "npx"]);
77574
77977
  function resolveRunCommandInvocation(command, args, platform = process.platform) {
77575
77978
  if (platform !== "win32" || !WINDOWS_CMD_SHIM_COMMANDS.has(command.toLowerCase())) {
77576
77979
  return { command, args: [...args] };
@@ -78275,12 +78678,12 @@ async function runCodexInstaller(options = {}) {
78275
78678
  const agentConfigs = new Map;
78276
78679
  for (const entry of marketplace.plugins) {
78277
78680
  const sourcePath = resolvePluginSource(codexPackageRoot, entry, { pathOverride: "./plugin" });
78278
- const manifest = await readPluginManifest(sourcePath);
78279
- if (manifest.name !== entry.name) {
78280
- throw new Error(`plugin manifest name ${JSON.stringify(manifest.name)} does not match marketplace name ${JSON.stringify(entry.name)}`);
78681
+ const manifest2 = await readPluginManifest(sourcePath);
78682
+ if (manifest2.name !== entry.name) {
78683
+ throw new Error(`plugin manifest name ${JSON.stringify(manifest2.name)} does not match marketplace name ${JSON.stringify(entry.name)}`);
78281
78684
  }
78282
78685
  const version2 = resolveLazyCodexPluginVersion({
78283
- manifestVersion: manifest.version,
78686
+ manifestVersion: manifest2.version,
78284
78687
  marketplaceName: marketplace.name,
78285
78688
  pluginName: entry.name,
78286
78689
  distributionManifest,
@@ -78970,8 +79373,24 @@ import { promisify as promisify2 } from "util";
78970
79373
  var execFileAsync2 = promisify2(execFile4);
78971
79374
  var REQUIRED_PLUGIN_ARTIFACTS = [
78972
79375
  join58("extensions", "omo.js"),
79376
+ join58("skills", "ast-grep", "SKILL.md"),
79377
+ join58("skills", "coding-agent-sessions", "SKILL.md"),
79378
+ join58("skills", "debugging", "SKILL.md"),
79379
+ join58("skills", "frontend", "SKILL.md"),
79380
+ join58("skills", "git-master", "SKILL.md"),
79381
+ join58("skills", "init-deep", "SKILL.md"),
79382
+ join58("skills", "lsp-setup", "SKILL.md"),
79383
+ join58("skills", "programming", "SKILL.md"),
79384
+ join58("skills", "refactor", "SKILL.md"),
79385
+ join58("skills", "remove-ai-slops", "SKILL.md"),
79386
+ join58("skills", "review-work", "SKILL.md"),
79387
+ join58("skills", "start-work", "SKILL.md"),
79388
+ join58("skills", "ultimate-browsing", "SKILL.md"),
78973
79389
  join58("skills", "ultrawork", "SKILL.md"),
78974
79390
  join58("skills", "ulw-loop", "SKILL.md"),
79391
+ join58("skills", "ulw-plan", "SKILL.md"),
79392
+ join58("skills", "ulw-research", "SKILL.md"),
79393
+ join58("skills", "visual-qa", "SKILL.md"),
78975
79394
  join58("runtime", "lsp-daemon", "dist", "cli.js"),
78976
79395
  join58("runtime", "lsp-daemon", "dist", "index.js"),
78977
79396
  join58("runtime", "lsp-daemon", "dist", "index.d.ts"),
@@ -79025,6 +79444,7 @@ async function ensurePluginArtifacts(context) {
79025
79444
  throw new Error(`Packed omo-senpi plugin is missing required runtime artifacts at ${context.pluginPath}`);
79026
79445
  }
79027
79446
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "build-extension.mjs")], { cwd: context.repoRoot });
79447
+ await context.runCommand("node", [join58("packages", "omo-codex", "plugin", "scripts", "materialize-shared-upstreams.mjs")], { cwd: context.repoRoot });
79028
79448
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "sync-skills.mjs")], { cwd: context.repoRoot });
79029
79449
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "build-install.mjs")], { cwd: context.repoRoot });
79030
79450
  await context.runCommand("node", [join58(context.pluginPath, "scripts", "stage-lsp-daemon-runtime.mjs")], { cwd: context.repoRoot });
@@ -96654,7 +97074,8 @@ var BrowserAutomationProviderSchema = exports_external.enum([
96654
97074
  "playwright-cli"
96655
97075
  ]);
96656
97076
  var BrowserAutomationConfigSchema = exports_external.object({
96657
- provider: BrowserAutomationProviderSchema.default("playwright")
97077
+ provider: BrowserAutomationProviderSchema.default("playwright"),
97078
+ playwright_mcp_args: exports_external.array(exports_external.string()).optional()
96658
97079
  });
96659
97080
  // packages/omo-opencode/src/config/schema/categories.ts
96660
97081
  var CategoryConfigSchema = exports_external.object({
@@ -96705,7 +97126,9 @@ var ClaudeCodeConfigSchema = exports_external.object({
96705
97126
  var CodegraphConfigSchema = exports_external.object({
96706
97127
  auto_init: exports_external.boolean().default(true),
96707
97128
  auto_provision: exports_external.boolean().default(true),
97129
+ daemon: exports_external.boolean().default(false),
96708
97130
  enabled: exports_external.boolean().default(true),
97131
+ excluded_roots: exports_external.array(exports_external.string()).optional(),
96709
97132
  install_dir: exports_external.string().optional(),
96710
97133
  telemetry: exports_external.boolean().optional(),
96711
97134
  watch_debounce_ms: exports_external.number().nonnegative().optional()
@@ -96716,9 +97139,7 @@ var CommentCheckerConfigSchema = exports_external.object({
96716
97139
  });
96717
97140
  // packages/omo-opencode/src/config/schema/commands.ts
96718
97141
  var BuiltinCommandNameSchema = exports_external.enum([
96719
- "ralph-loop",
96720
- "ulw-loop",
96721
- "cancel-ralph",
97142
+ "goal",
96722
97143
  "refactor",
96723
97144
  "start-work",
96724
97145
  "stop-continuation",
@@ -96728,7 +97149,7 @@ var BuiltinCommandNameSchema = exports_external.enum([
96728
97149
  // packages/omo-opencode/src/config/schema/default-mode.ts
96729
97150
  var DefaultModeConfigSchema = exports_external.object({
96730
97151
  ultrawork: exports_external.boolean().default(false),
96731
- ralph_loop: exports_external.boolean().default(false)
97152
+ goal: exports_external.boolean().default(false)
96732
97153
  });
96733
97154
  // packages/omo-opencode/src/config/schema/dynamic-context-pruning.ts
96734
97155
  var DynamicContextPruningConfigSchema = exports_external.object({
@@ -96776,6 +97197,12 @@ var ExperimentalConfigSchema = exports_external.object({
96776
97197
  max_tools: exports_external.number().int().min(1).optional(),
96777
97198
  disable_live_parent_wake_routing: exports_external.boolean().optional()
96778
97199
  });
97200
+ // packages/omo-opencode/src/config/schema/goal.ts
97201
+ var GoalConfigSchema = exports_external.object({
97202
+ enabled: exports_external.boolean().default(false),
97203
+ auto_start: exports_external.boolean().default(false),
97204
+ default_max_iterations: exports_external.number().min(1).max(1000).default(100)
97205
+ });
96779
97206
  // packages/skills-loader-core/src/config/git-env-prefix.ts
96780
97207
  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_-]*)*$/;
96781
97208
  var GIT_ENV_PREFIX_VALIDATION_MESSAGE = 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"';
@@ -96818,7 +97245,7 @@ var HookNameSchema = exports_external.enum([
96818
97245
  "interactive-bash-session",
96819
97246
  "tool-pair-validator",
96820
97247
  "monitor-status-injector",
96821
- "ralph-loop",
97248
+ "goal",
96822
97249
  "category-skill-reminder",
96823
97250
  "compaction-context-injector",
96824
97251
  "compaction-todo-preserver",
@@ -96928,14 +97355,6 @@ var MonitorConfigSchema = exports_external.object({
96928
97355
  pattern_max_length: exports_external.number().int().min(1).default(512)
96929
97356
  });
96930
97357
 
96931
- // packages/omo-opencode/src/config/schema/ralph-loop.ts
96932
- var RalphLoopConfigSchema = exports_external.object({
96933
- enabled: exports_external.boolean().default(false),
96934
- default_max_iterations: exports_external.number().min(1).max(1000).default(100),
96935
- state_dir: exports_external.string().optional(),
96936
- default_strategy: exports_external.enum(["reset", "continue"]).default("continue")
96937
- });
96938
-
96939
97358
  // packages/omo-opencode/src/config/schema/runtime-fallback.ts
96940
97359
  var RuntimeFallbackConfigSchema = exports_external.object({
96941
97360
  enabled: exports_external.boolean().optional(),
@@ -97071,7 +97490,8 @@ var OhMyOpenCodeConfigSchema = exports_external.object({
97071
97490
  experimental: ExperimentalConfigSchema.optional(),
97072
97491
  auto_update: exports_external.boolean().optional(),
97073
97492
  skills: SkillsConfigSchema.optional(),
97074
- ralph_loop: RalphLoopConfigSchema.optional(),
97493
+ goal: GoalConfigSchema.optional(),
97494
+ ralph_loop: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
97075
97495
  runtime_fallback: exports_external.union([exports_external.boolean(), RuntimeFallbackConfigSchema]).optional(),
97076
97496
  background_task: BackgroundTaskConfigSchema.optional(),
97077
97497
  notification: NotificationConfigSchema.optional(),
@@ -97454,6 +97874,7 @@ function loadPluginConfig(directory, ctx) {
97454
97874
  }
97455
97875
  }
97456
97876
  const userMcpEnvAllowlist = config3.mcp_env_allowlist ?? [];
97877
+ const userPlaywrightMcpArgs = config3.browser_automation_engine?.playwright_mcp_args;
97457
97878
  const canonicalAncestorPathsFarthestFirst = [...canonicalAncestorPathsNearestFirst].reverse();
97458
97879
  const defaultGitMaster = OhMyOpenCodeConfigSchema.parse({}).git_master;
97459
97880
  const ancestorGitMasterOverridesFarthestFirst = [];
@@ -97486,6 +97907,16 @@ function loadPluginConfig(directory, ctx) {
97486
97907
  ...config3,
97487
97908
  mcp_env_allowlist: userMcpEnvAllowlist
97488
97909
  };
97910
+ if (config3.browser_automation_engine) {
97911
+ const {
97912
+ playwright_mcp_args: _ancestorPlaywrightMcpArgs,
97913
+ ...browserAutomationEngine
97914
+ } = config3.browser_automation_engine;
97915
+ config3 = {
97916
+ ...config3,
97917
+ browser_automation_engine: userPlaywrightMcpArgs !== undefined ? { ...browserAutomationEngine, playwright_mcp_args: userPlaywrightMcpArgs } : browserAutomationEngine
97918
+ };
97919
+ }
97489
97920
  applyDisabledProviders(config3);
97490
97921
  log2("Final merged config", {
97491
97922
  agents: config3.agents,
@@ -97957,22 +98388,170 @@ var BOULDER_FILE = "boulder.json";
97957
98388
  var BOULDER_STATE_PATH = `${BOULDER_DIR}/${BOULDER_FILE}`;
97958
98389
  var NOTEPAD_DIR = "notepads";
97959
98390
  var NOTEPAD_BASE_PATH = `${BOULDER_DIR}/${NOTEPAD_DIR}`;
97960
- // packages/boulder-state/src/top-level-task.ts
97961
- import { existsSync as existsSync37, readFileSync as readFileSync19 } from "fs";
97962
- var TODO_HEADING_PATTERN = /^##\s+TODOs\b/i;
97963
- var FINAL_VERIFICATION_HEADING_PATTERN = /^##\s+Final Verification Wave\b/i;
97964
- var SECOND_LEVEL_HEADING_PATTERN = /^##\s+/;
97965
- var UNCHECKED_CHECKBOX_PATTERN = /^(\s*)[-*]\s*\[\s*\]\s*(.+)$/;
97966
- var TODO_TASK_PATTERN = /^(\d+)\.\s+(.+)$/;
97967
- var FINAL_WAVE_TASK_PATTERN = /^(F\d+)\.\s+(.+)$/i;
97968
- function buildTaskRef(section, taskLabel) {
97969
- const pattern = section === "todo" ? TODO_TASK_PATTERN : FINAL_WAVE_TASK_PATTERN;
97970
- const match = taskLabel.match(pattern);
97971
- if (!match) {
98391
+ // packages/boulder-state/src/plan-checklist.ts
98392
+ var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX]?)[ \t]*\][ \t]+(.+)$/;
98393
+ var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
98394
+ var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
98395
+ var SECTION_BOUNDARY_HEADING_PATTERN = /^#{1,2}(?:[ \t]+|$)/;
98396
+ var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
98397
+ var TODO_CHECKBOX_PATTERN = /^- \[([ xX])\] ([1-9]\d*\. .+)$/;
98398
+ var FINAL_WAVE_CHECKBOX_PATTERN = /^- \[([ xX])\] (F[1-9]\d*\. .+)$/i;
98399
+ function parsePlanChecklist(markdown) {
98400
+ const lines = markdown.split(/\r?\n/);
98401
+ if (!hasStructuredSection(lines)) {
98402
+ return parseSimpleChecklist(lines);
98403
+ }
98404
+ return parseStructuredPlan(lines).checklist;
98405
+ }
98406
+ function parseCurrentTopLevelTask(markdown) {
98407
+ const lines = markdown.split(/\r?\n/);
98408
+ if (!hasStructuredSection(lines)) {
98409
+ return null;
98410
+ }
98411
+ return parseStructuredPlan(lines).nextTask;
98412
+ }
98413
+ function parseStructuredPlan(lines) {
98414
+ let remaining = 0;
98415
+ let total = 0;
98416
+ let nextTaskLabel = null;
98417
+ let nextTask = null;
98418
+ let section = "other";
98419
+ let fence = null;
98420
+ for (const line of lines) {
98421
+ if (fence !== null) {
98422
+ if (isClosingFence(line, fence)) {
98423
+ fence = null;
98424
+ }
98425
+ continue;
98426
+ }
98427
+ const openingFence = parseOpeningFence(line);
98428
+ if (openingFence !== null) {
98429
+ fence = openingFence;
98430
+ continue;
98431
+ }
98432
+ if (SECTION_BOUNDARY_HEADING_PATTERN.test(line)) {
98433
+ section = parseStructuredSectionHeading(line);
98434
+ continue;
98435
+ }
98436
+ if (section === "other") {
98437
+ continue;
98438
+ }
98439
+ const checkbox = parseStructuredTopLevelCheckbox(line, section);
98440
+ if (checkbox === null) {
98441
+ continue;
98442
+ }
98443
+ total += 1;
98444
+ if (checkbox.checked) {
98445
+ continue;
98446
+ }
98447
+ remaining += 1;
98448
+ if (nextTaskLabel === null) {
98449
+ nextTaskLabel = checkbox.label;
98450
+ nextTask = checkbox.task;
98451
+ }
98452
+ }
98453
+ return {
98454
+ checklist: {
98455
+ completed: total - remaining,
98456
+ remaining,
98457
+ total,
98458
+ nextTaskLabel
98459
+ },
98460
+ nextTask
98461
+ };
98462
+ }
98463
+ function parseSimpleChecklist(lines) {
98464
+ let remaining = 0;
98465
+ let total = 0;
98466
+ let nextTaskLabel = null;
98467
+ let fence = null;
98468
+ for (const line of lines) {
98469
+ if (fence !== null) {
98470
+ if (isClosingFence(line, fence)) {
98471
+ fence = null;
98472
+ }
98473
+ continue;
98474
+ }
98475
+ const openingFence = parseOpeningFence(line);
98476
+ if (openingFence !== null) {
98477
+ fence = openingFence;
98478
+ continue;
98479
+ }
98480
+ const checkbox = parseSimpleTopLevelCheckbox(line);
98481
+ if (checkbox === null) {
98482
+ continue;
98483
+ }
98484
+ total += 1;
98485
+ if (checkbox.checked) {
98486
+ continue;
98487
+ }
98488
+ remaining += 1;
98489
+ if (nextTaskLabel === null) {
98490
+ nextTaskLabel = checkbox.label;
98491
+ }
98492
+ }
98493
+ return { completed: total - remaining, remaining, total, nextTaskLabel };
98494
+ }
98495
+ function parseSimpleTopLevelCheckbox(line) {
98496
+ const match = line.match(SIMPLE_CHECKBOX_PATTERN);
98497
+ const marker = match?.[1];
98498
+ const label = match?.[2];
98499
+ if (marker === undefined || label === undefined) {
98500
+ return null;
98501
+ }
98502
+ return { checked: marker.toLowerCase() === "x", label };
98503
+ }
98504
+ function hasStructuredSection(lines) {
98505
+ let fence = null;
98506
+ for (const line of lines) {
98507
+ if (fence !== null) {
98508
+ if (isClosingFence(line, fence)) {
98509
+ fence = null;
98510
+ }
98511
+ continue;
98512
+ }
98513
+ const openingFence = parseOpeningFence(line);
98514
+ if (openingFence !== null) {
98515
+ fence = openingFence;
98516
+ continue;
98517
+ }
98518
+ if (parseStructuredSectionHeading(line) !== "other") {
98519
+ return true;
98520
+ }
98521
+ }
98522
+ return false;
98523
+ }
98524
+ function parseStructuredSectionHeading(line) {
98525
+ if (TODO_HEADING_PATTERN.test(line)) {
98526
+ return "todo";
98527
+ }
98528
+ if (FINAL_VERIFICATION_HEADING_PATTERN.test(line)) {
98529
+ return "final-wave";
98530
+ }
98531
+ return "other";
98532
+ }
98533
+ function parseStructuredTopLevelCheckbox(line, section) {
98534
+ const pattern = section === "todo" ? TODO_CHECKBOX_PATTERN : FINAL_WAVE_CHECKBOX_PATTERN;
98535
+ const match = line.match(pattern);
98536
+ const marker = match?.[1];
98537
+ const label = match?.[2];
98538
+ if (marker === undefined || label === undefined) {
98539
+ return null;
98540
+ }
98541
+ const task = buildTaskRef(section, label);
98542
+ if (task === null) {
98543
+ return null;
98544
+ }
98545
+ return { checked: marker.toLowerCase() === "x", label, task };
98546
+ }
98547
+ function buildTaskRef(section, label) {
98548
+ const pattern = section === "todo" ? /^([1-9]\d*)\. (.+)$/ : /^(F[1-9]\d*)\. (.+)$/i;
98549
+ const match = label.match(pattern);
98550
+ const rawLabel = match?.[1];
98551
+ const title = match?.[2];
98552
+ if (rawLabel === undefined || title === undefined) {
97972
98553
  return null;
97973
98554
  }
97974
- const rawLabel = match[1];
97975
- const title = match[2].trim();
97976
98555
  return {
97977
98556
  key: `${section}:${rawLabel.toLowerCase()}`,
97978
98557
  section,
@@ -97980,31 +98559,29 @@ function buildTaskRef(section, taskLabel) {
97980
98559
  title
97981
98560
  };
97982
98561
  }
98562
+ function parseOpeningFence(line) {
98563
+ const match = line.match(FENCE_PATTERN);
98564
+ const run = match?.[1];
98565
+ const info = match?.[2];
98566
+ const marker = run?.charAt(0);
98567
+ if (run === undefined || info === undefined || marker !== "`" && marker !== "~" || marker === "`" && info.includes("`")) {
98568
+ return null;
98569
+ }
98570
+ return { marker, length: run.length };
98571
+ }
98572
+ function isClosingFence(line, fence) {
98573
+ const run = line.match(/^[ \t]{0,3}(`{3,}|~{3,})[ \t]*$/)?.[1];
98574
+ return run?.charAt(0) === fence.marker && run.length >= fence.length;
98575
+ }
98576
+ // packages/boulder-state/src/top-level-task.ts
98577
+ import { existsSync as existsSync37, readFileSync as readFileSync19 } from "fs";
97983
98578
  function readCurrentTopLevelTask(planPath) {
97984
98579
  if (!existsSync37(planPath)) {
97985
98580
  return null;
97986
98581
  }
97987
98582
  try {
97988
98583
  const content = readFileSync19(planPath, "utf-8");
97989
- const lines = content.split(/\r?\n/);
97990
- let section = "other";
97991
- for (const line of lines) {
97992
- if (SECOND_LEVEL_HEADING_PATTERN.test(line)) {
97993
- section = TODO_HEADING_PATTERN.test(line) ? "todo" : FINAL_VERIFICATION_HEADING_PATTERN.test(line) ? "final-wave" : "other";
97994
- }
97995
- const uncheckedTaskMatch = line.match(UNCHECKED_CHECKBOX_PATTERN);
97996
- if (!uncheckedTaskMatch || uncheckedTaskMatch[1].length > 0) {
97997
- continue;
97998
- }
97999
- if (section !== "todo" && section !== "final-wave") {
98000
- continue;
98001
- }
98002
- const taskRef = buildTaskRef(section, uncheckedTaskMatch[2].trim());
98003
- if (taskRef) {
98004
- return taskRef;
98005
- }
98006
- }
98007
- return null;
98584
+ return parseCurrentTopLevelTask(content);
98008
98585
  } catch {
98009
98586
  return null;
98010
98587
  }
@@ -98038,69 +98615,25 @@ function resolveBoulderPlanPathForWork(directory, work) {
98038
98615
  }
98039
98616
  // packages/boulder-state/src/storage/plan-progress.ts
98040
98617
  import { existsSync as existsSync39, readFileSync as readFileSync20, readdirSync as readdirSync5, statSync as statSync5 } from "fs";
98041
- var TODO_HEADING_PATTERN2 = /^##\s+TODOs\b/i;
98042
- var FINAL_VERIFICATION_HEADING_PATTERN2 = /^##\s+Final Verification Wave\b/i;
98043
- var SECOND_LEVEL_HEADING_PATTERN2 = /^##\s+/;
98044
- var UNCHECKED_CHECKBOX_PATTERN2 = /^(\s*)[-*]\s*\[\s*\]\s*(.+)$/;
98045
- var CHECKED_CHECKBOX_PATTERN = /^(\s*)[-*]\s*\[[xX]\]\s*(.+)$/;
98046
- var TODO_TASK_PATTERN2 = /^\d+\.\s+/;
98047
- var FINAL_WAVE_TASK_PATTERN2 = /^F\d+\.\s+/i;
98048
98618
  function getPlanProgress(planPath) {
98049
98619
  if (!existsSync39(planPath)) {
98050
98620
  return { total: 0, completed: 0, isComplete: false };
98051
98621
  }
98052
98622
  try {
98053
98623
  const content = readFileSync20(planPath, "utf-8");
98054
- const lines = content.split(/\r?\n/);
98055
- const hasStructuredSections = lines.some((line) => TODO_HEADING_PATTERN2.test(line) || FINAL_VERIFICATION_HEADING_PATTERN2.test(line));
98056
- if (hasStructuredSections) {
98057
- return getStructuredPlanProgress(lines);
98058
- }
98059
- return getSimplePlanProgress(content);
98624
+ const checklist = parsePlanChecklist(content);
98625
+ return {
98626
+ total: checklist.total,
98627
+ completed: checklist.completed,
98628
+ isComplete: checklist.total > 0 && checklist.remaining === 0
98629
+ };
98060
98630
  } catch {
98061
98631
  return { total: 0, completed: 0, isComplete: false };
98062
98632
  }
98063
98633
  }
98064
- function getStructuredPlanProgress(lines) {
98065
- let section = "other";
98066
- let total = 0;
98067
- let completed = 0;
98068
- for (const line of lines) {
98069
- if (SECOND_LEVEL_HEADING_PATTERN2.test(line)) {
98070
- section = TODO_HEADING_PATTERN2.test(line) ? "todo" : FINAL_VERIFICATION_HEADING_PATTERN2.test(line) ? "final-wave" : "other";
98071
- continue;
98072
- }
98073
- if (section !== "todo" && section !== "final-wave") {
98074
- continue;
98075
- }
98076
- const checkedMatch = line.match(CHECKED_CHECKBOX_PATTERN);
98077
- const uncheckedMatch = checkedMatch ? null : line.match(UNCHECKED_CHECKBOX_PATTERN2);
98078
- const match = checkedMatch ?? uncheckedMatch;
98079
- if (!match || match[1].length > 0) {
98080
- continue;
98081
- }
98082
- const taskBody = match[2].trim();
98083
- const labelPattern = section === "todo" ? TODO_TASK_PATTERN2 : FINAL_WAVE_TASK_PATTERN2;
98084
- if (!labelPattern.test(taskBody)) {
98085
- continue;
98086
- }
98087
- total += 1;
98088
- if (checkedMatch) {
98089
- completed += 1;
98090
- }
98091
- }
98092
- return { total, completed, isComplete: total > 0 && completed === total };
98093
- }
98094
- function getSimplePlanProgress(content) {
98095
- const uncheckedMatches = content.match(/^[-*]\s*\[\s*\]/gm) ?? [];
98096
- const checkedMatches = content.match(/^[-*]\s*\[[xX]\]/gm) ?? [];
98097
- const total = uncheckedMatches.length + checkedMatches.length;
98098
- const completed = checkedMatches.length;
98099
- return { total, completed, isComplete: total > 0 && completed === total };
98100
- }
98101
98634
  // packages/boulder-state/src/storage/shared.ts
98102
98635
  var RESERVED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
98103
- var SESSION_ID_PREFIX_PATTERN = /^(codex|opencode):/;
98636
+ var SESSION_ID_PREFIX_PATTERN = /^(codex|opencode|senpi):/;
98104
98637
  function normalizeSessionId(sessionId, platform = "opencode") {
98105
98638
  if (SESSION_ID_PREFIX_PATTERN.test(sessionId)) {
98106
98639
  return sessionId;
@@ -98175,7 +98708,7 @@ function readBoulderState(directory) {
98175
98708
  try {
98176
98709
  const content = readFileSync21(filePath, "utf-8");
98177
98710
  const parsed = JSON.parse(content);
98178
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
98711
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || Object.keys(parsed).length === 0) {
98179
98712
  return null;
98180
98713
  }
98181
98714
  normalizeState(parsed);
@@ -100132,6 +100665,7 @@ import { readFileSync as readFileSync35 } from "fs";
100132
100665
  import { homedir as homedir16 } from "os";
100133
100666
  import { dirname as dirname29, relative as relative9 } from "path";
100134
100667
  init_shared();
100668
+ init_logger2();
100135
100669
  init_plugin_identity();
100136
100670
  function resolveHomeDirectory2() {
100137
100671
  return process.env.HOME ?? process.env.USERPROFILE ?? homedir16();
@@ -100220,13 +100754,45 @@ function mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst) {
100220
100754
  config3 = mergeConfigs2(config3, layer.config);
100221
100755
  }
100222
100756
  const userMcpEnvAllowlist = config3.mcp_env_allowlist ?? [];
100757
+ const userPlaywrightMcpArgs = config3.browser_automation_engine?.playwright_mcp_args;
100223
100758
  for (const layer of [...projectLayersNearestFirst].reverse()) {
100224
100759
  if (layer.config)
100225
100760
  config3 = mergeConfigs2(config3, layer.config);
100226
100761
  }
100227
100762
  config3 = { ...config3, mcp_env_allowlist: userMcpEnvAllowlist };
100763
+ if (config3.browser_automation_engine) {
100764
+ const {
100765
+ playwright_mcp_args: _projectPlaywrightMcpArgs,
100766
+ ...browserAutomationEngine
100767
+ } = config3.browser_automation_engine;
100768
+ config3 = {
100769
+ ...config3,
100770
+ browser_automation_engine: userPlaywrightMcpArgs !== undefined ? { ...browserAutomationEngine, playwright_mcp_args: userPlaywrightMcpArgs } : browserAutomationEngine
100771
+ };
100772
+ }
100228
100773
  return applyDisabledProviders(config3);
100229
100774
  }
100775
+ function migrateRalphLoopConfig(config3) {
100776
+ const legacy = config3.ralph_loop;
100777
+ if (legacy === undefined) {
100778
+ return config3;
100779
+ }
100780
+ const enabled = typeof legacy.enabled === "boolean" ? legacy.enabled : undefined;
100781
+ const defaultMaxIterations = typeof legacy.default_max_iterations === "number" ? legacy.default_max_iterations : undefined;
100782
+ if (enabled === undefined && defaultMaxIterations === undefined) {
100783
+ return config3;
100784
+ }
100785
+ log2("[config] ralph_loop is deprecated and will be removed in a future release. Use goal instead.");
100786
+ const existingGoal = config3.goal;
100787
+ return {
100788
+ ...config3,
100789
+ goal: {
100790
+ enabled: existingGoal?.enabled ?? enabled ?? false,
100791
+ auto_start: existingGoal?.auto_start ?? false,
100792
+ default_max_iterations: existingGoal?.default_max_iterations ?? defaultMaxIterations ?? 100
100793
+ }
100794
+ };
100795
+ }
100230
100796
  function validatePluginConfig(directory) {
100231
100797
  const userLayersNearestFirst = discoverUserLayers().map((layer) => parseLayerConfig(layer.path));
100232
100798
  const projectLayersNearestFirst = discoverProjectLayersNearestFirst(directory).map((layer) => parseLayerConfig(layer.path));
@@ -100236,7 +100802,7 @@ function validatePluginConfig(directory) {
100236
100802
  valid: messages.length === 0,
100237
100803
  messages,
100238
100804
  path: firstFailingPath(layers) ?? firstPath(layers),
100239
- config: mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst)
100805
+ config: migrateRalphLoopConfig(mergeLoadedConfig(userLayersNearestFirst, projectLayersNearestFirst))
100240
100806
  };
100241
100807
  }
100242
100808
 
@@ -101547,10 +102113,10 @@ async function gatherCodexSummary(deps = {}) {
101547
102113
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
101548
102114
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
101549
102115
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
101550
- const manifest = pluginRoot === null ? null : await readJson(join82(pluginRoot, ".codex-plugin", "plugin.json"));
102116
+ const manifest2 = pluginRoot === null ? null : await readJson(join82(pluginRoot, ".codex-plugin", "plugin.json"));
101551
102117
  const installSnapshot = pluginRoot === null ? null : await readJson(join82(pluginRoot, "lazycodex-install.json"));
101552
102118
  const configPath = join82(codexHome, "config.toml");
101553
- const pluginVersion = stringField(manifest, "version");
102119
+ const pluginVersion = stringField(manifest2, "version");
101554
102120
  return {
101555
102121
  codexPath: detection.found && "path" in detection ? detection.path : null,
101556
102122
  codexSource: detection.found ? detection.source : null,
@@ -101897,12 +102463,12 @@ async function auditBundleTargets(pluginRoot) {
101897
102463
  const broken = [];
101898
102464
  let referencedCount = 0;
101899
102465
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
101900
- const manifest = await readJson2(manifestPath);
101901
- if (manifest === null || !isRecord6(manifest["mcpServers"]))
102466
+ const manifest2 = await readJson2(manifestPath);
102467
+ if (manifest2 === null || !isRecord6(manifest2["mcpServers"]))
101902
102468
  continue;
101903
102469
  const manifestRoot = dirname32(manifestPath);
101904
102470
  const isRootManifest = resolve23(manifestRoot) === resolve23(pluginRoot);
101905
- for (const server2 of Object.values(manifest["mcpServers"])) {
102471
+ for (const server2 of Object.values(manifest2["mcpServers"])) {
101906
102472
  if (!isRecord6(server2) || !Array.isArray(server2["args"]))
101907
102473
  continue;
101908
102474
  for (const arg of server2["args"]) {
@@ -101916,11 +102482,11 @@ async function auditBundleTargets(pluginRoot) {
101916
102482
  }
101917
102483
  }
101918
102484
  for (const hookManifestPath of await findHookManifestPaths(pluginRoot)) {
101919
- const manifest = await readJson2(hookManifestPath);
101920
- if (manifest === null)
102485
+ const manifest2 = await readJson2(hookManifestPath);
102486
+ if (manifest2 === null)
101921
102487
  continue;
101922
102488
  const commands2 = [];
101923
- collectHookCommands(manifest, commands2);
102489
+ collectHookCommands(manifest2, commands2);
101924
102490
  const hookPluginRoot = dirname32(dirname32(hookManifestPath));
101925
102491
  for (const command of commands2) {
101926
102492
  for (const relativePath of extractPluginRootPaths(command)) {