oh-my-opencode 5.0.0-beta.31 → 5.0.0-beta.32

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 (227) hide show
  1. package/dist/cli/index.js +136 -44
  2. package/dist/cli-node/index.js +136 -44
  3. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
  4. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
  5. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
  6. package/dist/features/monitor/manager-internals.d.ts +1 -1
  7. package/dist/features/monitor/output-injector-types.d.ts +1 -1
  8. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +1 -0
  9. package/dist/features/team-mode/tools/messaging-runtime.d.ts +1 -0
  10. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  11. package/dist/index.js +286 -99
  12. package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  13. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  14. package/dist/tui.js +109 -23
  15. package/package.json +16 -15
  16. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +47 -19
  17. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  18. package/packages/lsp-core/src/lsp/client.ts +6 -3
  19. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +61 -0
  20. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  21. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  22. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  23. package/packages/lsp-core/src/lsp/transport.ts +7 -2
  24. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  25. package/packages/lsp-core/src/lsp/workspace-document-state.ts +30 -11
  26. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  27. package/packages/lsp-daemon/dist/cli.js +41 -16
  28. package/packages/lsp-daemon/dist/client.js +41 -16
  29. package/packages/lsp-daemon/dist/index.js +41 -16
  30. package/packages/lsp-tools-mcp/dist/cli.js +41 -16
  31. package/packages/lsp-tools-mcp/dist/lsp/manager.js +41 -16
  32. package/packages/lsp-tools-mcp/dist/mcp.js +41 -16
  33. package/packages/lsp-tools-mcp/dist/tools.js +41 -16
  34. package/packages/lsp-tools-mcp/package.json +1 -1
  35. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  36. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +3 -17
  39. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +3 -17
  40. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  42. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  43. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  44. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  46. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  48. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +39 -16
  49. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  50. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  52. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  56. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -4
  58. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +489 -4
  59. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  60. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -2
  61. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  62. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  63. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  64. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  65. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  66. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  67. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +4 -2
  69. package/packages/omo-codex/plugin/components/ulw-loop/README.md +1 -0
  70. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +9 -0
  71. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +14 -0
  72. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +10 -1
  73. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +8 -0
  74. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +113 -0
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +7 -5
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +2 -1
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  78. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +1 -0
  79. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +2 -0
  80. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +775 -312
  81. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +18 -0
  82. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +13 -0
  83. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +14 -0
  84. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
  85. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +17 -2
  86. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +13 -0
  87. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +19 -0
  88. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +2 -0
  89. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +53 -0
  90. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +9 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +85 -0
  92. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +1 -1
  93. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +41 -99
  94. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +4 -2
  95. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +184 -14
  96. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
  97. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
  98. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +3 -0
  99. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +15 -0
  100. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  101. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  102. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +17 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +7 -0
  104. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +25 -1
  105. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +127 -0
  106. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +8 -12
  107. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +2 -1
  108. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +1 -0
  109. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +2 -0
  110. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +18 -0
  111. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +23 -0
  112. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
  113. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +18 -3
  114. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +27 -0
  115. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +57 -0
  116. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +103 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +1 -1
  118. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +50 -116
  119. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +4 -2
  120. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +186 -12
  121. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
  122. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +22 -0
  123. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +66 -3
  124. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +92 -0
  125. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +183 -0
  126. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +13 -3
  127. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +105 -0
  128. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +101 -0
  129. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +16 -15
  130. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  131. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +5 -0
  132. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +300 -3
  133. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +9 -3
  134. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  136. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  139. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  140. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  141. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  142. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  143. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  144. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  145. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  146. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  147. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  148. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  149. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  150. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  151. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  152. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  153. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  154. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  155. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  156. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  157. package/packages/omo-codex/plugin/package-lock.json +13 -13
  158. package/packages/omo-codex/plugin/package.json +1 -1
  159. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +31 -2
  160. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  161. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +17 -0
  162. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +11 -1
  163. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +13 -0
  164. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -2
  165. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  166. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  167. package/dist/features/builtin-skills/index.d.ts +0 -1
  168. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  169. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  170. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  171. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  172. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  173. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  174. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  175. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  176. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  177. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  178. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  179. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  180. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  181. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  182. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  183. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  184. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  185. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  186. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  187. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  188. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  189. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  190. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  191. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  192. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  193. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  194. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  195. package/dist/features/builtin-skills/skills.d.ts +0 -1
  196. package/dist/features/builtin-skills/types.d.ts +0 -1
  197. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  198. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  199. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  200. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  201. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  202. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  203. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  204. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  205. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  206. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  207. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  208. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  209. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  210. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  211. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  212. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  213. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  214. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  215. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  216. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  217. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  218. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  219. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  220. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  221. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  222. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  223. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  224. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  225. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  226. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -483
  227. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +0 -490
@@ -1,4 +1,4 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { mkdtemp, rm } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
@@ -9,16 +9,27 @@ import { applySpawnGuards } from "../src/spawn-guard.ts";
9
9
 
10
10
  let workDir: string;
11
11
  let originalLimit: string | undefined;
12
+ let originalReviewLimit: string | undefined;
13
+ let originalToolkitSurface: string | undefined;
12
14
 
13
15
  beforeEach(async () => {
14
16
  workDir = await mkdtemp(join(tmpdir(), "ulw-spawn-guard-"));
15
17
  originalLimit = process.env["OMO_SPAWN_FANOUT_LIMIT"];
18
+ originalReviewLimit = process.env["OMO_ULW_LOOP_REVIEW_SPAWN_LIMIT"];
19
+ originalToolkitSurface = process.env["OMO_AGENT_TOOLKIT_SURFACE"];
16
20
  delete process.env["OMO_SPAWN_FANOUT_LIMIT"];
21
+ delete process.env["OMO_ULW_LOOP_REVIEW_SPAWN_LIMIT"];
22
+ delete process.env["OMO_AGENT_TOOLKIT_SURFACE"];
17
23
  });
18
24
 
19
25
  afterEach(async () => {
26
+ delete process.env["OMO_AGENT_TOOLKIT_SURFACE"];
20
27
  if (originalLimit === undefined) delete process.env["OMO_SPAWN_FANOUT_LIMIT"];
21
28
  else process.env["OMO_SPAWN_FANOUT_LIMIT"] = originalLimit;
29
+ if (originalReviewLimit === undefined) delete process.env["OMO_ULW_LOOP_REVIEW_SPAWN_LIMIT"];
30
+ else process.env["OMO_ULW_LOOP_REVIEW_SPAWN_LIMIT"] = originalReviewLimit;
31
+ if (originalToolkitSurface === undefined) delete process.env["OMO_AGENT_TOOLKIT_SURFACE"];
32
+ else process.env["OMO_AGENT_TOOLKIT_SURFACE"] = originalToolkitSurface;
22
33
  await rm(workDir, { recursive: true, force: true });
23
34
  });
24
35
 
@@ -132,7 +143,118 @@ describe("applySpawnGuards fan-out cap", () => {
132
143
  });
133
144
  });
134
145
 
146
+ describe("applySpawnGuards fan-out cap + reviewer quota interaction", () => {
147
+ it("#given fan-out cap exhausted #when a reviewer spawns #then denies without charging reviewer quota", () => {
148
+ writeGoals();
149
+ process.env["OMO_SPAWN_FANOUT_LIMIT"] = "3";
150
+
151
+ // exhaust the fan-out cap with non-reviewer spawns
152
+ expect(applySpawnGuards(payload("spawn_agent", { message: "scan" }))).toBe("");
153
+ expect(applySpawnGuards(payload("spawn_agent", { message: "scan" }))).toBe("");
154
+ expect(applySpawnGuards(payload("spawn_agent", { message: "scan" }))).toBe("");
155
+
156
+ // reviewer spawn while cap is exhausted — must deny without incrementing reviewer count
157
+ const reviewSpawn = payload("spawn_agent", {
158
+ agent_type: "lazycodex-code-reviewer",
159
+ message: "review the current diff",
160
+ });
161
+ const result = applySpawnGuards(reviewSpawn);
162
+ expect(result).not.toBe("");
163
+ expect(deny(result).permissionDecisionReason).toContain("4/3");
164
+
165
+ // reviewer quota must be untouched — a subsequent spawn after raising the limit must succeed
166
+ process.env["OMO_SPAWN_FANOUT_LIMIT"] = "10";
167
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
168
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
169
+ expect(counters["lazycodex-code-reviewer:g1:a1"]).toBe(1);
170
+ });
171
+ });
172
+
173
+ describe("applySpawnGuards review repetition cap", () => {
174
+ it("#given one goal attempt #when the same reviewer spawns four times #then denies until the attempt advances", () => {
175
+ writeGoals();
176
+ const reviewSpawn = payload("spawn_agent", {
177
+ agent_type: "lazycodex-code-reviewer",
178
+ message: "review the current diff",
179
+ });
180
+
181
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
182
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
183
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
184
+
185
+ const fourth = applySpawnGuards(reviewSpawn);
186
+ expect(fourth).not.toBe("");
187
+ expect(deny(fourth).permissionDecisionReason).toContain("4/3");
188
+ const counter = JSON.parse(readFileSync(join(sessionDir(), "spawn-count.json"), "utf8"));
189
+ expect(counter.count).toBe(3);
190
+
191
+ const goalsPath = join(sessionDir(), "goals.json");
192
+ const plan = JSON.parse(readFileSync(goalsPath, "utf8")) as {
193
+ goals: Array<{ attempt: number }>;
194
+ };
195
+ const [goal] = plan.goals;
196
+ if (goal === undefined) throw new Error("fixture must include a goal");
197
+ goal.attempt = 2;
198
+ writeFileSync(goalsPath, JSON.stringify(plan));
199
+
200
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
201
+ });
202
+
203
+ it.each(["lazycodex-code-reviewer", "lazycodex-qa-executor"])(
204
+ "#given a MultiAgentV2 %s message #when it spawns four times #then applies the reviewer cap",
205
+ (agentType) => {
206
+ writeGoals();
207
+ const reviewSpawn = payload("spawn_agent", {
208
+ message: `Delegate this final-quality lane to ${agentType}`,
209
+ });
210
+
211
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
212
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
213
+ expect(applySpawnGuards(reviewSpawn)).toBe("");
214
+
215
+ const fourth = deny(applySpawnGuards(reviewSpawn));
216
+ expect(fourth.permissionDecisionReason).toContain(`${agentType} 4/3`);
217
+ },
218
+ );
219
+
220
+ it("#given exhausted code reviews and an explicit QA assignment #when a mixed V2 prompt is guarded #then charges the QA role", () => {
221
+ writeGoals();
222
+ const codeReview = payload("collaboration.spawn_agent", {
223
+ message: "Act as lazycodex-code-reviewer; review the current diff",
224
+ });
225
+
226
+ expect(applySpawnGuards(codeReview)).toBe("");
227
+ expect(applySpawnGuards(codeReview)).toBe("");
228
+ expect(applySpawnGuards(codeReview)).toBe("");
229
+
230
+ const output = applySpawnGuards(
231
+ payload("collaboration.spawn_agent", {
232
+ message: "Act as a lazycodex-qa-executor; verify the lazycodex-code-reviewer finding",
233
+ }),
234
+ );
235
+ expect(output).toBe("");
236
+
237
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
238
+ expect(counters["lazycodex-code-reviewer:g1:a1"]).toBe(3);
239
+ expect(counters["lazycodex-qa-executor:g1:a1"]).toBe(1);
240
+ });
241
+ });
242
+
135
243
  describe("applySpawnGuards gate-artifact guard", () => {
244
+ it("#given a mixed-role V2 gate prompt #when guarded #then prioritizes the gate role and denies on missing artifact without charging quota", () => {
245
+ writeGoals();
246
+
247
+ const output = applySpawnGuards(
248
+ payload("spawn_agent", {
249
+ message: "Act as lazycodex-gate-reviewer; audit the lazycodex-code-reviewer report",
250
+ }),
251
+ );
252
+
253
+ expect(output).not.toBe("");
254
+ expect(deny(output).permissionDecisionReason).toContain("g1-code-review.md");
255
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
256
+ });
257
+
136
258
  it("#given a gate spawn by agent_type without artifacts #when guarded #then denies naming the missing path", () => {
137
259
  writeGoals();
138
260
 
@@ -146,7 +268,21 @@ describe("applySpawnGuards gate-artifact guard", () => {
146
268
  expect(parsed.permissionDecisionReason).toContain("g1-code-review.md");
147
269
  });
148
270
 
149
- it("#given an omo-senpi gate spawn by agent_type without artifacts #when guarded #then denies naming the missing path", () => {
271
+ it("#given senpi main-session QA is present but code review is absent #when the gate reviewer spawns #then the self-check allows it", () => {
272
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
273
+ writeGoals();
274
+ mkdirSync(join(workDir, ".omo", "evidence"), { recursive: true });
275
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-manual-qa.md"), "matrix\n");
276
+
277
+ const output = applySpawnGuards(
278
+ payload("collaborationspawn_agent", { agent_type: "omo-senpi-gate-reviewer", message: "audit the artifacts" }),
279
+ );
280
+
281
+ expect(output).toBe("");
282
+ });
283
+
284
+ it("#given senpi QA is absent #when the gate reviewer spawns #then the self-check blocks naming manual QA", () => {
285
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
150
286
  writeGoals();
151
287
 
152
288
  const output = applySpawnGuards(
@@ -155,7 +291,20 @@ describe("applySpawnGuards gate-artifact guard", () => {
155
291
 
156
292
  const parsed = deny(output);
157
293
  expect(parsed.permissionDecision).toBe("deny");
158
- expect(parsed.permissionDecisionReason).toContain("g1-code-review.md");
294
+ expect(parsed.permissionDecisionReason).toContain("g1-manual-qa.md");
295
+ });
296
+
297
+ it("#given an omo-senpi gate spawn with a code-review artifact only #when guarded #then blocks the missing manual QA", () => {
298
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
299
+ writeGoals();
300
+ mkdirSync(join(workDir, ".omo", "evidence"), { recursive: true });
301
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-code-review.md"), "report\n");
302
+
303
+ const output = applySpawnGuards(
304
+ payload("collaborationspawn_agent", { agent_type: "omo-senpi-gate-reviewer", message: "audit the artifacts" }),
305
+ );
306
+
307
+ expect(deny(output).permissionDecisionReason).toContain("g1-manual-qa.md");
159
308
  });
160
309
 
161
310
  it("#given an omo-senpi gate reviewer named in the message #when guarded #then still denies", () => {
@@ -174,6 +323,49 @@ describe("applySpawnGuards gate-artifact guard", () => {
174
323
  expect(deny(output).permissionDecision).toBe("deny");
175
324
  });
176
325
 
326
+ it("#given the staged Senpi surface #when generic and explicit gate spawns alternate #then they share one cap", () => {
327
+ writeGoals();
328
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
329
+ mkdirSync(join(workDir, ".omo", "evidence"), { recursive: true });
330
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-code-review.md"), "report\n");
331
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-manual-qa.md"), "matrix\n");
332
+ const genericGate = payload("spawn_agent", { message: "run the final gate review now" });
333
+ const explicitGate = payload("spawn_agent", {
334
+ message: "Act as omo-senpi-gate-reviewer; audit the final evidence",
335
+ });
336
+
337
+ expect(applySpawnGuards(genericGate)).toBe("");
338
+ expect(applySpawnGuards(explicitGate)).toBe("");
339
+ expect(applySpawnGuards(genericGate)).toBe("");
340
+
341
+ const fourth = deny(applySpawnGuards(explicitGate));
342
+ expect(fourth.permissionDecisionReason).toContain("omo-senpi-gate-reviewer 4/3");
343
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
344
+ expect(counters["omo-senpi-gate-reviewer:g1:a1"]).toBe(3);
345
+ expect(counters["lazycodex-gate-reviewer:g1:a1"]).toBeUndefined();
346
+ });
347
+
348
+ it("#given the staged Senpi surface #when LazyCodex and Senpi aliases alternate #then one reviewer lane owns the cap", () => {
349
+ writeGoals();
350
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
351
+ const senpiReviewer = payload("spawn_agent", {
352
+ message: "Act as omo-senpi-code-reviewer; inspect the current diff",
353
+ });
354
+ const lazycodexReviewer = payload("spawn_agent", {
355
+ message: "Act as lazycodex-code-reviewer; inspect the current diff",
356
+ });
357
+
358
+ expect(applySpawnGuards(senpiReviewer)).toBe("");
359
+ expect(applySpawnGuards(lazycodexReviewer)).toBe("");
360
+ expect(applySpawnGuards(senpiReviewer)).toBe("");
361
+
362
+ const fourth = deny(applySpawnGuards(lazycodexReviewer));
363
+ expect(fourth.permissionDecisionReason).toContain("omo-senpi-code-reviewer 4/3");
364
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
365
+ expect(counters["omo-senpi-code-reviewer:g1:a1"]).toBe(3);
366
+ expect(counters["lazycodex-code-reviewer:g1:a1"]).toBeUndefined();
367
+ });
368
+
177
369
  it("#given v1 artifacts on disk #when the gate spawns #then allows", () => {
178
370
  writeGoals();
179
371
  mkdirSync(join(workDir, ".omo", "evidence"), { recursive: true });
@@ -246,3 +438,108 @@ describe("applySpawnGuards gate-artifact guard", () => {
246
438
  expect(output).toBe("");
247
439
  });
248
440
  });
441
+
442
+ describe("applySpawnGuards V1 agent_type non-reviewer early-exit", () => {
443
+ it("#given a V1 spawn with a non-reviewer agent_type #when guarded #then allows without charging any quota", () => {
444
+ writeGoals();
445
+ const explorerSpawn = payload("spawn_agent", {
446
+ agent_type: "explorer",
447
+ message: "scan the codebase for lazycodex-code-reviewer patterns",
448
+ });
449
+
450
+ const result = applySpawnGuards(explorerSpawn);
451
+
452
+ expect(result).toBe("");
453
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
454
+ });
455
+
456
+ it("#given a V1 spawn with a non-reviewer agent_type mentioning a gate role #when guarded #then does not charge gate quota", () => {
457
+ writeGoals();
458
+ const explorerSpawn = payload("spawn_agent", {
459
+ agent_type: "deep",
460
+ message: "final gate review — summarize findings",
461
+ });
462
+
463
+ const result = applySpawnGuards(explorerSpawn);
464
+
465
+ expect(result).toBe("");
466
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
467
+ });
468
+ });
469
+
470
+ describe("applySpawnGuards V2 explicit non-reviewer act-as guard", () => {
471
+ it("#given an explicit 'act as explorer' assignment mentioning a reviewer #when guarded #then allows without charging reviewer quota", () => {
472
+ writeGoals();
473
+ const explorerSpawn = payload("spawn_agent", {
474
+ message: "Act as explorer; scan for lazycodex-code-reviewer usage patterns",
475
+ });
476
+
477
+ const result = applySpawnGuards(explorerSpawn);
478
+
479
+ expect(result).toBe("");
480
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
481
+ });
482
+
483
+ it("#given an explicit 'act as a deep' assignment with gate keyword #when guarded #then allows without charging gate quota", () => {
484
+ writeGoals();
485
+ const deepSpawn = payload("spawn_agent", {
486
+ message: "Act as a deep agent; run the final gate review summary",
487
+ });
488
+
489
+ const result = applySpawnGuards(deepSpawn);
490
+
491
+ expect(result).toBe("");
492
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
493
+ });
494
+
495
+ it("#given an explicit reviewer act-as assignment #when guarded #then still charges reviewer quota", () => {
496
+ writeGoals();
497
+ const reviewerSpawn = payload("spawn_agent", {
498
+ message: "Act as lazycodex-code-reviewer; inspect the diff",
499
+ });
500
+
501
+ const result = applySpawnGuards(reviewerSpawn);
502
+
503
+ expect(result).toBe("");
504
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
505
+ expect(counters["lazycodex-code-reviewer:g1:a1"]).toBe(1);
506
+ });
507
+ });
508
+
509
+ describe("applySpawnGuards gate-artifact check before reviewer quota", () => {
510
+ it("#given a gate spawn without artifacts #when the fan-out budget is available #then denies on artifact rule without charging reviewer quota", () => {
511
+ writeGoals();
512
+
513
+ const gateSpawn = payload("spawn_agent", {
514
+ agent_type: "lazycodex-gate-reviewer",
515
+ message: "final gate review",
516
+ });
517
+
518
+ const result = applySpawnGuards(gateSpawn);
519
+
520
+ expect(result).not.toBe("");
521
+ expect(deny(result).permissionDecisionReason).toContain("missing");
522
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
523
+ });
524
+
525
+ it("#given a gate spawn denied for missing artifacts #when retried after artifacts land #then charges quota only on the allowed spawn", () => {
526
+ writeGoals();
527
+ const gateSpawn = payload("spawn_agent", {
528
+ agent_type: "lazycodex-gate-reviewer",
529
+ message: "final gate review",
530
+ });
531
+
532
+ const firstResult = applySpawnGuards(gateSpawn);
533
+ expect(firstResult).not.toBe("");
534
+ expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
535
+
536
+ mkdirSync(join(workDir, ".omo", "evidence"), { recursive: true });
537
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-code-review.md"), "report\n");
538
+ writeFileSync(join(workDir, ".omo", "evidence", "g1-manual-qa.md"), "matrix\n");
539
+
540
+ const secondResult = applySpawnGuards(gateSpawn);
541
+ expect(secondResult).toBe("");
542
+ const counters = JSON.parse(readFileSync(join(sessionDir(), "review-spawn-counts.json"), "utf8"));
543
+ expect(counters["lazycodex-gate-reviewer:g1:a1"]).toBe(1);
544
+ });
545
+ });
@@ -56,11 +56,17 @@ describe("standalone ultrawork directive injection", () => {
56
56
  expect(parsed.hookSpecificOutput.additionalContext).toMatch(/^<ultrawork-mode>/);
57
57
  });
58
58
 
59
- it("#given ulw-loop bundles the ultrawork directive #when compared to ultrawork #then the copy stays byte-identical", async () => {
59
+ it("#given ulw-loop bundles the ultrawork directive #when compared to the canonical prompts-core source #then the copy stays byte-identical", async () => {
60
+ // ulw-loop is a standalone published package with no prompts-core dependency, so it bundles its
61
+ // own copy as the runtime fallback its `files` list ships. This pins that copy to the canonical
62
+ // source that scripts/sync-directive.mjs in the ultrawork component regenerates it from.
60
63
  const ulwLoopDirective = await readFile(new URL("../directive.md", import.meta.url), "utf8");
61
- const ultraworkDirective = await readFile(new URL("../../ultrawork/directive.md", import.meta.url), "utf8");
64
+ const canonicalDirective = await readFile(
65
+ new URL("../../../../../prompts-core/prompts/ultrawork/codex.md", import.meta.url),
66
+ "utf8",
67
+ );
62
68
 
63
- expect(ulwLoopDirective).toBe(ultraworkDirective);
69
+ expect(ulwLoopDirective).toBe(canonicalDirective);
64
70
  });
65
71
 
66
72
  it("#given an existing ultrawork skill file #when standalone injection runs #then emits the compact skill pointer", async () => {
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/codegraph/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking CodeGraph Init Guidance",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking CodeGraph Init Guidance",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\codegraph\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Comments",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.31) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.0.0-beta.32) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -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 5.0.0-beta.31) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/codegraph/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking CodeGraph Bootstrap",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking CodeGraph Bootstrap",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\codegraph\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.31) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.32) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]