lazycodex-ai 5.1.2 → 5.1.3

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 (55) hide show
  1. package/dist/cli/index.js +99 -77
  2. package/dist/cli-node/index.js +99 -77
  3. package/package.json +1 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  6. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  7. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +33 -7
  8. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  10. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +4 -4
  11. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  12. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  17. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  19. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  29. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  30. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  31. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  32. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  51. package/packages/omo-codex/plugin/package-lock.json +12 -12
  52. package/packages/omo-codex/plugin/package.json +1 -1
  53. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  54. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  55. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.1.2",
68
+ version: "5.1.3",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -242,7 +242,7 @@ var init_package = __esm(() => {
242
242
  },
243
243
  devDependencies: {
244
244
  "@clack/prompts": "^1.8.1",
245
- "@code-yeongyu/senpi": "2026.9.29-3",
245
+ "@code-yeongyu/senpi": "2026.9.29-4",
246
246
  "@modelcontextprotocol/sdk": "^1.30.0",
247
247
  "@oh-my-opencode/agents-md-core": "workspace:*",
248
248
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -300,18 +300,18 @@ var init_package = __esm(() => {
300
300
  typescript: "^7.0.2"
301
301
  },
302
302
  optionalDependencies: {
303
- "oh-my-opencode-darwin-arm64": "5.1.2",
304
- "oh-my-opencode-darwin-x64": "5.1.2",
305
- "oh-my-opencode-darwin-x64-baseline": "5.1.2",
306
- "oh-my-opencode-linux-arm64": "5.1.2",
307
- "oh-my-opencode-linux-arm64-musl": "5.1.2",
308
- "oh-my-opencode-linux-x64": "5.1.2",
309
- "oh-my-opencode-linux-x64-baseline": "5.1.2",
310
- "oh-my-opencode-linux-x64-musl": "5.1.2",
311
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.2",
312
- "oh-my-opencode-windows-arm64": "5.1.2",
313
- "oh-my-opencode-windows-x64": "5.1.2",
314
- "oh-my-opencode-windows-x64-baseline": "5.1.2"
303
+ "oh-my-opencode-darwin-arm64": "5.1.3",
304
+ "oh-my-opencode-darwin-x64": "5.1.3",
305
+ "oh-my-opencode-darwin-x64-baseline": "5.1.3",
306
+ "oh-my-opencode-linux-arm64": "5.1.3",
307
+ "oh-my-opencode-linux-arm64-musl": "5.1.3",
308
+ "oh-my-opencode-linux-x64": "5.1.3",
309
+ "oh-my-opencode-linux-x64-baseline": "5.1.3",
310
+ "oh-my-opencode-linux-x64-musl": "5.1.3",
311
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.3",
312
+ "oh-my-opencode-windows-arm64": "5.1.3",
313
+ "oh-my-opencode-windows-x64": "5.1.3",
314
+ "oh-my-opencode-windows-x64-baseline": "5.1.3"
315
315
  },
316
316
  overrides: {
317
317
  hono: "^4.13.8",
@@ -89099,7 +89099,7 @@ var package_default2;
89099
89099
  var init_package2 = __esm(() => {
89100
89100
  package_default2 = {
89101
89101
  name: "@oh-my-opencode/omo-codex",
89102
- version: "5.1.2",
89102
+ version: "5.1.3",
89103
89103
  type: "module",
89104
89104
  private: true,
89105
89105
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -106532,15 +106532,10 @@ async function checkDeprecatedReasoningKeys() {
106532
106532
  }
106533
106533
 
106534
106534
  // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
106535
- init_src();
106536
106535
  import { existsSync as existsSync55 } from "node:fs";
106537
- import { createRequire as createRequire3 } from "node:module";
106536
+ import { createRequire as createRequire4 } from "node:module";
106538
106537
  import { homedir as homedir20 } from "node:os";
106539
- import { dirname as dirname33, join as join88 } from "node:path";
106540
-
106541
- // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106542
- import { join as join87 } from "path";
106543
- import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
106538
+ import { join as join89 } from "node:path";
106544
106539
  // packages/comment-checker-core/src/release.ts
106545
106540
  import { join as join85 } from "node:path";
106546
106541
  var COMMENT_CHECKER_RELEASE_VERSION = "0.8.0";
@@ -106567,12 +106562,45 @@ function isCachedCommentCheckerCurrent(cacheDir, readFile = (path) => readFileSy
106567
106562
  return false;
106568
106563
  }
106569
106564
  }
106565
+ // packages/comment-checker-core/src/package-binary.ts
106566
+ import { createRequire as createRequire3 } from "node:module";
106567
+ import { dirname as dirname33, join as join87 } from "node:path";
106568
+ var COMMENT_CHECKER_PACKAGE_NAME = "@code-yeongyu/comment-checker";
106569
+ function isModuleResolutionMiss(error) {
106570
+ return error instanceof Error || typeof error === "object" && error !== null && "name" in error && error.name === "ResolveMessage";
106571
+ }
106572
+ function findCommentCheckerPackageBinary(input) {
106573
+ const packageName = input.packageName ?? COMMENT_CHECKER_PACKAGE_NAME;
106574
+ const platformKey = `${input.platform ?? process.platform}-${input.arch ?? process.arch}`;
106575
+ const packageDir = dirname33(input.packageJsonPath);
106576
+ const candidates = [
106577
+ resolvePlatformPackageBinary(input.packageJsonPath, `${packageName}-${platformKey}`, input.binaryName),
106578
+ join87(packageDir, "vendor", platformKey, input.binaryName),
106579
+ join87(packageDir, "bin", input.binaryName)
106580
+ ];
106581
+ return candidates.find((candidate) => candidate !== null && input.existsSync(candidate)) ?? null;
106582
+ }
106583
+ function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, binaryName) {
106584
+ try {
106585
+ const manifestPath = createRequire3(packageJsonPath).resolve(`${platformPackageName}/package.json`);
106586
+ return join87(dirname33(manifestPath), "bin", binaryName);
106587
+ } catch (error) {
106588
+ if (isModuleResolutionMiss(error))
106589
+ return null;
106590
+ throw error;
106591
+ }
106592
+ }
106593
+ // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
106594
+ init_src();
106595
+
106570
106596
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106597
+ import { join as join88 } from "path";
106598
+ import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
106571
106599
  init_binary_downloader();
106572
106600
  init_logger2();
106573
106601
  init_plugin_identity();
106574
106602
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
106575
- var DEBUG_FILE = join87(tmpdir4(), "comment-checker-debug.log");
106603
+ var DEBUG_FILE = join88(tmpdir4(), "comment-checker-debug.log");
106576
106604
  function getCacheDir2() {
106577
106605
  return commentCheckerCacheDir({
106578
106606
  platform: process.platform,
@@ -106631,7 +106659,7 @@ async function getBinaryVersion(binary) {
106631
106659
  }
106632
106660
  }
106633
106661
  async function checkAstGrepCli() {
106634
- const runtimeDir = astGrepRuntimeDir(join88(homedir20(), ".omo"));
106662
+ const runtimeDir = astGrepRuntimeDir(join89(homedir20(), ".omo"));
106635
106663
  const sgPath = findSgBinarySync({ runtimeDir });
106636
106664
  if (sgPath === null) {
106637
106665
  return {
@@ -106653,20 +106681,14 @@ async function checkAstGrepCli() {
106653
106681
  };
106654
106682
  }
106655
106683
  function resolveCommentCheckerPackageJson() {
106656
- const require2 = createRequire3(import.meta.url);
106684
+ const require2 = createRequire4(import.meta.url);
106657
106685
  return require2.resolve("@code-yeongyu/comment-checker/package.json");
106658
106686
  }
106659
- function findCommentCheckerPackageBinary(baseDirOverride, resolvePackageJsonPath = resolveCommentCheckerPackageJson) {
106687
+ function findCommentCheckerPackageBinary2(baseDirOverride, resolvePackageJsonPath = resolveCommentCheckerPackageJson) {
106660
106688
  const binaryName = process.platform === "win32" ? "comment-checker.exe" : "comment-checker";
106661
- const platformKey = `${process.platform}-${process.arch === "x64" ? "x64" : process.arch}`;
106662
106689
  try {
106663
- const packageDir = baseDirOverride ?? dirname33(resolvePackageJsonPath());
106664
- const vendorPath = join88(packageDir, "vendor", platformKey, binaryName);
106665
- if (existsSync55(vendorPath))
106666
- return vendorPath;
106667
- const binPath = join88(packageDir, "bin", binaryName);
106668
- if (existsSync55(binPath))
106669
- return binPath;
106690
+ const packageJsonPath = baseDirOverride === undefined ? resolvePackageJsonPath() : join89(baseDirOverride, "package.json");
106691
+ return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync: existsSync55 });
106670
106692
  } catch (error) {
106671
106693
  if (!(error instanceof Error) && !isModuleResolutionFailure(error))
106672
106694
  throw error;
@@ -106686,7 +106708,7 @@ async function checkCommentChecker() {
106686
106708
  };
106687
106709
  }
106688
106710
  const binaryCheck = await checkBinaryExists("comment-checker");
106689
- const resolvedPath = binaryCheck.exists ? binaryCheck.path : findCommentCheckerPackageBinary();
106711
+ const resolvedPath = binaryCheck.exists ? binaryCheck.path : findCommentCheckerPackageBinary2();
106690
106712
  if (!resolvedPath) {
106691
106713
  return {
106692
106714
  name: "Comment Checker",
@@ -106812,7 +106834,7 @@ async function getGhCliInfo(dependencies = {}) {
106812
106834
  init_zod();
106813
106835
  init_opencode_config_dir();
106814
106836
  import { existsSync as existsSync56, readFileSync as readFileSync38 } from "node:fs";
106815
- import { delimiter as delimiter3, dirname as dirname34, resolve as resolve23 } from "node:path";
106837
+ import { delimiter as delimiter3, dirname as dirname35, resolve as resolve23 } from "node:path";
106816
106838
  import { fileURLToPath as fileURLToPath7 } from "node:url";
106817
106839
 
106818
106840
  // packages/omo-opencode/src/mcp/cli-suffix.ts
@@ -106943,7 +106965,7 @@ var LSP_BOOTSTRAP_SCRIPT = [
106943
106965
  ].join(";");
106944
106966
  function getModuleDirectory(moduleUrl) {
106945
106967
  try {
106946
- return dirname34(fileURLToPath7(moduleUrl));
106968
+ return dirname35(fileURLToPath7(moduleUrl));
106947
106969
  } catch (error) {
106948
106970
  if (!(error instanceof Error))
106949
106971
  throw error;
@@ -107040,13 +107062,13 @@ function getInstalledLspServers(options = {}) {
107040
107062
  init_shared();
107041
107063
  import { existsSync as existsSync57, readFileSync as readFileSync39 } from "node:fs";
107042
107064
  import { homedir as homedir21 } from "node:os";
107043
- import { join as join89 } from "node:path";
107065
+ import { join as join90 } from "node:path";
107044
107066
  var BUILTIN_MCP_SERVERS = ["websearch", "context7", "grep_app", "lsp"];
107045
107067
  function getMcpConfigPaths() {
107046
107068
  return [
107047
- join89(homedir21(), ".claude", ".mcp.json"),
107048
- join89(process.cwd(), ".mcp.json"),
107049
- join89(process.cwd(), ".claude", ".mcp.json")
107069
+ join90(homedir21(), ".claude", ".mcp.json"),
107070
+ join90(process.cwd(), ".mcp.json"),
107071
+ join90(process.cwd(), ".claude", ".mcp.json")
107050
107072
  ];
107051
107073
  }
107052
107074
  function loadUserMcpConfig() {
@@ -107328,7 +107350,7 @@ init_src();
107328
107350
  import { existsSync as existsSync59 } from "node:fs";
107329
107351
  import { lstat as lstat16, readdir as readdir14, readFile as readFile30 } from "node:fs/promises";
107330
107352
  import { homedir as homedir23 } from "node:os";
107331
- import { basename as basename12, join as join90, resolve as resolve24 } from "node:path";
107353
+ import { basename as basename12, join as join91, resolve as resolve24 } from "node:path";
107332
107354
  // packages/omo-opencode/package.json
107333
107355
  var package_default3 = {
107334
107356
  name: "@oh-my-opencode/omo-opencode",
@@ -107397,13 +107419,13 @@ var CODEX_BIN_NAMES = [
107397
107419
  "omo-git-bash-hook"
107398
107420
  ];
107399
107421
  async function gatherCodexSummary(deps = {}) {
107400
- const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join90(homedir23(), ".codex"));
107422
+ const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join91(homedir23(), ".codex"));
107401
107423
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107402
107424
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
107403
107425
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
107404
- const manifest = pluginRoot === null ? null : await readJson(join90(pluginRoot, ".codex-plugin", "plugin.json"));
107405
- const installSnapshot = pluginRoot === null ? null : await readJson(join90(pluginRoot, "lazycodex-install.json"));
107406
- const configPath = join90(codexHome, "config.toml");
107426
+ const manifest = pluginRoot === null ? null : await readJson(join91(pluginRoot, ".codex-plugin", "plugin.json"));
107427
+ const installSnapshot = pluginRoot === null ? null : await readJson(join91(pluginRoot, "lazycodex-install.json"));
107428
+ const configPath = join91(codexHome, "config.toml");
107407
107429
  const pluginVersion = stringField(manifest, "version");
107408
107430
  return {
107409
107431
  codexPath: detection.found && "path" in detection ? detection.path : null,
@@ -107460,7 +107482,7 @@ function buildCodexIssues(summary) {
107460
107482
  if (summary.pluginRoot === null) {
107461
107483
  issues.push({
107462
107484
  title: "OMO Codex plugin is not installed",
107463
- description: `Expected cached plugin at ${join90("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
107485
+ description: `Expected cached plugin at ${join91("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
107464
107486
  fix: "Run: npx lazycodex-ai install",
107465
107487
  severity: "error",
107466
107488
  affects: ["plugin loading"]
@@ -107525,12 +107547,12 @@ function buildCodexIssues(summary) {
107525
107547
  return issues;
107526
107548
  }
107527
107549
  async function resolveInstalledPluginRoot(codexHome) {
107528
- const pluginRoot = join90(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107550
+ const pluginRoot = join91(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107529
107551
  if (!existsSync59(pluginRoot))
107530
107552
  return null;
107531
107553
  const versions = await readdir14(pluginRoot, { withFileTypes: true });
107532
107554
  const candidates = versions.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(compareVersionsDescending);
107533
- return candidates.length === 0 ? null : join90(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
107555
+ return candidates.length === 0 ? null : join91(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
107534
107556
  }
107535
107557
  async function readCodexConfigSummary(configPath) {
107536
107558
  if (!existsSync59(configPath)) {
@@ -107558,13 +107580,13 @@ async function readCodexConfigSummary(configPath) {
107558
107580
  async function readLinkedBins(binDir) {
107559
107581
  const linked = [];
107560
107582
  for (const name of CODEX_BIN_NAMES) {
107561
- if (await pathExists3(join90(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107583
+ if (await pathExists3(join91(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107562
107584
  linked.push(name);
107563
107585
  }
107564
107586
  return linked;
107565
107587
  }
107566
107588
  async function readLinkedAgents(codexHome) {
107567
- const agentsDir = join90(codexHome, "agents");
107589
+ const agentsDir = join91(codexHome, "agents");
107568
107590
  if (!existsSync59(agentsDir))
107569
107591
  return [];
107570
107592
  const entries = await readdir14(agentsDir, { withFileTypes: true });
@@ -107698,7 +107720,7 @@ function resolveLatestVersion(input) {
107698
107720
  init_src();
107699
107721
  import { readdir as readdir15, readFile as readFile31, stat as stat7 } from "node:fs/promises";
107700
107722
  import { homedir as homedir24 } from "node:os";
107701
- import { dirname as dirname35, isAbsolute as isAbsolute14, join as join91, relative as relative9, resolve as resolve25, sep as sep9 } from "node:path";
107723
+ import { dirname as dirname36, isAbsolute as isAbsolute14, join as join92, relative as relative9, resolve as resolve25, sep as sep9 } from "node:path";
107702
107724
  var CODEX_COMPONENTS_CHECK_ID = "codex-components";
107703
107725
  var CODEX_COMPONENTS_CHECK_NAME = "codex-components";
107704
107726
  var PLUGIN_DATA_DIR_NAME = "omo-sisyphuslabs";
@@ -107708,7 +107730,7 @@ async function checkCodexComponents(deps = {}) {
107708
107730
  const env = deps.env ?? process.env;
107709
107731
  const platform = deps.platform ?? process.platform;
107710
107732
  const arch = deps.arch ?? process.arch;
107711
- const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join91(homedir24(), ".codex"));
107733
+ const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join92(homedir24(), ".codex"));
107712
107734
  const summary = await gatherCodexSummary({ ...deps, codexHome });
107713
107735
  if (summary.pluginRoot === null) {
107714
107736
  return {
@@ -107733,7 +107755,7 @@ async function checkCodexComponents(deps = {}) {
107733
107755
  });
107734
107756
  }
107735
107757
  const runtimeSgDir = runtimeSgDirectory(codexHome, platform, arch);
107736
- const runtimeSgPath = join91(runtimeSgDir, sgBinaryName(platform));
107758
+ const runtimeSgPath = join92(runtimeSgDir, sgBinaryName(platform));
107737
107759
  const sg = findSgBinarySync({
107738
107760
  arch,
107739
107761
  env,
@@ -107772,7 +107794,7 @@ async function auditBundleTargets(pluginRoot) {
107772
107794
  const manifest = await readJson2(manifestPath);
107773
107795
  if (manifest === null || !isRecord18(manifest["mcpServers"]))
107774
107796
  continue;
107775
- const manifestRoot = dirname35(manifestPath);
107797
+ const manifestRoot = dirname36(manifestPath);
107776
107798
  const isRootManifest = resolve25(manifestRoot) === resolve25(pluginRoot);
107777
107799
  for (const server of Object.values(manifest["mcpServers"])) {
107778
107800
  if (!isRecord18(server) || !Array.isArray(server["args"]))
@@ -107793,7 +107815,7 @@ async function auditBundleTargets(pluginRoot) {
107793
107815
  continue;
107794
107816
  const commands = [];
107795
107817
  collectHookCommands(manifest, commands);
107796
- const hookPluginRoot = dirname35(dirname35(hookManifestPath));
107818
+ const hookPluginRoot = dirname36(dirname36(hookManifestPath));
107797
107819
  for (const command of commands) {
107798
107820
  for (const relativePath of extractPluginRootPaths(command)) {
107799
107821
  referencedCount += 1;
@@ -107832,7 +107854,7 @@ async function classifyBundleTarget(bundleRoot, baseRoot, relativePath, allowEsc
107832
107854
  }
107833
107855
  async function findHookManifestPaths(root) {
107834
107856
  const paths = await findManifestPaths(root, "hooks.json");
107835
- return paths.filter((path) => dirname35(path).endsWith(`${sep9}hooks`));
107857
+ return paths.filter((path) => dirname36(path).endsWith(`${sep9}hooks`));
107836
107858
  }
107837
107859
  async function findManifestPaths(root, manifestName) {
107838
107860
  let entries;
@@ -107845,7 +107867,7 @@ async function findManifestPaths(root, manifestName) {
107845
107867
  for (const entry of entries) {
107846
107868
  if (entry.name === "node_modules" || entry.name === ".git")
107847
107869
  continue;
107848
- const entryPath = join91(root, entry.name);
107870
+ const entryPath = join92(root, entry.name);
107849
107871
  if (entry.isDirectory()) {
107850
107872
  paths.push(...await findManifestPaths(entryPath, manifestName));
107851
107873
  continue;
@@ -107889,18 +107911,18 @@ function isPluginRuntimePathArg(arg) {
107889
107911
  return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute14(arg));
107890
107912
  }
107891
107913
  function runtimeSgDirectory(codexHome, platform, arch) {
107892
- return join91(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107914
+ return join92(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107893
107915
  }
107894
107916
  function describeSgSource(sgPath, env, runtimeSgDir, platform) {
107895
107917
  const override = env[SG_PATH_ENV_KEY]?.trim();
107896
107918
  if (override !== undefined && override.length > 0 && sgPath === override)
107897
107919
  return `env override ${SG_PATH_ENV_KEY}`;
107898
- if (sgPath === join91(runtimeSgDir, sgBinaryName(platform)))
107920
+ if (sgPath === join92(runtimeSgDir, sgBinaryName(platform)))
107899
107921
  return "runtime dir";
107900
107922
  return "PATH";
107901
107923
  }
107902
107924
  async function readBootstrapStateSummary(codexHome) {
107903
- const statePath = join91(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
107925
+ const statePath = join92(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
107904
107926
  const raw = await readJson2(statePath);
107905
107927
  if (raw === null)
107906
107928
  return null;
@@ -107979,16 +108001,16 @@ function isRecord18(value) {
107979
108001
  import { existsSync as existsSync60 } from "node:fs";
107980
108002
  import { readFile as readFile32 } from "node:fs/promises";
107981
108003
  import { homedir as homedir25 } from "node:os";
107982
- import { join as join92, resolve as resolve26 } from "node:path";
108004
+ import { join as join93, resolve as resolve26 } from "node:path";
107983
108005
  var RUNTIME_WRAPPER_MARKER2 = "OMO_GENERATED_RUNTIME_WRAPPER";
107984
108006
  var CHECK_NAME = "codex-runtime-wrapper";
107985
108007
  var REINSTALL_COMMAND = "npx --yes lazycodex-ai@latest install --no-tui";
107986
108008
  async function checkCodexRuntimeWrapper(deps = {}) {
107987
- const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join92(homedir25(), ".codex"));
108009
+ const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join93(homedir25(), ".codex"));
107988
108010
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107989
108011
  const platform = deps.platform ?? process.platform;
107990
- const wrapperPath = join92(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
107991
- const legacyWrapperPath = join92(binDir, platform === "win32" ? "omo.cmd" : "omo");
108012
+ const wrapperPath = join93(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
108013
+ const legacyWrapperPath = join93(binDir, platform === "win32" ? "omo.cmd" : "omo");
107992
108014
  const [wrapper, legacyWrapper] = await Promise.all([readRuntimeWrapper(wrapperPath), readRuntimeWrapper(legacyWrapperPath)]);
107993
108015
  const issues = [];
107994
108016
  if (wrapper?.includes(RUNTIME_WRAPPER_MARKER2) === true) {
@@ -108524,12 +108546,12 @@ import {
108524
108546
  unlinkSync as unlinkSync9,
108525
108547
  writeFileSync as writeFileSync14
108526
108548
  } from "node:fs";
108527
- import { basename as basename13, dirname as dirname36, join as join95 } from "node:path";
108549
+ import { basename as basename13, dirname as dirname37, join as join96 } from "node:path";
108528
108550
 
108529
108551
  // packages/mcp-client-core/src/config-dir.ts
108530
108552
  import { existsSync as existsSync61, realpathSync as realpathSync10 } from "node:fs";
108531
108553
  import { homedir as homedir26 } from "node:os";
108532
- import { join as join93, resolve as resolve27 } from "node:path";
108554
+ import { join as join94, resolve as resolve27 } from "node:path";
108533
108555
  function resolveConfigPath2(pathValue) {
108534
108556
  const resolvedPath = resolve27(pathValue);
108535
108557
  if (!existsSync61(resolvedPath))
@@ -108547,13 +108569,13 @@ function getOpenCodeCliConfigDir(env = process.env) {
108547
108569
  if (customConfigDir) {
108548
108570
  return resolveConfigPath2(customConfigDir);
108549
108571
  }
108550
- const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join93(homedir26(), ".config");
108551
- return resolveConfigPath2(join93(xdgConfigDir, "opencode"));
108572
+ const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join94(homedir26(), ".config");
108573
+ return resolveConfigPath2(join94(xdgConfigDir, "opencode"));
108552
108574
  }
108553
108575
 
108554
108576
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
108555
108577
  import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "node:fs";
108556
- import { join as join94 } from "node:path";
108578
+ import { join as join95 } from "node:path";
108557
108579
  var INDEX_FILE_NAME = "index.json";
108558
108580
  function isTokenIndex(value) {
108559
108581
  if (typeof value !== "object" || value === null || Array.isArray(value))
@@ -108561,7 +108583,7 @@ function isTokenIndex(value) {
108561
108583
  return Object.values(value).every((entry) => typeof entry === "string");
108562
108584
  }
108563
108585
  function getIndexPath(storageDir) {
108564
- return join94(storageDir, INDEX_FILE_NAME);
108586
+ return join95(storageDir, INDEX_FILE_NAME);
108565
108587
  }
108566
108588
  function readTokenIndex(storageDir) {
108567
108589
  const indexPath = getIndexPath(storageDir);
@@ -108605,16 +108627,16 @@ function deleteTokenIndexEntry(storageDir, hash) {
108605
108627
  var STORAGE_DIR_NAME = "mcp-oauth";
108606
108628
  var LEGACY_STORAGE_FILE_NAME = "mcp-oauth.json";
108607
108629
  function getMcpOauthStorageDir() {
108608
- return join95(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108630
+ return join96(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108609
108631
  }
108610
108632
  function getMcpOauthServerHash(serverHost, resource) {
108611
108633
  return createHash7("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
108612
108634
  }
108613
108635
  function getMcpOauthStoragePath(serverHost, resource) {
108614
- return join95(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108636
+ return join96(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108615
108637
  }
108616
108638
  function getLegacyStoragePath() {
108617
- return join95(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108639
+ return join96(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108618
108640
  }
108619
108641
  function normalizeHost2(serverHost) {
108620
108642
  let host = serverHost.trim();
@@ -108708,7 +108730,7 @@ function readLegacyStore() {
108708
108730
  }
108709
108731
  function writeTokenFile(filePath, token) {
108710
108732
  try {
108711
- const dir = dirname36(filePath);
108733
+ const dir = dirname37(filePath);
108712
108734
  if (!existsSync63(dir)) {
108713
108735
  mkdirSync17(dir, { recursive: true });
108714
108736
  }
@@ -108793,7 +108815,7 @@ function listTokensByHost(serverHost) {
108793
108815
  for (const [hash, indexedKey] of Object.entries(index)) {
108794
108816
  if (!indexedKey.startsWith(prefix))
108795
108817
  continue;
108796
- const indexedToken = readTokenFile(join95(getMcpOauthStorageDir(), `${hash}.json`));
108818
+ const indexedToken = readTokenFile(join96(getMcpOauthStorageDir(), `${hash}.json`));
108797
108819
  if (indexedToken)
108798
108820
  result[indexedKey] = indexedToken;
108799
108821
  }
@@ -108808,7 +108830,7 @@ function listAllTokens() {
108808
108830
  for (const entry of readdirSync13(dir, { withFileTypes: true })) {
108809
108831
  if (!entry.isFile() || !entry.name.endsWith(".json") || entry.name === "index.json")
108810
108832
  continue;
108811
- const token = readTokenFile(join95(dir, entry.name));
108833
+ const token = readTokenFile(join96(dir, entry.name));
108812
108834
  const hash = basename13(entry.name, ".json");
108813
108835
  if (token)
108814
108836
  result[index[hash] ?? hash] = token;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.1.2",
3
+ "version": "5.1.3",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.1.2",
3
+ "version": "5.1.3",
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.1.2) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.3) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.1.2",
3
+ "version": "5.1.3",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -146,6 +146,34 @@ function joinPatchLines(lines) {
146
146
  `)}
147
147
  `;
148
148
  }
149
+ // ../../comment-checker-core/src/package-binary.ts
150
+ import { createRequire } from "node:module";
151
+ import { dirname, join } from "node:path";
152
+ var COMMENT_CHECKER_PACKAGE_NAME = "@code-yeongyu/comment-checker";
153
+ function isModuleResolutionMiss(error) {
154
+ return error instanceof Error || typeof error === "object" && error !== null && "name" in error && error.name === "ResolveMessage";
155
+ }
156
+ function findCommentCheckerPackageBinary(input) {
157
+ const packageName = input.packageName ?? COMMENT_CHECKER_PACKAGE_NAME;
158
+ const platformKey = `${input.platform ?? process.platform}-${input.arch ?? process.arch}`;
159
+ const packageDir = dirname(input.packageJsonPath);
160
+ const candidates = [
161
+ resolvePlatformPackageBinary(input.packageJsonPath, `${packageName}-${platformKey}`, input.binaryName),
162
+ join(packageDir, "vendor", platformKey, input.binaryName),
163
+ join(packageDir, "bin", input.binaryName)
164
+ ];
165
+ return candidates.find((candidate) => candidate !== null && input.existsSync(candidate)) ?? null;
166
+ }
167
+ function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, binaryName) {
168
+ try {
169
+ const manifestPath = createRequire(packageJsonPath).resolve(`${platformPackageName}/package.json`);
170
+ return join(dirname(manifestPath), "bin", binaryName);
171
+ } catch (error) {
172
+ if (isModuleResolutionMiss(error))
173
+ return null;
174
+ throw error;
175
+ }
176
+ }
149
177
  // components/comment-checker/src/hook-input.ts
150
178
  function toHookInput(request, context) {
151
179
  return {
@@ -302,8 +330,7 @@ function getContentText(content) {
302
330
  // components/comment-checker/src/runner.ts
303
331
  import { spawn } from "node:child_process";
304
332
  import { existsSync } from "node:fs";
305
- import { createRequire } from "node:module";
306
- import { dirname, join } from "node:path";
333
+ import { createRequire as createRequire2 } from "node:module";
307
334
  var MAX_PROCESS_OUTPUT_BYTES = 64 * 1024;
308
335
  async function runCommentChecker2(input, options = {}) {
309
336
  const binaryPath = options.binaryPath ?? (options.resolveBinary ? options.resolveBinary() : resolveCommentCheckerBinary2());
@@ -361,7 +388,7 @@ function resolveCommentCheckerBinary2() {
361
388
  }
362
389
  function resolvePackageApiBinary() {
363
390
  try {
364
- const require2 = createRequire(import.meta.url);
391
+ const require2 = createRequire2(import.meta.url);
365
392
  const packageExports = require2(commentCheckerPackageName());
366
393
  if (!isCommentCheckerPackage(packageExports))
367
394
  return;
@@ -373,10 +400,9 @@ function resolvePackageApiBinary() {
373
400
  }
374
401
  function resolvePackageBinary(binaryName) {
375
402
  try {
376
- const require2 = createRequire(import.meta.url);
377
- const packagePath = require2.resolve(`${commentCheckerPackageName()}/package.json`);
378
- const binaryPath = join(dirname(packagePath), "bin", binaryName);
379
- return existsSync(binaryPath) ? binaryPath : undefined;
403
+ const require2 = createRequire2(import.meta.url);
404
+ const packageJsonPath = require2.resolve(`${commentCheckerPackageName()}/package.json`);
405
+ return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync }) ?? undefined;
380
406
  } catch {
381
407
  return;
382
408
  }
@@ -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.1.2) Checking Comments"
11
+ "statusMessage": "(OmO 5.1.3) 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.1.2",
3
+ "version": "5.1.3",
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",
@@ -1,7 +1,8 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { createRequire } from "node:module";
4
- import { dirname, join } from "node:path";
4
+
5
+ import { findCommentCheckerPackageBinary } from "@oh-my-opencode/comment-checker-core";
5
6
 
6
7
  import type { CommentCheckerHookInput } from "./core.js";
7
8
 
@@ -108,9 +109,8 @@ function resolvePackageApiBinary(): string | undefined {
108
109
  function resolvePackageBinary(binaryName: string): string | undefined {
109
110
  try {
110
111
  const require = createRequire(import.meta.url);
111
- const packagePath = require.resolve(`${commentCheckerPackageName()}/package.json`);
112
- const binaryPath = join(dirname(packagePath), "bin", binaryName);
113
- return existsSync(binaryPath) ? binaryPath : undefined;
112
+ const packageJsonPath = require.resolve(`${commentCheckerPackageName()}/package.json`);
113
+ return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync }) ?? undefined;
114
114
  } catch {
115
115
  return undefined;
116
116
  }
@@ -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.1.2) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.1.3) 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.1.2) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.1.3) 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.1.2",
3
+ "version": "5.1.3",
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.1.2) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.1.3) 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.1.2",
3
+ "version": "5.1.3",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",