lazycodex-ai 4.17.1 → 4.18.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 (73) hide show
  1. package/dist/cli/get-local-version/types.d.ts +1 -1
  2. package/dist/cli/index.js +55 -25
  3. package/dist/cli-node/index.js +55 -25
  4. package/package.json +1 -1
  5. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  6. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  8. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  10. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  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/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +7 -5
  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/start-work-continuation/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/ultrawork/directive.md +37 -10
  27. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +37 -10
  30. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +37 -10
  31. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  32. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +4 -4
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  58. package/packages/omo-codex/plugin/package-lock.json +13 -13
  59. package/packages/omo-codex/plugin/package.json +1 -1
  60. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  61. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +9 -0
  62. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +4 -2
  63. package/packages/omo-codex/plugin/skills/frontend/references/design/layout-skill.md +107 -0
  64. package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -2
  65. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +37 -10
  66. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  67. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +4 -4
  68. package/packages/omo-codex/scripts/install-dist/install-local.mjs +24 -12
  69. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  70. package/packages/shared-skills/skills/frontend/references/design/README.md +9 -0
  71. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +4 -2
  72. package/packages/shared-skills/skills/frontend/references/design/layout-skill.md +107 -0
  73. package/packages/shared-skills/skills/programming/SKILL.md +12 -2
@@ -5,7 +5,7 @@ export interface VersionInfo {
5
5
  isLocalDev: boolean;
6
6
  isPinned: boolean;
7
7
  pinnedVersion: string | null;
8
- status: "up-to-date" | "outdated" | "local-dev" | "pinned" | "pinned-mismatch" | "error" | "unknown";
8
+ status: "up-to-date" | "outdated" | "local-dev" | "dev" | "pinned" | "pinned-mismatch" | "error" | "unknown";
9
9
  }
10
10
  export interface GetLocalVersionOptions {
11
11
  directory?: string;
package/dist/cli/index.js CHANGED
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "oh-my-opencode",
2148
- version: "4.17.1",
2148
+ version: "4.18.0",
2149
2149
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -2252,6 +2252,7 @@ var init_package = __esm(() => {
2252
2252
  build: "bun run script/build.ts",
2253
2253
  "build:cli-node": "bun run script/build-cli-node.ts",
2254
2254
  "build:codex-install": "bun run script/build-codex-install.ts",
2255
+ "install:codex-dev": "bun run script/build-codex-install.ts && bun run script/install-codex-dev.ts",
2255
2256
  "build:codex-plugin": "npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build",
2256
2257
  "build:senpi-plugin": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check",
2257
2258
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
@@ -2356,18 +2357,18 @@ var init_package = __esm(() => {
2356
2357
  typescript: "^6.0.3"
2357
2358
  },
2358
2359
  optionalDependencies: {
2359
- "oh-my-opencode-darwin-arm64": "4.17.1",
2360
- "oh-my-opencode-darwin-x64": "4.17.1",
2361
- "oh-my-opencode-darwin-x64-baseline": "4.17.1",
2362
- "oh-my-opencode-linux-arm64": "4.17.1",
2363
- "oh-my-opencode-linux-arm64-musl": "4.17.1",
2364
- "oh-my-opencode-linux-x64": "4.17.1",
2365
- "oh-my-opencode-linux-x64-baseline": "4.17.1",
2366
- "oh-my-opencode-linux-x64-musl": "4.17.1",
2367
- "oh-my-opencode-linux-x64-musl-baseline": "4.17.1",
2368
- "oh-my-opencode-windows-arm64": "4.17.1",
2369
- "oh-my-opencode-windows-x64": "4.17.1",
2370
- "oh-my-opencode-windows-x64-baseline": "4.17.1"
2360
+ "oh-my-opencode-darwin-arm64": "4.18.0",
2361
+ "oh-my-opencode-darwin-x64": "4.18.0",
2362
+ "oh-my-opencode-darwin-x64-baseline": "4.18.0",
2363
+ "oh-my-opencode-linux-arm64": "4.18.0",
2364
+ "oh-my-opencode-linux-arm64-musl": "4.18.0",
2365
+ "oh-my-opencode-linux-x64": "4.18.0",
2366
+ "oh-my-opencode-linux-x64-baseline": "4.18.0",
2367
+ "oh-my-opencode-linux-x64-musl": "4.18.0",
2368
+ "oh-my-opencode-linux-x64-musl-baseline": "4.18.0",
2369
+ "oh-my-opencode-windows-arm64": "4.18.0",
2370
+ "oh-my-opencode-windows-x64": "4.18.0",
2371
+ "oh-my-opencode-windows-x64-baseline": "4.18.0"
2371
2372
  },
2372
2373
  overrides: {
2373
2374
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -72601,7 +72602,7 @@ var package_default2;
72601
72602
  var init_package2 = __esm(() => {
72602
72603
  package_default2 = {
72603
72604
  name: "@oh-my-opencode/omo-codex",
72604
- version: "4.17.1",
72605
+ version: "4.18.0",
72605
72606
  type: "module",
72606
72607
  private: true,
72607
72608
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75325,9 +75326,11 @@ function collectCommands(value, commands) {
75325
75326
 
75326
75327
  // packages/omo-codex/src/install/codex-cache-install.ts
75327
75328
  async function installCachedPlugin(input) {
75329
+ const env2 = input.env ?? process.env;
75330
+ const npmInstallEnv = sanitizeNpmInstallEnv(env2);
75328
75331
  if (input.buildSource !== false) {
75329
- await maybeRunNpmInstall(input.sourcePath, input.runCommand);
75330
- await maybeRunNpmBuild(input.sourcePath, input.runCommand);
75332
+ await maybeRunNpmInstall(input.sourcePath, input.runCommand, npmInstallEnv);
75333
+ await maybeRunNpmBuild(input.sourcePath, input.runCommand, env2);
75331
75334
  }
75332
75335
  const targetPath = join33(input.codexHome, "plugins", "cache", input.marketplaceName, input.name, input.version);
75333
75336
  const tempPath = createTempSiblingPath(targetPath);
@@ -75337,10 +75340,10 @@ async function installCachedPlugin(input) {
75337
75340
  await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75338
75341
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75339
75342
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75340
- await maybeRunNpmInstall(tempPath, input.runCommand, ["ci", "--omit=dev"]);
75343
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75341
75344
  await removeCachedManagedNpmBinShims(tempPath);
75342
75345
  if (input.buildSource === false)
75343
- await maybeRunNpmSyncSkills(tempPath, input.runCommand);
75346
+ await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
75344
75347
  await assertNoRemovedSparkshellPromptReferences(tempPath);
75345
75348
  await rewriteCachedMcpManifest(tempPath, input.sourcePath);
75346
75349
  await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
@@ -75352,12 +75355,12 @@ async function installCachedPlugin(input) {
75352
75355
  }
75353
75356
  return { name: input.name, version: input.version, path: targetPath };
75354
75357
  }
75355
- async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
75358
+ async function maybeRunNpmInstall(cwd, runCommand, env2, args = ["install"]) {
75356
75359
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75357
75360
  return;
75358
- await runCommand("npm", args, { cwd });
75361
+ await runCommand("npm", args, { cwd, env: env2 });
75359
75362
  }
75360
- async function maybeRunNpmBuild(cwd, runCommand) {
75363
+ async function maybeRunNpmBuild(cwd, runCommand, env2) {
75361
75364
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75362
75365
  return;
75363
75366
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75366,9 +75369,9 @@ async function maybeRunNpmBuild(cwd, runCommand) {
75366
75369
  const scripts = packageJson.scripts;
75367
75370
  if (!isPlainRecord3(scripts) || typeof scripts.build !== "string")
75368
75371
  return;
75369
- await runCommand("npm", ["run", "build"], { cwd });
75372
+ await runCommand("npm", ["run", "build"], { cwd, env: env2 });
75370
75373
  }
75371
- async function maybeRunNpmSyncSkills(cwd, runCommand) {
75374
+ async function maybeRunNpmSyncSkills(cwd, runCommand, env2) {
75372
75375
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75373
75376
  return;
75374
75377
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75377,7 +75380,10 @@ async function maybeRunNpmSyncSkills(cwd, runCommand) {
75377
75380
  const scripts = packageJson.scripts;
75378
75381
  if (!isPlainRecord3(scripts) || typeof scripts["sync:skills"] !== "string")
75379
75382
  return;
75380
- await runCommand("npm", ["run", "sync:skills"], { cwd });
75383
+ await runCommand("npm", ["run", "sync:skills"], { cwd, env: env2 });
75384
+ }
75385
+ function sanitizeNpmInstallEnv(env2) {
75386
+ return Object.fromEntries(Object.entries(env2).filter(([key]) => key.toLowerCase() !== "npm_config_allow_scripts"));
75381
75387
  }
75382
75388
  function createTempSiblingPath(targetPath) {
75383
75389
  return join33(dirname13(targetPath), `.tmp-${basename7(targetPath)}-${process.pid}-${Date.now()}`);
@@ -77407,6 +77413,10 @@ async function readDistributionManifest(repoRoot) {
77407
77413
  }
77408
77414
  }
77409
77415
  function resolveLazyCodexPluginVersion(input) {
77416
+ const override = input.versionOverride?.trim();
77417
+ if (override !== undefined && override.length > 0) {
77418
+ return override;
77419
+ }
77410
77420
  if (input.marketplaceName === "sisyphuslabs" && input.pluginName === "omo" && input.distributionManifest !== undefined) {
77411
77421
  return input.distributionManifest.version;
77412
77422
  }
@@ -77957,6 +77967,7 @@ async function runCodexInstaller(options = {}) {
77957
77967
  return;
77958
77968
  });
77959
77969
  const buildSource = await shouldBuildSourcePackages(repoRoot);
77970
+ const versionOverride = env3.LAZYCODEX_DEV_VERSION?.trim() || undefined;
77960
77971
  const gitBashResolution = await prepareGitBashForInstall({
77961
77972
  platform,
77962
77973
  env: env3,
@@ -77983,13 +77994,15 @@ async function runCodexInstaller(options = {}) {
77983
77994
  manifestVersion: manifest.version,
77984
77995
  marketplaceName: marketplace.name,
77985
77996
  pluginName: entry.name,
77986
- distributionManifest
77997
+ distributionManifest,
77998
+ versionOverride
77987
77999
  });
77988
78000
  validatePathSegment(version2, "plugin version");
77989
78001
  log4(`Building ${entry.name}@${version2}`);
77990
78002
  const plugin = await installCachedPlugin({
77991
78003
  buildSource,
77992
78004
  codexHome,
78005
+ env: env3,
77993
78006
  marketplaceName: marketplace.name,
77994
78007
  name: entry.name,
77995
78008
  runCommand,
@@ -99070,6 +99083,10 @@ function formatVersionOutput(info) {
99070
99083
  lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running in local development mode")}`);
99071
99084
  lines.push(` ${import_picocolors17.default.dim("Using file:// protocol from config")}`);
99072
99085
  break;
99086
+ case "dev":
99087
+ lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running a local dev build")}`);
99088
+ lines.push(` ${import_picocolors17.default.dim("Installed from source; update checks are skipped")}`);
99089
+ break;
99073
99090
  case "pinned":
99074
99091
  lines.push(` ${SYMBOLS3.pin} ${import_picocolors17.default.magenta(`Version pinned to ${info.pinnedVersion}`)}`);
99075
99092
  lines.push(` ${import_picocolors17.default.dim("Update check skipped for pinned versions")}`);
@@ -99142,6 +99159,19 @@ async function getLocalVersion(options = {}) {
99142
99159
  console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99143
99160
  return 1;
99144
99161
  }
99162
+ if (!/^\d+\.\d+\.\d+/.test(currentVersion)) {
99163
+ const info2 = {
99164
+ currentVersion,
99165
+ latestVersion: null,
99166
+ isUpToDate: false,
99167
+ isLocalDev: true,
99168
+ isPinned: false,
99169
+ pinnedVersion: null,
99170
+ status: "dev"
99171
+ };
99172
+ console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99173
+ return 0;
99174
+ }
99145
99175
  const { extractChannel: extractChannel2 } = await Promise.resolve().then(() => (init_auto_update_checker(), exports_auto_update_checker));
99146
99176
  const channel = extractChannel2(pluginInfo?.pinnedVersion ?? currentVersion);
99147
99177
  const latestVersion = await getLatestVersion(channel);
@@ -2146,7 +2146,7 @@ var package_default;
2146
2146
  var init_package = __esm(() => {
2147
2147
  package_default = {
2148
2148
  name: "oh-my-opencode",
2149
- version: "4.17.1",
2149
+ version: "4.18.0",
2150
2150
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2151
2151
  main: "./dist/index.js",
2152
2152
  types: "dist/index.d.ts",
@@ -2253,6 +2253,7 @@ var init_package = __esm(() => {
2253
2253
  build: "bun run script/build.ts",
2254
2254
  "build:cli-node": "bun run script/build-cli-node.ts",
2255
2255
  "build:codex-install": "bun run script/build-codex-install.ts",
2256
+ "install:codex-dev": "bun run script/build-codex-install.ts && bun run script/install-codex-dev.ts",
2256
2257
  "build:codex-plugin": "npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build",
2257
2258
  "build:senpi-plugin": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check",
2258
2259
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
@@ -2357,18 +2358,18 @@ var init_package = __esm(() => {
2357
2358
  typescript: "^6.0.3"
2358
2359
  },
2359
2360
  optionalDependencies: {
2360
- "oh-my-opencode-darwin-arm64": "4.17.1",
2361
- "oh-my-opencode-darwin-x64": "4.17.1",
2362
- "oh-my-opencode-darwin-x64-baseline": "4.17.1",
2363
- "oh-my-opencode-linux-arm64": "4.17.1",
2364
- "oh-my-opencode-linux-arm64-musl": "4.17.1",
2365
- "oh-my-opencode-linux-x64": "4.17.1",
2366
- "oh-my-opencode-linux-x64-baseline": "4.17.1",
2367
- "oh-my-opencode-linux-x64-musl": "4.17.1",
2368
- "oh-my-opencode-linux-x64-musl-baseline": "4.17.1",
2369
- "oh-my-opencode-windows-arm64": "4.17.1",
2370
- "oh-my-opencode-windows-x64": "4.17.1",
2371
- "oh-my-opencode-windows-x64-baseline": "4.17.1"
2361
+ "oh-my-opencode-darwin-arm64": "4.18.0",
2362
+ "oh-my-opencode-darwin-x64": "4.18.0",
2363
+ "oh-my-opencode-darwin-x64-baseline": "4.18.0",
2364
+ "oh-my-opencode-linux-arm64": "4.18.0",
2365
+ "oh-my-opencode-linux-arm64-musl": "4.18.0",
2366
+ "oh-my-opencode-linux-x64": "4.18.0",
2367
+ "oh-my-opencode-linux-x64-baseline": "4.18.0",
2368
+ "oh-my-opencode-linux-x64-musl": "4.18.0",
2369
+ "oh-my-opencode-linux-x64-musl-baseline": "4.18.0",
2370
+ "oh-my-opencode-windows-arm64": "4.18.0",
2371
+ "oh-my-opencode-windows-x64": "4.18.0",
2372
+ "oh-my-opencode-windows-x64-baseline": "4.18.0"
2372
2373
  },
2373
2374
  overrides: {
2374
2375
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -72657,7 +72658,7 @@ var package_default2;
72657
72658
  var init_package2 = __esm(() => {
72658
72659
  package_default2 = {
72659
72660
  name: "@oh-my-opencode/omo-codex",
72660
- version: "4.17.1",
72661
+ version: "4.18.0",
72661
72662
  type: "module",
72662
72663
  private: true,
72663
72664
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75381,9 +75382,11 @@ function collectCommands(value, commands) {
75381
75382
 
75382
75383
  // packages/omo-codex/src/install/codex-cache-install.ts
75383
75384
  async function installCachedPlugin(input) {
75385
+ const env2 = input.env ?? process.env;
75386
+ const npmInstallEnv = sanitizeNpmInstallEnv(env2);
75384
75387
  if (input.buildSource !== false) {
75385
- await maybeRunNpmInstall(input.sourcePath, input.runCommand);
75386
- await maybeRunNpmBuild(input.sourcePath, input.runCommand);
75388
+ await maybeRunNpmInstall(input.sourcePath, input.runCommand, npmInstallEnv);
75389
+ await maybeRunNpmBuild(input.sourcePath, input.runCommand, env2);
75387
75390
  }
75388
75391
  const targetPath = join33(input.codexHome, "plugins", "cache", input.marketplaceName, input.name, input.version);
75389
75392
  const tempPath = createTempSiblingPath(targetPath);
@@ -75393,10 +75396,10 @@ async function installCachedPlugin(input) {
75393
75396
  await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75394
75397
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75395
75398
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75396
- await maybeRunNpmInstall(tempPath, input.runCommand, ["ci", "--omit=dev"]);
75399
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75397
75400
  await removeCachedManagedNpmBinShims(tempPath);
75398
75401
  if (input.buildSource === false)
75399
- await maybeRunNpmSyncSkills(tempPath, input.runCommand);
75402
+ await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
75400
75403
  await assertNoRemovedSparkshellPromptReferences(tempPath);
75401
75404
  await rewriteCachedMcpManifest(tempPath, input.sourcePath);
75402
75405
  await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
@@ -75408,12 +75411,12 @@ async function installCachedPlugin(input) {
75408
75411
  }
75409
75412
  return { name: input.name, version: input.version, path: targetPath };
75410
75413
  }
75411
- async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
75414
+ async function maybeRunNpmInstall(cwd, runCommand, env2, args = ["install"]) {
75412
75415
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75413
75416
  return;
75414
- await runCommand("npm", args, { cwd });
75417
+ await runCommand("npm", args, { cwd, env: env2 });
75415
75418
  }
75416
- async function maybeRunNpmBuild(cwd, runCommand) {
75419
+ async function maybeRunNpmBuild(cwd, runCommand, env2) {
75417
75420
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75418
75421
  return;
75419
75422
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75422,9 +75425,9 @@ async function maybeRunNpmBuild(cwd, runCommand) {
75422
75425
  const scripts = packageJson.scripts;
75423
75426
  if (!isPlainRecord3(scripts) || typeof scripts.build !== "string")
75424
75427
  return;
75425
- await runCommand("npm", ["run", "build"], { cwd });
75428
+ await runCommand("npm", ["run", "build"], { cwd, env: env2 });
75426
75429
  }
75427
- async function maybeRunNpmSyncSkills(cwd, runCommand) {
75430
+ async function maybeRunNpmSyncSkills(cwd, runCommand, env2) {
75428
75431
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75429
75432
  return;
75430
75433
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75433,7 +75436,10 @@ async function maybeRunNpmSyncSkills(cwd, runCommand) {
75433
75436
  const scripts = packageJson.scripts;
75434
75437
  if (!isPlainRecord3(scripts) || typeof scripts["sync:skills"] !== "string")
75435
75438
  return;
75436
- await runCommand("npm", ["run", "sync:skills"], { cwd });
75439
+ await runCommand("npm", ["run", "sync:skills"], { cwd, env: env2 });
75440
+ }
75441
+ function sanitizeNpmInstallEnv(env2) {
75442
+ return Object.fromEntries(Object.entries(env2).filter(([key]) => key.toLowerCase() !== "npm_config_allow_scripts"));
75437
75443
  }
75438
75444
  function createTempSiblingPath(targetPath) {
75439
75445
  return join33(dirname13(targetPath), `.tmp-${basename7(targetPath)}-${process.pid}-${Date.now()}`);
@@ -77463,6 +77469,10 @@ async function readDistributionManifest(repoRoot) {
77463
77469
  }
77464
77470
  }
77465
77471
  function resolveLazyCodexPluginVersion(input) {
77472
+ const override = input.versionOverride?.trim();
77473
+ if (override !== undefined && override.length > 0) {
77474
+ return override;
77475
+ }
77466
77476
  if (input.marketplaceName === "sisyphuslabs" && input.pluginName === "omo" && input.distributionManifest !== undefined) {
77467
77477
  return input.distributionManifest.version;
77468
77478
  }
@@ -78013,6 +78023,7 @@ async function runCodexInstaller(options = {}) {
78013
78023
  return;
78014
78024
  });
78015
78025
  const buildSource = await shouldBuildSourcePackages(repoRoot);
78026
+ const versionOverride = env3.LAZYCODEX_DEV_VERSION?.trim() || undefined;
78016
78027
  const gitBashResolution = await prepareGitBashForInstall({
78017
78028
  platform,
78018
78029
  env: env3,
@@ -78039,13 +78050,15 @@ async function runCodexInstaller(options = {}) {
78039
78050
  manifestVersion: manifest.version,
78040
78051
  marketplaceName: marketplace.name,
78041
78052
  pluginName: entry.name,
78042
- distributionManifest
78053
+ distributionManifest,
78054
+ versionOverride
78043
78055
  });
78044
78056
  validatePathSegment(version2, "plugin version");
78045
78057
  log4(`Building ${entry.name}@${version2}`);
78046
78058
  const plugin = await installCachedPlugin({
78047
78059
  buildSource,
78048
78060
  codexHome,
78061
+ env: env3,
78049
78062
  marketplaceName: marketplace.name,
78050
78063
  name: entry.name,
78051
78064
  runCommand,
@@ -99126,6 +99139,10 @@ function formatVersionOutput(info) {
99126
99139
  lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running in local development mode")}`);
99127
99140
  lines.push(` ${import_picocolors17.default.dim("Using file:// protocol from config")}`);
99128
99141
  break;
99142
+ case "dev":
99143
+ lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running a local dev build")}`);
99144
+ lines.push(` ${import_picocolors17.default.dim("Installed from source; update checks are skipped")}`);
99145
+ break;
99129
99146
  case "pinned":
99130
99147
  lines.push(` ${SYMBOLS3.pin} ${import_picocolors17.default.magenta(`Version pinned to ${info.pinnedVersion}`)}`);
99131
99148
  lines.push(` ${import_picocolors17.default.dim("Update check skipped for pinned versions")}`);
@@ -99198,6 +99215,19 @@ async function getLocalVersion(options = {}) {
99198
99215
  console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99199
99216
  return 1;
99200
99217
  }
99218
+ if (!/^\d+\.\d+\.\d+/.test(currentVersion)) {
99219
+ const info2 = {
99220
+ currentVersion,
99221
+ latestVersion: null,
99222
+ isUpToDate: false,
99223
+ isLocalDev: true,
99224
+ isPinned: false,
99225
+ pinnedVersion: null,
99226
+ status: "dev"
99227
+ };
99228
+ console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99229
+ return 0;
99230
+ }
99201
99231
  const { extractChannel: extractChannel2 } = await Promise.resolve().then(() => (init_auto_update_checker(), exports_auto_update_checker));
99202
99232
  const channel = extractChannel2(pluginInfo?.pinnedVersion ?? currentVersion);
99203
99233
  const latestVersion = await getLatestVersion(channel);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
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": "4.17.1",
3
+ "version": "4.18.0",
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 4.17.1) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 4.18.0) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
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 4.17.1) Checking Comments"
11
+ "statusMessage": "(OmO 4.18.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.17.1",
3
+ "version": "4.18.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.17.1) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.18.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.17.1) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.18.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.17.1",
3
+ "version": "4.18.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.17.1) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.18.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.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
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": 60,
11
- "statusMessage": "(OmO 4.17.1) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.18.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.17.1) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.18.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.17.1",
3
+ "version": "4.18.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",
@@ -9,7 +9,7 @@ You are Hephaestus, an autonomous deep worker based on GPT-5.6. You and the user
9
9
 
10
10
  User instructions override these defaults; newer instructions override older. Safety and type-safety constraints never yield.
11
11
 
12
- Implement, don't propose. "How does X work?" means understand, then fix; "Why is A broken?" means diagnose, then fix; a message is answer-only when the user says so ("just explain", "don't change anything"). State your read in one line before acting: "I detect [intent type] - [reason]. [What I'm doing now]." That line commits you to finish the named work this turn.
12
+ Implement, don't propose. "How does X work?" means understand, then fix; "Why is A broken?" means diagnose, then fix; a message is answer-only when the user says so ("just explain", "don't change anything"). State your read in one line before acting: "I detect [intent type] - [reason]. [What I'm doing now]. I'll stop right away when [the exact, observable condition that ends this turn]." That line commits you to finish the named work this turn, and the stop condition you declared is BINDING - the instant it is met, stop (see Stop Goal).
13
13
 
14
14
  Requests to answer, review, diagnose, or plan: inspect and report. Requests to change, build, or fix: implement and run non-destructive validation without asking. Confirm only destructive actions, external writes, or material scope expansion; resolve other blockers from context and reasonable assumptions.
15
15
 
@@ -29,13 +29,15 @@ Implement surgically, matching codebase style (naming, indentation, imports, err
29
29
 
30
30
  # Subagents
31
31
 
32
- Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent_v1.spawn_agent({"message":"TASK: act as a <role>. ...","fork_context":false})`. If your tool list instead has a flat `spawn_agent` with a required `task_name` (`multi_agent_v2`): `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":"TASK: act as a <role>. ...","fork_turns":"none"})` - finished agents end on their own; `wait_agent` takes only `timeout_ms`.
32
+ Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent_v1.spawn_agent({"message":"TASK: act as a <role>. GOAL: ... STOP WHEN: ... EVIDENCE: ...","fork_context":false})`. If your tool list instead has a flat `spawn_agent` with a required `task_name` (`multi_agent_v2`): `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":"TASK: act as a <role>. GOAL: ... STOP WHEN: ... EVIDENCE: ...","fork_turns":"none"})` - finished agents end on their own; `wait_agent` takes only `timeout_ms`.
33
33
 
34
34
  - `explorer` - codebase search
35
35
  - `librarian` - external docs, OSS code, API contracts
36
36
  - `plan` - planning when design is still open after discovery; never for a known checklist or for work being delegated onward
37
37
  - `lazycodex-gate-reviewer` - final verification of a finished change
38
38
 
39
+ Every spawn message MUST fill all three labels - **GOAL** (the one outcome that makes the child done), **STOP WHEN** (the exact, observable condition that ends its run; the child stops the moment it holds, exactly like your own intent line), **EVIDENCE** (what the child returns so you can SEE, not trust, that the condition held). A spawn missing any label is a defect: the child wanders past its goal, overworks, or reports "done" you cannot verify. Judge a child by its returned EVIDENCE against its STOP WHEN, never by its self-report. Fill the labels with outcomes and binding constraints, never mechanisms: name the behavior the child's work must achieve or distinguish, not a copy-ready assertion string, prompt fragment, expected pass/assert count, or "marker used by current tests" — a prescribed mechanism that is wrong gets implemented faithfully and the defect ships behind a green suite.
40
+
39
41
  Spawn in parallel for independent investigations; do non-overlapping prep while they run, integrate on return. Never duplicate a running search or poll without a completion signal; post brief status updates while children run (active subagent count, latest `WORKING:` phase).
40
42
 
41
43
  # Manual QA Gate
@@ -68,16 +70,16 @@ On a multi-step task, open with one or two visible sentences naming the first st
68
70
 
69
71
  Final message: lead with the result, group by outcome, no conversational openers. Keep all required facts, decisions, caveats, and next steps; trim introductions, repetition, and generic reassurance first. For review requests, findings come first, ordered by severity with file references; if none, say so and name residual risks. No emojis or em dashes unless requested. Never output broken inline citations like `【F:README.md†L5-L14】` - they break the CLI.
70
72
 
71
- # Success Criteria and Stop Rules
73
+ # Stop Goal
72
74
 
73
- Done when ALL of:
75
+ Your STOP GOAL — the turn is over the moment ALL of these hold:
74
76
 
75
77
  - Every requested behavior implemented - no partial delivery.
76
78
  - Diagnostics clean on changed files; build exits 0; tests pass or pre-existing failures are named.
77
79
  - The artifact passed the Manual QA Gate this turn.
78
80
  - The final message reports what you did, verified, could not verify (and why), and pre-existing issues left alone.
79
81
 
80
- When you think you are done: re-read the request and your intent line, re-run verification, then report. Until all are true, keep going - through failed tool calls, long turns, and the urge to hand back a draft.
82
+ Until the stop goal holds, keep going - through failed tool calls, long turns, and the urge to hand back a draft. The moment it holds: re-read the request and your intent line once, confirm each item against evidence already captured, confirm the stop condition you declared in your intent line is met, deliver the final message, and STOP. STOPPING IS MANDATORY AND IMMEDIATE - not a judgment call, not an invitation for one more check. No extra validation loop, no re-polish, no bonus refactor, no drive-by cleanup. Every action past the stop goal is a defect, not diligence.
81
83
 
82
84
  Hard invariants, regardless of pressure to ship:
83
85
 
@@ -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.17.1) Loading Project Rules"
10
+ "statusMessage": "(OmO 4.18.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.17.1) Loading Project Rules"
22
+ "statusMessage": "(OmO 4.18.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.17.1) Matching Project Rules"
35
+ "statusMessage": "(OmO 4.18.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.17.1) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 4.18.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.17.1",
3
+ "version": "4.18.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",