oh-my-opencode 5.0.0-beta.51 → 5.0.0-beta.53

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 (105) hide show
  1. package/README.ja.md +11 -18
  2. package/README.ko.md +10 -17
  3. package/README.md +11 -18
  4. package/README.ru.md +11 -18
  5. package/README.zh-cn.md +11 -18
  6. package/dist/cli/doctor/checks/index.d.ts +2 -0
  7. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  8. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  9. package/dist/cli/doctor/framework/types.d.ts +2 -0
  10. package/dist/cli/index.js +181 -63
  11. package/dist/cli-node/index.js +181 -63
  12. package/dist/features/background-agent/manager.d.ts +7 -0
  13. package/dist/features/background-agent/types.d.ts +4 -0
  14. package/dist/features/claude-tasks/storage.d.ts +7 -2
  15. package/dist/features/hook-message-injector/index.d.ts +1 -0
  16. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
  17. package/dist/hooks/keyword-detector/hook.d.ts +2 -0
  18. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
  19. package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
  20. package/dist/index.js +1539 -1292
  21. package/dist/plugin/chat-message/types.d.ts +3 -1
  22. package/dist/plugin/stop-continuation.d.ts +3 -0
  23. package/dist/plugin/system-transform.d.ts +5 -1
  24. package/dist/skills/frontend/ATTRIBUTION.md +10 -0
  25. package/dist/skills/frontend/SKILL.md +3 -0
  26. package/dist/skills/frontend/references/design/README.md +10 -2
  27. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  28. package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
  29. package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
  30. package/dist/skills/refactor/SKILL.md +3 -3
  31. package/dist/skills/review-work/SKILL.md +1 -1
  32. package/dist/skills/ulw-execute/SKILL.md +5 -5
  33. package/dist/tui.js +89 -13
  34. package/package.json +14 -14
  35. package/packages/lsp-daemon/dist/cli.js +1 -2
  36. package/packages/lsp-daemon/dist/ownership.js +2 -2
  37. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  38. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  39. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  43. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  44. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  47. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  48. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  51. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  52. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  54. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  56. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  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/hooks/hooks.json +1 -1
  60. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  61. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  62. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  64. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  86. package/packages/omo-codex/plugin/package-lock.json +12 -12
  87. package/packages/omo-codex/plugin/package.json +1 -1
  88. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  89. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +3 -0
  90. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  91. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  92. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  93. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  94. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +3 -3
  95. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +5 -5
  96. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  97. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  98. package/packages/shared-skills/skills/frontend/SKILL.md +3 -0
  99. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  100. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  101. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  102. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  103. package/packages/shared-skills/skills/refactor/SKILL.md +3 -3
  104. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  105. package/packages/shared-skills/skills/ulw-execute/SKILL.md +5 -5
package/dist/tui.js CHANGED
@@ -3170,7 +3170,7 @@ var init_command_executor2 = __esm(() => {
3170
3170
  var init_contains_path2 = () => {};
3171
3171
 
3172
3172
  // packages/omo-opencode/src/shared/plugin-identity.ts
3173
- var LOG_FILENAME = "oh-my-opencode.log", CACHE_DIR_NAME = "oh-my-opencode";
3173
+ var PUBLISHED_PACKAGE_NAME = "oh-my-openagent", LOG_FILENAME = "oh-my-opencode.log", CACHE_DIR_NAME = "oh-my-opencode";
3174
3174
  var init_plugin_identity = () => {};
3175
3175
 
3176
3176
  // packages/omo-opencode/src/shared/logger.ts
@@ -59867,6 +59867,7 @@ var init_injector = __esm(() => {
59867
59867
  var init_hook_message_injector = __esm(() => {
59868
59868
  init_injector();
59869
59869
  init_constants2();
59870
+ init_id_generation();
59870
59871
  });
59871
59872
 
59872
59873
  // packages/omo-opencode/src/shared/opencode-message-dir.ts
@@ -68205,6 +68206,25 @@ var init_model_catalog = __esm(() => {
68205
68206
  OmoModelCatalogLayerSchema = record(string2(), OmoModelCatalogEntryLayerSchema);
68206
68207
  });
68207
68208
 
68209
+ // packages/omo-config-core/src/schema/model-profile.ts
68210
+ function isRecord8(value) {
68211
+ return typeof value === "object" && value !== null && !Array.isArray(value);
68212
+ }
68213
+ var OmoModelProfileInputSchema, OmoModelProfileSchema, OmoModelProfilesSchema, OmoModelProfileLayerInputSchema, OmoModelProfileLayerSchema, OmoModelProfilesLayerSchema;
68214
+ var init_model_profile = __esm(() => {
68215
+ init_zod();
68216
+ init_fallback_models();
68217
+ OmoModelProfileInputSchema = object({
68218
+ display_name: string2().optional(),
68219
+ models: array(union([string2(), OmoFallbackModelObjectSchema])).optional()
68220
+ }).strict();
68221
+ OmoModelProfileSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileInputSchema);
68222
+ OmoModelProfilesSchema = record(string2(), OmoModelProfileSchema);
68223
+ OmoModelProfileLayerInputSchema = OmoModelProfileInputSchema.partial();
68224
+ OmoModelProfileLayerSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileLayerInputSchema);
68225
+ OmoModelProfilesLayerSchema = record(string2(), OmoModelProfileLayerSchema);
68226
+ });
68227
+
68208
68228
  // packages/omo-config-core/src/schema/task.ts
68209
68229
  import { availableParallelism } from "os";
68210
68230
  function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism) {
@@ -68397,6 +68417,7 @@ var init_config = __esm(() => {
68397
68417
  init_git_master();
68398
68418
  init_memory();
68399
68419
  init_model_catalog();
68420
+ init_model_profile();
68400
68421
  init_task();
68401
68422
  init_team();
68402
68423
  init_telemetry();
@@ -68410,6 +68431,8 @@ var init_config = __esm(() => {
68410
68431
  task: OmoTaskSettingsLayerSchema.optional(),
68411
68432
  teams: OmoTeamsConfigLayerSchema.optional(),
68412
68433
  models: OmoModelCatalogLayerSchema.optional(),
68434
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
68435
+ model_profile: string2().optional(),
68413
68436
  memory: OmoMemorySettingsLayerSchema.optional(),
68414
68437
  telemetry: OmoTelemetrySettingsLayerSchema.optional()
68415
68438
  }).strict();
@@ -68421,6 +68444,8 @@ var init_config = __esm(() => {
68421
68444
  task: OmoTaskSettingsLayerSchema.optional(),
68422
68445
  teams: OmoTeamsConfigLayerSchema.optional(),
68423
68446
  models: OmoModelCatalogLayerSchema.optional(),
68447
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
68448
+ model_profile: string2().optional(),
68424
68449
  memory: OmoMemorySettingsLayerSchema.optional(),
68425
68450
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
68426
68451
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -68436,6 +68461,8 @@ var init_config = __esm(() => {
68436
68461
  task: OmoTaskSettingsSchema.optional(),
68437
68462
  teams: OmoTeamsConfigSchema.optional(),
68438
68463
  models: OmoModelCatalogSchema.optional(),
68464
+ model_profiles: OmoModelProfilesSchema.optional(),
68465
+ model_profile: string2().optional(),
68439
68466
  memory: OmoMemorySettingsSchema.optional(),
68440
68467
  telemetry: OmoTelemetrySettingsSchema.optional(),
68441
68468
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -68454,6 +68481,8 @@ var init_config = __esm(() => {
68454
68481
  task: OmoTaskSettingsLayerSchema.optional(),
68455
68482
  teams: OmoTeamsConfigLayerSchema.optional(),
68456
68483
  models: OmoModelCatalogLayerSchema.optional(),
68484
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
68485
+ model_profile: string2().optional(),
68457
68486
  memory: OmoMemorySettingsLayerSchema.optional(),
68458
68487
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
68459
68488
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -68476,6 +68505,7 @@ var init_schema = __esm(() => {
68476
68505
  init_harness();
68477
68506
  init_memory();
68478
68507
  init_model_catalog();
68508
+ init_model_profile();
68479
68509
  init_model_ref();
68480
68510
  init_task();
68481
68511
  init_team();
@@ -68723,29 +68753,27 @@ function validationDiagnostic(path, issues) {
68723
68753
  function unrecognizedKeyIssues(issues) {
68724
68754
  return issues.flatMap((issue) => issue.code === "unrecognized_keys" ? [{ keys: issue.keys, path: issue.path.map((segment) => String(segment)) }] : []);
68725
68755
  }
68726
- function hasUnsafeUnrecognizedKey(parsed, issues) {
68727
- if (issues.some((issue) => issue.keys.some((key) => isUnsafeObjectKey2(key))))
68728
- return true;
68729
- return hasTamperedPrototype(parsed);
68756
+ function hasUnsafeUnrecognizedKey(issues) {
68757
+ return issues.some((issue) => issue.keys.some((key) => isUnsafeObjectKey2(key)));
68730
68758
  }
68731
68759
  function hasTamperedPrototype(value) {
68732
68760
  if (Array.isArray(value))
68733
68761
  return value.some((entry) => hasTamperedPrototype(entry));
68734
- if (!isRecord8(value))
68762
+ if (!isRecord9(value))
68735
68763
  return false;
68736
68764
  const prototype = Object.getPrototypeOf(value);
68737
68765
  if (prototype !== Object.prototype && prototype !== null)
68738
68766
  return true;
68739
68767
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
68740
68768
  }
68741
- function isRecord8(value) {
68769
+ function isRecord9(value) {
68742
68770
  return typeof value === "object" && value !== null && !Array.isArray(value);
68743
68771
  }
68744
68772
  function containerAt(record, path) {
68745
68773
  let container = record;
68746
68774
  for (const segment of path) {
68747
68775
  const next = container[segment];
68748
- if (!isRecord8(next))
68776
+ if (!isRecord9(next))
68749
68777
  return null;
68750
68778
  container = next;
68751
68779
  }
@@ -68799,11 +68827,17 @@ function readConfigSource(path, scope, fileSystem) {
68799
68827
  source: { exists: true, loaded: false, path, scope }
68800
68828
  };
68801
68829
  }
68830
+ if (hasTamperedPrototype(parsed.data)) {
68831
+ return {
68832
+ diagnostic: { kind: "validation", message: `Invalid omo config at ${path}: "__proto__" member is not allowed`, path },
68833
+ source: { exists: true, loaded: false, path, scope }
68834
+ };
68835
+ }
68802
68836
  const parsedRecord = toRecord2(parsed.data);
68803
68837
  const validation = OmoConfigLayerSchema.safeParse(parsed.data);
68804
68838
  if (!validation.success) {
68805
68839
  const unrecognized = unrecognizedKeyIssues(validation.error.issues);
68806
- if (unrecognized.length > 0 && hasUnsafeUnrecognizedKey(parsed.data, unrecognized)) {
68840
+ if (hasUnsafeUnrecognizedKey(unrecognized)) {
68807
68841
  return {
68808
68842
  diagnostic: validationDiagnostic(path, validation.error.issues),
68809
68843
  source: { exists: true, loaded: false, path, scope }
@@ -69001,6 +69035,38 @@ function resolveCategoryDefinition(definition, catalog, cycleNames) {
69001
69035
  ...definition.fallback_models === undefined ? {} : { fallback_models: resolveFallbackModels(definition.fallback_models, catalog, cycleNames) }
69002
69036
  };
69003
69037
  }
69038
+ function resolveModelProfile(definition, catalog, cycleNames) {
69039
+ return {
69040
+ ...definition,
69041
+ ...definition.models === undefined ? {} : { models: definition.models.map((entry) => resolveModelEntry(entry, catalog, cycleNames)) }
69042
+ };
69043
+ }
69044
+ function profileShadowDiagnostics(view) {
69045
+ if (view.model_profiles === undefined || view.models === undefined)
69046
+ return [];
69047
+ return Object.keys(view.model_profiles).flatMap((name) => view.models?.[name] === undefined ? [] : [{
69048
+ kind: "validation",
69049
+ message: `Model profile "${name}" shadows a model catalog entry of the same name`,
69050
+ path: `model_profiles.${name}`
69051
+ }]);
69052
+ }
69053
+ function profileSpliceDiagnostics(section, definitions, profileNames) {
69054
+ if (definitions === undefined || profileNames.size === 0)
69055
+ return [];
69056
+ return Object.entries(definitions).flatMap(([name, definition]) => (definition.models ?? []).flatMap((entry, index) => typeof entry !== "string" || !profileNames.has(entry) ? [] : [{
69057
+ kind: "validation",
69058
+ message: `"${entry}" is a model profile; splicing a profile into a category chain is not supported yet`,
69059
+ path: `${section}.${name}.models.${index}`
69060
+ }]));
69061
+ }
69062
+ function modelProfileDiagnostics(view) {
69063
+ const profileNames = new Set(Object.keys(view.model_profiles ?? {}));
69064
+ return [
69065
+ ...profileShadowDiagnostics(view),
69066
+ ...profileSpliceDiagnostics("categories", view.categories, profileNames),
69067
+ ...profileSpliceDiagnostics("agents", view.agents, profileNames)
69068
+ ];
69069
+ }
69004
69070
  function cycleDiagnostics(catalog) {
69005
69071
  if (catalog === undefined)
69006
69072
  return [];
@@ -69011,9 +69077,10 @@ function cycleDiagnostics(catalog) {
69011
69077
  }));
69012
69078
  }
69013
69079
  function resolveModelReferences(view) {
69014
- const diagnostics = cycleDiagnostics(view.models);
69080
+ const cycles = cycleDiagnostics(view.models);
69081
+ const diagnostics = [...cycles, ...modelProfileDiagnostics(view)];
69015
69082
  const cycleNames = new Set;
69016
- for (const diagnostic of diagnostics) {
69083
+ for (const diagnostic of cycles) {
69017
69084
  const name = diagnostic.path.split(".")[1];
69018
69085
  if (name !== undefined)
69019
69086
  cycleNames.add(name);
@@ -69026,12 +69093,17 @@ function resolveModelReferences(view) {
69026
69093
  name,
69027
69094
  resolveCategoryDefinition(definition, view.models, cycleNames)
69028
69095
  ]));
69096
+ const modelProfiles = view.model_profiles === undefined ? undefined : Object.fromEntries(Object.entries(view.model_profiles).map(([name, definition]) => [
69097
+ name,
69098
+ resolveModelProfile(definition, view.models, cycleNames)
69099
+ ]));
69029
69100
  return {
69030
69101
  diagnostics,
69031
69102
  view: {
69032
69103
  ...view,
69033
69104
  ...agents === undefined ? {} : { agents },
69034
- ...categories === undefined ? {} : { categories }
69105
+ ...categories === undefined ? {} : { categories },
69106
+ ...modelProfiles === undefined ? {} : { model_profiles: modelProfiles }
69035
69107
  }
69036
69108
  };
69037
69109
  }
@@ -70455,7 +70527,7 @@ var require_picocolors = __commonJS(function(exports, module) {
70455
70527
  });
70456
70528
 
70457
70529
  // packages/omo-opencode/src/cli/doctor/framework/constants.ts
70458
- var import_picocolors, SYMBOLS, STATUS_COLORS, CHECK_IDS, CHECK_NAMES;
70530
+ var import_picocolors, SYMBOLS, STATUS_COLORS, CHECK_IDS, CHECK_NAMES, UPDATE_COMMANDS;
70459
70531
  var init_constants5 = __esm(() => {
70460
70532
  init_shared();
70461
70533
  import_picocolors = __toESM(require_picocolors(), 1);
@@ -70494,6 +70566,10 @@ var init_constants5 = __esm(() => {
70494
70566
  [CHECK_IDS.TEAM_MODE]: "Team Mode",
70495
70567
  [CHECK_IDS.CODEX]: "Codex"
70496
70568
  };
70569
+ UPDATE_COMMANDS = {
70570
+ opencode: `bunx ${PUBLISHED_PACKAGE_NAME} install`,
70571
+ codex: "npx lazycodex-ai install --no-tui --codex-autonomous"
70572
+ };
70497
70573
  });
70498
70574
 
70499
70575
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-cache.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
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",
@@ -184,7 +184,7 @@
184
184
  "zod": "^4.4.3"
185
185
  },
186
186
  "devDependencies": {
187
- "@code-yeongyu/senpi": "2026.9.9-2",
187
+ "@code-yeongyu/senpi": "2026.9.10-2",
188
188
  "@oh-my-opencode/agents-md-core": "workspace:*",
189
189
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
190
190
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -225,18 +225,18 @@
225
225
  "typescript": "^7.0.2"
226
226
  },
227
227
  "optionalDependencies": {
228
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.51",
229
- "oh-my-opencode-darwin-x64": "5.0.0-beta.51",
230
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.51",
231
- "oh-my-opencode-linux-arm64": "5.0.0-beta.51",
232
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.51",
233
- "oh-my-opencode-linux-x64": "5.0.0-beta.51",
234
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.51",
235
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.51",
236
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.51",
237
- "oh-my-opencode-windows-arm64": "5.0.0-beta.51",
238
- "oh-my-opencode-windows-x64": "5.0.0-beta.51",
239
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.51"
228
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.53",
229
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.53",
230
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.53",
231
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.53",
232
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.53",
233
+ "oh-my-opencode-linux-x64": "5.0.0-beta.53",
234
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.53",
235
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.53",
236
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.53",
237
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.53",
238
+ "oh-my-opencode-windows-x64": "5.0.0-beta.53",
239
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.53"
240
240
  },
241
241
  "overrides": {
242
242
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -6833,8 +6833,7 @@ async function validateExistingOwner(paths, pingOwner) {
6833
6833
  if (isProcessAlive2(owner.pid))
6834
6834
  throw new DaemonStartupDeferredError("owner_pid_live_unreachable");
6835
6835
  const reread = readDaemonOwner(paths);
6836
- const endpoint = endpointIdentity(owner.endpoint.path);
6837
- if (!reread || reread.nonce !== owner.nonce || !sameEndpoint(endpoint, owner.endpoint)) {
6836
+ if (!reread || !sameOwner(reread, owner)) {
6838
6837
  throw new DaemonStartupDeferredError("owner_changed_during_cleanup");
6839
6838
  }
6840
6839
  cleanupDeadOwner(paths, owner);
@@ -107,9 +107,9 @@ async function validateExistingOwner(paths, pingOwner) {
107
107
  continue;
108
108
  if (isProcessAlive(owner.pid))
109
109
  throw new DaemonStartupDeferredError("owner_pid_live_unreachable");
110
+ // Compare the two file reads only: a live socket stat drifts across reboots (st_dev, tmpfs) while the pid is dead.
110
111
  const reread = readDaemonOwner(paths);
111
- const endpoint = endpointIdentity(owner.endpoint.path);
112
- if (!reread || reread.nonce !== owner.nonce || !sameEndpoint(endpoint, owner.endpoint)) {
112
+ if (!reread || !sameOwner(reread, owner)) {
113
113
  throw new DaemonStartupDeferredError("owner_changed_during_cleanup");
114
114
  }
115
115
  cleanupDeadOwner(paths, owner);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.51) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
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 5.0.0-beta.51) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
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",
@@ -5,7 +5,7 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
5
5
  import { homedir } from "node:os";
6
6
  import { dirname, join } from "node:path";
7
7
  var BASH_TOOL_NAME = "Bash";
8
- var REMINDER = "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations.";
8
+ var REMINDER = "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations. " + "In code mode, these tools may be deferred: inspect ALL_TOOLS with exec to discover the actual git_bash run, diagnose, and which_bash tool names, then invoke the matching entries through the tools object inside exec before treating git_bash as unavailable. Do not issue deferred names as top-level tool calls.";
9
9
  function parsePreToolUsePayload(raw) {
10
10
  if (raw.trim().length === 0)
11
11
  return null;
@@ -2,7 +2,8 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
4
  const BASH_TOOL_NAME = "Bash";
5
- const REMINDER = "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations.";
5
+ const REMINDER = "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations. " +
6
+ "In code mode, these tools may be deferred: inspect ALL_TOOLS with exec to discover the actual git_bash run, diagnose, and which_bash tool names, then invoke the matching entries through the tools object inside exec before treating git_bash as unavailable. Do not issue deferred names as top-level tool calls.";
6
7
  export function parsePreToolUsePayload(raw) {
7
8
  if (raw.trim().length === 0)
8
9
  return null;
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.51) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.51) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.53) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
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,
@@ -37,7 +37,8 @@ interface PreToolUseHookOutput {
37
37
 
38
38
  const BASH_TOOL_NAME = "Bash";
39
39
  const REMINDER =
40
- "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations.";
40
+ "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations. " +
41
+ "In code mode, these tools may be deferred: inspect ALL_TOOLS with exec to discover the actual git_bash run, diagnose, and which_bash tool names, then invoke the matching entries through the tools object inside exec before treating git_bash as unavailable. Do not issue deferred names as top-level tool calls.";
41
42
 
42
43
  export function parsePreToolUsePayload(raw: string): PreToolUsePayload | null {
43
44
  if (raw.trim().length === 0) return null;
@@ -81,8 +81,7 @@ describe("applyGitBashPreToolUseReminder", () => {
81
81
  const parsed = JSON.parse(output);
82
82
  expect(parsed.hookSpecificOutput).toEqual({
83
83
  hookEventName: "PreToolUse",
84
- additionalContext:
85
- "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations.",
84
+ additionalContext: expect.any(String),
86
85
  });
87
86
  });
88
87
 
@@ -96,7 +95,7 @@ describe("applyGitBashPreToolUseReminder", () => {
96
95
  const second = applyGitBashPreToolUseReminder(payload, { env: windowsEnv(), platform: "linux", pluginDataRoot });
97
96
 
98
97
  // then
99
- expect(first).toContain("git_bash");
98
+ expect(JSON.parse(first).hookSpecificOutput.hookEventName).toBe("PreToolUse");
100
99
  expect(second).toBe("");
101
100
  });
102
101
 
@@ -148,9 +147,9 @@ describe("applyGitBashPostCompactReset", () => {
148
147
  });
149
148
 
150
149
  // then
151
- expect(first).toContain("git_bash");
150
+ expect(JSON.parse(first).hookSpecificOutput.hookEventName).toBe("PreToolUse");
152
151
  expect(second).toBe("");
153
- expect(afterCompact).toContain("git_bash");
152
+ expect(JSON.parse(afterCompact).hookSpecificOutput.hookEventName).toBe("PreToolUse");
154
153
  });
155
154
  });
156
155
 
@@ -169,7 +168,7 @@ describe("runGitBashHookCli", () => {
169
168
  });
170
169
 
171
170
  // then
172
- expect(capture.read()).toContain("git_bash MCP");
171
+ expect(JSON.parse(capture.read()).hookSpecificOutput.hookEventName).toBe("PreToolUse");
173
172
  });
174
173
 
175
174
  it("#given PostCompact stdin #when CLI hook runs #then it resets the one-shot reminder", async () => {
@@ -190,6 +189,6 @@ describe("runGitBashHookCli", () => {
190
189
 
191
190
  // then
192
191
  expect(capture.read()).toBe("");
193
- expect(afterCompact).toContain("git_bash");
192
+ expect(JSON.parse(afterCompact).hookSpecificOutput.hookEventName).toBe("PreToolUse");
194
193
  });
195
194
  });
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.51) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.0-beta.51",
4
- "inputDigest": "sha256:5ff68702440d0c19cf7d59a8fb7e953983cdae7c9228a0fae86af5e289116416",
3
+ "version": "5.0.0-beta.53",
4
+ "inputDigest": "sha256:f202c8adb130249d2a7745db228ccd528b47f0cfeaeb5db5c99ab13d9b76af00",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.0.0-beta.51) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) 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 5.0.0-beta.51) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.53) 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": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.51) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.53) 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 5.0.0-beta.51) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.53) 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 5.0.0-beta.51) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.53) 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 5.0.0-beta.51) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.53) 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": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
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",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.51) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.53) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.51) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.53) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.51) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.53) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.51",
3
+ "version": "5.0.0-beta.53",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.53) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }