oh-my-opencode 4.18.2 → 4.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.ja.md +2 -2
  2. package/README.ko.md +2 -2
  3. package/README.md +4 -4
  4. package/README.ru.md +2 -2
  5. package/README.zh-cn.md +2 -2
  6. package/dist/agents/atlas/agent.d.ts +6 -5
  7. package/dist/agents/sisyphus/index.d.ts +5 -0
  8. package/dist/agents/sisyphus/kimi-k3.d.ts +19 -0
  9. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  10. package/dist/agents/sisyphus-junior/agent.d.ts +8 -4
  11. package/dist/agents/sisyphus-junior/index.d.ts +2 -0
  12. package/dist/agents/sisyphus-junior/kimi-k3.d.ts +12 -0
  13. package/dist/agents/types.d.ts +2 -2
  14. package/dist/cli/index.js +648 -136
  15. package/dist/cli-node/index.js +648 -136
  16. package/dist/config/index.d.ts +1 -1
  17. package/dist/config/schema/browser-automation.d.ts +1 -0
  18. package/dist/config/schema/commands.d.ts +1 -3
  19. package/dist/config/schema/default-mode.d.ts +1 -1
  20. package/dist/config/schema/goal.d.ts +7 -0
  21. package/dist/config/schema/hooks.d.ts +1 -1
  22. package/dist/config/schema/oh-my-opencode-config.d.ts +6 -10
  23. package/dist/config/schema/ralph-loop.d.ts +1 -1
  24. package/dist/config/schema.d.ts +1 -1
  25. package/dist/create-hooks.d.ts +1 -1
  26. package/dist/features/builtin-commands/templates/goal.d.ts +1 -0
  27. package/dist/features/builtin-commands/templates/stop-continuation.d.ts +1 -1
  28. package/dist/features/builtin-commands/types.d.ts +1 -1
  29. package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
  30. package/dist/hooks/goal/command-arguments.d.ts +13 -0
  31. package/dist/hooks/goal/controller.d.ts +26 -0
  32. package/dist/hooks/goal/index.d.ts +23 -0
  33. package/dist/hooks/goal/prompt.d.ts +3 -0
  34. package/dist/hooks/goal/store.d.ts +8 -0
  35. package/dist/hooks/goal/tools.d.ts +10 -0
  36. package/dist/hooks/goal/types.d.ts +93 -0
  37. package/dist/hooks/goal/validation.d.ts +4 -0
  38. package/dist/hooks/index.d.ts +1 -0
  39. package/dist/hooks/keyword-detector/hook.d.ts +1 -2
  40. package/dist/hooks/ralph-loop/types.d.ts +1 -1
  41. package/dist/index.js +3515 -4365
  42. package/dist/oh-my-opencode.schema.json +23 -19
  43. package/dist/plugin/chat-message/loop-commands.d.ts +1 -1
  44. package/dist/plugin/chat-message/types.d.ts +23 -10
  45. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -1
  46. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -2
  47. package/dist/plugin/hooks/create-transform-hooks.d.ts +0 -2
  48. package/dist/plugin/stop-continuation.d.ts +2 -2
  49. package/dist/shared/system-directive.d.ts +0 -1
  50. package/dist/skills/ulw-plan/SKILL.md +11 -7
  51. package/dist/skills/ulw-plan/references/full-workflow.md +117 -6
  52. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  53. package/dist/skills/ulw-research/SKILL.md +3 -3
  54. package/dist/tools/delegate-task/types.d.ts +0 -1
  55. package/dist/tui.js +73 -25
  56. package/package.json +14 -14
  57. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  58. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +352 -17
  59. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  60. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  61. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +7 -6
  62. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +97 -30
  63. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  64. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +1 -1
  65. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  66. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  68. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  70. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +1 -0
  72. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  73. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  74. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  75. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  76. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  77. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +8 -0
  78. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +147 -60
  79. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  80. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  81. package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +3 -71
  82. package/packages/omo-codex/plugin/components/start-work-continuation/src/plan-checklist.ts +171 -0
  83. package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +198 -23
  84. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +4 -3
  85. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +6 -5
  86. package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-scaffold.md +15 -0
  87. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  88. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  89. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  90. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  91. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -10
  92. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +3 -3
  93. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  94. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  95. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +11 -7
  96. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +117 -6
  97. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  98. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  99. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  123. package/packages/omo-codex/plugin/package-lock.json +13 -13
  124. package/packages/omo-codex/plugin/package.json +1 -1
  125. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +32 -28
  126. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +17 -45
  127. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +455 -0
  128. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +3 -18
  129. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +11 -7
  130. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +117 -6
  131. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  132. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +2 -2
  133. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +2 -2
  134. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +6 -6
  135. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +3 -3
  136. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +62 -0
  137. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +271 -14
  138. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +3 -18
  139. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +0 -5
  140. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +293 -0
  141. package/packages/omo-codex/scripts/install-config.test.mjs +10 -10
  142. package/packages/omo-codex/scripts/install-dist/install-local.mjs +353 -18
  143. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +39 -2
  144. package/packages/shared-skills/skills/ulw-plan/SKILL.md +11 -7
  145. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +117 -6
  146. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
  147. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
  148. package/dist/features/builtin-commands/templates/ralph-loop.d.ts +0 -3
  149. package/dist/skills/ultraresearch/SKILL.md +0 -10
  150. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +0 -273
  151. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -12
  152. package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -107
  153. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +0 -128
  154. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +0 -11
  155. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +0 -268
  156. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +0 -11
  157. package/packages/shared-skills/skills/ultraresearch/SKILL.md +0 -10
  158. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/SKILL.md +0 -0
  159. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -0
  160. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -0
  161. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/SKILL.md +0 -0
  162. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/agents/openai.yaml +0 -0
  163. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/SKILL.md +0 -0
  164. /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/agents/openai.yaml +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  // components/codegraph/src/cli.ts
4
4
  import { realpathSync as realpathSync6 } from "node:fs";
5
- import { basename as basename5, resolve as resolve6 } from "node:path";
5
+ import { basename as basename5, resolve as resolve7 } from "node:path";
6
6
  import { stderr as processStderr4 } from "node:process";
7
7
  import { fileURLToPath as fileURLToPath4 } from "node:url";
8
8
 
@@ -98,8 +98,9 @@ function buildCodegraphChildEnv(options = {}) {
98
98
  import { homedir as homedir5 } from "node:os";
99
99
 
100
100
  // ../../utils/src/codegraph/workspace.ts
101
+ import { execFileSync } from "node:child_process";
101
102
  import { appendFileSync, existsSync as existsSync2, lstatSync as lstatSync2, mkdirSync, realpathSync as realpathSync3, readFileSync as readFileSync2, statSync, symlinkSync } from "node:fs";
102
- import { join as join5 } from "node:path";
103
+ import { dirname, join as join5, resolve as resolve3 } from "node:path";
103
104
 
104
105
  // ../../utils/src/codegraph/paths.ts
105
106
  import { createHash } from "node:crypto";
@@ -305,12 +306,52 @@ function prepareCodegraphWorkspace(workspace, options = {}) {
305
306
  }
306
307
  }
307
308
  function ensureCodegraphGitignored(workspace) {
308
- const gitDir = join5(workspace, ".git");
309
- if (!existsSync2(gitDir))
309
+ const gitMarkerPath = join5(workspace, ".git");
310
+ if (!existsSync2(gitMarkerPath))
310
311
  return false;
311
- const excludePath = join5(gitDir, "info", "exclude");
312
312
  try {
313
- mkdirSync(join5(gitDir, "info"), { recursive: true });
313
+ const isWorktree = execFileSync("git", ["rev-parse", "--is-inside-work-tree"], {
314
+ cwd: workspace,
315
+ encoding: "utf8",
316
+ shell: false,
317
+ stdio: ["ignore", "pipe", "ignore"],
318
+ timeout: 5000,
319
+ windowsHide: true
320
+ }).trim();
321
+ if (isWorktree !== "true")
322
+ return false;
323
+ const gitTopLevel = execFileSync("git", ["rev-parse", "--show-toplevel"], {
324
+ cwd: workspace,
325
+ encoding: "utf8",
326
+ shell: false,
327
+ stdio: ["ignore", "pipe", "ignore"],
328
+ timeout: 5000,
329
+ windowsHide: true
330
+ }).trim();
331
+ if (gitTopLevel.length === 0 || realpathSync3.native(gitTopLevel) !== realpathSync3.native(workspace))
332
+ return false;
333
+ const gitDir = execFileSync("git", ["rev-parse", "--absolute-git-dir"], {
334
+ cwd: workspace,
335
+ encoding: "utf8",
336
+ shell: false,
337
+ stdio: ["ignore", "pipe", "ignore"],
338
+ timeout: 5000,
339
+ windowsHide: true
340
+ }).trim();
341
+ if (gitDir.length === 0 || !gitMarkerOwnsGitDir(gitMarkerPath, workspace, gitDir))
342
+ return false;
343
+ const gitExcludePath = execFileSync("git", ["rev-parse", "--git-path", "info/exclude"], {
344
+ cwd: workspace,
345
+ encoding: "utf8",
346
+ shell: false,
347
+ stdio: ["ignore", "pipe", "ignore"],
348
+ timeout: 5000,
349
+ windowsHide: true
350
+ }).trim();
351
+ if (gitExcludePath.length === 0)
352
+ return false;
353
+ const excludePath = resolve3(workspace, gitExcludePath);
354
+ mkdirSync(dirname(excludePath), { recursive: true });
314
355
  const existing = existsSync2(excludePath) ? readFileSync2(excludePath, "utf8") : "";
315
356
  if (existing.split(/\r?\n/).includes(".codegraph"))
316
357
  return true;
@@ -319,12 +360,38 @@ function ensureCodegraphGitignored(workspace) {
319
360
  `}.codegraph
320
361
  `);
321
362
  return true;
322
- } catch (error) {
323
- if (error instanceof Error)
324
- return false;
325
- throw error;
363
+ } catch {
364
+ return false;
326
365
  }
327
366
  }
367
+ function gitMarkerOwnsGitDir(gitMarkerPath, workspace, gitDir) {
368
+ const markerStat = lstatSync2(gitMarkerPath);
369
+ if (markerStat.isSymbolicLink())
370
+ return false;
371
+ const resolvedGitDir = realpathSync3.native(gitDir);
372
+ if (markerStat.isDirectory())
373
+ return realpathSync3.native(gitMarkerPath) === resolvedGitDir;
374
+ if (!markerStat.isFile())
375
+ return false;
376
+ const markerMatch = /^gitdir:\s*(.+)\s*$/i.exec(readFileSync2(gitMarkerPath, "utf8").trim());
377
+ if (markerMatch?.[1] === undefined)
378
+ return false;
379
+ if (realpathSync3.native(resolve3(workspace, markerMatch[1])) !== resolvedGitDir)
380
+ return false;
381
+ const backlinkPath = join5(resolvedGitDir, "gitdir");
382
+ if (existsSync2(backlinkPath)) {
383
+ const backlink = readFileSync2(backlinkPath, "utf8").trim();
384
+ return backlink.length > 0 && realpathSync3.native(resolve3(resolvedGitDir, backlink)) === realpathSync3.native(gitMarkerPath);
385
+ }
386
+ const coreWorktree = execFileSync("git", ["config", "--file", join5(resolvedGitDir, "config"), "--get", "core.worktree"], {
387
+ encoding: "utf8",
388
+ shell: false,
389
+ stdio: ["ignore", "pipe", "ignore"],
390
+ timeout: 5000,
391
+ windowsHide: true
392
+ }).trim();
393
+ return coreWorktree.length > 0 && realpathSync3.native(resolve3(resolvedGitDir, coreWorktree)) === realpathSync3.native(workspace);
394
+ }
328
395
 
329
396
  // ../../utils/src/codegraph/guidance.ts
330
397
  var CODEGRAPH_UNINITIALIZED_PATTERN = /CodeGraph not initialized in ([\s\S]*?)\.\s*Run ['`]codegraph init['`] in that project first\./i;
@@ -416,7 +483,7 @@ function isRecord(value) {
416
483
  import { existsSync as existsSync3 } from "node:fs";
417
484
  import { homedir as homedir6 } from "node:os";
418
485
  import { spawnSync } from "node:child_process";
419
- import { basename as basename2, dirname, join as join7 } from "node:path";
486
+ import { basename as basename2, dirname as dirname2, join as join7 } from "node:path";
420
487
  import { createRequire } from "node:module";
421
488
 
422
489
  // ../../utils/src/runtime/which.ts
@@ -603,7 +670,7 @@ function defaultProvisionedBin(homeDir, fileExists) {
603
670
  function resolveBundledShim(requireResolve, fileExists) {
604
671
  try {
605
672
  const packageJson = requireResolve(`${CODEGRAPH_PACKAGE}/package.json`);
606
- const packageRoot = dirname(packageJson);
673
+ const packageRoot = dirname2(packageJson);
607
674
  const candidates = [join7(packageRoot, "bin", "codegraph.js"), join7(packageRoot, "npm-shim.js")];
608
675
  return candidates.find((candidate) => fileExists(candidate)) ?? null;
609
676
  } catch (error) {
@@ -1819,14 +1886,14 @@ function buildEnvOverrides(harness, env, warnings, merge) {
1819
1886
 
1820
1887
  // ../../utils/src/omo-config/resolve.ts
1821
1888
  import { existsSync as existsSync4 } from "node:fs";
1822
- import { dirname as dirname2, isAbsolute as isAbsolute2, join as join8, relative, resolve as resolve3 } from "node:path";
1889
+ import { dirname as dirname3, isAbsolute as isAbsolute2, join as join8, relative, resolve as resolve4 } from "node:path";
1823
1890
  function containsPath(parent, child) {
1824
1891
  const pathToChild = relative(parent, child);
1825
1892
  return pathToChild === "" || !pathToChild.startsWith("..") && !isAbsolute2(pathToChild);
1826
1893
  }
1827
1894
  function findProjectConfigPathsNearestFirst(cwd, homeDir) {
1828
- const startDir = resolve3(cwd);
1829
- const stopBeforeDir = containsPath(resolve3(homeDir), startDir) ? resolve3(homeDir) : null;
1895
+ const startDir = resolve4(cwd);
1896
+ const stopBeforeDir = containsPath(resolve4(homeDir), startDir) ? resolve4(homeDir) : null;
1830
1897
  const paths = [];
1831
1898
  let currentDir = startDir;
1832
1899
  while (true) {
@@ -1836,7 +1903,7 @@ function findProjectConfigPathsNearestFirst(cwd, homeDir) {
1836
1903
  if (existsSync4(configPath)) {
1837
1904
  paths.push(configPath);
1838
1905
  }
1839
- const parentDir = dirname2(currentDir);
1906
+ const parentDir = dirname3(currentDir);
1840
1907
  if (parentDir === currentDir)
1841
1908
  break;
1842
1909
  currentDir = parentDir;
@@ -1844,7 +1911,7 @@ function findProjectConfigPathsNearestFirst(cwd, homeDir) {
1844
1911
  return paths;
1845
1912
  }
1846
1913
  function resolveOmoConfigPaths(options) {
1847
- const globalPath = join8(resolve3(options.homeDir), ".omo", "config.jsonc");
1914
+ const globalPath = join8(resolve4(options.homeDir), ".omo", "config.jsonc");
1848
1915
  const projectPathsFarthestFirst = findProjectConfigPathsNearestFirst(options.cwd, options.homeDir).reverse();
1849
1916
  return [
1850
1917
  { path: globalPath, scope: "global" },
@@ -1943,7 +2010,7 @@ import { fileURLToPath } from "node:url";
1943
2010
  // ../../utils/src/codegraph/process-sweeper.ts
1944
2011
  import { existsSync as existsSync7, mkdirSync as mkdirSync2, statSync as statSync2, utimesSync, writeFileSync as writeFileSync2 } from "node:fs";
1945
2012
  import { homedir as homedir10 } from "node:os";
1946
- import { dirname as dirname3, join as join10 } from "node:path";
2013
+ import { dirname as dirname4, join as join10 } from "node:path";
1947
2014
 
1948
2015
  // ../../utils/src/codegraph/process-exec.ts
1949
2016
  import { execFile } from "node:child_process";
@@ -2188,7 +2255,7 @@ function processKillErrorMeansAlive(error) {
2188
2255
  // ../../utils/src/codegraph/process-roots.ts
2189
2256
  import { existsSync as existsSync6, readdirSync as readdirSync2, realpathSync as realpathSync4 } from "node:fs";
2190
2257
  import { homedir as homedir9 } from "node:os";
2191
- import { join as join9, resolve as resolve4 } from "node:path";
2258
+ import { join as join9, resolve as resolve5 } from "node:path";
2192
2259
  function discoverCodegraphOwnedRoots(options = {}) {
2193
2260
  const env = options.env ?? process.env;
2194
2261
  const homeDir = options.homeDir ?? env["HOME"] ?? env["USERPROFILE"] ?? homedir9();
@@ -2222,7 +2289,7 @@ function readCodexPluginCacheRoots(codexHome) {
2222
2289
  function addRoot(roots, root) {
2223
2290
  if (root === undefined || root.trim().length === 0)
2224
2291
  return;
2225
- const resolved = resolve4(root);
2292
+ const resolved = resolve5(root);
2226
2293
  roots.add(resolved);
2227
2294
  roots.add(realpathIfPossible2(resolved));
2228
2295
  }
@@ -2240,7 +2307,7 @@ function realpathIfPossible2(path) {
2240
2307
  return realpathSync4(path);
2241
2308
  } catch (error) {
2242
2309
  if (error instanceof Error)
2243
- return resolve4(path);
2310
+ return resolve5(path);
2244
2311
  throw error;
2245
2312
  }
2246
2313
  }
@@ -2325,7 +2392,7 @@ function isSweepThrottled(stampFile, nowMs, throttleMs) {
2325
2392
  return nowMs - statSync2(stampFile).mtimeMs < throttleMs;
2326
2393
  }
2327
2394
  function writeSweepStamp(stampFile, nowMs) {
2328
- mkdirSync2(dirname3(stampFile), { recursive: true });
2395
+ mkdirSync2(dirname4(stampFile), { recursive: true });
2329
2396
  writeFileSync2(stampFile, `${new Date(nowMs).toISOString()}
2330
2397
  `);
2331
2398
  const stampDate = new Date(nowMs);
@@ -2442,7 +2509,7 @@ async function removeEmptyDirectory(path) {
2442
2509
  }
2443
2510
  }
2444
2511
  function sleep(ms) {
2445
- return new Promise((resolve5) => setTimeout(resolve5, ms));
2512
+ return new Promise((resolve6) => setTimeout(resolve6, ms));
2446
2513
  }
2447
2514
  async function defaultDownloader(asset, timeoutMs = DEFAULT_DOWNLOAD_TIMEOUT_MS) {
2448
2515
  const response = await fetch(asset.url, { signal: AbortSignal.timeout(timeoutMs) });
@@ -2962,7 +3029,7 @@ function defaultWorkerCliPath() {
2962
3029
  // components/codegraph/src/serve.ts
2963
3030
  import { existsSync as existsSync10, realpathSync as realpathSync5 } from "node:fs";
2964
3031
  import { homedir as homedir14 } from "node:os";
2965
- import { basename as basename4, join as join14, resolve as resolve5 } from "node:path";
3032
+ import { basename as basename4, join as join14, resolve as resolve6 } from "node:path";
2966
3033
  import {
2967
3034
  cwd as processCwd3,
2968
3035
  env as processEnv3,
@@ -3023,7 +3090,7 @@ ${body}` : `${body}
3023
3090
  await writeChunk(output, payload);
3024
3091
  }
3025
3092
  function writeChunk(output, chunk) {
3026
- return new Promise((resolve5, reject) => {
3093
+ return new Promise((resolve6, reject) => {
3027
3094
  let settled = false;
3028
3095
  const onError = (error) => {
3029
3096
  if (settled)
@@ -3043,7 +3110,7 @@ function writeChunk(output, chunk) {
3043
3110
  return;
3044
3111
  }
3045
3112
  output.removeListener("error", onError);
3046
- resolve5();
3113
+ resolve6();
3047
3114
  });
3048
3115
  } catch (error) {
3049
3116
  output.removeListener("error", onError);
@@ -3624,11 +3691,11 @@ function resolveProjectCwd(env, fallback) {
3624
3691
  const candidate = env[key]?.trim();
3625
3692
  if (candidate === undefined || candidate.length === 0)
3626
3693
  continue;
3627
- const resolved = resolve5(candidate);
3694
+ const resolved = resolve6(candidate);
3628
3695
  if (existsSync10(resolved))
3629
3696
  return resolved;
3630
3697
  }
3631
- return resolve5(fallback);
3698
+ return resolve6(fallback);
3632
3699
  }
3633
3700
  function provisionedBinFromInstallDir3(installDir) {
3634
3701
  if (installDir === undefined)
@@ -3653,7 +3720,7 @@ function isDirectInvocation(argvPath) {
3653
3720
  const moduleName = basename4(modulePath);
3654
3721
  if (moduleName !== "serve.js" && moduleName !== "serve.ts")
3655
3722
  return false;
3656
- return realpathSync5(resolve5(argvPath)) === realpathSync5(modulePath);
3723
+ return realpathSync5(resolve6(argvPath)) === realpathSync5(modulePath);
3657
3724
  }
3658
3725
 
3659
3726
  // components/codegraph/src/sweep-cli.ts
@@ -3763,7 +3830,7 @@ function isDirectInvocation2(argvPath) {
3763
3830
  const moduleName = basename5(modulePath);
3764
3831
  if (moduleName !== "cli.js" && moduleName !== "cli.ts")
3765
3832
  return false;
3766
- return realpathSync6(resolve6(argvPath)) === realpathSync6(modulePath);
3833
+ return realpathSync6(resolve7(argvPath)) === realpathSync6(modulePath);
3767
3834
  }
3768
3835
  export {
3769
3836
  runCodegraphCli
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -21,7 +21,7 @@ describe("CodeGraph SessionStart exclusion policy", () => {
21
21
  const stdout: string[] = [];
22
22
  const spawned: WorkerSpawnInvocation[] = [];
23
23
  const stateRoot = createAllowedWorkspace("codegraph-omo-state");
24
- const workspace = join(stateRoot, ".omo", "ultraresearch", "run", "clones", "repo");
24
+ const workspace = join(stateRoot, ".omo", "ulw-research", "run", "clones", "repo");
25
25
  mkdirSync(workspace, { recursive: true });
26
26
 
27
27
  try {
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.18.2) Checking Comments"
11
+ "statusMessage": "(OmO 4.19.0) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 4.18.2) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.19.0) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 4.18.2) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.19.0) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -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 4.18.2) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.19.0) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -22,4 +22,5 @@ Conventions for humans and agents working on this repository.
22
22
  - LSP server processes are owned by `LspManager`.
23
23
  - Tool execution acquires clients through `withLspClient(...)` unless it only reports static status.
24
24
  - `lsp.rename` mutates files by applying workspace edits; keep it sequential at the MCP caller level.
25
+ - `.mcp.json` sets `lsp` MCP server `startup_timeout_sec: 10` to bound startup; preserve the bound on edits.
25
26
  - Do not add pi-coding-agent or omo source dependencies. This package is standalone.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "4.18.2",
4
- "inputDigest": "sha256:5f242410eb12245b588135e29137ee9e7a0fdb2346469bdfdb75727b2abaf248",
3
+ "version": "4.19.0",
4
+ "inputDigest": "sha256:1c26ab90eb222f050b468e7088ee9e655d0db850605ab425e8636c089a910f79",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 4.18.2) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.19.0) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 4.18.2) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.19.0) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.18.2) Loading Project Rules"
10
+ "statusMessage": "(OmO 4.19.0) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 4.18.2) Loading Project Rules"
22
+ "statusMessage": "(OmO 4.19.0) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 4.18.2) Matching Project Rules"
35
+ "statusMessage": "(OmO 4.19.0) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 4.18.2) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 4.19.0) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -29,6 +29,13 @@ Conventions for human contributors and AI agents working on this repository.
29
29
  - Never use Arrange-Act-Assert comments.
30
30
  - Keep fixtures in `test/fixtures/`.
31
31
 
32
+ ## Layout
33
+
34
+ - `src/boulder-reader.ts`: reads `.omo/boulder.json`, resolves the active work for the session, re-exports `getPlanChecklist`/`PlanChecklist` from `plan-checklist.ts`. `readContinuationState` returns null only when the plan has no readable top-level checklist (`total === 0`).
35
+ - `src/plan-checklist.ts`: `PlanChecklist` (`completed`/`remaining`/`total`/`nextTaskLabel`) and `getPlanChecklist`/`parsePlanChecklist`. Counts structured `## TODOs` rows (`N. <title>`) and `## Final Verification Wave` rows (`F<number>. <title>`); falls back to simple top-level `- [ ]`/`- [x]` checkboxes. Skips fenced blocks and respects `#`/`##` section boundaries.
36
+ - `src/codex-hook.ts`: Stop/SubagentStop hook; fills `REMAINING_COUNT`/`TOTAL_COUNT`/`NEXT_TASK_LABEL` from the checklist into `directive.md`.
37
+ - `directive.md`: directive template with placeholders, applied per invocation.
38
+
32
39
  ## Build and Hooks
33
40
 
34
41
  - Build output goes to `dist/`.
@@ -41,3 +48,4 @@ Conventions for human contributors and AI agents working on this repository.
41
48
  - Never make a network call from the hook.
42
49
  - Keep the directive in `directive.md`. Do not inline it into TypeScript files.
43
50
  - The hook only continues sessions listed in `.omo/boulder.json` as `codex:<session_id>`.
51
+ - The hook continues while the plan has a readable top-level checklist (`total > 0`). A fully-checked plan still blocks Stop until the final gate runs and the Boulder work is marked completed; an unreadable or empty checklist yields no output.