lazycodex-ai 5.0.0-beta.50 → 5.0.0-beta.52

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 (79) hide show
  1. package/dist/cli/doctor/checks/index.d.ts +2 -0
  2. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  3. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  4. package/dist/cli/doctor/framework/types.d.ts +2 -0
  5. package/dist/cli/index.js +110 -44
  6. package/dist/cli-node/index.js +110 -44
  7. package/package.json +1 -1
  8. package/packages/lsp-daemon/dist/cli.js +1 -2
  9. package/packages/lsp-daemon/dist/ownership.js +2 -2
  10. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +5 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  17. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  21. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  22. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  25. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  26. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  28. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +11 -5
  38. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +11 -5
  39. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  40. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +10 -5
  42. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +21 -1
  43. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  64. package/packages/omo-codex/plugin/package-lock.json +12 -12
  65. package/packages/omo-codex/plugin/package.json +1 -1
  66. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +1 -0
  67. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  68. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +3 -0
  69. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  70. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  71. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  72. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  73. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9 -5
  74. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  75. package/packages/shared-skills/skills/frontend/SKILL.md +3 -0
  76. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  77. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  78. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  79. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
@@ -2,9 +2,11 @@ import type { CheckDefinition } from "../framework/types";
2
2
  import { gatherSystemInfo } from "./system";
3
3
  import { gatherToolsSummary } from "./tools";
4
4
  import { gatherCodexSummary } from "./codex";
5
+ import { gatherEditionDistTags, resolveLatestVersion } from "./latest-version";
5
6
  export type { CheckDefinition };
6
7
  export * from "./model-resolution-types";
7
8
  export { gatherSystemInfo, gatherToolsSummary };
8
9
  export { gatherCodexSummary };
10
+ export { gatherEditionDistTags, resolveLatestVersion };
9
11
  export declare function getAllCheckDefinitions(): CheckDefinition[];
10
12
  export declare function getCodexCheckDefinitions(): CheckDefinition[];
@@ -0,0 +1,11 @@
1
+ import { type NpmDistTags } from "../../config-manager/npm-dist-tags";
2
+ import type { CodexDoctorSummary, DoctorTarget, SystemInfo } from "../framework/types";
3
+ export type FetchDistTags = (packageName: string) => Promise<NpmDistTags | null>;
4
+ export interface LatestVersionInput {
5
+ target: DoctorTarget;
6
+ systemInfo: SystemInfo;
7
+ codex: CodexDoctorSummary | undefined;
8
+ distTags: NpmDistTags | null;
9
+ }
10
+ export declare function gatherEditionDistTags(target: DoctorTarget, fetchDistTags?: FetchDistTags): Promise<NpmDistTags | null>;
11
+ export declare function resolveLatestVersion(input: LatestVersionInput): string | null;
@@ -1,3 +1,4 @@
1
+ import type { DoctorTarget } from "./types";
1
2
  export declare const SYMBOLS: {
2
3
  readonly check: string;
3
4
  readonly cross: string;
@@ -31,3 +32,7 @@ export declare const EXIT_CODES: {
31
32
  export declare const MIN_OPENCODE_VERSION = "1.4.0";
32
33
  export declare const PACKAGE_NAME = "oh-my-openagent";
33
34
  export declare const OPENCODE_BINARIES: readonly ["opencode", "opencode-desktop"];
35
+ export declare const EDITION_LABELS: Record<DoctorTarget, string>;
36
+ export declare const EDITION_PACKAGE_NAMES: Record<DoctorTarget, string>;
37
+ export declare const UPDATE_COMMANDS: Record<DoctorTarget, string>;
38
+ export declare const LATEST_UNAVAILABLE_TEXT = "could not check";
@@ -69,6 +69,8 @@ export interface DoctorResult {
69
69
  exitCode: number;
70
70
  target?: DoctorTarget;
71
71
  codex?: CodexDoctorSummary;
72
+ /** Latest published version on the installed channel; null when the registry lookup failed. */
73
+ latestVersion: string | null;
72
74
  }
73
75
  export interface CodexConfigSummary {
74
76
  readonly exists: boolean;
package/dist/cli/index.js CHANGED
@@ -64,7 +64,7 @@ var package_default;
64
64
  var init_package = __esm(() => {
65
65
  package_default = {
66
66
  name: "oh-my-opencode",
67
- version: "5.0.0-beta.50",
67
+ version: "5.0.0-beta.52",
68
68
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
69
69
  main: "./dist/index.js",
70
70
  types: "dist/index.d.ts",
@@ -248,7 +248,7 @@ var init_package = __esm(() => {
248
248
  zod: "^4.4.3"
249
249
  },
250
250
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.9",
251
+ "@code-yeongyu/senpi": "2026.9.10",
252
252
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
253
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
254
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -289,18 +289,18 @@ var init_package = __esm(() => {
289
289
  typescript: "^7.0.2"
290
290
  },
291
291
  optionalDependencies: {
292
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.50",
293
- "oh-my-opencode-darwin-x64": "5.0.0-beta.50",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.50",
295
- "oh-my-opencode-linux-arm64": "5.0.0-beta.50",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.50",
297
- "oh-my-opencode-linux-x64": "5.0.0-beta.50",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.50",
299
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.50",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.50",
301
- "oh-my-opencode-windows-arm64": "5.0.0-beta.50",
302
- "oh-my-opencode-windows-x64": "5.0.0-beta.50",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.50"
292
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.52",
293
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.52",
294
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.52",
295
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.52",
296
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.52",
297
+ "oh-my-opencode-linux-x64": "5.0.0-beta.52",
298
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.52",
299
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.52",
300
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.52",
301
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.52",
302
+ "oh-my-opencode-windows-x64": "5.0.0-beta.52",
303
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.52"
304
304
  },
305
305
  overrides: {
306
306
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -64424,6 +64424,7 @@ var init_injector = __esm(() => {
64424
64424
  var init_hook_message_injector = __esm(() => {
64425
64425
  init_injector();
64426
64426
  init_constants2();
64427
+ init_id_generation();
64427
64428
  });
64428
64429
 
64429
64430
  // packages/omo-opencode/src/shared/opencode-message-dir.ts
@@ -73359,10 +73360,8 @@ function validationDiagnostic(path, issues) {
73359
73360
  function unrecognizedKeyIssues(issues) {
73360
73361
  return issues.flatMap((issue) => issue.code === "unrecognized_keys" ? [{ keys: issue.keys, path: issue.path.map((segment) => String(segment)) }] : []);
73361
73362
  }
73362
- function hasUnsafeUnrecognizedKey(parsed, issues) {
73363
- if (issues.some((issue) => issue.keys.some((key) => isUnsafeObjectKey2(key))))
73364
- return true;
73365
- return hasTamperedPrototype(parsed);
73363
+ function hasUnsafeUnrecognizedKey(issues) {
73364
+ return issues.some((issue) => issue.keys.some((key) => isUnsafeObjectKey2(key)));
73366
73365
  }
73367
73366
  function hasTamperedPrototype(value) {
73368
73367
  if (Array.isArray(value))
@@ -73435,11 +73434,17 @@ function readConfigSource(path, scope, fileSystem) {
73435
73434
  source: { exists: true, loaded: false, path, scope }
73436
73435
  };
73437
73436
  }
73437
+ if (hasTamperedPrototype(parsed.data)) {
73438
+ return {
73439
+ diagnostic: { kind: "validation", message: `Invalid omo config at ${path}: "__proto__" member is not allowed`, path },
73440
+ source: { exists: true, loaded: false, path, scope }
73441
+ };
73442
+ }
73438
73443
  const parsedRecord = toRecord2(parsed.data);
73439
73444
  const validation = OmoConfigLayerSchema.safeParse(parsed.data);
73440
73445
  if (!validation.success) {
73441
73446
  const unrecognized = unrecognizedKeyIssues(validation.error.issues);
73442
- if (unrecognized.length > 0 && hasUnsafeUnrecognizedKey(parsed.data, unrecognized)) {
73447
+ if (hasUnsafeUnrecognizedKey(unrecognized)) {
73443
73448
  return {
73444
73449
  diagnostic: validationDiagnostic(path, validation.error.issues),
73445
73450
  source: { exists: true, loaded: false, path, scope }
@@ -84439,7 +84444,7 @@ var package_default2;
84439
84444
  var init_package2 = __esm(() => {
84440
84445
  package_default2 = {
84441
84446
  name: "@oh-my-opencode/omo-codex",
84442
- version: "5.0.0-beta.50",
84447
+ version: "5.0.0-beta.52",
84443
84448
  type: "module",
84444
84449
  private: true,
84445
84450
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -87860,6 +87865,19 @@ var EXIT_CODES = {
87860
87865
  var MIN_OPENCODE_VERSION = "1.4.0";
87861
87866
  var PACKAGE_NAME = PUBLISHED_PACKAGE_NAME;
87862
87867
  var OPENCODE_BINARIES2 = ["opencode", "opencode-desktop"];
87868
+ var EDITION_LABELS = {
87869
+ opencode: "OpenCode",
87870
+ codex: "Codex"
87871
+ };
87872
+ var EDITION_PACKAGE_NAMES = {
87873
+ opencode: PUBLISHED_PACKAGE_NAME,
87874
+ codex: "lazycodex-ai"
87875
+ };
87876
+ var UPDATE_COMMANDS = {
87877
+ opencode: `bunx ${PUBLISHED_PACKAGE_NAME} install`,
87878
+ codex: "npx lazycodex-ai install --no-tui --codex-autonomous"
87879
+ };
87880
+ var LATEST_UNAVAILABLE_TEXT = "could not check";
87863
87881
 
87864
87882
  // packages/omo-opencode/src/cli/minimum-opencode-version.ts
87865
87883
  init_opencode_version();
@@ -90436,7 +90454,7 @@ var CODEX_AGENTS_HEADER = "agents";
90436
90454
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
90437
90455
  function ensureCodexMultiAgentV2Config(config, options = {}) {
90438
90456
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
90439
- const v2Preferred = options.multiAgentVersion === "v2";
90457
+ const v2Preferred = options.multiAgentVersion === "v2" || isMultiAgentV2Enabled(featureFlag.config);
90440
90458
  const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
90441
90459
  const preserveDisable = featureFlag.value === false && !v2Preferred;
90442
90460
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
@@ -90515,6 +90533,10 @@ function removeFeatureFlagSetting(config, featureName) {
90515
90533
  value: readBooleanSetting(section.text, featureName)
90516
90534
  };
90517
90535
  }
90536
+ function isMultiAgentV2Enabled(config) {
90537
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
90538
+ return section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#.*)?$/m.test(section.text);
90539
+ }
90518
90540
  function removeAgentsMaxThreads(config, v2Preferred) {
90519
90541
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
90520
90542
  if (!section)
@@ -91677,7 +91699,7 @@ function lastValue(values) {
91677
91699
  return values.length > 0 ? values[values.length - 1] ?? null : null;
91678
91700
  }
91679
91701
  function repairProjectLocalCodexConfigText(config) {
91680
- if (!isMultiAgentV2Enabled(config))
91702
+ if (!isMultiAgentV2Enabled2(config))
91681
91703
  return { config, changed: false, removedKeys: [] };
91682
91704
  let nextConfig = config;
91683
91705
  const removedKeys = [];
@@ -91767,7 +91789,7 @@ async function collectProjectLocalArtifacts(projectRoots) {
91767
91789
  }
91768
91790
  return artifacts;
91769
91791
  }
91770
- function isMultiAgentV2Enabled(config) {
91792
+ function isMultiAgentV2Enabled2(config) {
91771
91793
  const featuresSection = findTomlSection(config, "features");
91772
91794
  if (featuresSection !== null && settingIsBooleanTrue(featuresSection.text, "multi_agent_v2"))
91773
91795
  return true;
@@ -93198,6 +93220,20 @@ import { constants as constants9 } from "fs";
93198
93220
  import { access as access2, readFile as readFile26, stat as stat6 } from "fs/promises";
93199
93221
  import { dirname as dirname23, join as join59 } from "path";
93200
93222
 
93223
+ // packages/memory-core/src/personas/manifest.ts
93224
+ var PERSONA_ASSET_FILENAMES = {
93225
+ reflection: "reflection-persona.md",
93226
+ dream: "dream-persona.md",
93227
+ facts: "facts-persona.md",
93228
+ kibitzer: "kibitzer-persona.md"
93229
+ };
93230
+ var PERSONA_ASSET_FILES = [
93231
+ PERSONA_ASSET_FILENAMES.reflection,
93232
+ PERSONA_ASSET_FILENAMES.dream,
93233
+ PERSONA_ASSET_FILENAMES.facts,
93234
+ PERSONA_ASSET_FILENAMES.kibitzer
93235
+ ];
93236
+
93201
93237
  // packages/omo-senpi/src/install/senpi-settings.ts
93202
93238
  import { constants as constants8 } from "fs";
93203
93239
  import { access, copyFile as copyFile3, mkdir as mkdir9, readFile as readFile25, rename as rename5, writeFile as writeFile14 } from "fs/promises";
@@ -93321,10 +93357,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
93321
93357
  join59("extensions", "omo-task.js"),
93322
93358
  join59("extensions", "omo-member.js"),
93323
93359
  join59("extensions", "memory-run-supervisor.mjs"),
93324
- join59("extensions", "reflection-persona.md"),
93325
- join59("extensions", "dream-persona.md"),
93326
- join59("extensions", "facts-persona.md"),
93327
- join59("extensions", "kibitzer-persona.md"),
93360
+ ...PERSONA_ASSET_FILES.map((filename) => join59("extensions", filename)),
93328
93361
  join59("skills", "ast-grep", "SKILL.md"),
93329
93362
  join59("skills", "coding-agent-sessions", "SKILL.md"),
93330
93363
  join59("skills", "debugging", "SKILL.md"),
@@ -100644,7 +100677,9 @@ async function checkConfig() {
100644
100677
  }
100645
100678
 
100646
100679
  // packages/omo-opencode/src/cli/doctor/checks/deprecated-reasoning-keys.ts
100680
+ init_src4();
100647
100681
  init_main();
100682
+ init_config_migration();
100648
100683
  import { existsSync as existsSync52, readFileSync as readFileSync33 } from "fs";
100649
100684
  import { join as join78 } from "path";
100650
100685
  var CANONICAL_REPLACEMENT = new Map([
@@ -100652,8 +100687,9 @@ var CANONICAL_REPLACEMENT = new Map([
100652
100687
  ["reasoningEffort", "reasoning"],
100653
100688
  ["thinking", 'reasoning: "off" or provider_options.thinking'],
100654
100689
  ["textVerbosity", "provider_options.textVerbosity"],
100655
- ["fallback_models", "models"]
100690
+ ["fallback_models", "models: [<primary>, ...fallbacks] (the first entry becomes the primary model)"]
100656
100691
  ]);
100692
+ var MIGRATE_SUFFIX = ", or run: oh-my-openagent config migrate";
100657
100693
  var TUNING_CONTAINERS = new Set(["agents", "categories", "models"]);
100658
100694
  var PASSTHROUGH_CONTAINERS = new Set(["provider_options", "providerOptions"]);
100659
100695
  function isRecord13(value) {
@@ -100662,7 +100698,7 @@ function isRecord13(value) {
100662
100698
  function isHarnessBlock(key) {
100663
100699
  return key.startsWith("[") && key.endsWith("]");
100664
100700
  }
100665
- function collectIssues(configPath, value, prefix) {
100701
+ function collectIssues(configPath, value, prefix, fixSuffix) {
100666
100702
  if (!isRecord13(value))
100667
100703
  return [];
100668
100704
  const issues = [];
@@ -100673,7 +100709,7 @@ function collectIssues(configPath, value, prefix) {
100673
100709
  issues.push({
100674
100710
  title: "Deprecated config key",
100675
100711
  description: `${configPath}: ${path}`,
100676
- fix: `Replace ${key} with ${replacement}, or run: oh-my-openagent config migrate`,
100712
+ fix: `Replace ${key} with ${replacement}${fixSuffix}`,
100677
100713
  severity: "warning",
100678
100714
  affects: [path]
100679
100715
  });
@@ -100685,18 +100721,23 @@ function collectIssues(configPath, value, prefix) {
100685
100721
  continue;
100686
100722
  if (prefix.length === 0 && key === "profiles") {
100687
100723
  for (const profile of Object.values(child)) {
100688
- issues.push(...collectIssues(configPath, profile, ""));
100724
+ issues.push(...collectIssues(configPath, profile, "", fixSuffix));
100689
100725
  }
100690
100726
  continue;
100691
100727
  }
100692
100728
  if (key === "[opencode]")
100693
100729
  continue;
100694
100730
  if (TUNING_CONTAINERS.has(key) || isHarnessBlock(key) || prefix.length > 0) {
100695
- issues.push(...collectIssues(configPath, child, path));
100731
+ issues.push(...collectIssues(configPath, child, path, fixSuffix));
100696
100732
  }
100697
100733
  }
100698
100734
  return issues;
100699
100735
  }
100736
+ function migrateFixSuffix(parsed) {
100737
+ if (isRecord13(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
100738
+ return "";
100739
+ return MIGRATE_SUFFIX;
100740
+ }
100700
100741
  function userConfigPaths() {
100701
100742
  const home = process.env.HOME ?? process.env.USERPROFILE;
100702
100743
  if (home === undefined || home.length === 0)
@@ -100711,7 +100752,7 @@ async function checkDeprecatedReasoningKeys() {
100711
100752
  continue;
100712
100753
  scanned.push(configPath);
100713
100754
  const parsed = parse2(readFileSync33(configPath, "utf-8"));
100714
- issues.push(...collectIssues(configPath, parsed, ""));
100755
+ issues.push(...collectIssues(configPath, parsed, "", migrateFixSuffix(parsed)));
100715
100756
  }
100716
100757
  return {
100717
100758
  name: CHECK_NAMES[CHECK_IDS.CONFIG],
@@ -101837,6 +101878,24 @@ async function pathExists2(path) {
101837
101878
  }
101838
101879
  }
101839
101880
 
101881
+ // packages/omo-opencode/src/cli/doctor/checks/latest-version.ts
101882
+ init_auto_update_checker();
101883
+ function gatherEditionDistTags(target, fetchDistTags = fetchNpmDistTags) {
101884
+ return fetchDistTags(EDITION_PACKAGE_NAMES[target]);
101885
+ }
101886
+ function resolveInstalledVersion(input) {
101887
+ if (input.target === "codex" && input.codex) {
101888
+ return input.codex.packageVersion ?? input.codex.installerVersion;
101889
+ }
101890
+ return input.systemInfo.pluginVersion;
101891
+ }
101892
+ function resolveLatestVersion(input) {
101893
+ if (!input.distTags)
101894
+ return null;
101895
+ const channel = extractChannel(resolveInstalledVersion(input));
101896
+ return input.distTags[channel] ?? input.distTags.latest ?? null;
101897
+ }
101898
+
101840
101899
  // packages/omo-opencode/src/cli/doctor/checks/codex-components.ts
101841
101900
  init_src();
101842
101901
  import { readdir as readdir15, readFile as readFile28, stat as stat7 } from "fs/promises";
@@ -102247,7 +102306,6 @@ function getCodexCheckDefinitions() {
102247
102306
  }
102248
102307
 
102249
102308
  // packages/omo-opencode/src/cli/doctor/framework/format-default.ts
102250
- init_shared();
102251
102309
  var import_picocolors19 = __toESM(require_picocolors(), 1);
102252
102310
 
102253
102311
  // packages/omo-opencode/src/cli/doctor/framework/format-shared.ts
@@ -102289,23 +102347,27 @@ function formatIssue(issue, index) {
102289
102347
  }
102290
102348
 
102291
102349
  // packages/omo-opencode/src/cli/doctor/framework/format-default.ts
102350
+ function formatOkSummary(result, headline, installedVersion) {
102351
+ const target = result.target ?? "opencode";
102352
+ const latest = result.latestVersion ?? LATEST_UNAVAILABLE_TEXT;
102353
+ return [
102354
+ ` ${import_picocolors19.default.green(SYMBOLS2.check)} ${import_picocolors19.default.green(`${headline} \xB7 Edition: ${EDITION_LABELS[target]} \xB7 Installed: ${installedVersion} \xB7 Latest: ${latest}`)}`,
102355
+ ` Update: ${UPDATE_COMMANDS[target]}`
102356
+ ];
102357
+ }
102292
102358
  function formatDefault(result) {
102293
102359
  const lines = [];
102294
102360
  lines.push(formatHeader());
102295
102361
  const allIssues = result.results.flatMap((r) => r.issues);
102296
102362
  if (allIssues.length === 0) {
102297
102363
  if (result.target === "codex" && result.codex) {
102298
- const codex = result.codex.codexPath ?? result.codex.codexAppId ?? "unknown";
102299
- const pluginVer = result.codex.pluginVersion ?? "unknown";
102300
- const packageName = result.codex.packageName ?? "lazycodex-ai";
102301
102364
  const packageVer = result.codex.packageVersion ?? result.codex.installerVersion;
102302
- lines.push(` ${import_picocolors19.default.green(SYMBOLS2.check)} ${import_picocolors19.default.green(`LazyCodex OK (codex ${codex} \xB7 omo ${pluginVer} \xB7 ${packageName} ${packageVer})`)}`);
102365
+ lines.push(...formatOkSummary(result, "LazyCodex OK", packageVer));
102303
102366
  return lines.join(`
102304
102367
  `);
102305
102368
  }
102306
- const opencodeVer = result.systemInfo.opencodeVersion ?? "unknown";
102307
102369
  const pluginVer = result.systemInfo.pluginVersion ?? "unknown";
102308
- lines.push(` ${import_picocolors19.default.green(SYMBOLS2.check)} ${import_picocolors19.default.green(`System OK (opencode ${opencodeVer} \xB7 oh-my-opencode ${pluginVer})`.replace("oh-my-opencode", PLUGIN_NAME))}`);
102370
+ lines.push(...formatOkSummary(result, "System OK", pluginVer));
102309
102371
  } else {
102310
102372
  const issueCount = allIssues.filter((i) => i.severity === "error").length;
102311
102373
  const warnCount = allIssues.filter((i) => i.severity === "warning").length;
@@ -102552,7 +102614,8 @@ function buildTimeoutResult(start, options) {
102552
102614
  systemInfo: { opencodeVersion: null, opencodePath: null, pluginVersion: null, loadedVersion: null, bunVersion: null, configPath: null, configValid: false, isLocalDev: false },
102553
102615
  tools: { lspServers: [], astGrepCli: false, commentChecker: false, ghCli: { installed: false, authenticated: false, username: null }, mcpBuiltin: [], mcpUser: [] },
102554
102616
  summary: { total: 1, passed: 0, failed: 1, warnings: 0, skipped: 0, duration: Math.round(performance.now() - start) },
102555
- exitCode: EXIT_CODES.FAILURE
102617
+ exitCode: EXIT_CODES.FAILURE,
102618
+ latestVersion: null
102556
102619
  };
102557
102620
  if (options.json) {
102558
102621
  console.log(formatJsonOutput2(timeoutResult));
@@ -102572,7 +102635,8 @@ async function runDoctor(options) {
102572
102635
  Promise.all(allChecks.map(runCheck)),
102573
102636
  gatherSystemInfo(),
102574
102637
  gatherToolsSummary(),
102575
- target === "codex" ? gatherCodexSummary() : Promise.resolve(undefined)
102638
+ target === "codex" ? gatherCodexSummary() : Promise.resolve(undefined),
102639
+ gatherEditionDistTags(target)
102576
102640
  ]);
102577
102641
  let timer;
102578
102642
  const timeoutPromise = new Promise((_, reject) => {
@@ -102582,8 +102646,9 @@ async function runDoctor(options) {
102582
102646
  let systemInfo;
102583
102647
  let tools;
102584
102648
  let codex;
102649
+ let distTags;
102585
102650
  try {
102586
- [results, systemInfo, tools, codex] = await Promise.race([checksPromise, timeoutPromise]);
102651
+ [results, systemInfo, tools, codex, distTags] = await Promise.race([checksPromise, timeoutPromise]);
102587
102652
  } catch (error) {
102588
102653
  clearTimeout(timer);
102589
102654
  if (error instanceof DoctorTimeoutError) {
@@ -102602,7 +102667,8 @@ async function runDoctor(options) {
102602
102667
  summary,
102603
102668
  exitCode,
102604
102669
  target,
102605
- codex
102670
+ codex,
102671
+ latestVersion: resolveLatestVersion({ target, systemInfo, codex, distTags })
102606
102672
  };
102607
102673
  if (options.json) {
102608
102674
  console.log(formatJsonOutput2(doctorResult));