oh-my-opencode 4.17.0 → 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 (134) hide show
  1. package/.agents/command/publish.md +31 -58
  2. package/.agents/skills/codex-qa/SKILL.md +2 -0
  3. package/.agents/skills/pre-publish-review/SKILL.md +1 -1
  4. package/.agents/skills/publish/SKILL.md +32 -59
  5. package/.opencode/command/publish.md +31 -58
  6. package/.opencode/skills/pre-publish-review/SKILL.md +1 -1
  7. package/dist/cli/get-local-version/types.d.ts +1 -1
  8. package/dist/cli/index.js +71 -38
  9. package/dist/cli-node/index.js +71 -38
  10. package/dist/index.js +212 -258
  11. package/dist/skills/frontend/SKILL.md +1 -1
  12. package/dist/skills/frontend/references/design/README.md +9 -0
  13. package/dist/skills/frontend/references/design/design-system-architecture.md +4 -2
  14. package/dist/skills/frontend/references/design/layout-skill.md +107 -0
  15. package/dist/skills/programming/SKILL.md +12 -2
  16. package/dist/skills/review-work/SKILL.md +10 -2
  17. package/dist/skills/start-work/SKILL.md +1 -1
  18. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  19. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  20. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  21. package/dist/skills/ulw-plan/SKILL.md +2 -1
  22. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  23. package/dist/skills/ulw-plan/references/intent-unclear.md +4 -4
  24. package/dist/skills/visual-qa/SKILL.md +9 -5
  25. package/dist/tui.js +8 -3
  26. package/package.json +14 -13
  27. package/packages/lsp-daemon/dist/cli.js +7 -13
  28. package/packages/lsp-daemon/dist/daemon-client.js +3 -5
  29. package/packages/lsp-daemon/dist/index.js +12 -18
  30. package/packages/lsp-daemon/dist/request-routing.js +6 -8
  31. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  32. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +398 -400
  33. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  39. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +14 -14
  43. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  44. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +2 -2
  46. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +9 -7
  47. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  48. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  50. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/teammode/AGENTS.md +2 -2
  52. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  53. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  54. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +33 -16
  55. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +2 -1
  56. package/packages/omo-codex/plugin/components/teammode/test/v2-spawn-schema.test.ts +69 -0
  57. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  58. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  59. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +3 -3
  60. package/packages/omo-codex/plugin/components/ultrawork/directive.md +66 -27
  61. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  62. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +66 -27
  64. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -1
  65. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  66. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
  67. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +9 -6
  68. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +66 -27
  69. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  70. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -2
  72. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +6 -6
  73. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  96. package/packages/omo-codex/plugin/package-lock.json +13 -13
  97. package/packages/omo-codex/plugin/package.json +1 -1
  98. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  99. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +9 -0
  100. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +4 -2
  101. package/packages/omo-codex/plugin/skills/frontend/references/design/layout-skill.md +107 -0
  102. package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -2
  103. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +10 -2
  104. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +1 -1
  105. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +33 -16
  106. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +2 -1
  107. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  108. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  109. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  110. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +66 -27
  111. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -2
  112. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +6 -6
  113. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
  114. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  115. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
  116. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -5
  117. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -1
  118. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +25 -0
  119. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +24 -0
  120. package/packages/omo-codex/scripts/install-dist/install-local.mjs +32 -22
  121. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  122. package/packages/shared-skills/skills/frontend/references/design/README.md +9 -0
  123. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +4 -2
  124. package/packages/shared-skills/skills/frontend/references/design/layout-skill.md +107 -0
  125. package/packages/shared-skills/skills/programming/SKILL.md +12 -2
  126. package/packages/shared-skills/skills/review-work/SKILL.md +10 -2
  127. package/packages/shared-skills/skills/start-work/SKILL.md +1 -1
  128. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  129. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  130. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  131. package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
  132. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  133. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
  134. package/packages/shared-skills/skills/visual-qa/SKILL.md +9 -5
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.0",
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.0",
2360
- "oh-my-opencode-darwin-x64": "4.17.0",
2361
- "oh-my-opencode-darwin-x64-baseline": "4.17.0",
2362
- "oh-my-opencode-linux-arm64": "4.17.0",
2363
- "oh-my-opencode-linux-arm64-musl": "4.17.0",
2364
- "oh-my-opencode-linux-x64": "4.17.0",
2365
- "oh-my-opencode-linux-x64-baseline": "4.17.0",
2366
- "oh-my-opencode-linux-x64-musl": "4.17.0",
2367
- "oh-my-opencode-linux-x64-musl-baseline": "4.17.0",
2368
- "oh-my-opencode-windows-arm64": "4.17.0",
2369
- "oh-my-opencode-windows-x64": "4.17.0",
2370
- "oh-my-opencode-windows-x64-baseline": "4.17.0"
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",
@@ -9223,7 +9224,7 @@ var init_agent_model_requirements = __esm(() => {
9223
9224
  {
9224
9225
  providers: ["openai", "vercel"],
9225
9226
  model: "gpt-5.6-sol",
9226
- variant: "medium"
9227
+ variant: "high"
9227
9228
  },
9228
9229
  {
9229
9230
  providers: ["openai", "github-copilot", "opencode", "vercel"],
@@ -65103,15 +65104,20 @@ var init_command_loader = __esm(() => {
65103
65104
  init_logger3();
65104
65105
  });
65105
65106
 
65106
- // packages/claude-code-compat-core/src/shared/skill-path-resolver.ts
65107
+ // packages/utils/src/skill-path-resolver.ts
65107
65108
  var init_skill_path_resolver = () => {};
65108
65109
 
65110
+ // packages/claude-code-compat-core/src/shared/skill-path-resolver.ts
65111
+ var init_skill_path_resolver2 = __esm(() => {
65112
+ init_skill_path_resolver();
65113
+ });
65114
+
65109
65115
  // packages/claude-code-compat-core/src/features/claude-code-plugin-loader/skill-loader.ts
65110
65116
  var init_skill_loader = __esm(() => {
65111
65117
  init_frontmatter3();
65112
65118
  init_file_utils3();
65113
65119
  init_model_sanitizer2();
65114
- init_skill_path_resolver();
65120
+ init_skill_path_resolver2();
65115
65121
  init_logger3();
65116
65122
  });
65117
65123
  // packages/claude-code-compat-core/src/shared/model-format-normalizer.ts
@@ -72596,7 +72602,7 @@ var package_default2;
72596
72602
  var init_package2 = __esm(() => {
72597
72603
  package_default2 = {
72598
72604
  name: "@oh-my-opencode/omo-codex",
72599
- version: "4.16.3",
72605
+ version: "4.18.0",
72600
72606
  type: "module",
72601
72607
  private: true,
72602
72608
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75320,9 +75326,11 @@ function collectCommands(value, commands) {
75320
75326
 
75321
75327
  // packages/omo-codex/src/install/codex-cache-install.ts
75322
75328
  async function installCachedPlugin(input) {
75329
+ const env2 = input.env ?? process.env;
75330
+ const npmInstallEnv = sanitizeNpmInstallEnv(env2);
75323
75331
  if (input.buildSource !== false) {
75324
- await maybeRunNpmInstall(input.sourcePath, input.runCommand);
75325
- await maybeRunNpmBuild(input.sourcePath, input.runCommand);
75332
+ await maybeRunNpmInstall(input.sourcePath, input.runCommand, npmInstallEnv);
75333
+ await maybeRunNpmBuild(input.sourcePath, input.runCommand, env2);
75326
75334
  }
75327
75335
  const targetPath = join33(input.codexHome, "plugins", "cache", input.marketplaceName, input.name, input.version);
75328
75336
  const tempPath = createTempSiblingPath(targetPath);
@@ -75332,10 +75340,10 @@ async function installCachedPlugin(input) {
75332
75340
  await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75333
75341
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75334
75342
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75335
- await maybeRunNpmInstall(tempPath, input.runCommand, ["ci", "--omit=dev"]);
75343
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75336
75344
  await removeCachedManagedNpmBinShims(tempPath);
75337
75345
  if (input.buildSource === false)
75338
- await maybeRunNpmSyncSkills(tempPath, input.runCommand);
75346
+ await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
75339
75347
  await assertNoRemovedSparkshellPromptReferences(tempPath);
75340
75348
  await rewriteCachedMcpManifest(tempPath, input.sourcePath);
75341
75349
  await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
@@ -75347,12 +75355,12 @@ async function installCachedPlugin(input) {
75347
75355
  }
75348
75356
  return { name: input.name, version: input.version, path: targetPath };
75349
75357
  }
75350
- async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
75358
+ async function maybeRunNpmInstall(cwd, runCommand, env2, args = ["install"]) {
75351
75359
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75352
75360
  return;
75353
- await runCommand("npm", args, { cwd });
75361
+ await runCommand("npm", args, { cwd, env: env2 });
75354
75362
  }
75355
- async function maybeRunNpmBuild(cwd, runCommand) {
75363
+ async function maybeRunNpmBuild(cwd, runCommand, env2) {
75356
75364
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75357
75365
  return;
75358
75366
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75361,9 +75369,9 @@ async function maybeRunNpmBuild(cwd, runCommand) {
75361
75369
  const scripts = packageJson.scripts;
75362
75370
  if (!isPlainRecord3(scripts) || typeof scripts.build !== "string")
75363
75371
  return;
75364
- await runCommand("npm", ["run", "build"], { cwd });
75372
+ await runCommand("npm", ["run", "build"], { cwd, env: env2 });
75365
75373
  }
75366
- async function maybeRunNpmSyncSkills(cwd, runCommand) {
75374
+ async function maybeRunNpmSyncSkills(cwd, runCommand, env2) {
75367
75375
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75368
75376
  return;
75369
75377
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75372,7 +75380,10 @@ async function maybeRunNpmSyncSkills(cwd, runCommand) {
75372
75380
  const scripts = packageJson.scripts;
75373
75381
  if (!isPlainRecord3(scripts) || typeof scripts["sync:skills"] !== "string")
75374
75382
  return;
75375
- 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"));
75376
75387
  }
75377
75388
  function createTempSiblingPath(targetPath) {
75378
75389
  return join33(dirname13(targetPath), `.tmp-${basename7(targetPath)}-${process.pid}-${Date.now()}`);
@@ -75896,6 +75907,14 @@ function parseAgentHeaderName(header) {
75896
75907
  const path7 = parseTomlDottedKey(header);
75897
75908
  return path7?.[0] === "agents" ? path7[1] ?? null : null;
75898
75909
  }
75910
+ function parseJsonString(value) {
75911
+ try {
75912
+ const parsed = JSON.parse(value);
75913
+ return typeof parsed === "string" ? parsed : null;
75914
+ } catch {
75915
+ return null;
75916
+ }
75917
+ }
75899
75918
  function parseHookStateHeaderKey(header) {
75900
75919
  const path7 = parseTomlDottedKey(header);
75901
75920
  if (path7?.[0] !== "hooks" || path7[1] !== "state")
@@ -77052,16 +77071,6 @@ function isSectionHeader3(line) {
77052
77071
  function agentNameFromToml(fileName) {
77053
77072
  return fileName.endsWith(".toml") ? fileName.slice(0, -".toml".length) : fileName;
77054
77073
  }
77055
- function parseJsonString(value) {
77056
- try {
77057
- const parsed = JSON.parse(value);
77058
- return typeof parsed === "string" ? parsed : null;
77059
- } catch (error) {
77060
- if (error instanceof Error)
77061
- return null;
77062
- return null;
77063
- }
77064
- }
77065
77074
  async function exists2(path7) {
77066
77075
  try {
77067
77076
  await lstat7(path7);
@@ -77404,6 +77413,10 @@ async function readDistributionManifest(repoRoot) {
77404
77413
  }
77405
77414
  }
77406
77415
  function resolveLazyCodexPluginVersion(input) {
77416
+ const override = input.versionOverride?.trim();
77417
+ if (override !== undefined && override.length > 0) {
77418
+ return override;
77419
+ }
77407
77420
  if (input.marketplaceName === "sisyphuslabs" && input.pluginName === "omo" && input.distributionManifest !== undefined) {
77408
77421
  return input.distributionManifest.version;
77409
77422
  }
@@ -77954,6 +77967,7 @@ async function runCodexInstaller(options = {}) {
77954
77967
  return;
77955
77968
  });
77956
77969
  const buildSource = await shouldBuildSourcePackages(repoRoot);
77970
+ const versionOverride = env3.LAZYCODEX_DEV_VERSION?.trim() || undefined;
77957
77971
  const gitBashResolution = await prepareGitBashForInstall({
77958
77972
  platform,
77959
77973
  env: env3,
@@ -77980,13 +77994,15 @@ async function runCodexInstaller(options = {}) {
77980
77994
  manifestVersion: manifest.version,
77981
77995
  marketplaceName: marketplace.name,
77982
77996
  pluginName: entry.name,
77983
- distributionManifest
77997
+ distributionManifest,
77998
+ versionOverride
77984
77999
  });
77985
78000
  validatePathSegment(version2, "plugin version");
77986
78001
  log4(`Building ${entry.name}@${version2}`);
77987
78002
  const plugin = await installCachedPlugin({
77988
78003
  buildSource,
77989
78004
  codexHome,
78005
+ env: env3,
77990
78006
  marketplaceName: marketplace.name,
77991
78007
  name: entry.name,
77992
78008
  runCommand,
@@ -99067,6 +99083,10 @@ function formatVersionOutput(info) {
99067
99083
  lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running in local development mode")}`);
99068
99084
  lines.push(` ${import_picocolors17.default.dim("Using file:// protocol from config")}`);
99069
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;
99070
99090
  case "pinned":
99071
99091
  lines.push(` ${SYMBOLS3.pin} ${import_picocolors17.default.magenta(`Version pinned to ${info.pinnedVersion}`)}`);
99072
99092
  lines.push(` ${import_picocolors17.default.dim("Update check skipped for pinned versions")}`);
@@ -99139,6 +99159,19 @@ async function getLocalVersion(options = {}) {
99139
99159
  console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99140
99160
  return 1;
99141
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
+ }
99142
99175
  const { extractChannel: extractChannel2 } = await Promise.resolve().then(() => (init_auto_update_checker(), exports_auto_update_checker));
99143
99176
  const channel = extractChannel2(pluginInfo?.pinnedVersion ?? currentVersion);
99144
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.0",
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.0",
2361
- "oh-my-opencode-darwin-x64": "4.17.0",
2362
- "oh-my-opencode-darwin-x64-baseline": "4.17.0",
2363
- "oh-my-opencode-linux-arm64": "4.17.0",
2364
- "oh-my-opencode-linux-arm64-musl": "4.17.0",
2365
- "oh-my-opencode-linux-x64": "4.17.0",
2366
- "oh-my-opencode-linux-x64-baseline": "4.17.0",
2367
- "oh-my-opencode-linux-x64-musl": "4.17.0",
2368
- "oh-my-opencode-linux-x64-musl-baseline": "4.17.0",
2369
- "oh-my-opencode-windows-arm64": "4.17.0",
2370
- "oh-my-opencode-windows-x64": "4.17.0",
2371
- "oh-my-opencode-windows-x64-baseline": "4.17.0"
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",
@@ -9224,7 +9225,7 @@ var init_agent_model_requirements = __esm(() => {
9224
9225
  {
9225
9226
  providers: ["openai", "vercel"],
9226
9227
  model: "gpt-5.6-sol",
9227
- variant: "medium"
9228
+ variant: "high"
9228
9229
  },
9229
9230
  {
9230
9231
  providers: ["openai", "github-copilot", "opencode", "vercel"],
@@ -65104,15 +65105,20 @@ var init_command_loader = __esm(() => {
65104
65105
  init_logger3();
65105
65106
  });
65106
65107
 
65107
- // packages/claude-code-compat-core/src/shared/skill-path-resolver.ts
65108
+ // packages/utils/src/skill-path-resolver.ts
65108
65109
  var init_skill_path_resolver = () => {};
65109
65110
 
65111
+ // packages/claude-code-compat-core/src/shared/skill-path-resolver.ts
65112
+ var init_skill_path_resolver2 = __esm(() => {
65113
+ init_skill_path_resolver();
65114
+ });
65115
+
65110
65116
  // packages/claude-code-compat-core/src/features/claude-code-plugin-loader/skill-loader.ts
65111
65117
  var init_skill_loader = __esm(() => {
65112
65118
  init_frontmatter3();
65113
65119
  init_file_utils3();
65114
65120
  init_model_sanitizer2();
65115
- init_skill_path_resolver();
65121
+ init_skill_path_resolver2();
65116
65122
  init_logger3();
65117
65123
  });
65118
65124
  // packages/claude-code-compat-core/src/shared/model-format-normalizer.ts
@@ -72652,7 +72658,7 @@ var package_default2;
72652
72658
  var init_package2 = __esm(() => {
72653
72659
  package_default2 = {
72654
72660
  name: "@oh-my-opencode/omo-codex",
72655
- version: "4.16.3",
72661
+ version: "4.18.0",
72656
72662
  type: "module",
72657
72663
  private: true,
72658
72664
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -75376,9 +75382,11 @@ function collectCommands(value, commands) {
75376
75382
 
75377
75383
  // packages/omo-codex/src/install/codex-cache-install.ts
75378
75384
  async function installCachedPlugin(input) {
75385
+ const env2 = input.env ?? process.env;
75386
+ const npmInstallEnv = sanitizeNpmInstallEnv(env2);
75379
75387
  if (input.buildSource !== false) {
75380
- await maybeRunNpmInstall(input.sourcePath, input.runCommand);
75381
- await maybeRunNpmBuild(input.sourcePath, input.runCommand);
75388
+ await maybeRunNpmInstall(input.sourcePath, input.runCommand, npmInstallEnv);
75389
+ await maybeRunNpmBuild(input.sourcePath, input.runCommand, env2);
75382
75390
  }
75383
75391
  const targetPath = join33(input.codexHome, "plugins", "cache", input.marketplaceName, input.name, input.version);
75384
75392
  const tempPath = createTempSiblingPath(targetPath);
@@ -75388,10 +75396,10 @@ async function installCachedPlugin(input) {
75388
75396
  await rewriteCachedPackageLocalFileDependencies(tempPath, input.sourcePath);
75389
75397
  await copyBundledMcpRuntimeDists({ pluginRoot: tempPath, sourceRoot: input.sourcePath });
75390
75398
  await copyRootRuntimeDists({ pluginRoot: tempPath, sourcePath: input.sourcePath });
75391
- await maybeRunNpmInstall(tempPath, input.runCommand, ["ci", "--omit=dev"]);
75399
+ await maybeRunNpmInstall(tempPath, input.runCommand, npmInstallEnv, ["ci", "--omit=dev"]);
75392
75400
  await removeCachedManagedNpmBinShims(tempPath);
75393
75401
  if (input.buildSource === false)
75394
- await maybeRunNpmSyncSkills(tempPath, input.runCommand);
75402
+ await maybeRunNpmSyncSkills(tempPath, input.runCommand, env2);
75395
75403
  await assertNoRemovedSparkshellPromptReferences(tempPath);
75396
75404
  await rewriteCachedMcpManifest(tempPath, input.sourcePath);
75397
75405
  await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
@@ -75403,12 +75411,12 @@ async function installCachedPlugin(input) {
75403
75411
  }
75404
75412
  return { name: input.name, version: input.version, path: targetPath };
75405
75413
  }
75406
- async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
75414
+ async function maybeRunNpmInstall(cwd, runCommand, env2, args = ["install"]) {
75407
75415
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75408
75416
  return;
75409
- await runCommand("npm", args, { cwd });
75417
+ await runCommand("npm", args, { cwd, env: env2 });
75410
75418
  }
75411
- async function maybeRunNpmBuild(cwd, runCommand) {
75419
+ async function maybeRunNpmBuild(cwd, runCommand, env2) {
75412
75420
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75413
75421
  return;
75414
75422
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75417,9 +75425,9 @@ async function maybeRunNpmBuild(cwd, runCommand) {
75417
75425
  const scripts = packageJson.scripts;
75418
75426
  if (!isPlainRecord3(scripts) || typeof scripts.build !== "string")
75419
75427
  return;
75420
- await runCommand("npm", ["run", "build"], { cwd });
75428
+ await runCommand("npm", ["run", "build"], { cwd, env: env2 });
75421
75429
  }
75422
- async function maybeRunNpmSyncSkills(cwd, runCommand) {
75430
+ async function maybeRunNpmSyncSkills(cwd, runCommand, env2) {
75423
75431
  if (!await fileExistsStrict(join33(cwd, "package.json")))
75424
75432
  return;
75425
75433
  const packageJson = JSON.parse(await readFile8(join33(cwd, "package.json"), "utf8"));
@@ -75428,7 +75436,10 @@ async function maybeRunNpmSyncSkills(cwd, runCommand) {
75428
75436
  const scripts = packageJson.scripts;
75429
75437
  if (!isPlainRecord3(scripts) || typeof scripts["sync:skills"] !== "string")
75430
75438
  return;
75431
- 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"));
75432
75443
  }
75433
75444
  function createTempSiblingPath(targetPath) {
75434
75445
  return join33(dirname13(targetPath), `.tmp-${basename7(targetPath)}-${process.pid}-${Date.now()}`);
@@ -75952,6 +75963,14 @@ function parseAgentHeaderName(header) {
75952
75963
  const path7 = parseTomlDottedKey(header);
75953
75964
  return path7?.[0] === "agents" ? path7[1] ?? null : null;
75954
75965
  }
75966
+ function parseJsonString(value) {
75967
+ try {
75968
+ const parsed = JSON.parse(value);
75969
+ return typeof parsed === "string" ? parsed : null;
75970
+ } catch {
75971
+ return null;
75972
+ }
75973
+ }
75955
75974
  function parseHookStateHeaderKey(header) {
75956
75975
  const path7 = parseTomlDottedKey(header);
75957
75976
  if (path7?.[0] !== "hooks" || path7[1] !== "state")
@@ -77108,16 +77127,6 @@ function isSectionHeader3(line) {
77108
77127
  function agentNameFromToml(fileName) {
77109
77128
  return fileName.endsWith(".toml") ? fileName.slice(0, -".toml".length) : fileName;
77110
77129
  }
77111
- function parseJsonString(value) {
77112
- try {
77113
- const parsed = JSON.parse(value);
77114
- return typeof parsed === "string" ? parsed : null;
77115
- } catch (error) {
77116
- if (error instanceof Error)
77117
- return null;
77118
- return null;
77119
- }
77120
- }
77121
77130
  async function exists2(path7) {
77122
77131
  try {
77123
77132
  await lstat7(path7);
@@ -77460,6 +77469,10 @@ async function readDistributionManifest(repoRoot) {
77460
77469
  }
77461
77470
  }
77462
77471
  function resolveLazyCodexPluginVersion(input) {
77472
+ const override = input.versionOverride?.trim();
77473
+ if (override !== undefined && override.length > 0) {
77474
+ return override;
77475
+ }
77463
77476
  if (input.marketplaceName === "sisyphuslabs" && input.pluginName === "omo" && input.distributionManifest !== undefined) {
77464
77477
  return input.distributionManifest.version;
77465
77478
  }
@@ -78010,6 +78023,7 @@ async function runCodexInstaller(options = {}) {
78010
78023
  return;
78011
78024
  });
78012
78025
  const buildSource = await shouldBuildSourcePackages(repoRoot);
78026
+ const versionOverride = env3.LAZYCODEX_DEV_VERSION?.trim() || undefined;
78013
78027
  const gitBashResolution = await prepareGitBashForInstall({
78014
78028
  platform,
78015
78029
  env: env3,
@@ -78036,13 +78050,15 @@ async function runCodexInstaller(options = {}) {
78036
78050
  manifestVersion: manifest.version,
78037
78051
  marketplaceName: marketplace.name,
78038
78052
  pluginName: entry.name,
78039
- distributionManifest
78053
+ distributionManifest,
78054
+ versionOverride
78040
78055
  });
78041
78056
  validatePathSegment(version2, "plugin version");
78042
78057
  log4(`Building ${entry.name}@${version2}`);
78043
78058
  const plugin = await installCachedPlugin({
78044
78059
  buildSource,
78045
78060
  codexHome,
78061
+ env: env3,
78046
78062
  marketplaceName: marketplace.name,
78047
78063
  name: entry.name,
78048
78064
  runCommand,
@@ -99123,6 +99139,10 @@ function formatVersionOutput(info) {
99123
99139
  lines.push(` ${SYMBOLS3.dev} ${import_picocolors17.default.cyan("Running in local development mode")}`);
99124
99140
  lines.push(` ${import_picocolors17.default.dim("Using file:// protocol from config")}`);
99125
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;
99126
99146
  case "pinned":
99127
99147
  lines.push(` ${SYMBOLS3.pin} ${import_picocolors17.default.magenta(`Version pinned to ${info.pinnedVersion}`)}`);
99128
99148
  lines.push(` ${import_picocolors17.default.dim("Update check skipped for pinned versions")}`);
@@ -99195,6 +99215,19 @@ async function getLocalVersion(options = {}) {
99195
99215
  console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
99196
99216
  return 1;
99197
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
+ }
99198
99231
  const { extractChannel: extractChannel2 } = await Promise.resolve().then(() => (init_auto_update_checker(), exports_auto_update_checker));
99199
99232
  const channel = extractChannel2(pluginInfo?.pinnedVersion ?? currentVersion);
99200
99233
  const latestVersion = await getLatestVersion(channel);