oh-my-opencode 4.19.0 → 4.19.2

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 (310) 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 +6 -6
  7. package/README.ru.md +6 -6
  8. package/README.zh-cn.md +6 -6
  9. package/dist/agents/atlas/agent.d.ts +5 -3
  10. package/dist/agents/explore.d.ts +4 -2
  11. package/dist/agents/gpt-prompt-identity.d.ts +3 -0
  12. package/dist/agents/hephaestus/agent.d.ts +4 -2
  13. package/dist/agents/librarian.d.ts +4 -2
  14. package/dist/agents/metis.d.ts +4 -2
  15. package/dist/agents/momus.d.ts +3 -2
  16. package/dist/agents/multimodal-looker.d.ts +4 -2
  17. package/dist/agents/oracle.d.ts +4 -2
  18. package/dist/agents/sisyphus/claude-opus-5.d.ts +33 -0
  19. package/dist/agents/sisyphus/gpt-5-5.d.ts +1 -1
  20. package/dist/agents/sisyphus/gpt-task-system-guide.d.ts +1 -0
  21. package/dist/agents/sisyphus/index.d.ts +2 -0
  22. package/dist/agents/sisyphus-agent-factory.d.ts +5 -2
  23. package/dist/agents/sisyphus-junior/agent.d.ts +4 -1
  24. package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +2 -2
  25. package/dist/agents/types.d.ts +2 -2
  26. package/dist/cli/index.js +23577 -19269
  27. package/dist/cli-node/index.js +23577 -19269
  28. package/dist/config/schema/agent-names.d.ts +26 -26
  29. package/dist/config/schema/agent-overrides.d.ts +400 -400
  30. package/dist/config/schema/browser-automation.d.ts +2 -2
  31. package/dist/config/schema/categories.d.ts +36 -36
  32. package/dist/config/schema/codegraph.d.ts +2 -0
  33. package/dist/config/schema/commands.d.ts +2 -2
  34. package/dist/config/schema/dynamic-context-pruning.d.ts +1 -1
  35. package/dist/config/schema/experimental.d.ts +1 -1
  36. package/dist/config/schema/fallback-models.d.ts +25 -25
  37. package/dist/config/schema/hooks.d.ts +43 -43
  38. package/dist/config/schema/internal/permission.d.ts +9 -9
  39. package/dist/config/schema/keyword-detector.d.ts +6 -6
  40. package/dist/config/schema/oh-my-opencode-config.d.ts +404 -402
  41. package/dist/config/schema/tmux.d.ts +6 -6
  42. package/dist/create-hooks.d.ts +35 -35
  43. package/dist/features/background-agent/spawner/tmux-callback-invoker.d.ts +11 -0
  44. package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
  45. package/dist/features/claude-tasks/types.d.ts +4 -4
  46. package/dist/features/team-mode/team-runtime/shutdown-helpers.d.ts +1 -1
  47. package/dist/features/team-mode/team-runtime/shutdown-test-fixtures.d.ts +4 -4
  48. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +42 -42
  49. package/dist/features/tmux-subagent/environment-eligibility.d.ts +2 -0
  50. package/dist/features/tmux-subagent/index.d.ts +1 -0
  51. package/dist/features/tmux-subagent/tracked-session-state.d.ts +1 -0
  52. package/dist/features/tui-sidebar/snapshot-schema.d.ts +6 -6
  53. package/dist/help/schema/acp.d.ts +3 -3
  54. package/dist/help/schema/doctor.d.ts +4 -4
  55. package/dist/help/schema/status.d.ts +3 -3
  56. package/dist/hooks/codegraph-bootstrap/hook.d.ts +3 -2
  57. package/dist/hooks/goal/types.d.ts +5 -5
  58. package/dist/hooks/non-interactive-env/constants.d.ts +4 -1
  59. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  60. package/dist/hooks/start-work/notepad-scaffold.d.ts +10 -0
  61. package/dist/hooks/start-work/parse-user-request.d.ts +2 -0
  62. package/dist/hooks/start-work/worktree-block.d.ts +5 -0
  63. package/dist/index.js +27370 -21301
  64. package/dist/mcp/types.d.ts +3 -3
  65. package/dist/oh-my-opencode.schema.json +11 -0
  66. package/dist/plugin/chat-message/loop-commands.d.ts +1 -0
  67. package/dist/plugin/command-execute-before.d.ts +3 -3
  68. package/dist/plugin/hooks/create-core-hooks.d.ts +25 -25
  69. package/dist/shared/omo-process-sweep.d.ts +18 -0
  70. package/dist/shared/tmux/tmux-utils/environment.d.ts +1 -1
  71. package/dist/shared/tmux/tmux-utils.d.ts +1 -1
  72. package/dist/shared/typescript-native-source-parser.d.ts +7 -0
  73. package/dist/skills/coding-agent-sessions/SKILL.md +5 -2
  74. package/dist/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  75. package/dist/skills/coding-agent-sessions/references/senpi.md +15 -5
  76. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  77. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  78. package/dist/skills/debugging/SKILL.md +2 -1
  79. package/dist/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  80. package/dist/skills/programming/SKILL.md +11 -1
  81. package/dist/skills/programming/references/logging.md +6 -1
  82. package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
  83. package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.ts +75 -11
  84. package/dist/skills/start-work/SKILL.md +12 -2
  85. package/dist/skills/ulw-plan/SKILL.md +21 -2
  86. package/dist/skills/ulw-plan/references/full-workflow.md +12 -1
  87. package/dist/skills/ulw-plan/references/intent-clear.md +1 -1
  88. package/dist/testing/create-plugin-module.d.ts +1 -0
  89. package/dist/tools/task/types.d.ts +10 -10
  90. package/dist/tui.js +23442 -19182
  91. package/package.json +14 -14
  92. package/packages/git-bash-mcp/dist/cli.js +54 -8
  93. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +62 -2
  94. package/packages/lsp-core/src/lsp/client.ts +14 -1
  95. package/packages/lsp-core/src/lsp/fixtures/diagnostics-freshness-contract-probe.ts +2 -2
  96. package/packages/lsp-core/src/mcp.ts +9 -0
  97. package/packages/lsp-daemon/dist/cli.js +319 -51
  98. package/packages/lsp-daemon/dist/client.js +136 -48
  99. package/packages/lsp-daemon/dist/daemon-client.d.ts +0 -10
  100. package/packages/lsp-daemon/dist/daemon-client.js +4 -34
  101. package/packages/lsp-daemon/dist/daemon-failure-result.d.ts +3 -0
  102. package/packages/lsp-daemon/dist/daemon-failure-result.js +38 -0
  103. package/packages/lsp-daemon/dist/daemon-request-error.d.ts +14 -0
  104. package/packages/lsp-daemon/dist/daemon-request-error.js +26 -0
  105. package/packages/lsp-daemon/dist/daemon-server.js +5 -1
  106. package/packages/lsp-daemon/dist/index.js +137 -48
  107. package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
  108. package/packages/lsp-daemon/dist/proxy.js +1 -0
  109. package/packages/lsp-daemon/dist/version-reap.d.ts +26 -0
  110. package/packages/lsp-daemon/dist/version-reap.js +182 -0
  111. package/packages/lsp-tools-mcp/dist/cli.js +61 -10
  112. package/packages/lsp-tools-mcp/dist/lsp/manager.js +6 -1
  113. package/packages/lsp-tools-mcp/dist/mcp.js +61 -10
  114. package/packages/lsp-tools-mcp/dist/tools.js +6 -1
  115. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  116. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +72 -12
  117. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  118. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  119. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +22 -2
  120. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +779 -385
  121. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +302 -173
  122. package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
  123. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
  124. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +23 -42
  125. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +98 -32
  126. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +5 -0
  127. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +17 -9
  128. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +18 -25
  129. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +1 -0
  130. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +5 -0
  131. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +176 -0
  132. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +6 -1
  133. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +31 -2
  134. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +1 -1
  135. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +6 -0
  136. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +65 -1
  137. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +3 -7
  138. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +2 -1
  139. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +57 -3
  140. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +42 -0
  141. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +122 -10
  142. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +2 -2
  143. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +101 -64
  144. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  145. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  146. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  147. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  148. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  149. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  151. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +80 -40
  152. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  153. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  154. package/packages/omo-codex/plugin/components/rules/dist/cli.js +11 -0
  155. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  156. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  157. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +11 -0
  158. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +60 -0
  159. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +1 -1
  160. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  161. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  162. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  163. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  164. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  165. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  166. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +2 -2
  167. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
  168. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  169. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  170. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +2 -2
  171. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  172. package/packages/omo-codex/plugin/components/ultrawork/directive.md +12 -7
  173. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
  174. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  175. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  176. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +12 -7
  177. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +21 -2
  178. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +12 -1
  179. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +1 -1
  180. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
  181. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +42 -0
  182. package/packages/omo-codex/plugin/components/ulw-loop/README.md +6 -4
  183. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +12 -7
  184. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.d.ts +21 -0
  185. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +64 -0
  186. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +15 -2
  187. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +1 -1
  188. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +2 -1
  189. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  190. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +3 -3
  191. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +3 -0
  192. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +85 -0
  193. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +0 -1
  194. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -33
  195. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +998 -593
  196. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +1 -0
  197. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -1
  198. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +2 -0
  199. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +6 -0
  200. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +1 -0
  201. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +3 -0
  202. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +1 -0
  203. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +4 -0
  204. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  205. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +10 -2
  206. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +1 -1
  207. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.d.ts +15 -0
  208. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +84 -0
  209. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +5 -0
  210. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +81 -0
  211. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +7 -59
  212. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +12 -4
  213. package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.d.ts +9 -0
  214. package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.js +122 -0
  215. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  216. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  217. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -1
  218. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -6
  219. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +84 -0
  220. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +13 -2
  221. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +1 -1
  222. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +1 -1
  223. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +3 -3
  224. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +49 -0
  225. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +13 -45
  226. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -0
  227. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +2 -0
  228. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +7 -0
  229. package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +4 -0
  230. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +4 -1
  231. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +20 -2
  232. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +1 -1
  233. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +125 -0
  234. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +59 -0
  235. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +6 -58
  236. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +12 -4
  237. package/packages/omo-codex/plugin/components/ulw-loop/src/validation-batch.ts +122 -0
  238. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +76 -0
  239. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +111 -0
  240. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +67 -0
  241. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +57 -0
  242. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +1 -0
  243. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +152 -0
  244. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +29 -0
  245. package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch-checkpoint.test.ts +147 -0
  246. package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch.test.ts +73 -0
  247. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  248. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  249. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  250. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  251. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  252. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  253. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  254. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  255. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  256. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  257. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  258. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -2
  259. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  260. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -2
  261. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  262. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -2
  263. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  264. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  265. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  266. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  267. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  268. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  269. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  270. package/packages/omo-codex/plugin/package-lock.json +41 -41
  271. package/packages/omo-codex/plugin/package.json +1 -1
  272. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +44 -0
  273. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +5 -2
  274. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  275. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +15 -5
  276. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  277. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  278. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -1
  279. package/packages/omo-codex/plugin/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  280. package/packages/omo-codex/plugin/skills/programming/SKILL.md +11 -1
  281. package/packages/omo-codex/plugin/skills/programming/references/logging.md +6 -1
  282. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +75 -11
  283. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +12 -2
  284. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +12 -7
  285. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -1
  286. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -6
  287. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +21 -2
  288. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +12 -1
  289. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +1 -1
  290. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +9 -9
  291. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +26 -0
  292. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +41 -0
  293. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +22 -0
  294. package/packages/omo-codex/scripts/install-dist/install-local.mjs +49 -5
  295. package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +4 -1
  296. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +5 -2
  297. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  298. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +15 -5
  299. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  300. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  301. package/packages/shared-skills/skills/debugging/SKILL.md +2 -1
  302. package/packages/shared-skills/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  303. package/packages/shared-skills/skills/programming/SKILL.md +11 -1
  304. package/packages/shared-skills/skills/programming/references/logging.md +6 -1
  305. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
  306. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +75 -11
  307. package/packages/shared-skills/skills/start-work/SKILL.md +12 -2
  308. package/packages/shared-skills/skills/ulw-plan/SKILL.md +21 -2
  309. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +12 -1
  310. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "4.19.0",
3
+ "version": "4.19.2",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -209,21 +209,21 @@
209
209
  "bun-types": "1.3.14",
210
210
  "node-pty": "^1.1.0",
211
211
  "puppeteer-core": "^25.3.0",
212
- "typescript": "^6.0.3"
212
+ "typescript": "^7.0.2"
213
213
  },
214
214
  "optionalDependencies": {
215
- "oh-my-opencode-darwin-arm64": "4.19.0",
216
- "oh-my-opencode-darwin-x64": "4.19.0",
217
- "oh-my-opencode-darwin-x64-baseline": "4.19.0",
218
- "oh-my-opencode-linux-arm64": "4.19.0",
219
- "oh-my-opencode-linux-arm64-musl": "4.19.0",
220
- "oh-my-opencode-linux-x64": "4.19.0",
221
- "oh-my-opencode-linux-x64-baseline": "4.19.0",
222
- "oh-my-opencode-linux-x64-musl": "4.19.0",
223
- "oh-my-opencode-linux-x64-musl-baseline": "4.19.0",
224
- "oh-my-opencode-windows-arm64": "4.19.0",
225
- "oh-my-opencode-windows-x64": "4.19.0",
226
- "oh-my-opencode-windows-x64-baseline": "4.19.0"
215
+ "oh-my-opencode-darwin-arm64": "4.19.2",
216
+ "oh-my-opencode-darwin-x64": "4.19.2",
217
+ "oh-my-opencode-darwin-x64-baseline": "4.19.2",
218
+ "oh-my-opencode-linux-arm64": "4.19.2",
219
+ "oh-my-opencode-linux-arm64-musl": "4.19.2",
220
+ "oh-my-opencode-linux-x64": "4.19.2",
221
+ "oh-my-opencode-linux-x64-baseline": "4.19.2",
222
+ "oh-my-opencode-linux-x64-musl": "4.19.2",
223
+ "oh-my-opencode-linux-x64-musl-baseline": "4.19.2",
224
+ "oh-my-opencode-windows-arm64": "4.19.2",
225
+ "oh-my-opencode-windows-x64": "4.19.2",
226
+ "oh-my-opencode-windows-x64-baseline": "4.19.2"
227
227
  },
228
228
  "overrides": {
229
229
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -163,16 +163,35 @@ function bufferFromChunk(chunk) {
163
163
 
164
164
  // ../mcp-stdio-core/src/server.ts
165
165
  var DEFAULT_IDLE_TIMEOUT_MS = 10 * 60000;
166
+ var DEFAULT_PARENT_POLL_INTERVAL_MS = 30000;
166
167
  var noopLog = () => {};
168
+ function isProcessAlive(pid) {
169
+ try {
170
+ process.kill(pid, 0);
171
+ return true;
172
+ } catch (error) {
173
+ return !hasErrorCode(error, "ESRCH");
174
+ }
175
+ }
167
176
  async function runJsonRpcStdioServer(config) {
168
177
  const log = config.log ?? noopLog;
169
178
  const idleTimeoutMs = config.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
170
- const idleTimer = createIdleTimer(idleTimeoutMs, log, config.onIdleTimeout);
179
+ let isClosed = false;
180
+ const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
181
+ isClosed = true;
182
+ config.onIdleTimeout?.();
183
+ });
184
+ const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
185
+ isClosed = true;
186
+ log("parent_exit", { parent_pid: parentPid, poll_interval_ms: pollIntervalMs });
187
+ config.onParentExit?.();
188
+ config.input.destroy();
189
+ });
171
190
  log("stdio_started", { cwd: process.cwd(), idle_timeout_ms: idleTimeoutMs });
172
191
  idleTimer.arm();
173
192
  try {
174
193
  for await (const message of readStdioJsonRpcMessages(config.input)) {
175
- if (idleTimer.closed())
194
+ if (isClosed)
176
195
  break;
177
196
  idleTimer.arm();
178
197
  if (message.kind === "parse_error") {
@@ -183,8 +202,12 @@ async function runJsonRpcStdioServer(config) {
183
202
  if (!await handleRequest(message, config, log))
184
203
  break;
185
204
  }
205
+ } catch (error) {
206
+ if (!(isClosed && hasErrorCode(error, "ERR_STREAM_PREMATURE_CLOSE")))
207
+ throw error;
186
208
  } finally {
187
209
  idleTimer.clear();
210
+ watchdog.clear();
188
211
  log("stdio_stopped");
189
212
  }
190
213
  }
@@ -240,9 +263,33 @@ function isTerminalOutputError(error) {
240
263
  return false;
241
264
  return error.code === "EPIPE" || error.code === "ERR_STREAM_DESTROYED" || error.code === "ERR_STREAM_WRITE_AFTER_END";
242
265
  }
243
- function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
266
+ function hasErrorCode(error, code) {
267
+ return error instanceof Error && "code" in error && error.code === code;
268
+ }
269
+ function createParentWatchdog(config, onDeadParent) {
270
+ if (config === undefined)
271
+ return { clear: () => {} };
272
+ const pollIntervalMs = config.pollIntervalMs ?? DEFAULT_PARENT_POLL_INTERVAL_MS;
273
+ if (pollIntervalMs <= 0)
274
+ return { clear: () => {} };
275
+ const parentPid = config.parentPid ?? process.ppid;
276
+ const probeAlive = config.probeAlive ?? isProcessAlive;
277
+ let fired = false;
278
+ const timer = setInterval(() => {
279
+ if (fired || probeAlive(parentPid))
280
+ return;
281
+ fired = true;
282
+ onDeadParent(parentPid, pollIntervalMs);
283
+ }, pollIntervalMs);
284
+ timer.unref();
285
+ return {
286
+ clear: () => {
287
+ clearInterval(timer);
288
+ }
289
+ };
290
+ }
291
+ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
244
292
  let timer = null;
245
- let isClosed = false;
246
293
  return {
247
294
  arm: () => {
248
295
  if (timer !== null)
@@ -250,9 +297,8 @@ function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
250
297
  if (idleTimeoutMs <= 0)
251
298
  return;
252
299
  timer = setTimeout(() => {
253
- isClosed = true;
254
300
  log("idle_timeout", { idle_timeout_ms: idleTimeoutMs });
255
- onIdleTimeout?.();
301
+ onTimeout();
256
302
  }, idleTimeoutMs);
257
303
  timer.unref();
258
304
  },
@@ -261,8 +307,7 @@ function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
261
307
  return;
262
308
  clearTimeout(timer);
263
309
  timer = null;
264
- },
265
- closed: () => isClosed
310
+ }
266
311
  };
267
312
  }
268
313
  // ../utils/src/runtime/git-bash.ts
@@ -444,6 +489,7 @@ async function runMcpStdioServer(input, output, options = {}) {
444
489
  handler: handleGitBashMcpRequest,
445
490
  handlerOptions: options,
446
491
  idleTimeoutMs: 0,
492
+ parentWatchdog: options.parentWatchdog ?? {},
447
493
  log: options.lifecycleLog,
448
494
  parseErrorResponse: () => errorResponse(null, -32601, "Method not found")
449
495
  });
@@ -107,7 +107,7 @@ describe("LspClient diagnostics freshness", () => {
107
107
  },
108
108
  ],
109
109
  },
110
- { diagnosticsFreshnessTimeoutMs: 30, versionlessPublishQuiescenceMs: 5 },
110
+ { diagnosticsFreshnessTimeoutMs: 100, versionlessPublishQuiescenceMs: 5 },
111
111
  );
112
112
  await stale.client.openFile(stale.source);
113
113
  writeFileSync(stale.source, "const stale = 1;\n", "utf-8");
@@ -130,7 +130,7 @@ describe("LspClient diagnostics freshness", () => {
130
130
  },
131
131
  ],
132
132
  },
133
- { diagnosticsFreshnessTimeoutMs: 30, versionlessPublishQuiescenceMs: 5 },
133
+ { diagnosticsFreshnessTimeoutMs: 100, versionlessPublishQuiescenceMs: 5 },
134
134
  );
135
135
  await future.client.openFile(future.source);
136
136
  writeFileSync(future.source, "const future = 1;\n", "utf-8");
@@ -258,4 +258,64 @@ describe("LspClient diagnostics freshness", () => {
258
258
  expect(result.transientError?.kind).toBe("freshness_timeout");
259
259
  expect(cancel?.params).toEqual({ id: request?.id });
260
260
  });
261
+
262
+ it("#given a server without pull support that never publishes diagnostics #when diagnostics run on a clean file #then the request resolves clean after the freshness window instead of reporting a timeout", async () => {
263
+ const context = await harness.makeClient(
264
+ {},
265
+ { diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
266
+ );
267
+
268
+ const startedAt = Date.now();
269
+ const result = await context.client.diagnostics(context.source);
270
+ const elapsedMs = Date.now() - startedAt;
271
+
272
+ expect(result.transientError).toBeUndefined();
273
+ expect(result.items).toEqual([]);
274
+ // The full freshness window is still honored so a slow publisher can win.
275
+ expect(elapsedMs).toBeGreaterThanOrEqual(45);
276
+ });
277
+
278
+ it("#given a pull-supported server that cached diagnostics for an older document version #when the file changes and a later pull is rejected as unsupported without any publish #then the fallback resolves empty instead of returning the stale cached diagnostics", async () => {
279
+ const context = await harness.makeClient(
280
+ {
281
+ capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
282
+ diagnosticResponses: [
283
+ { report: { kind: "full", resultId: "v1", items: [diagnostic("stale-pull")] } },
284
+ { error: { code: -32601, message: "Method not found" } },
285
+ ],
286
+ },
287
+ { diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
288
+ );
289
+
290
+ const first = await context.client.diagnostics(context.source);
291
+ expect(first.items).toEqual([diagnostic("stale-pull")]);
292
+
293
+ writeFileSync(context.source, "const changed = 1;\n");
294
+ await context.client.openFile(context.source);
295
+
296
+ const second = await context.client.diagnostics(context.source);
297
+ expect(second.transientError).toBeUndefined();
298
+ expect(second.items).toEqual([]);
299
+ });
300
+
301
+ it("#given a pull-supported server with a current cached pull report #when a later pull is rejected as unsupported without any publish and the document is unchanged #then the fallback resolves with the current cached diagnostics", async () => {
302
+ const context = await harness.makeClient(
303
+ {
304
+ capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
305
+ diagnosticResponses: [
306
+ { report: { kind: "full", resultId: "v1", items: [diagnostic("cached-full")] } },
307
+ { error: { code: -32601, message: "Method not found" } },
308
+ ],
309
+ },
310
+ { diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
311
+ );
312
+
313
+ const first = await context.client.diagnostics(context.source);
314
+ expect(first.items).toEqual([diagnostic("cached-full")]);
315
+
316
+ const second = await context.client.diagnostics(context.source);
317
+ expect(second.transientError).toBeUndefined();
318
+ expect(second.items).toEqual([diagnostic("cached-full")]);
319
+ });
320
+
261
321
  });
@@ -237,7 +237,20 @@ export class LspClient extends LspClientConnection {
237
237
  if (!pushFallbackOnly) continue;
238
238
 
239
239
  const remainingMs = deadlineAt - Date.now();
240
- if (remainingMs <= 0) return this.freshnessTimeout(absPath);
240
+ if (remainingMs <= 0) {
241
+ // A server that never advertised pull diagnostics (or rejected the pull
242
+ // method) and has never published for this document stays silent for a
243
+ // clean file (e.g. Marksman, #6131). Resolve with the version-current
244
+ // pull cache or explicit empty instead of a freshness timeout; a stale
245
+ // pull cache from an older document version is never returned. Servers
246
+ // that have published before keep timing out via publishGeneration > 0,
247
+ // and a hung advertised pull keeps timing out because pull stays supported.
248
+ if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
249
+ const cached = this.documents.getPullCache(snapshot);
250
+ return { items: cached === null ? [] : [...cached.diagnostics] };
251
+ }
252
+ return this.freshnessTimeout(absPath);
253
+ }
241
254
  const waitMs = push.status === "wait" ? Math.min(push.waitMs, remainingMs) : remainingMs;
242
255
  await waitForDiagnosticsActivity(this.documents.waitForDiagnosticsActivity(snapshot, waitMs), signal);
243
256
  }
@@ -182,9 +182,9 @@ try {
182
182
  outcome: "silent",
183
183
  items: silentResult.items.map((entry) => entry.message),
184
184
  transientError: silentResult.transientError ?? null,
185
- ok: silentResult.items.length === 0 && silentResult.transientError?.kind === "freshness_timeout",
185
+ ok: silentResult.items.length === 0 && silentResult.transientError === undefined,
186
186
  };
187
- requireProbe(silentEvidence.ok, "silent diagnostics were labeled clean instead of timing out transiently");
187
+ requireProbe(silentEvidence.ok, "silent no-pull server that never published did not resolve clean after the freshness window");
188
188
 
189
189
  const closedServer = await harness.makeClient(
190
190
  {
@@ -10,6 +10,7 @@ import {
10
10
  type JsonRpcResponse,
11
11
  type JsonRpcResult,
12
12
  type McpToolDescriptor,
13
+ type ParentWatchdogConfig,
13
14
  } from "@oh-my-opencode/mcp-stdio-core";
14
15
  import { coerceToolArguments, executeLspTool, LSP_MCP_TOOLS } from "./tools.js";
15
16
  import { createStandaloneMcpRequestContext, runWithRequestContext } from "./request-context.js";
@@ -23,6 +24,12 @@ export interface HandleLspMcpRequestOptions {
23
24
  readonly signal?: AbortSignal;
24
25
  }
25
26
 
27
+ export interface LspMcpStdioServerOptions {
28
+ // Test seam: production callers leave this unset so the watchdog uses its
29
+ // defaults (parentPid = process.ppid, 30s poll).
30
+ readonly parentWatchdog?: ParentWatchdogConfig;
31
+ }
32
+
26
33
  export async function handleLspMcpRequest(
27
34
  input: unknown,
28
35
  options: HandleLspMcpRequestOptions = {},
@@ -58,12 +65,14 @@ export async function handleLspMcpRequest(
58
65
  export async function runMcpStdioServer(
59
66
  input: Readable = process.stdin,
60
67
  output: Writable = process.stdout,
68
+ options: LspMcpStdioServerOptions = {},
61
69
  ): Promise<void> {
62
70
  const requestContext = createStandaloneMcpRequestContext();
63
71
  await runJsonRpcStdioServer({
64
72
  input,
65
73
  output,
66
74
  idleTimeoutMs: 0,
75
+ parentWatchdog: options.parentWatchdog ?? {},
67
76
  handler: (request) => runWithRequestContext(requestContext, () => handleLspMcpRequest(request)),
68
77
  handlerOptions: undefined,
69
78
  });