oh-my-opencode 5.0.0-beta.62 → 5.0.0-beta.63

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 (213) hide show
  1. package/THIRD-PARTY-NOTICES.md +8 -6
  2. package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
  3. package/dist/cli/index.js +64 -35
  4. package/dist/cli-node/index.js +64 -35
  5. package/dist/config/schema/agent-names.d.ts +0 -1
  6. package/dist/config/schema/browser-automation.d.ts +0 -2
  7. package/dist/config/schema/oh-my-opencode-config.d.ts +0 -1
  8. package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
  9. package/dist/index.js +61 -535
  10. package/dist/oh-my-opencode.schema.json +0 -1
  11. package/dist/skills/ast-grep/SKILL.md +12 -0
  12. package/dist/skills/debugging/references/tools/playwright-cli.md +79 -161
  13. package/dist/skills/frontend/SKILL.md +1 -1
  14. package/dist/skills/frontend/references/design/aside.md +1 -1
  15. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  16. package/dist/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  17. package/dist/skills/review-work/SKILL.md +1 -1
  18. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  19. package/dist/skills/ultimate-browsing/SKILL.md +17 -29
  20. package/dist/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  21. package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
  22. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  23. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  24. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  25. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  26. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  27. package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  28. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  29. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  30. package/dist/skills/ulw-execute/SKILL.md +1 -1
  31. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  32. package/dist/skills/ulw-research/SKILL.md +3 -3
  33. package/dist/skills/visual-qa/AGENTS.md +1 -1
  34. package/dist/skills/visual-qa/SKILL.md +1 -1
  35. package/dist/skills/visual-qa/references/browser-setup.md +75 -0
  36. package/dist/tui.js +12 -5
  37. package/package.json +16 -23
  38. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  39. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
  40. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  47. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  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/plan.toml +2 -2
  58. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +5 -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 -1
  61. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  62. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
  63. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +13 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +5 -4
  67. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +5 -4
  68. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +582 -322
  69. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +5 -0
  70. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +16 -12
  71. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
  72. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +34 -0
  73. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
  74. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +107 -0
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +2 -1
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +48 -22
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +9 -7
  78. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +105 -114
  79. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +15 -0
  80. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +86 -0
  81. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +5 -1
  82. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +15 -3
  83. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +3 -4
  84. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +12 -5
  85. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
  86. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
  87. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +8 -62
  88. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +11 -1
  89. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +120 -88
  90. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +3 -2
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +18 -10
  92. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
  93. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +5 -5
  94. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +8 -17
  95. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  96. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  97. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  98. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +5 -4
  99. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +5 -0
  100. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +16 -16
  101. package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +33 -0
  102. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +124 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +58 -51
  104. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +126 -140
  105. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +84 -0
  106. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +26 -3
  107. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +3 -3
  108. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +30 -5
  109. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
  110. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +8 -59
  111. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +129 -111
  112. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +19 -10
  113. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
  114. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +5 -4
  115. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +8 -16
  116. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
  118. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
  119. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
  120. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
  121. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
  122. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
  123. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
  124. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
  125. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +50 -35
  126. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
  127. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
  128. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +21 -0
  129. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +92 -0
  130. package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
  131. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
  132. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +4 -1
  133. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  134. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  136. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  139. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  140. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  141. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  142. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  143. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  144. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  145. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  146. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  147. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  148. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  149. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  150. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  151. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  152. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  153. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  154. package/packages/omo-codex/plugin/package-lock.json +12 -12
  155. package/packages/omo-codex/plugin/package.json +1 -1
  156. package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
  157. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +15 -7
  158. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +12 -0
  159. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +79 -161
  160. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  161. package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
  162. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  163. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  164. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
  165. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  166. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +17 -29
  167. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  168. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
  169. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  170. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  171. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  172. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  173. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  174. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  175. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  176. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  177. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +5 -4
  178. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +1 -1
  179. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  180. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -3
  181. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +1 -1
  182. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
  183. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
  184. package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
  185. package/packages/prompts-core/prompts/ultrawork/codex.md +5 -4
  186. package/packages/shared-skills/skills/ast-grep/SKILL.md +12 -0
  187. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +79 -161
  188. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  189. package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
  190. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  191. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  192. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  193. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  194. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +17 -29
  195. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  196. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
  197. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  198. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  199. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  200. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  201. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  202. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  203. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  204. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  205. package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
  206. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  207. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
  208. package/packages/shared-skills/skills/visual-qa/AGENTS.md +1 -1
  209. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  210. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
  211. package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
  212. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
  213. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
@@ -80,6 +80,98 @@ function ownerPid(): number {
80
80
  return record.pid;
81
81
  }
82
82
 
83
+ function manualClock() {
84
+ let now = Date.now();
85
+ const tasks = new Set<{ at: number; fn: () => void }>();
86
+ return {
87
+ now: () => now,
88
+ schedule(fn: () => void, ms: number) {
89
+ const task = { at: now + ms, fn };
90
+ tasks.add(task);
91
+ return { unref() {}, cancel: () => tasks.delete(task) };
92
+ },
93
+ advance(ms: number) {
94
+ const end = now + ms;
95
+ for (;;) {
96
+ const next = [...tasks].filter((task) => task.at <= end).sort((a, b) => a.at - b.at)[0];
97
+ if (next === undefined) break;
98
+ now = next.at;
99
+ tasks.delete(next);
100
+ next.fn();
101
+ }
102
+ now = end;
103
+ },
104
+ };
105
+ }
106
+
107
+ describe("#given lease-based ownership", () => {
108
+ it("#when (1) a live owner's lease expired #then an async waiter reclaims it", async () => {
109
+ const clock = manualClock();
110
+ mkdirSync(join(workDir, ".omo", "ulw-loop", "s1"), { recursive: true });
111
+ await writeFile(
112
+ lockPath,
113
+ JSON.stringify({
114
+ pid: process.pid,
115
+ token: "expired",
116
+ createdAt: new Date().toISOString(),
117
+ leaseUntil: clock.now() - 1,
118
+ }),
119
+ );
120
+ await expect(withStateLock(lockPath, async () => "acquired", { clock, leaseMs: 90, timeoutMs: 0 })).resolves.toBe(
121
+ "acquired",
122
+ );
123
+ });
124
+
125
+ it("#when (2) reclaimed while owner alive #then its heartbeat never overwrites or recreates the successor path", async () => {
126
+ const clock = manualClock();
127
+ await withStateLock(
128
+ lockPath,
129
+ async () => {
130
+ const initial = JSON.parse(readFileSync(lockPath, "utf8"));
131
+ expect(initial.leaseUntil).toBe(clock.now() + 90);
132
+ await withStateLock(
133
+ lockPath,
134
+ async () => {
135
+ const successor = readFileSync(lockPath, "utf8");
136
+ clock.advance(30);
137
+ expect(readFileSync(lockPath, "utf8")).toBe(successor);
138
+ },
139
+ { leaseMs: 900, heartbeatMs: 0, timeoutMs: 0, clock: { ...clock, now: () => clock.now() + 91 } },
140
+ );
141
+ clock.advance(30);
142
+ expect(existsSync(lockPath)).toBe(false);
143
+ },
144
+ { clock, leaseMs: 90 },
145
+ );
146
+ });
147
+
148
+ it("#when (3) the clock passes the original lease #then a refreshing holder cannot be reclaimed", async () => {
149
+ const clock = manualClock();
150
+ await withStateLock(
151
+ lockPath,
152
+ async () => {
153
+ clock.advance(120);
154
+ await expect(withStateLock(lockPath, async () => "stolen", { clock, timeoutMs: 0 })).rejects.toMatchObject({
155
+ code: ULW_LOOP_LOCK_TIMEOUT_CODE,
156
+ });
157
+ },
158
+ { clock, leaseMs: 90 },
159
+ );
160
+ });
161
+
162
+ it("#when acquisition hands off to its body #then ownership uses the acquired token rather than rereading a successor", async () => {
163
+ await withStateLock(lockPath, async (token: string) => {
164
+ expect(token).toBe(JSON.parse(readFileSync(lockPath, "utf8")).token);
165
+ });
166
+ });
167
+
168
+ it("#when (4) a synchronous holder runs #then it writes a lease-less record", () => {
169
+ withStateLockSync(lockPath, () => {
170
+ expect(JSON.parse(readFileSync(lockPath, "utf8"))).not.toHaveProperty("leaseUntil");
171
+ });
172
+ });
173
+ });
174
+
83
175
  describe("withStateLock", () => {
84
176
  describe("#given a lock held by another live process", () => {
85
177
  it("#when acquiring #then it waits for that process to release before running the body", async () => {
@@ -0,0 +1,133 @@
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { runInNewContext } from "node:vm";
5
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
6
+
7
+ import { ulwLoopDir } from "../src/paths.js";
8
+ import { writePlan } from "../src/plan-io.js";
9
+ import {
10
+ type CheckpointArgs,
11
+ type CreateGoalsArgs,
12
+ createAgentToolkit,
13
+ type RecordEvidenceArgs,
14
+ type RecordReviewBlockersArgs,
15
+ type ToolkitSurface,
16
+ } from "../src/sdk.js";
17
+ import type { UlwLoopPlan } from "../src/types.js";
18
+ import { criterion, goal, plan } from "./fixtures/checkpoint-builders.js";
19
+
20
+ const scope = { sessionId: "surface-test" };
21
+ const surfaces: ToolkitSurface[] = ["omo-senpi", "lazycodex"];
22
+ let cwd: string;
23
+
24
+ beforeEach(async () => {
25
+ cwd = await mkdtemp(join(tmpdir(), "ulw-surface-"));
26
+ });
27
+ afterEach(async () => {
28
+ await rm(cwd, { recursive: true, force: true });
29
+ });
30
+
31
+ interface Scenario {
32
+ readonly name: string;
33
+ readonly plan: UlwLoopPlan;
34
+ readonly method: string;
35
+ readonly args:
36
+ | CreateGoalsArgs
37
+ | RecordEvidenceArgs
38
+ | CheckpointArgs
39
+ | Omit<RecordReviewBlockersArgs, "codexGoalJson">;
40
+ readonly cli: string;
41
+ }
42
+
43
+ const scenarios: Scenario[] = [
44
+ {
45
+ name: "no goals",
46
+ plan: plan([]),
47
+ method: "createGoals",
48
+ args: { brief: "<brief>" },
49
+ cli: 'omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json',
50
+ },
51
+ {
52
+ name: "unresolved criteria",
53
+ plan: plan([goal({ successCriteria: [criterion("C001", "pass"), criterion("C002", "pending")] })]),
54
+ method: "recordEvidence",
55
+ args: { goalId: "G001", criterionId: "<id>", status: "pass", evidence: "<observable proof>" },
56
+ cli: 'omo-agent-toolkit ulw-loop record-evidence --goal-id G001 --criterion-id <id> --status pass --evidence "<observable proof>"',
57
+ },
58
+ {
59
+ name: "a passing non-final goal",
60
+ plan: plan([goal(), goal({ id: "G002", status: "pending" })]),
61
+ method: "checkpoint",
62
+ args: { goalId: "G001", status: "complete", evidence: "<proof>" },
63
+ cli: "omo-agent-toolkit ulw-loop checkpoint --goal-id G001 --status complete --evidence \"<proof>\" --codex-goal-json '<get_goal json>'",
64
+ },
65
+ {
66
+ name: "a passing final goal",
67
+ plan: plan([goal()]),
68
+ method: "checkpoint",
69
+ args: { goalId: "G001", printTemplate: true },
70
+ cli: "checkpoint --print-template",
71
+ },
72
+ {
73
+ name: "a review-blocked goal",
74
+ plan: plan([goal({ status: "review_blocked" })]),
75
+ method: "recordReviewBlockers",
76
+ args: { goalId: "G001", title: "<title>", objective: "<objective>", evidence: "<verdict>" },
77
+ cli: 'omo-agent-toolkit ulw-loop record-review-blockers --goal-id G001 --title "<title>" --objective "<objective>" --evidence "<verdict>" --codex-goal-json \'<get_goal json>\'',
78
+ },
79
+ ];
80
+
81
+ function sdkArgs(text: string, method: string): unknown {
82
+ const snippet = text.match(new RegExp(`agentToolkit\\.${method}\\([^\x60]*\\)`))?.[0];
83
+ expect(snippet).toBeDefined();
84
+ if (snippet === undefined) throw new Error(`Missing SDK call: ${method}`);
85
+ return runInNewContext(snippet, { agentToolkit: { [method]: (args: unknown) => args } });
86
+ }
87
+
88
+ for (const surface of surfaces) {
89
+ describe(`#given the ${surface} SDK surface`, () => {
90
+ it.each(scenarios)("#when status reads $name #then its action uses the calling surface", async (scenario) => {
91
+ await mkdir(ulwLoopDir(cwd, scope), { recursive: true });
92
+ await writePlan(cwd, { ...scenario.plan, evidenceLayoutVersion: 2 }, scope);
93
+ const response = await createAgentToolkit({ cwd, ...scope, surface }).status();
94
+ if (!response.ok) throw new Error(response.error.message);
95
+
96
+ expect(response.nextActions).toEqual(response.result.nextActions);
97
+ const actions = response.nextActions.join("\n");
98
+ if (surface === "lazycodex") {
99
+ expect(actions).toContain(scenario.cli);
100
+ expect(actions).not.toContain("agentToolkit.");
101
+ return;
102
+ }
103
+ expect(actions).not.toMatch(/omo-agent-toolkit|status --json|codexGoalJson|--codex-goal-json|update_goal/);
104
+ expect(sdkArgs(actions, scenario.method)).toEqual(scenario.args);
105
+ if (scenario.method === "checkpoint") expect(actions).toContain("status().result.currentAttemptDir");
106
+ });
107
+
108
+ for (const siblings of [false, true]) {
109
+ it.each(["status", "completeGoals"])(
110
+ `#when %s has no plan and siblings=${siblings} #then recovery uses the calling surface`,
111
+ async (method) => {
112
+ if (siblings) await mkdir(ulwLoopDir(cwd, { sessionId: "other-session" }), { recursive: true });
113
+ const toolkit = createAgentToolkit({ cwd, ...scope, surface });
114
+ const response = await (method === "status" ? toolkit.status() : toolkit.completeGoals());
115
+ if (response.ok) throw new Error("Expected a missing-plan failure");
116
+
117
+ expect(response.error.code).toBe("ULW_LOOP_PLAN_MISSING");
118
+ if (surface === "lazycodex") {
119
+ expect(response.error.message).toContain(
120
+ 'omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json',
121
+ );
122
+ if (siblings) expect(response.error.message).toContain("--session-id <id>");
123
+ } else {
124
+ expect(response.error.message).not.toMatch(/omo-agent-toolkit|--session-id/);
125
+ expect(sdkArgs(response.error.message, "createGoals")).toEqual({ brief: "<brief>" });
126
+ }
127
+ if (siblings)
128
+ expect(response.error.details?.["existingSessionIds"]?.split(",")).toContain("other-session");
129
+ },
130
+ );
131
+ }
132
+ });
133
+ }
@@ -9,11 +9,11 @@ import { readSteeringLedgerEntries, readUlwLoopPlan, writePlan } from "../src/pl
9
9
  import { steerUlwLoopBatch } from "../src/steering-batch.js";
10
10
  import type { UlwLoopItem, UlwLoopPlan, UlwLoopSteeringProposal } from "../src/types.js";
11
11
 
12
- const appendFileCalls = vi.hoisted(() => vi.fn());
13
- vi.mock("node:fs/promises", async (importOriginal) => {
14
- const actual = await importOriginal<typeof import("node:fs/promises")>();
15
- appendFileCalls.mockImplementation(actual.appendFile);
16
- return { ...actual, appendFile: appendFileCalls };
12
+ const publishCalls = vi.hoisted(() => vi.fn());
13
+ vi.mock("node:fs", async (importOriginal) => {
14
+ const actual = await importOriginal<typeof import("node:fs")>();
15
+ publishCalls.mockImplementation(actual.linkSync);
16
+ return { ...actual, linkSync: publishCalls };
17
17
  });
18
18
 
19
19
  const NOW = "2026-05-23T00:00:00.000Z";
@@ -78,12 +78,12 @@ describe("steerUlwLoopBatch", () => {
78
78
 
79
79
  it("#given rejected proposals #when applied as a batch #then one rejection audit lists every rejected index", async () => {
80
80
  const repo = await repoWithPlan();
81
- const before = JSON.stringify(await readUlwLoopPlan(repo));
81
+ const before = await readUlwLoopPlan(repo);
82
82
 
83
83
  const result = await steerUlwLoopBatch(repo, [proposal({ idempotencyKey: "ok" }), proposal({ kind: "reorder_pending", pendingOrder: ["missing"] }), proposal({ evidence: "" })]);
84
84
 
85
85
  expect(result.accepted).toBe(false);
86
- expect(JSON.stringify(await readUlwLoopPlan(repo))).toBe(before);
86
+ expect(await readUlwLoopPlan(repo)).toEqual({ ...before, revision: (before.revision ?? 0) + 1 });
87
87
  expect((await readUlwLoopPlan(repo)).goals).toHaveLength(2);
88
88
  const entries = await readSteeringLedgerEntries(repo);
89
89
  expect(entries.filter((entry) => entry.kind === "steering_accepted")).toHaveLength(0);
@@ -120,13 +120,13 @@ describe("steerUlwLoopBatch", () => {
120
120
  expect((await readUlwLoopPlan(repo)).goals).toHaveLength(4);
121
121
  });
122
122
 
123
- it("#given mixed fresh and deduped proposals #when accepted and replayed #then one append records all fresh audits and replay records none", async () => {
123
+ it("#given mixed fresh and deduped proposals #when accepted and replayed #then one publication records all fresh audits and replay records none", async () => {
124
124
  const repo = await repoWithPlan();
125
125
  const seeded = await readUlwLoopPlan(repo);
126
126
  seeded.goals[0]?.successCriteria.push({ id: "C001", scenario: "old", expectedEvidence: "proof", userModel: "edge", status: "pending", capturedEvidence: null });
127
127
  await writePlan(repo, { ...seeded, validationBatches: [{ batchId: "VB001", memberIds: ["G001", "G002"], finalGoalId: "G002" }] });
128
128
  await steerUlwLoopBatch(repo, [proposal({ idempotencyKey: "dedupe-me" })]);
129
- appendFileCalls.mockClear();
129
+ publishCalls.mockClear();
130
130
 
131
131
  const revise = { ...proposal({ kind: "revise_criterion", targetGoalId: "G001", criterionId: "C001", idempotencyKey: "revise-c1" }), scenario: "new" } satisfies CliSteeringProposal;
132
132
  const batch = [
@@ -138,15 +138,15 @@ describe("steerUlwLoopBatch", () => {
138
138
 
139
139
  expect(result.accepted).toBe(true);
140
140
  expect(result.results.map((item) => item.deduped)).toEqual([true, false, false]);
141
- expect(appendFileCalls).toHaveBeenCalledTimes(1);
141
+ expect(publishCalls).toHaveBeenCalledTimes(1);
142
142
  expect((await readSteeringLedgerEntries(repo)).map((entry) => entry.kind).slice(-3)).toEqual(["criteria_revised", "steering_accepted", "batch_updated"]);
143
143
  const after = JSON.stringify(await readUlwLoopPlan(repo));
144
- appendFileCalls.mockClear();
144
+ publishCalls.mockClear();
145
145
 
146
146
  const replay = await steerUlwLoopBatch(repo, batch);
147
147
 
148
148
  expect(replay.results.map((item) => item.deduped)).toEqual([true, true, true]);
149
149
  expect(JSON.stringify(await readUlwLoopPlan(repo))).toBe(after);
150
- expect(appendFileCalls).not.toHaveBeenCalled();
150
+ expect(publishCalls).not.toHaveBeenCalled();
151
151
  });
152
152
  });
@@ -250,7 +250,10 @@ describe("steerUlwLoop", () => {
250
250
  const repoRoot = await repoWithPlan(seed);
251
251
  const result = await steerUlwLoop(repoRoot, steering({ kind: "annotate_ledger" }));
252
252
  expect(result.plan.goals).toEqual(seed.goals);
253
- expect(await readFile(ulwLoopGoalsPath(repoRoot), "utf8")).toBe(`${JSON.stringify(seed, null, 2)}\n`);
253
+ expect(JSON.parse(await readFile(ulwLoopGoalsPath(repoRoot), "utf8"))).toEqual({
254
+ ...seed,
255
+ revision: (seed.revision ?? 0) + 1,
256
+ });
254
257
  });
255
258
 
256
259
  it("mark_blocked_superseded with children: supersede + replace", 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.62) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.0.0-beta.62) Checking Comments",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook post-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.62) Recording Spawn Admission",
11
+ "statusMessage": "(OmO 5.0.0-beta.63) Recording Spawn Admission",
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 post-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -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.62) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.63) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -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.62) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.62) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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.62) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.63) 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
  ]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.0.0-beta.62",
3
+ "version": "5.0.0-beta.63",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.0.0-beta.62",
9
+ "version": "5.0.0-beta.63",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -90,7 +90,7 @@
90
90
  },
91
91
  "components/comment-checker": {
92
92
  "name": "@code-yeongyu/codex-comment-checker",
93
- "version": "5.0.0-beta.62",
93
+ "version": "5.0.0-beta.63",
94
94
  "license": "MIT",
95
95
  "bin": {
96
96
  "omo-comment-checker": "dist/cli.js"
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "components/git-bash": {
113
113
  "name": "@sisyphuslabs/codex-git-bash-hook",
114
- "version": "5.0.0-beta.62",
114
+ "version": "5.0.0-beta.63",
115
115
  "bin": {
116
116
  "omo-git-bash-hook": "dist/cli.js"
117
117
  },
@@ -125,7 +125,7 @@
125
125
  },
126
126
  "components/lazycodex-executor-verify": {
127
127
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
128
- "version": "5.0.0-beta.62",
128
+ "version": "5.0.0-beta.63",
129
129
  "license": "MIT",
130
130
  "bin": {
131
131
  "lazycodex-executor-verify": "dist/cli.js"
@@ -142,7 +142,7 @@
142
142
  },
143
143
  "components/lsp": {
144
144
  "name": "@code-yeongyu/codex-lsp",
145
- "version": "5.0.0-beta.62",
145
+ "version": "5.0.0-beta.63",
146
146
  "license": "MIT",
147
147
  "dependencies": {
148
148
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -163,7 +163,7 @@
163
163
  },
164
164
  "components/rules": {
165
165
  "name": "@code-yeongyu/codex-rules",
166
- "version": "5.0.0-beta.62",
166
+ "version": "5.0.0-beta.63",
167
167
  "license": "MIT",
168
168
  "dependencies": {
169
169
  "picomatch": "^4.0.7"
@@ -185,7 +185,7 @@
185
185
  },
186
186
  "components/teammode": {
187
187
  "name": "@sisyphuslabs/codex-teammode",
188
- "version": "5.0.0-beta.62",
188
+ "version": "5.0.0-beta.63",
189
189
  "devDependencies": {
190
190
  "@types/node": "^26.2.0",
191
191
  "bun-types": "^1.4.2",
@@ -198,7 +198,7 @@
198
198
  },
199
199
  "components/telemetry": {
200
200
  "name": "@code-yeongyu/codex-telemetry",
201
- "version": "5.0.0-beta.62",
201
+ "version": "5.0.0-beta.63",
202
202
  "license": "MIT",
203
203
  "bin": {
204
204
  "omo-telemetry": "dist/cli.js"
@@ -216,7 +216,7 @@
216
216
  },
217
217
  "components/ultrawork": {
218
218
  "name": "@code-yeongyu/codex-ultrawork",
219
- "version": "5.0.0-beta.62",
219
+ "version": "5.0.0-beta.63",
220
220
  "license": "MIT",
221
221
  "bin": {
222
222
  "omo-ultrawork": "dist/cli.js"
@@ -234,7 +234,7 @@
234
234
  },
235
235
  "components/ulw-execute-continuation": {
236
236
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
237
- "version": "5.0.0-beta.62",
237
+ "version": "5.0.0-beta.63",
238
238
  "license": "MIT",
239
239
  "bin": {
240
240
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -251,7 +251,7 @@
251
251
  },
252
252
  "components/ulw-loop": {
253
253
  "name": "@code-yeongyu/codex-ulw-loop",
254
- "version": "5.0.0-beta.62",
254
+ "version": "5.0.0-beta.63",
255
255
  "license": "MIT",
256
256
  "bin": {
257
257
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.0.0-beta.62",
3
+ "version": "5.0.0-beta.63",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",