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
@@ -0,0 +1,293 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
8
+ const repositoryRoot = dirname(dirname(dirname(pluginRoot)));
9
+
10
+ const surfaces = [
11
+ {
12
+ name: "shared OpenCode",
13
+ skillPath: join(repositoryRoot, "packages", "shared-skills", "skills", "ulw-plan", "SKILL.md"),
14
+ workflowPath: join(repositoryRoot, "packages", "shared-skills", "skills", "ulw-plan", "references", "full-workflow.md"),
15
+ independentReviewer: "oracle",
16
+ reviewRoots: {
17
+ momus: "<literal-canonical-source-workspace-root>",
18
+ independent: "<literal-canonical-source-workspace-root>",
19
+ },
20
+ runtimeHomes: { momus: null, independent: null },
21
+ },
22
+ {
23
+ name: "Codex",
24
+ skillPath: join(pluginRoot, "components", "ultrawork", "skills", "ulw-plan", "SKILL.md"),
25
+ workflowPath: join(pluginRoot, "components", "ultrawork", "skills", "ulw-plan", "references", "full-workflow.md"),
26
+ independentReviewer: "codex-cli:gpt-5.6-sol:xhigh",
27
+ reviewRoots: {
28
+ momus: "<literal-canonical-source-workspace-root>",
29
+ independent: "<literal-canonical-disposable-review-workspace-root>",
30
+ },
31
+ runtimeHomes: { momus: null, independent: "<literal-isolated-codex-home>" },
32
+ },
33
+ ];
34
+
35
+ function readJsonContract(workflow, contractName) {
36
+ const fence = "```";
37
+ const pattern = new RegExp(`<!-- ${contractName} -->\\s*${fence}json\\s*([\\s\\S]*?)\\s*${fence}`);
38
+ const match = workflow.match(pattern);
39
+ assert.ok(match, `missing ${contractName}`);
40
+ return JSON.parse(match[1]);
41
+ }
42
+
43
+ function matchesCas(state, expected, clauses) {
44
+ return clauses.every((clause) => {
45
+ const separator = clause.indexOf("=");
46
+ if (separator !== -1) {
47
+ const key = clause.slice(0, separator);
48
+ const value = clause.slice(separator + 1);
49
+ return state[key] === value;
50
+ }
51
+ return Object.hasOwn(expected, clause) && state[clause] === expected[clause];
52
+ });
53
+ }
54
+
55
+ for (const surface of surfaces) {
56
+ test(`#given ${surface.name} #when deeper review becomes required before plan completion #then durable request state covers explicit and automatic review without inventing a digest`, async () => {
57
+ const skill = await readFile(surface.skillPath, "utf8");
58
+ const workflow = await readFile(surface.workflowPath, "utf8");
59
+ const contract = readJsonContract(workflow, "ulw-plan-review-request-state-contract");
60
+
61
+ assert.equal(contract.transition, "replace");
62
+ assert.equal(contract.phase, "review_requested");
63
+ assert.deepEqual(contract.applies_when, ["explicit_review_modifier_before_complete_plan", "intent=unclear_and_nontrivial"]);
64
+ assert.match(skill, /Include `--review-required`[\s\S]{0,180}non-Trivial UNCLEAR/);
65
+ assert.match(workflow, /--draft-only/);
66
+ assert.equal(contract.atomic, true);
67
+ assert.equal(contract.review_required, true);
68
+ assert.equal(contract.plan_path, ".omo/plans/<slug>.md");
69
+ assert.equal(contract.plan_sha256, null);
70
+ assert.equal(contract.review_round_id, null);
71
+ assert.deepEqual(contract.pending_action_policy, {
72
+ review_required: "write and review .omo/plans/<slug>.md",
73
+ otherwise: "write .omo/plans/<slug>.md",
74
+ });
75
+ assert.equal(contract["pending-action"], contract.pending_action_policy.review_required);
76
+ assert.deepEqual(Object.keys(contract.review).sort(), ["independent", "momus"]);
77
+
78
+ for (const lane of Object.values(contract.review)) {
79
+ assert.deepEqual(lane, {
80
+ status: "pending",
81
+ workspace_root: null,
82
+ runtime_home: null,
83
+ target: ".omo/plans/<slug>.md",
84
+ round_id: null,
85
+ plan_sha256: null,
86
+ launch_id: null,
87
+ session: null,
88
+ result: null,
89
+ });
90
+ }
91
+ });
92
+
93
+ test(`#given a complete ${surface.name} plan #when a fresh review round starts #then both lanes persist literal workspace and artifact bindings`, async () => {
94
+ const workflow = await readFile(surface.workflowPath, "utf8");
95
+ const contract = readJsonContract(workflow, "ulw-plan-review-round-state-contract");
96
+
97
+ assert.equal(contract.transition, "replace");
98
+ assert.equal(contract.phase, "review_round_initialized");
99
+ assert.deepEqual(contract.applies_when, [
100
+ "complete_plan_after_review_request",
101
+ "explicit_review_modifier_with_complete_plan",
102
+ "retry_after_plan_change",
103
+ ]);
104
+ assert.equal(contract.atomic, true);
105
+ assert.equal(contract.review_required, true);
106
+ assert.equal(contract.plan_path, ".omo/plans/<slug>.md");
107
+ assert.equal(contract.plan_sha256, "<sha256-of-complete-plan>");
108
+ assert.equal(contract.review_round_id, "<fresh-unique-round-id>");
109
+ assert.equal(contract.round_status, "active");
110
+ assert.deepEqual(contract.completion_cas, [
111
+ "status=in_flight",
112
+ "workspace_root",
113
+ "runtime_home",
114
+ "target",
115
+ "launch_id",
116
+ "round_id",
117
+ "plan_sha256",
118
+ "session",
119
+ "receipt_identity=session",
120
+ "live_plan_sha256=plan_sha256",
121
+ "echoed_binding",
122
+ "terminal_transition=in_flight->approved|changes_requested|inconclusive",
123
+ ]);
124
+ assert.equal(contract["pending-action"], "review .omo/plans/<slug>.md");
125
+
126
+ for (const [laneName, lane] of Object.entries(contract.review)) {
127
+ assert.deepEqual(lane, {
128
+ status: "pending",
129
+ workspace_root: surface.reviewRoots[laneName],
130
+ runtime_home: surface.runtimeHomes[laneName],
131
+ target: ".omo/plans/<validated-slug>.md",
132
+ round_id: "<review-round-id>",
133
+ plan_sha256: "<plan-sha256>",
134
+ launch_id: null,
135
+ session: null,
136
+ result: null,
137
+ });
138
+ }
139
+ });
140
+
141
+ test(`#given a ${surface.name} review round #when launch, interruption, completion, or compaction occurs #then the durable transition table fails closed`, async () => {
142
+ const workflow = await readFile(surface.workflowPath, "utf8");
143
+ const contract = readJsonContract(workflow, "ulw-plan-review-lifecycle-state-contract");
144
+
145
+ assert.deepEqual(contract.transitions.launch, {
146
+ from: "pending",
147
+ to: "launching",
148
+ cas: ["round_status=active", "status=pending", "workspace_root", "runtime_home", "target", "round_id", "plan_sha256"],
149
+ writes: ["launch_id=<fresh-launch-id>"],
150
+ });
151
+ assert.deepEqual(contract.transitions.receipt, {
152
+ from: "launching",
153
+ to: "in_flight",
154
+ cas: [
155
+ "round_status=active",
156
+ "status=launching",
157
+ "workspace_root",
158
+ "runtime_home",
159
+ "target",
160
+ "round_id",
161
+ "plan_sha256",
162
+ "launch_id",
163
+ ],
164
+ writes: ["session=<session-or-process-receipt>"],
165
+ });
166
+ assert.deepEqual(contract.transitions.complete, {
167
+ from: "in_flight",
168
+ to: ["approved", "changes_requested", "inconclusive"],
169
+ one_shot: true,
170
+ cas: [
171
+ "round_status=active",
172
+ "workspace_root",
173
+ "runtime_home",
174
+ "target",
175
+ "launch_id",
176
+ "round_id",
177
+ "plan_sha256",
178
+ "session",
179
+ "receipt_identity=session",
180
+ "live_plan_sha256=plan_sha256",
181
+ "echoed_binding",
182
+ ],
183
+ });
184
+ assert.deepEqual(contract.transitions.launch_interrupted, {
185
+ from: { round_status: "active", lane_status: "launching" },
186
+ to: {
187
+ round_status: "inconclusive",
188
+ lane_status: "inconclusive",
189
+ result: "launch_interrupted_without_receipt",
190
+ },
191
+ cas: [
192
+ "round_status=active",
193
+ "status=launching",
194
+ "workspace_root",
195
+ "runtime_home",
196
+ "target",
197
+ "round_id",
198
+ "plan_sha256",
199
+ "launch_id",
200
+ ],
201
+ invalidates_other_lane: true,
202
+ next: "fresh_review_round",
203
+ });
204
+ assert.deepEqual(contract.resume_after_compaction, {
205
+ pending: "dispatch_with_launch_cas",
206
+ launching: "apply_launch_interrupted_transition",
207
+ in_flight: "wait_for_matching_completion_only",
208
+ "approved|changes_requested|inconclusive": "do_not_mutate",
209
+ "round_status=inconclusive": "start_fresh_review_round",
210
+ });
211
+ assert.deepEqual(contract.rejected_completions, ["duplicate", "late", "stale", "mismatched"]);
212
+ });
213
+
214
+ test(`#given ${surface.name} round R2 replaced R1 #when a delayed R1 launch or receipt arrives #then identity-bound CAS leaves R2 unchanged`, async () => {
215
+ const workflow = await readFile(surface.workflowPath, "utf8");
216
+ const contract = readJsonContract(workflow, "ulw-plan-review-lifecycle-state-contract");
217
+ const currentRound = {
218
+ round_status: "active",
219
+ status: "pending",
220
+ workspace_root: surface.reviewRoots.independent,
221
+ runtime_home: surface.runtimeHomes.independent,
222
+ target: ".omo/plans/demo.md",
223
+ round_id: "round-r2",
224
+ plan_sha256: "sha-r2",
225
+ launch_id: null,
226
+ };
227
+ const staleRound = {
228
+ ...currentRound,
229
+ round_id: "round-r1",
230
+ plan_sha256: "sha-r1",
231
+ launch_id: "launch-r1",
232
+ };
233
+
234
+ assert.equal(matchesCas(currentRound, currentRound, contract.transitions.launch.cas), true);
235
+ assert.equal(matchesCas(currentRound, staleRound, contract.transitions.launch.cas), false);
236
+
237
+ const launchedCurrentRound = { ...currentRound, status: "launching", launch_id: "launch-r2" };
238
+ assert.equal(matchesCas(launchedCurrentRound, launchedCurrentRound, contract.transitions.receipt.cas), true);
239
+ assert.equal(matchesCas(launchedCurrentRound, staleRound, contract.transitions.receipt.cas), false);
240
+ assert.equal(matchesCas(launchedCurrentRound, staleRound, contract.transitions.launch_interrupted.cas), false);
241
+ });
242
+
243
+ test(`#given ${surface.name} independent reviewers #when exact-path retrieval drifts #then intake fails closed without alternate artifact recovery`, async () => {
244
+ const workflow = await readFile(surface.workflowPath, "utf8");
245
+ const contract = readJsonContract(workflow, "ulw-plan-review-intake-contract");
246
+
247
+ assert.equal(contract.independent_reviewer, surface.independentReviewer);
248
+ assert.deepEqual(contract.lanes, ["momus", "independent"]);
249
+ assert.equal(contract.binding, "substitute_literals_before_dispatch");
250
+ assert.equal(contract.workspace_root, "<literal-canonical-review-workspace-root>");
251
+ assert.equal(contract.runtime_home, "<literal-runtime-home-or-null>");
252
+ assert.equal(contract.target, "<literal-.omo/plans/validated-slug.md>");
253
+ assert.equal(contract.first_action, "read_exact_plan_path");
254
+ assert.equal(contract.read_mechanism, "open_workspace_root_then_openat_no_follow_each_segment_fstat_read_hash");
255
+ assert.equal(contract.artifact_identity, "<literal-plan-sha256>");
256
+ assert.equal(contract.round_identity, "<literal-review-round-id>");
257
+ assert.equal(contract.launch_identity, "<literal-launch-id>");
258
+ assert.deepEqual(contract.required_echo, [
259
+ "workspace_root",
260
+ "runtime_home",
261
+ "target",
262
+ "artifact_identity",
263
+ "round_identity",
264
+ "launch_identity",
265
+ ]);
266
+ assert.deepEqual(contract.required_receipt, ["session_or_process_identity"]);
267
+ assert.deepEqual(contract.pre_read_validation.sort(), [
268
+ "descriptor_relative_no_follow_each_segment",
269
+ "open_workspace_root_directory_descriptor",
270
+ "regular_file",
271
+ "workspace_relative_canonical_equality",
272
+ ]);
273
+ assert.equal(contract.drift_verdict, "INCONCLUSIVE");
274
+ assert.deepEqual(contract.drift_conditions.sort(), [
275
+ "ancestor_descriptor_mismatch",
276
+ "digest_mismatch",
277
+ "incomplete_retrieval",
278
+ "launch_identity_mismatch",
279
+ "path_mismatch",
280
+ "read_failure",
281
+ "receipt_identity_mismatch",
282
+ "runtime_home_mismatch",
283
+ "stale_or_different_artifact",
284
+ "unsafe_path",
285
+ ]);
286
+ assert.deepEqual(contract.forbidden_fallbacks.sort(), [
287
+ "alternate_files",
288
+ "memory",
289
+ "search",
290
+ "summaries",
291
+ ]);
292
+ });
293
+ }
@@ -29,9 +29,9 @@ test("#given empty Codex config #when script installer updates config #then sets
29
29
  assert.doesNotMatch(config, /^\s*multi_agent_mode\s*=/m);
30
30
  assert.doesNotMatch(config, /^\s*max_threads\s*=/m);
31
31
  assert.match(config, /\[features\.multi_agent_v2\]/);
32
- const v2Section = multiAgentV2Section(config);
32
+ const v2Section = multiAgentV2Section(config);
33
33
  assert.doesNotMatch(v2Section, /^enabled\s*=/m);
34
- assert.match(v2Section, /max_concurrent_threads_per_session = 1000/);
34
+ assert.match(v2Section, /max_concurrent_threads_per_session = 16/);
35
35
  });
36
36
 
37
37
  test("#given queue multi-agent mode #when script installer updates config #then removes unsupported root key", async () => {
@@ -313,8 +313,8 @@ test("#given existing MultiAgentV2 table #when script installer updates config #
313
313
  assert.match(config, /\[features\.multi_agent_v2\]/);
314
314
  assert.doesNotMatch(sectionText(config, "[features.multi_agent_v2]"), /enabled = true/);
315
315
  assert.match(config, /usage_hint_enabled = false/);
316
- assert.match(config, /max_concurrent_threads_per_session = 1000/);
317
- assert.doesNotMatch(config, /max_concurrent_threads_per_session = 4/);
316
+ assert.match(config, /max_concurrent_threads_per_session = 4/);
317
+ assert.doesNotMatch(config, /max_concurrent_threads_per_session = 1000/);
318
318
  });
319
319
 
320
320
  test("#given empty Codex config #when script installer updates config #then sets the generated MultiAgentV2 thread limit", async () => {
@@ -337,7 +337,7 @@ test("#given empty Codex config #when script installer updates config #then sets
337
337
  const config = await readFile(configPath, "utf8");
338
338
  const v2Section = config.slice(config.indexOf("[features.multi_agent_v2]"));
339
339
  assert.doesNotMatch(config, /^\s*max_threads\s*=/m);
340
- assert.match(v2Section, /max_concurrent_threads_per_session = 1000/);
340
+ assert.match(v2Section, /max_concurrent_threads_per_session = 16/);
341
341
  assert.doesNotMatch(v2Section, /hide_spawn_agent_metadata/);
342
342
  });
343
343
 
@@ -401,10 +401,10 @@ test("#given legacy boolean MultiAgentV2 flag and table #when script installer u
401
401
  const config = await readFile(configPath, "utf8");
402
402
  assert.doesNotMatch(config, /^multi_agent_v2\s*=/m);
403
403
  assert.match(config, /\[features\.multi_agent_v2\]/);
404
- const v2Section = multiAgentV2Section(config);
404
+ const v2Section = multiAgentV2Section(config);
405
405
  assert.doesNotMatch(v2Section, /^enabled\s*=/m);
406
406
  assert.match(v2Section, /usage_hint_enabled = false/);
407
- assert.match(v2Section, /max_concurrent_threads_per_session = 1000/);
407
+ assert.match(v2Section, /max_concurrent_threads_per_session = 16/);
408
408
  });
409
409
 
410
410
  test("#given legacy boolean MultiAgentV2 flag false #when script installer updates config #then normalizes to a disabled table config", async () => {
@@ -440,7 +440,7 @@ test("#given legacy boolean MultiAgentV2 flag false #when script installer updat
440
440
  assert.match(config, /\[features\.multi_agent_v2\]/);
441
441
  const disabledV2Section = multiAgentV2Section(config);
442
442
  assert.match(disabledV2Section, /^enabled = false$/m);
443
- assert.match(disabledV2Section, /^max_concurrent_threads_per_session = 1000$/m);
443
+ assert.match(disabledV2Section, /^max_concurrent_threads_per_session = 16$/m);
444
444
  });
445
445
 
446
446
  test("#given legacy agents max_threads #when script installer updates config #then raises the root subagent thread cap", async () => {
@@ -474,9 +474,9 @@ test("#given legacy agents max_threads #when script installer updates config #th
474
474
  // then
475
475
  const config = await readFile(configPath, "utf8");
476
476
  assert.match(config, /\[features\.multi_agent_v2\]/);
477
- const v2Section = multiAgentV2Section(config);
477
+ const v2Section = multiAgentV2Section(config);
478
478
  assert.doesNotMatch(v2Section, /^enabled\s*=/m);
479
- assert.match(v2Section, /max_concurrent_threads_per_session = 1000/);
479
+ assert.match(v2Section, /max_concurrent_threads_per_session = 16/);
480
480
  assert.match(config, /\[agents\]/);
481
481
  assert.match(config, /max_threads = 1000/);
482
482
  assert.doesNotMatch(config, /max_threads = 16/);