lazycodex-ai 5.0.0-beta.46 → 5.0.0-beta.48

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 (105) hide show
  1. package/dist/cli/index.js +15 -15
  2. package/dist/cli-node/index.js +15 -15
  3. package/package.json +1 -1
  4. package/packages/lsp-daemon/dist/cli.js +6 -3
  5. package/packages/lsp-daemon/dist/client.js +6 -3
  6. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  7. package/packages/lsp-daemon/dist/ensure-daemon.js +9 -2
  8. package/packages/lsp-daemon/dist/index.js +6 -3
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  15. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  19. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +6 -3
  20. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  31. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +15 -7
  33. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +1 -1
  35. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +294 -96
  36. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  37. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  38. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +12 -3
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +21 -6
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +1 -0
  43. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +10 -0
  44. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +4 -1
  45. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +25 -57
  46. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +9 -0
  47. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +227 -0
  48. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +17 -3
  49. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  50. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -1
  52. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +10 -7
  53. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +18 -7
  54. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  56. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +24 -3
  57. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +25 -5
  58. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +11 -0
  59. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +34 -64
  60. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +239 -0
  61. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +16 -3
  62. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +14 -4
  63. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  64. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +4 -2
  65. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  67. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +10 -8
  68. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +12 -2
  69. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +2 -0
  70. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  71. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +7 -5
  72. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  73. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  74. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  75. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +2 -1
  76. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  77. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +36 -2
  78. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +37 -0
  79. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +218 -0
  80. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  101. package/packages/omo-codex/plugin/package-lock.json +12 -12
  102. package/packages/omo-codex/plugin/package.json +1 -1
  103. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -1
  104. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +10 -7
  105. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
package/dist/cli/index.js CHANGED
@@ -54,7 +54,7 @@ var package_default;
54
54
  var init_package = __esm(() => {
55
55
  package_default = {
56
56
  name: "oh-my-opencode",
57
- version: "5.0.0-beta.46",
57
+ version: "5.0.0-beta.48",
58
58
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
59
59
  main: "./dist/index.js",
60
60
  types: "dist/index.d.ts",
@@ -238,7 +238,7 @@ var init_package = __esm(() => {
238
238
  zod: "^4.4.3"
239
239
  },
240
240
  devDependencies: {
241
- "@code-yeongyu/senpi": "2026.9.7",
241
+ "@code-yeongyu/senpi": "2026.9.7-2",
242
242
  "@oh-my-opencode/agents-md-core": "workspace:*",
243
243
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
244
244
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -279,18 +279,18 @@ var init_package = __esm(() => {
279
279
  typescript: "^7.0.2"
280
280
  },
281
281
  optionalDependencies: {
282
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.46",
283
- "oh-my-opencode-darwin-x64": "5.0.0-beta.46",
284
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.46",
285
- "oh-my-opencode-linux-arm64": "5.0.0-beta.46",
286
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.46",
287
- "oh-my-opencode-linux-x64": "5.0.0-beta.46",
288
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.46",
289
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.46",
290
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.46",
291
- "oh-my-opencode-windows-arm64": "5.0.0-beta.46",
292
- "oh-my-opencode-windows-x64": "5.0.0-beta.46",
293
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.46"
282
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.48",
283
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.48",
284
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.48",
285
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.48",
286
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.48",
287
+ "oh-my-opencode-linux-x64": "5.0.0-beta.48",
288
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.48",
289
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.48",
290
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.48",
291
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.48",
292
+ "oh-my-opencode-windows-x64": "5.0.0-beta.48",
293
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.48"
294
294
  },
295
295
  overrides: {
296
296
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -94447,7 +94447,7 @@ var package_default2;
94447
94447
  var init_package2 = __esm(() => {
94448
94448
  package_default2 = {
94449
94449
  name: "@oh-my-opencode/omo-codex",
94450
- version: "5.0.0-beta.46",
94450
+ version: "5.0.0-beta.48",
94451
94451
  type: "module",
94452
94452
  private: true,
94453
94453
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -55,7 +55,7 @@ var package_default;
55
55
  var init_package = __esm(() => {
56
56
  package_default = {
57
57
  name: "oh-my-opencode",
58
- version: "5.0.0-beta.46",
58
+ version: "5.0.0-beta.48",
59
59
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
60
60
  main: "./dist/index.js",
61
61
  types: "dist/index.d.ts",
@@ -239,7 +239,7 @@ var init_package = __esm(() => {
239
239
  zod: "^4.4.3"
240
240
  },
241
241
  devDependencies: {
242
- "@code-yeongyu/senpi": "2026.9.7",
242
+ "@code-yeongyu/senpi": "2026.9.7-2",
243
243
  "@oh-my-opencode/agents-md-core": "workspace:*",
244
244
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
245
245
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -280,18 +280,18 @@ var init_package = __esm(() => {
280
280
  typescript: "^7.0.2"
281
281
  },
282
282
  optionalDependencies: {
283
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.46",
284
- "oh-my-opencode-darwin-x64": "5.0.0-beta.46",
285
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.46",
286
- "oh-my-opencode-linux-arm64": "5.0.0-beta.46",
287
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.46",
288
- "oh-my-opencode-linux-x64": "5.0.0-beta.46",
289
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.46",
290
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.46",
291
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.46",
292
- "oh-my-opencode-windows-arm64": "5.0.0-beta.46",
293
- "oh-my-opencode-windows-x64": "5.0.0-beta.46",
294
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.46"
283
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.48",
284
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.48",
285
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.48",
286
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.48",
287
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.48",
288
+ "oh-my-opencode-linux-x64": "5.0.0-beta.48",
289
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.48",
290
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.48",
291
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.48",
292
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.48",
293
+ "oh-my-opencode-windows-x64": "5.0.0-beta.48",
294
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.48"
295
295
  },
296
296
  overrides: {
297
297
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -94526,7 +94526,7 @@ var package_default2;
94526
94526
  var init_package2 = __esm(() => {
94527
94527
  package_default2 = {
94528
94528
  name: "@oh-my-opencode/omo-codex",
94529
- version: "5.0.0-beta.46",
94529
+ version: "5.0.0-beta.48",
94530
94530
  type: "module",
94531
94531
  private: true,
94532
94532
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -6127,14 +6127,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
6127
6127
  socket.connect(paths.socket);
6128
6128
  });
6129
6129
  }
6130
- function spawnDaemonProcess(paths) {
6130
+ function spawnDaemonProcess(paths, deps = {}) {
6131
6131
  mkdirSync3(dirname10(paths.log), { recursive: true });
6132
6132
  const logFd = openSync2(paths.log, "a");
6133
6133
  try {
6134
- const child = spawn2(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
6134
+ const spawnDaemonChild = deps.spawn ?? spawn2;
6135
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
6136
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
6135
6137
  detached: true,
6136
6138
  stdio: ["ignore", logFd, logFd],
6137
- windowsHide: true
6139
+ windowsHide: true,
6140
+ env: { ...process.env, BUN_BE_BUN: "1" }
6138
6141
  });
6139
6142
  child.once("spawn", () => closeSync2(logFd));
6140
6143
  child.once("error", (error) => {
@@ -719,14 +719,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
719
719
  socket.connect(paths.socket);
720
720
  });
721
721
  }
722
- function spawnDaemonProcess(paths) {
722
+ function spawnDaemonProcess(paths, deps = {}) {
723
723
  mkdirSync2(dirname3(paths.log), { recursive: true });
724
724
  const logFd = openSync2(paths.log, "a");
725
725
  try {
726
- const child = spawn(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
726
+ const spawnDaemonChild = deps.spawn ?? spawn;
727
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
728
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
727
729
  detached: true,
728
730
  stdio: ["ignore", logFd, logFd],
729
- windowsHide: true
731
+ windowsHide: true,
732
+ env: { ...process.env, BUN_BE_BUN: "1" }
730
733
  });
731
734
  child.once("spawn", () => closeSync2(logFd));
732
735
  child.once("error", (error) => {
@@ -1,3 +1,4 @@
1
+ import { type ChildProcess, type SpawnOptions } from "node:child_process";
1
2
  import type { OwnerPing } from "./ownership.js";
2
3
  import { type DaemonPaths } from "./paths.js";
3
4
  import { type DaemonRuntimeDefaults } from "./runtime-contract.js";
@@ -19,7 +20,11 @@ export interface EnsureDaemonOptions {
19
20
  export declare function ensureDaemonRunning(paths: DaemonPaths, deps?: EnsureDaemonDeps, options?: EnsureDaemonOptions): Promise<void>;
20
21
  export declare function probeDaemon(paths: DaemonPaths, timeoutMs?: number, signal?: AbortSignal): Promise<boolean>;
21
22
  export declare function pingDaemon(paths: DaemonPaths, token: string, timeoutMs?: number, signal?: AbortSignal): Promise<OwnerPing | null>;
22
- export declare function spawnDaemonProcess(paths: DaemonPaths): void;
23
+ export interface SpawnDaemonProcessDeps {
24
+ spawn: (executable: string, args: readonly string[], options: SpawnOptions) => ChildProcess;
25
+ resolveExecutable: () => string;
26
+ }
27
+ export declare function spawnDaemonProcess(paths: DaemonPaths, deps?: Partial<SpawnDaemonProcessDeps>): void;
23
28
  export declare function resolveDaemonNodeExecutable(cachedExecPath?: string, originalArgv0?: string, pathExists?: (path: string) => boolean): string;
24
29
  export declare function resolveDaemonCliPath(env?: NodeJS.ProcessEnv, defaults?: DaemonRuntimeDefaults): string;
25
30
  export declare function defaultEnsureDaemonDeps(): EnsureDaemonDeps;
@@ -81,14 +81,21 @@ export function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
81
81
  socket.connect(paths.socket);
82
82
  });
83
83
  }
84
- export function spawnDaemonProcess(paths) {
84
+ export function spawnDaemonProcess(paths, deps = {}) {
85
85
  mkdirSync(dirname(paths.log), { recursive: true });
86
86
  const logFd = openSync(paths.log, "a");
87
87
  try {
88
- const child = spawn(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
88
+ const spawnDaemonChild = deps.spawn ?? spawn;
89
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
90
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
89
91
  detached: true,
90
92
  stdio: ["ignore", logFd, logFd],
91
93
  windowsHide: true,
94
+ // Under the packaged runtime execPath is the compiled omo binary, not a
95
+ // node interpreter; without BUN_BE_BUN it runs its embedded entrypoint, so
96
+ // the CLI argv boots a billable agent session instead of the daemon
97
+ // (issue #7914). Inert for node and for the bun interpreter itself.
98
+ env: { ...process.env, BUN_BE_BUN: "1" },
92
99
  });
93
100
  child.once("spawn", () => closeSync(logFd));
94
101
  child.once("error", (error) => {
@@ -3861,14 +3861,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3861
3861
  socket.connect(paths.socket);
3862
3862
  });
3863
3863
  }
3864
- function spawnDaemonProcess(paths) {
3864
+ function spawnDaemonProcess(paths, deps = {}) {
3865
3865
  mkdirSync2(dirname6(paths.log), { recursive: true });
3866
3866
  const logFd = openSync2(paths.log, "a");
3867
3867
  try {
3868
- const child = spawn2(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
3868
+ const spawnDaemonChild = deps.spawn ?? spawn2;
3869
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
3870
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
3869
3871
  detached: true,
3870
3872
  stdio: ["ignore", logFd, logFd],
3871
- windowsHide: true
3873
+ windowsHide: true,
3874
+ env: { ...process.env, BUN_BE_BUN: "1" }
3872
3875
  });
3873
3876
  child.once("spawn", () => closeSync2(logFd));
3874
3877
  child.once("error", (error) => {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -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.46) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.46) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.46) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.46) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.48) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.46) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.0-beta.46",
4
- "inputDigest": "sha256:13716a88e0e51dce96ef8d1176d14d542e981cb8e06b4dbd8736f1b62e62978f",
3
+ "version": "5.0.0-beta.48",
4
+ "inputDigest": "sha256:835e6f61b5800fc88f9cb11340f0d13f135cb1d6c987336145ccbbe809df7326",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "cli.js",
12
- "sha256": "87e305eb201e11600c35d89f332ac4892d2c927ab850ab8b69c5c84255f7ef78"
12
+ "sha256": "bddbb2f82db0dffb0c2ec7b69778a63e77cac2c6a0f8bfb6d7a62980a49d14bb"
13
13
  },
14
14
  {
15
15
  "path": "codex-hook-cli.d.ts",
@@ -556,14 +556,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
556
556
  socket.connect(paths.socket);
557
557
  });
558
558
  }
559
- function spawnDaemonProcess(paths) {
559
+ function spawnDaemonProcess(paths, deps = {}) {
560
560
  mkdirSync2(dirname3(paths.log), { recursive: true });
561
561
  const logFd = openSync2(paths.log, "a");
562
562
  try {
563
- const child = spawn(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
563
+ const spawnDaemonChild = deps.spawn ?? spawn;
564
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
565
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
564
566
  detached: true,
565
567
  stdio: ["ignore", logFd, logFd],
566
- windowsHide: true
568
+ windowsHide: true,
569
+ env: { ...process.env, BUN_BE_BUN: "1" }
567
570
  });
568
571
  child.once("spawn", () => closeSync2(logFd));
569
572
  child.once("error", (error) => {
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.0.0-beta.46) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 5.0.0-beta.46) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.48) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.46) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.48) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 5.0.0-beta.46) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.48) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 5.0.0-beta.46) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.48) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 5.0.0-beta.46) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.48) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.46) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.46) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.48) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.46) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -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.46) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook subagent-stop",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 5.0.0-beta.46) Checking Ulw-Execute Continuation"
22
+ "statusMessage": "(OmO 5.0.0-beta.48) Checking Ulw-Execute Continuation"
23
23
  }
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.0-beta.46",
3
+ "version": "5.0.0-beta.48",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -3,7 +3,8 @@ import { hasFlag, readValue } from "./cli-arg-parser.js";
3
3
  import { printJsonError, subcommandHelp, ULW_LOOP_HELP } from "./cli-output.js";
4
4
  import { addGoal, captureEvidence, completeGoals, createGoals, criteria, reviewBlockers, status, steer, } from "./cli-subcommands.js";
5
5
  import { resolveUlwLoopSessionIdFromEnv } from "./paths.js";
6
- import { sessionIdRequiredMessage } from "./plan-missing-recovery.js";
6
+ import { listUlwLoopSessionIds } from "./plan-io.js";
7
+ import { sessionIdRequiredMessage, sessionScopeRequiredMessage } from "./plan-missing-recovery.js";
7
8
  import { UlwLoopError } from "./types.js";
8
9
  export const ULW_LOOP_SUBCOMMANDS = [
9
10
  "help",
@@ -27,7 +28,6 @@ export async function ulwLoopCommand(argv) {
27
28
  const repoRoot = process.cwd();
28
29
  const json = hasFlag(rest, "--json");
29
30
  try {
30
- const scope = commandScope(rest);
31
31
  if (!isUlwLoopSubcommand(command)) {
32
32
  if (json) {
33
33
  printJsonError(new UlwLoopError(`Unknown ulw-loop subcommand: ${command}.`, "ULW_LOOP_SUBCOMMAND_UNKNOWN", {
@@ -42,10 +42,12 @@ export async function ulwLoopCommand(argv) {
42
42
  process.stdout.write(`${subcommandHelp(command)}\n`);
43
43
  return 0;
44
44
  }
45
+ if (command === "help") {
46
+ process.stdout.write(`${ULW_LOOP_HELP}\n`);
47
+ return 0;
48
+ }
49
+ const scope = commandScope(repoRoot, rest);
45
50
  switch (command) {
46
- case "help":
47
- process.stdout.write(`${ULW_LOOP_HELP}\n`);
48
- return 0;
49
51
  case "create-goals":
50
52
  return await createGoals(repoRoot, rest, json, scope);
51
53
  case "status":
@@ -89,7 +91,10 @@ const SESSION_ID_FLAG = "--session-id";
89
91
  function sessionIdFlagPresent(argv) {
90
92
  return hasFlag(argv, SESSION_ID_FLAG) || argv.some((arg) => arg.startsWith(`${SESSION_ID_FLAG}=`));
91
93
  }
92
- function commandScope(argv) {
94
+ // Every state subcommand runs against exactly one session directory. Without a flag or
95
+ // a session env there is no owner to resolve, so the command refuses instead of
96
+ // falling back to the repo-global root that every session in the cwd would share.
97
+ function commandScope(repoRoot, argv) {
93
98
  if (sessionIdFlagPresent(argv)) {
94
99
  const sessionId = readValue(argv, SESSION_ID_FLAG)?.trim();
95
100
  if (!sessionId) {
@@ -100,5 +105,8 @@ function commandScope(argv) {
100
105
  return { sessionId };
101
106
  }
102
107
  const sessionId = resolveUlwLoopSessionIdFromEnv();
103
- return sessionId === null ? undefined : { sessionId };
108
+ if (sessionId !== null)
109
+ return { sessionId };
110
+ const existingSessionIds = listUlwLoopSessionIds(repoRoot);
111
+ throw new UlwLoopError(sessionScopeRequiredMessage(SESSION_ID_FLAG, existingSessionIds), "ULW_LOOP_SESSION_SCOPE_REQUIRED", { details: { flag: SESSION_ID_FLAG, existingSessionIds } });
104
112
  }
@@ -1,5 +1,5 @@
1
1
  import type { UlwLoopCodexGoalMode, UlwLoopPlan } from "./types.js";
2
- export declare const ULW_LOOP_HELP = "Usage:\n omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)\n omo-agent-toolkit help | --help | -h (this message)\n omo-agent-toolkit ulw-loop help\n omo-agent-toolkit ulw-loop create-goals --brief \"...\" [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]\n omo-agent-toolkit ulw-loop status [--json]\n omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]\n omo-agent-toolkit ulw-loop criteria --goal-id <id> [--json]\n omo-agent-toolkit ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence \"...\" [--notes \"...\"] [--json]\n omo-agent-toolkit ulw-loop checkpoint --print-template [--goal-id <id>] [--json]\n omo-agent-toolkit ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence \"...\" --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]\n omo-agent-toolkit ulw-loop steer --kind <kind> ... --evidence \"...\" --rationale \"...\" [--proposals-json <json-or-path>] [--json]\n omo-agent-toolkit ulw-loop add-goal --title \"...\" --objective \"...\" [--json]\n omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title \"...\" --objective \"...\" --evidence \"...\" --codex-goal-json <...> [--json]\n\nAll subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.\nEvery subcommand accepts --help | -h to print its own usage line.";
2
+ export declare const ULW_LOOP_HELP = "Usage:\n omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)\n omo-agent-toolkit help | --help | -h (this message)\n omo-agent-toolkit ulw-loop help\n omo-agent-toolkit ulw-loop create-goals --brief \"...\" [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]\n omo-agent-toolkit ulw-loop status [--json]\n omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]\n omo-agent-toolkit ulw-loop criteria --goal-id <id> [--json]\n omo-agent-toolkit ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence \"...\" [--notes \"...\"] [--json]\n omo-agent-toolkit ulw-loop checkpoint --print-template [--goal-id <id>] [--json]\n omo-agent-toolkit ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence \"...\" --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]\n omo-agent-toolkit ulw-loop steer --kind <kind> ... --evidence \"...\" --rationale \"...\" [--proposals-json <json-or-path>] [--json]\n omo-agent-toolkit ulw-loop add-goal --title \"...\" --objective \"...\" [--json]\n omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title \"...\" --objective \"...\" --evidence \"...\" --codex-goal-json <...> [--json]\n\nEvery state subcommand needs a session scope: [--session-id <id>] or the session env (OMO_ULW_LOOP_SESSION_ID / CODEX_SESSION_ID / CODEX_THREAD_ID / PI_SESSION_ID); state lives under .omo/ulw-loop/<id>/ and the unscoped root is never used implicitly.\nEvery subcommand accepts --help | -h to print its own usage line.";
3
3
  export declare function subcommandHelp(subcommand: string): string;
4
4
  export declare function printJson(value: unknown): void;
5
5
  export declare function printJsonError(error: unknown): void;
@@ -14,7 +14,7 @@ export const ULW_LOOP_HELP = `Usage:
14
14
  omo-agent-toolkit ulw-loop add-goal --title "..." --objective "..." [--json]
15
15
  omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title "..." --objective "..." --evidence "..." --codex-goal-json <...> [--json]
16
16
 
17
- All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.
17
+ Every state subcommand needs a session scope: [--session-id <id>] or the session env (OMO_ULW_LOOP_SESSION_ID / CODEX_SESSION_ID / CODEX_THREAD_ID / PI_SESSION_ID); state lives under .omo/ulw-loop/<id>/ and the unscoped root is never used implicitly.
18
18
  Every subcommand accepts --help | -h to print its own usage line.`;
19
19
  export function subcommandHelp(subcommand) {
20
20
  const lines = ULW_LOOP_HELP.split("\n").filter((line) => line.trimStart().startsWith(`omo-agent-toolkit ulw-loop ${subcommand}`));