oh-my-opencode 4.16.3 → 4.17.0

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 (177) hide show
  1. package/.agents/command/omomomo.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +3 -3
  3. package/.agents/skills/omomomo/SKILL.md +1 -1
  4. package/.opencode/command/omomomo.md +1 -1
  5. package/.opencode/skills/hyperplan/SKILL.md +3 -3
  6. package/.opencode/skills/pre-publish-review/SKILL.md +3 -0
  7. package/README.ja.md +4 -4
  8. package/README.ko.md +4 -4
  9. package/README.md +2 -2
  10. package/README.ru.md +4 -4
  11. package/README.zh-cn.md +4 -4
  12. package/dist/cli/index.js +179 -63
  13. package/dist/cli-node/index.js +179 -63
  14. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
  15. package/dist/index.js +121 -58
  16. package/dist/plugin/chat-message/types.d.ts +4 -0
  17. package/dist/plugin/command-execute-before.d.ts +1 -0
  18. package/dist/plugin/stop-continuation.d.ts +17 -0
  19. package/dist/skills/remove-ai-slops/SKILL.md +2 -2
  20. package/dist/skills/start-work/SKILL.md +5 -2
  21. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  22. package/dist/tui.js +71 -29
  23. package/package.json +15 -14
  24. package/packages/git-bash-mcp/package.json +27 -0
  25. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +84 -19
  27. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  33. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  35. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
  36. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
  37. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
  38. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
  40. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  41. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
  42. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  43. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
  45. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +1 -1
  46. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  47. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  49. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
  51. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  52. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +2 -2
  56. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
  57. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +6 -6
  58. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
  59. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
  60. package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +6 -4
  61. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
  62. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +2 -2
  63. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
  64. package/packages/omo-codex/plugin/components/ultrawork/directive.md +55 -28
  65. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  66. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +55 -28
  68. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  69. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -0
  70. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
  71. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  72. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
  73. package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
  74. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +55 -28
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
  78. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
  79. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
  80. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
  81. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
  82. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
  83. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
  84. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
  85. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
  86. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
  87. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
  88. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
  89. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
  90. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
  92. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
  93. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  94. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
  95. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +29 -27
  96. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
  97. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
  98. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
  99. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
  100. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
  101. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
  102. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
  104. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
  105. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
  106. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
  107. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
  108. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
  109. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
  110. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
  111. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
  112. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
  113. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
  114. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
  115. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
  116. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
  126. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  130. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  131. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  132. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  133. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
  134. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
  136. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  139. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  140. package/packages/omo-codex/plugin/package-lock.json +13 -13
  141. package/packages/omo-codex/plugin/package.json +1 -1
  142. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  143. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +8 -2
  144. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +2 -2
  145. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
  146. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
  147. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +8 -2
  148. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +5 -2
  149. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +55 -28
  150. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
  151. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +29 -27
  152. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  153. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  154. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +2 -2
  155. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +76 -16
  156. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
  157. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
  158. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
  159. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  160. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  161. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
  162. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +14 -14
  163. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +11 -0
  164. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
  165. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -2
  166. package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
  167. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
  168. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  169. package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
  170. package/packages/omo-codex/scripts/install-dist/install-local.mjs +91 -21
  171. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
  172. package/packages/shared-skills/skills/start-work/SKILL.md +5 -2
  173. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  174. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  175. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
  176. package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
  177. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
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",
@@ -63,6 +63,7 @@
63
63
  "packages/lsp-tools-mcp/dist",
64
64
  "packages/lsp-daemon/package.json",
65
65
  "packages/lsp-daemon/dist",
66
+ "packages/git-bash-mcp/package.json",
66
67
  "packages/git-bash-mcp/dist",
67
68
  "packages/shared-skills/package.json",
68
69
  "packages/shared-skills/index.mjs",
@@ -128,7 +129,7 @@
128
129
  "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/pi-goal/tsconfig.json && tsgo --noEmit -p packages/pi-webfetch/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json",
129
130
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
130
131
  "test": "bun test",
131
- "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
132
+ "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
132
133
  "test:senpi": "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 && bun test packages/omo-senpi",
133
134
  "test:windows-codex": "bun run test:codex",
134
135
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build"
@@ -210,18 +211,18 @@
210
211
  "typescript": "^6.0.3"
211
212
  },
212
213
  "optionalDependencies": {
213
- "oh-my-opencode-darwin-arm64": "4.16.3",
214
- "oh-my-opencode-darwin-x64": "4.16.3",
215
- "oh-my-opencode-darwin-x64-baseline": "4.16.3",
216
- "oh-my-opencode-linux-arm64": "4.16.3",
217
- "oh-my-opencode-linux-arm64-musl": "4.16.3",
218
- "oh-my-opencode-linux-x64": "4.16.3",
219
- "oh-my-opencode-linux-x64-baseline": "4.16.3",
220
- "oh-my-opencode-linux-x64-musl": "4.16.3",
221
- "oh-my-opencode-linux-x64-musl-baseline": "4.16.3",
222
- "oh-my-opencode-windows-arm64": "4.16.3",
223
- "oh-my-opencode-windows-x64": "4.16.3",
224
- "oh-my-opencode-windows-x64-baseline": "4.16.3"
214
+ "oh-my-opencode-darwin-arm64": "4.17.0",
215
+ "oh-my-opencode-darwin-x64": "4.17.0",
216
+ "oh-my-opencode-darwin-x64-baseline": "4.17.0",
217
+ "oh-my-opencode-linux-arm64": "4.17.0",
218
+ "oh-my-opencode-linux-arm64-musl": "4.17.0",
219
+ "oh-my-opencode-linux-x64": "4.17.0",
220
+ "oh-my-opencode-linux-x64-baseline": "4.17.0",
221
+ "oh-my-opencode-linux-x64-musl": "4.17.0",
222
+ "oh-my-opencode-linux-x64-musl-baseline": "4.17.0",
223
+ "oh-my-opencode-windows-arm64": "4.17.0",
224
+ "oh-my-opencode-windows-x64": "4.17.0",
225
+ "oh-my-opencode-windows-x64-baseline": "4.17.0"
225
226
  },
226
227
  "overrides": {
227
228
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@oh-my-opencode/git-bash-mcp",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "private": true,
6
+ "bin": {
7
+ "omo-git-bash": "dist/cli.js"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.ts",
12
+ "import": "./src/index.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "bun build src/cli.ts --outdir dist --target node --format esm",
17
+ "typecheck": "tsgo --noEmit -p tsconfig.json",
18
+ "test": "bun test src/*.test.ts"
19
+ },
20
+ "dependencies": {
21
+ "@oh-my-opencode/mcp-stdio-core": "workspace:*",
22
+ "@oh-my-opencode/utils": "workspace:*"
23
+ },
24
+ "devDependencies": {
25
+ "bun-types": "1.3.12"
26
+ }
27
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -30,6 +30,7 @@
30
30
  "./hooks/user-prompt-submit-checking-ulw-loop-steering.json",
31
31
  "./hooks/pre-tool-use-recommending-git-bash-mcp.json",
32
32
  "./hooks/pre-tool-use-enforcing-unlimited-goal-budget.json",
33
+ "./hooks/pre-tool-use-guarding-ulw-loop-spawns.json",
33
34
  "./hooks/post-tool-use-checking-comments.json",
34
35
  "./hooks/post-tool-use-checking-lsp-diagnostics.json",
35
36
  "./hooks/post-tool-use-checking-codegraph-init-guidance.json",
@@ -39,6 +40,7 @@
39
40
  "./hooks/post-compact-resetting-project-rule-cache.json",
40
41
  "./hooks/post-compact-resetting-lsp-diagnostics-cache.json",
41
42
  "./hooks/stop-checking-start-work-continuation.json",
43
+ "./hooks/stop-checking-ulw-loop-resume.json",
42
44
  "./hooks/subagent-stop-checking-start-work-continuation.json",
43
45
  "./hooks/subagent-stop-verifying-lazycodex-executor-evidence.json"
44
46
  ],
@@ -879,32 +879,88 @@ import { join as join8 } from "node:path";
879
879
  var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
880
880
  [
881
881
  "explorer",
882
- {
883
- previous: { model: "gpt-5.4-mini", effort: "low" },
884
- current: { model: "gpt-5.6-terra", effort: "medium" }
885
- }
882
+ [
883
+ {
884
+ previous: { model: "gpt-5.4-mini", effort: "low" },
885
+ current: { model: "gpt-5.6-terra", effort: "medium" }
886
+ },
887
+ {
888
+ previous: { model: "gpt-5.6-terra", effort: "medium" },
889
+ current: { model: "gpt-5.6-luna", effort: "low" }
890
+ }
891
+ ]
886
892
  ],
887
893
  [
888
894
  "librarian",
889
- {
890
- previous: { model: "gpt-5.4-mini", effort: "low" },
891
- current: { model: "gpt-5.6-terra", effort: "medium" }
892
- }
895
+ [
896
+ {
897
+ previous: { model: "gpt-5.4-mini", effort: "low" },
898
+ current: { model: "gpt-5.6-terra", effort: "medium" }
899
+ },
900
+ {
901
+ previous: { model: "gpt-5.6-terra", effort: "medium" },
902
+ current: { model: "gpt-5.6-luna", effort: "low" }
903
+ }
904
+ ]
893
905
  ],
894
906
  [
895
907
  "momus",
896
- {
897
- previous: { model: "gpt-5.5", effort: "xhigh" },
898
- current: { model: "gpt-5.6-sol", effort: "ultra" }
899
- }
908
+ [
909
+ {
910
+ previous: { model: "gpt-5.5", effort: "xhigh" },
911
+ current: { model: "gpt-5.6-sol", effort: "ultra" }
912
+ }
913
+ ]
914
+ ],
915
+ [
916
+ "plan",
917
+ [
918
+ {
919
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
920
+ current: { model: "gpt-5.6-sol", effort: "max" }
921
+ }
922
+ ]
923
+ ],
924
+ [
925
+ "lazycodex-worker-medium",
926
+ [
927
+ {
928
+ previous: { model: "gpt-5.6-sol", effort: "high" },
929
+ current: { model: "gpt-5.6-luna", effort: "max" }
930
+ }
931
+ ]
932
+ ],
933
+ [
934
+ "lazycodex-qa-executor",
935
+ [
936
+ {
937
+ previous: { model: "gpt-5.6-terra", effort: "medium" },
938
+ current: { model: "gpt-5.6-luna", effort: "high" }
939
+ }
940
+ ]
941
+ ],
942
+ [
943
+ "lazycodex-gate-reviewer",
944
+ [
945
+ {
946
+ previous: { model: "gpt-5.6-sol", effort: "xhigh" },
947
+ current: { model: "gpt-5.6-sol", effort: "high" }
948
+ }
949
+ ]
900
950
  ]
901
951
  ]);
902
952
  function resolveManagedAgentReasoning(input) {
903
- const upgrade = MANAGED_REASONING_DEFAULT_UPGRADES.get(input.agentName);
904
- if (upgrade !== undefined && input.preserved.model === upgrade.previous.model && input.preserved.effort === upgrade.previous.effort && input.bundledModel === upgrade.current.model && input.bundledEffort === upgrade.current.effort) {
905
- return upgrade.current.effort;
906
- }
907
- return input.preserved.effort;
953
+ const steps = MANAGED_REASONING_DEFAULT_UPGRADES.get(input.agentName);
954
+ if (steps === undefined)
955
+ return input.preserved.effort;
956
+ const latest = steps[steps.length - 1];
957
+ if (latest === undefined)
958
+ return input.preserved.effort;
959
+ if (input.bundledModel !== latest.current.model || input.bundledEffort !== latest.current.effort) {
960
+ return input.preserved.effort;
961
+ }
962
+ const preservedMatchesAnyStep = steps.some((step) => input.preserved.model === step.previous.model && input.preserved.effort === step.previous.effort);
963
+ return preservedMatchesAnyStep ? latest.current.effort : input.preserved.effort;
908
964
  }
909
965
 
910
966
  // ../src/install/preserved-agent-settings.ts
@@ -2041,6 +2097,9 @@ function stripTomlLineComment(line) {
2041
2097
  var LEGACY_MANAGED_CODEX_AGENT_NAMES_TO_PURGE = ["codex-ultrawork-reviewer"];
2042
2098
  var CURRENT_MANAGED_CODEX_AGENT_NAMES = [
2043
2099
  "explorer",
2100
+ "lazycodex-worker-high",
2101
+ "lazycodex-worker-low",
2102
+ "lazycodex-worker-medium",
2044
2103
  "librarian",
2045
2104
  "metis",
2046
2105
  "momus",
@@ -2458,12 +2517,18 @@ import { readFile as readFile9 } from "node:fs/promises";
2458
2517
  import { join as join16 } from "node:path";
2459
2518
  var FALLBACK_CODEX_MODEL_CATALOG = {
2460
2519
  current: {
2461
- model: "gpt-5.5",
2462
- modelContextWindow: 400000,
2520
+ model: "gpt-5.6-sol",
2521
+ modelContextWindow: 372000,
2463
2522
  modelReasoningEffort: "high",
2464
2523
  planModeReasoningEffort: "xhigh"
2465
2524
  },
2466
2525
  managedProfiles: [
2526
+ {
2527
+ model: "gpt-5.5",
2528
+ modelContextWindow: 400000,
2529
+ modelReasoningEffort: "high",
2530
+ planModeReasoningEffort: "xhigh"
2531
+ },
2467
2532
  {
2468
2533
  model: "gpt-5.5",
2469
2534
  modelContextWindow: 1e6,
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.16.3) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 4.17.0) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.16.3) Checking Comments"
11
+ "statusMessage": "(OmO 4.17.0) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 4.16.3) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.17.0) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 4.16.3) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.17.0) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## OVERVIEW
6
6
 
7
- Codex `SubagentStop` hook component: the evidence gate for the `lazycodex-executor` subagent (ultrawork implementation executor). When the executor stops without a valid evidence receipt, the hook emits `{"decision": "block", "reason": <directive>}` and Codex sends it back to work. Matcher is `^lazycodex-executor$` only; `lazycodex-qa-executor` and `lazycodex-gate-reviewer` (same `ultrawork/agents/` family) are NOT gated by this hook.
7
+ Codex `SubagentStop` hook component: the evidence gate for the ultrawork implementation workers (`lazycodex-worker-low|medium|high`). When a worker stops without a valid evidence receipt, the hook emits `{"decision": "block", "reason": <directive>}` and Codex sends it back to work. Matcher is `^lazycodex-worker-(low|medium|high)$`; read-only roles like `lazycodex-qa-executor` and `lazycodex-gate-reviewer` (same `ultrawork/agents/` family) are NOT gated by this hook. (The historical `lazycodex-executor` agent was removed; this component keeps its name.)
8
8
 
9
9
  Valid receipt: `last_assistant_message` contains `EVIDENCE_RECORDED: <path>` where `<path>` resolves to a non-empty regular file strictly inside `<cwd>/.omo/evidence/`. Symlinks and directories rejected; containment checked on realpaths (file inside evidence root inside cwd, traversal-safe). A valid receipt clears attempt state and exits silently.
10
10
 
@@ -30,7 +30,7 @@ Escape hatches: after 3 blocked attempts (`MAX_ATTEMPTS`) the stop passes and st
30
30
  | Change the block message | `directive.md`; keep both `{{...}}` placeholders and the literal `EVIDENCE_RECORDED: <path>` final-line contract |
31
31
  | Change receipt validation | `src/codex-hook.ts` (`hasValidEvidenceReceipt`, `extractEvidencePath`, `isNonEmptyFileInsideEvidenceRoot`) |
32
32
  | Change the retry budget | `src/state.ts` `MAX_ATTEMPTS` |
33
- | Executor-side contract | `../ultrawork/agents/lazycodex-executor.toml` instructs the final `EVIDENCE_RECORDED: <path>` line this hook parses |
33
+ | Worker-side contract | `../ultrawork/agents/lazycodex-worker-{low,medium,high}.toml` instruct the final `EVIDENCE_RECORDED: <path>` line this hook parses |
34
34
  | Plugin-level wiring | `../../hooks/subagent-stop-verifying-lazycodex-executor-evidence.json` (adds `commandWindows` via `../bootstrap/scripts/node-dispatch.ps1`) |
35
35
  | Wiring + contract tests | `../../test/aggregate-hooks.test.mjs`, `../../test/component-hook-contract-cases.mjs`, `../../test/hook-status-message.test.mjs`, `../../test/component-bundled-cli.test.mjs` |
36
36
 
@@ -66,11 +66,15 @@ function isRecord(value) {
66
66
  var SUBAGENT_STOP_EVENT = "SubagentStop";
67
67
 
68
68
  // components/lazycodex-executor-verify/src/codex-hook.ts
69
- var LAZYCODEX_EXECUTOR_AGENT = "lazycodex-executor";
69
+ var RECEIPT_ENFORCED_AGENTS = new Set([
70
+ "lazycodex-worker-low",
71
+ "lazycodex-worker-medium",
72
+ "lazycodex-worker-high"
73
+ ]);
70
74
  function runSubagentStopHook(input, fs) {
71
75
  if (!isSubagentStopInput(input))
72
76
  return "";
73
- if (input.agent_type !== LAZYCODEX_EXECUTOR_AGENT)
77
+ if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type))
74
78
  return "";
75
79
  if (transcriptHasContextPressureMarker(input.transcript_path, fs))
76
80
  return "";
@@ -3,11 +3,15 @@ import { isAbsolute, relative, resolve } from "node:path";
3
3
  import { renderDirective } from "./directive.js";
4
4
  import { clearAttemptState, MAX_ATTEMPTS, readAttemptState, writeAttemptState } from "./state.js";
5
5
  import { SUBAGENT_STOP_EVENT } from "./types.js";
6
- const LAZYCODEX_EXECUTOR_AGENT = "lazycodex-executor";
6
+ const RECEIPT_ENFORCED_AGENTS = new Set([
7
+ "lazycodex-worker-low",
8
+ "lazycodex-worker-medium",
9
+ "lazycodex-worker-high",
10
+ ]);
7
11
  export function runSubagentStopHook(input, fs) {
8
12
  if (!isSubagentStopInput(input))
9
13
  return "";
10
- if (input.agent_type !== LAZYCODEX_EXECUTOR_AGENT)
14
+ if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type))
11
15
  return "";
12
16
  if (transcriptHasContextPressureMarker(input.transcript_path, fs))
13
17
  return "";
@@ -2,13 +2,13 @@
2
2
  "hooks": {
3
3
  "SubagentStop": [
4
4
  {
5
- "matcher": "^lazycodex-executor$",
5
+ "matcher": "^lazycodex-worker-(low|medium|high)$",
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 4.16.3) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.17.0) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -6,11 +6,15 @@ import { clearAttemptState, MAX_ATTEMPTS, readAttemptState, writeAttemptState }
6
6
  import type { HookFileSystem, StopHookOutput, SubagentStopInput } from "./types.js";
7
7
  import { SUBAGENT_STOP_EVENT } from "./types.js";
8
8
 
9
- const LAZYCODEX_EXECUTOR_AGENT = "lazycodex-executor";
9
+ const RECEIPT_ENFORCED_AGENTS = new Set([
10
+ "lazycodex-worker-low",
11
+ "lazycodex-worker-medium",
12
+ "lazycodex-worker-high",
13
+ ]);
10
14
 
11
15
  export function runSubagentStopHook(input: unknown, fs: HookFileSystem): string {
12
16
  if (!isSubagentStopInput(input)) return "";
13
- if (input.agent_type !== LAZYCODEX_EXECUTOR_AGENT) return "";
17
+ if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type)) return "";
14
18
  if (transcriptHasContextPressureMarker(input.transcript_path, fs)) return "";
15
19
  if (hasValidEvidenceReceipt(input, fs)) {
16
20
  clearAttemptState(input.cwd, input.session_id, input.agent_id, fs);
@@ -110,7 +110,7 @@ function createPayload(
110
110
  ): Record<string, string | boolean> {
111
111
  return {
112
112
  hook_event_name: "SubagentStop",
113
- agent_type: "lazycodex-executor",
113
+ agent_type: "lazycodex-worker-medium",
114
114
  agent_id: "agent_1",
115
115
  session_id: "sess.1",
116
116
  cwd,
@@ -299,7 +299,7 @@ function existingReceiptTargetOutsideEvidenceRoot(): string {
299
299
  function createInput(cwd: string, overrides: Partial<SubagentStopInput> = {}): SubagentStopInput {
300
300
  return {
301
301
  hook_event_name: "SubagentStop",
302
- agent_type: "lazycodex-executor",
302
+ agent_type: "lazycodex-worker-medium",
303
303
  agent_id: "agent_1",
304
304
  session_id: "sess.1",
305
305
  cwd,
@@ -315,7 +315,7 @@ function createInput(cwd: string, overrides: Partial<SubagentStopInput> = {}): S
315
315
  function createUnknownEventInput(cwd: string): Record<string, string | boolean> {
316
316
  return {
317
317
  hook_event_name: "Stop",
318
- agent_type: "lazycodex-executor",
318
+ agent_type: "lazycodex-worker-medium",
319
319
  agent_id: "agent_1",
320
320
  session_id: "sess.1",
321
321
  cwd,
@@ -344,3 +344,68 @@ function isBlockOutput(value: unknown): value is BlockOutput {
344
344
  typeof value.reason === "string"
345
345
  );
346
346
  }
347
+
348
+ describe("tier worker receipt enforcement", () => {
349
+ // given the matcher set now covers the difficulty-tier workers
350
+ const workerTypes = ["lazycodex-worker-low", "lazycodex-worker-medium", "lazycodex-worker-high"] as const;
351
+
352
+ for (const agentType of workerTypes) {
353
+ it(`#given no evidence receipt #when a ${agentType} child stops #then blocks`, () => {
354
+ // given
355
+ const cwd = createWorkspace();
356
+
357
+ // when
358
+ const output = runSubagentStopHook(createInput(cwd, { agent_type: agentType }), nodeFileSystem);
359
+
360
+ // then
361
+ expect(parseBlockOutput(output).decision).toBe("block");
362
+ });
363
+ }
364
+
365
+ it("#given no evidence receipt #when an explorer child stops #then no-ops", () => {
366
+ // given
367
+ const cwd = createWorkspace();
368
+
369
+ // when
370
+ const output = runSubagentStopHook(createInput(cwd, { agent_type: "explorer" }), nodeFileSystem);
371
+
372
+ // then
373
+ expect(output).toBe("");
374
+ });
375
+
376
+ it("#given both hook manifests #when their matchers are applied #then enforced agents match and read-only roles do not", () => {
377
+ // given
378
+ const componentManifest = JSON.parse(
379
+ readFileSync(new URL("../hooks/hooks.json", import.meta.url), "utf8"),
380
+ );
381
+ const rootManifest = JSON.parse(
382
+ readFileSync(
383
+ new URL("../../../hooks/subagent-stop-verifying-lazycodex-executor-evidence.json", import.meta.url),
384
+ "utf8",
385
+ ),
386
+ );
387
+ for (const manifest of [componentManifest, rootManifest]) {
388
+ const matcher = new RegExp(manifest.hooks.SubagentStop[0].matcher);
389
+
390
+ // then
391
+ for (const name of workerTypes) expect(matcher.test(name)).toBe(true);
392
+ expect(matcher.test("lazycodex-executor")).toBe(false);
393
+ expect(matcher.test("explorer")).toBe(false);
394
+ expect(matcher.test("lazycodex-gate-reviewer")).toBe(false);
395
+ }
396
+ });
397
+
398
+ it("#given the tier worker TOMLs #when inspected #then each instructs the EVIDENCE_RECORDED receipt line", () => {
399
+ for (const tier of ["low", "medium", "high"]) {
400
+ // when
401
+ const toml = readFileSync(
402
+ new URL(`../../ultrawork/agents/lazycodex-worker-${tier}.toml`, import.meta.url),
403
+ "utf8",
404
+ );
405
+
406
+ // then
407
+ expect(toml).toContain("EVIDENCE_RECORDED: <path>");
408
+ }
409
+ });
410
+ });
411
+
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 4.16.3) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.17.0) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 4.16.3) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.17.0) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -56,17 +56,4 @@ describe("plugin package metadata", () => {
56
56
  expect(codexHookSource).not.toContain("../../../../../lsp-daemon");
57
57
  expect(sourceFiles.filter((name) => name.startsWith("lazy-mcp") || name === "lazy-lsp-mcp.ts")).toEqual([]);
58
58
  });
59
-
60
- it("#given LSP skill guidance #when validating MCP tool instructions #then tool names are not framed as shell commands", () => {
61
- // given
62
- const skill = readTextFile("skills/lsp/SKILL.md");
63
-
64
- // when
65
- const mentionsToolInterface = skill.includes("through the tool interface");
66
- const rejectsShellExecution = skill.includes("not shell commands");
67
-
68
- // then
69
- expect(mentionsToolInterface).toBe(true);
70
- expect(rejectsShellExecution).toBe(true);
71
- });
72
59
  });
@@ -19,7 +19,7 @@ Status requests are not stop signals: give the update, keep working. Honor every
19
19
 
20
20
  # Discovery
21
21
 
22
- Never speculate about code you have not read: verify with tools and re-read on every hand-off. Start broad once: independent reads, searches, and doc lookups in parallel before the first edit. Retrieve again only when the core question is open, a needed fact is missing, or a second-order question (callers, error paths, ownership) changes the design. Stop when you can act. Prefer the root fix over the symptom fix.
22
+ Never speculate about code you have not read: verify with tools and re-read on every hand-off. Start broad once - and WIDE: tool calls run as JavaScript through `exec`, so write programs, not single calls. Batch EVERY independent read, search, and doc lookup into ONE `exec` script via `Promise.all` over the `tools` object before the first edit; filter and reduce results in-script so only what you need returns to context. NEVER await independent calls one at a time - sequence only when one result feeds the next. Retrieve again only when the core question is open, a needed fact is missing, or a second-order question (callers, error paths, ownership) changes the design. Stop when you can act. Prefer the root fix over the symptom fix.
23
23
 
24
24
  # Operating Loop
25
25
 
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.16.3) Loading Project Rules"
10
+ "statusMessage": "(OmO 4.17.0) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 4.16.3) Loading Project Rules"
22
+ "statusMessage": "(OmO 4.17.0) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 4.16.3) Matching Project Rules"
35
+ "statusMessage": "(OmO 4.17.0) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 4.16.3) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 4.17.0) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "4.16.3",
3
+ "version": "4.17.0",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",