oh-my-openagent 5.0.0-beta.64 → 5.0.0-beta.65

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 (62) hide show
  1. package/dist/cli/index.js +21 -16
  2. package/dist/cli-node/index.js +21 -16
  3. package/dist/hooks/plan-format-validator/hook.d.ts +19 -0
  4. package/dist/index.js +120 -32
  5. package/dist/skills/ulw-plan/references/full-workflow.md +1 -0
  6. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  7. package/dist/tui.js +7 -2
  8. package/package.json +13 -13
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +6 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  32. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  33. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  35. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/package-lock.json +12 -12
  58. package/packages/omo-codex/plugin/package.json +1 -1
  59. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  60. package/packages/omo-codex/scripts/install-dist/install-local.mjs +8 -3
  61. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -0
  62. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
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.64",
67
+ version: "5.0.0-beta.65",
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",
@@ -285,18 +285,18 @@ var init_package = __esm(() => {
285
285
  typescript: "^7.0.2"
286
286
  },
287
287
  optionalDependencies: {
288
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.64",
289
- "oh-my-opencode-darwin-x64": "5.0.0-beta.64",
290
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.64",
291
- "oh-my-opencode-linux-arm64": "5.0.0-beta.64",
292
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.64",
293
- "oh-my-opencode-linux-x64": "5.0.0-beta.64",
294
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.64",
295
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.64",
296
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.64",
297
- "oh-my-opencode-windows-arm64": "5.0.0-beta.64",
298
- "oh-my-opencode-windows-x64": "5.0.0-beta.64",
299
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.64"
288
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.65",
289
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.65",
290
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.65",
291
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.65",
292
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.65",
293
+ "oh-my-opencode-linux-x64": "5.0.0-beta.65",
294
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.65",
295
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.65",
296
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.65",
297
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.65",
298
+ "oh-my-opencode-windows-x64": "5.0.0-beta.65",
299
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.65"
300
300
  },
301
301
  overrides: {
302
302
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -73073,7 +73073,7 @@ var init_format_on_mutation = __esm(() => {
73073
73073
  });
73074
73074
 
73075
73075
  // packages/omo-config-core/src/schema/config.ts
73076
- var OmoOpenCodeHarnessConfigSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
73076
+ var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
73077
73077
  var init_config = __esm(() => {
73078
73078
  init_zod();
73079
73079
  init_agent();
@@ -73087,6 +73087,7 @@ var init_config = __esm(() => {
73087
73087
  init_telemetry();
73088
73088
  init_format_on_mutation();
73089
73089
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
73090
+ OmoDisabledSkillsSchema = array(string2());
73090
73091
  OmoTypedHarnessConfigSchema = object({
73091
73092
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
73092
73093
  categories: OmoCategoriesConfigSchema.optional(),
@@ -73098,7 +73099,8 @@ var init_config = __esm(() => {
73098
73099
  model_profiles: OmoModelProfilesLayerSchema.optional(),
73099
73100
  model_profile: string2().optional(),
73100
73101
  memory: OmoMemorySettingsLayerSchema.optional(),
73101
- telemetry: OmoTelemetrySettingsLayerSchema.optional()
73102
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73103
+ disabled_skills: OmoDisabledSkillsSchema.optional()
73102
73104
  }).strict();
73103
73105
  OmoConfigProfileSchema = object({
73104
73106
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -73112,6 +73114,7 @@ var init_config = __esm(() => {
73112
73114
  model_profile: string2().optional(),
73113
73115
  memory: OmoMemorySettingsLayerSchema.optional(),
73114
73116
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73117
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73115
73118
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73116
73119
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73117
73120
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -73129,6 +73132,7 @@ var init_config = __esm(() => {
73129
73132
  model_profile: string2().optional(),
73130
73133
  memory: OmoMemorySettingsSchema.optional(),
73131
73134
  telemetry: OmoTelemetrySettingsSchema.optional(),
73135
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73132
73136
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73133
73137
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73134
73138
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -73149,6 +73153,7 @@ var init_config = __esm(() => {
73149
73153
  model_profile: string2().optional(),
73150
73154
  memory: OmoMemorySettingsLayerSchema.optional(),
73151
73155
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73156
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73152
73157
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73153
73158
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73154
73159
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -84542,7 +84547,7 @@ var package_default2;
84542
84547
  var init_package2 = __esm(() => {
84543
84548
  package_default2 = {
84544
84549
  name: "@oh-my-opencode/omo-codex",
84545
- version: "5.0.0-beta.64",
84550
+ version: "5.0.0-beta.65",
84546
84551
  type: "module",
84547
84552
  private: true,
84548
84553
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.0.0-beta.64",
68
+ version: "5.0.0-beta.65",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -286,18 +286,18 @@ var init_package = __esm(() => {
286
286
  typescript: "^7.0.2"
287
287
  },
288
288
  optionalDependencies: {
289
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.64",
290
- "oh-my-opencode-darwin-x64": "5.0.0-beta.64",
291
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.64",
292
- "oh-my-opencode-linux-arm64": "5.0.0-beta.64",
293
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.64",
294
- "oh-my-opencode-linux-x64": "5.0.0-beta.64",
295
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.64",
296
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.64",
297
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.64",
298
- "oh-my-opencode-windows-arm64": "5.0.0-beta.64",
299
- "oh-my-opencode-windows-x64": "5.0.0-beta.64",
300
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.64"
289
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.65",
290
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.65",
291
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.65",
292
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.65",
293
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.65",
294
+ "oh-my-opencode-linux-x64": "5.0.0-beta.65",
295
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.65",
296
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.65",
297
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.65",
298
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.65",
299
+ "oh-my-opencode-windows-x64": "5.0.0-beta.65",
300
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.65"
301
301
  },
302
302
  overrides: {
303
303
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -73152,7 +73152,7 @@ var init_format_on_mutation = __esm(() => {
73152
73152
  });
73153
73153
 
73154
73154
  // packages/omo-config-core/src/schema/config.ts
73155
- var OmoOpenCodeHarnessConfigSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
73155
+ var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
73156
73156
  var init_config = __esm(() => {
73157
73157
  init_zod();
73158
73158
  init_agent();
@@ -73166,6 +73166,7 @@ var init_config = __esm(() => {
73166
73166
  init_telemetry();
73167
73167
  init_format_on_mutation();
73168
73168
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
73169
+ OmoDisabledSkillsSchema = array(string2());
73169
73170
  OmoTypedHarnessConfigSchema = object({
73170
73171
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
73171
73172
  categories: OmoCategoriesConfigSchema.optional(),
@@ -73177,7 +73178,8 @@ var init_config = __esm(() => {
73177
73178
  model_profiles: OmoModelProfilesLayerSchema.optional(),
73178
73179
  model_profile: string2().optional(),
73179
73180
  memory: OmoMemorySettingsLayerSchema.optional(),
73180
- telemetry: OmoTelemetrySettingsLayerSchema.optional()
73181
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73182
+ disabled_skills: OmoDisabledSkillsSchema.optional()
73181
73183
  }).strict();
73182
73184
  OmoConfigProfileSchema = object({
73183
73185
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -73191,6 +73193,7 @@ var init_config = __esm(() => {
73191
73193
  model_profile: string2().optional(),
73192
73194
  memory: OmoMemorySettingsLayerSchema.optional(),
73193
73195
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73196
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73194
73197
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73195
73198
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73196
73199
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -73208,6 +73211,7 @@ var init_config = __esm(() => {
73208
73211
  model_profile: string2().optional(),
73209
73212
  memory: OmoMemorySettingsSchema.optional(),
73210
73213
  telemetry: OmoTelemetrySettingsSchema.optional(),
73214
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73211
73215
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73212
73216
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73213
73217
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -73228,6 +73232,7 @@ var init_config = __esm(() => {
73228
73232
  model_profile: string2().optional(),
73229
73233
  memory: OmoMemorySettingsLayerSchema.optional(),
73230
73234
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73235
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
73231
73236
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
73232
73237
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
73233
73238
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -84621,7 +84626,7 @@ var package_default2;
84621
84626
  var init_package2 = __esm(() => {
84622
84627
  package_default2 = {
84623
84628
  name: "@oh-my-opencode/omo-codex",
84624
- version: "5.0.0-beta.64",
84629
+ version: "5.0.0-beta.65",
84625
84630
  type: "module",
84626
84631
  private: true,
84627
84632
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -1,4 +1,22 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
+ /**
3
+ * The five Effort bands the plan template offers. Effort is a size signal, never a wall-clock
4
+ * estimate: a plan that says "200 hours" is model prose, not a measurement.
5
+ */
6
+ export declare const PLAN_EFFORT_BANDS: readonly ["Quick", "Short", "Medium", "Large", "XL"];
7
+ export type PlanEffortBand = (typeof PLAN_EFFORT_BANDS)[number];
8
+ /** Maps a written duration ("200 hours", "3 days", "2-3 weeks") to the band that bounds it. */
9
+ export declare function effortBandForDuration(value: string): PlanEffortBand | null;
10
+ type EffortNormalization = {
11
+ readonly content: string;
12
+ readonly original: string;
13
+ readonly band: PlanEffortBand;
14
+ };
15
+ /**
16
+ * Rewrites an `**Effort:**` value that carries a duration to the bounding band. Band values,
17
+ * localized labels, and anything without a number+unit are left alone.
18
+ */
19
+ export declare function normalizePlanEffort(content: string): EffortNormalization | null;
2
20
  /**
3
21
  * Programmatic plan format validator.
4
22
  *
@@ -19,3 +37,4 @@ export declare function createPlanFormatValidatorHook(_ctx: PluginInput): {
19
37
  metadata: unknown;
20
38
  }) => Promise<void>;
21
39
  };
40
+ export {};
package/dist/index.js CHANGED
@@ -23114,6 +23114,7 @@ var OmoFormatOnMutationSchema = OmoFormatOnMutationLayerSchema.extend({
23114
23114
 
23115
23115
  // packages/omo-config-core/src/schema/config.ts
23116
23116
  var OmoOpenCodeHarnessConfigSchema = z14.record(z14.string(), z14.unknown());
23117
+ var OmoDisabledSkillsSchema = z14.array(z14.string());
23117
23118
  var OmoTypedHarnessConfigSchema = z14.object({
23118
23119
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
23119
23120
  categories: OmoCategoriesConfigSchema.optional(),
@@ -23125,7 +23126,8 @@ var OmoTypedHarnessConfigSchema = z14.object({
23125
23126
  model_profiles: OmoModelProfilesLayerSchema.optional(),
23126
23127
  model_profile: z14.string().optional(),
23127
23128
  memory: OmoMemorySettingsLayerSchema.optional(),
23128
- telemetry: OmoTelemetrySettingsLayerSchema.optional()
23129
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
23130
+ disabled_skills: OmoDisabledSkillsSchema.optional()
23129
23131
  }).strict();
23130
23132
  var OmoConfigProfileSchema = z14.object({
23131
23133
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -23139,6 +23141,7 @@ var OmoConfigProfileSchema = z14.object({
23139
23141
  model_profile: z14.string().optional(),
23140
23142
  memory: OmoMemorySettingsLayerSchema.optional(),
23141
23143
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
23144
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
23142
23145
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
23143
23146
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
23144
23147
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -23156,6 +23159,7 @@ var OmoConfigSchema = z14.object({
23156
23159
  model_profile: z14.string().optional(),
23157
23160
  memory: OmoMemorySettingsSchema.optional(),
23158
23161
  telemetry: OmoTelemetrySettingsSchema.optional(),
23162
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
23159
23163
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
23160
23164
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
23161
23165
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -23176,6 +23180,7 @@ var OmoConfigLayerSchema = z14.object({
23176
23180
  model_profile: z14.string().optional(),
23177
23181
  memory: OmoMemorySettingsLayerSchema.optional(),
23178
23182
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
23183
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
23179
23184
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
23180
23185
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
23181
23186
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -96510,7 +96515,7 @@ function getCachedVersion(options = {}) {
96510
96515
  // package.json
96511
96516
  var package_default = {
96512
96517
  name: "oh-my-opencode",
96513
- version: "5.0.0-beta.64",
96518
+ version: "5.0.0-beta.65",
96514
96519
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
96515
96520
  main: "./dist/index.js",
96516
96521
  types: "dist/index.d.ts",
@@ -96731,18 +96736,18 @@ var package_default = {
96731
96736
  typescript: "^7.0.2"
96732
96737
  },
96733
96738
  optionalDependencies: {
96734
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.64",
96735
- "oh-my-opencode-darwin-x64": "5.0.0-beta.64",
96736
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.64",
96737
- "oh-my-opencode-linux-arm64": "5.0.0-beta.64",
96738
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.64",
96739
- "oh-my-opencode-linux-x64": "5.0.0-beta.64",
96740
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.64",
96741
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.64",
96742
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.64",
96743
- "oh-my-opencode-windows-arm64": "5.0.0-beta.64",
96744
- "oh-my-opencode-windows-x64": "5.0.0-beta.64",
96745
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.64"
96739
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.65",
96740
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.65",
96741
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.65",
96742
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.65",
96743
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.65",
96744
+ "oh-my-opencode-linux-x64": "5.0.0-beta.65",
96745
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.65",
96746
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.65",
96747
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.65",
96748
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.65",
96749
+ "oh-my-opencode-windows-x64": "5.0.0-beta.65",
96750
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.65"
96746
96751
  },
96747
96752
  overrides: {
96748
96753
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -122090,7 +122095,7 @@ function createNotepadWriteGuardHook() {
122090
122095
  };
122091
122096
  }
122092
122097
  // packages/omo-opencode/src/hooks/plan-format-validator/hook.ts
122093
- import { existsSync as existsSync83, readFileSync as readFileSync56 } from "fs";
122098
+ import { existsSync as existsSync83, readFileSync as readFileSync56, writeFileSync as writeFileSync21 } from "fs";
122094
122099
  import { resolve as resolve24 } from "path";
122095
122100
  init_logger2();
122096
122101
  var WRITE_TOOLS = new Set(["Write", "Edit", "write", "edit"]);
@@ -122101,6 +122106,79 @@ var TOPLEVEL_CHECKBOX = /^[-*]\s*\[[ xX]?\]/;
122101
122106
  var TODO_TASK = /^- \[[ xX]\] [1-9]\d*\. .+$/;
122102
122107
  var FINAL_WAVE_TASK = /^- \[[ xX]\] F[1-9]\d*\. .+$/i;
122103
122108
  var FENCE_PATTERN2 = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
122109
+ var EFFORT_LINE = /^(\*\*Effort:\*\*[ \t]*)(.*)$/;
122110
+ var DURATION_VALUE = /(\d+(?:[.,]\d+)?)\s*(?:-|\u2013|to)?\s*(\d+(?:[.,]\d+)?)?\s*(min(?:ute)?s?|h(?:ou)?rs?|d(?:ay)?s?|w(?:ee)?ks?|mo(?:nth)?s?)\b/i;
122111
+ var HOURS_PER_UNIT = {
122112
+ min: 1 / 60,
122113
+ h: 1,
122114
+ d: 8,
122115
+ w: 40,
122116
+ mo: 160
122117
+ };
122118
+ var BAND_UPPER_BOUND_HOURS = [
122119
+ ["Quick", 1],
122120
+ ["Short", 4],
122121
+ ["Medium", 16],
122122
+ ["Large", 40]
122123
+ ];
122124
+ function unitKey(unit) {
122125
+ const lower = unit.toLowerCase();
122126
+ if (lower.startsWith("mi"))
122127
+ return "min";
122128
+ if (lower.startsWith("mo"))
122129
+ return "mo";
122130
+ return lower.charAt(0);
122131
+ }
122132
+ function effortBandForDuration(value) {
122133
+ const match = value.match(DURATION_VALUE);
122134
+ if (match === null)
122135
+ return null;
122136
+ const upper = (match[2] ?? match[1] ?? "").replace(",", ".");
122137
+ const unit = match[3] ?? "";
122138
+ const hours = Number.parseFloat(upper) * (HOURS_PER_UNIT[unitKey(unit)] ?? 1);
122139
+ if (!Number.isFinite(hours))
122140
+ return null;
122141
+ for (const [band, bound] of BAND_UPPER_BOUND_HOURS) {
122142
+ if (hours <= bound)
122143
+ return band;
122144
+ }
122145
+ return "XL";
122146
+ }
122147
+ function normalizePlanEffort(content) {
122148
+ const lines = content.split(/\r?\n/);
122149
+ for (let index = 0;index < lines.length; index += 1) {
122150
+ const line = lines[index] ?? "";
122151
+ const match = line.match(EFFORT_LINE);
122152
+ if (match === null)
122153
+ continue;
122154
+ const prefix = match[1] ?? "";
122155
+ const value = (match[2] ?? "").trim();
122156
+ const band = effortBandForDuration(value);
122157
+ if (band === null)
122158
+ return null;
122159
+ lines[index] = `${prefix}${band}`;
122160
+ const newline = content.includes(`\r
122161
+ `) ? `\r
122162
+ ` : `
122163
+ `;
122164
+ return { content: lines.join(newline), original: value, band };
122165
+ }
122166
+ return null;
122167
+ }
122168
+ function buildEffortWarning(normalized) {
122169
+ return [
122170
+ "",
122171
+ "<plan-format-warning>",
122172
+ `Effort was written as a duration (\`${normalized.original}\`) and has been replaced with the band \`${normalized.band}\`.`,
122173
+ "Effort is a size band, never a wall-clock estimate. Use exactly one of:",
122174
+ " Quick (single edit, minutes of agent work) | Short (one focused change, a few files)",
122175
+ " | Medium (multi-file feature in one session) | Large (several waves, one long session)",
122176
+ " | XL (multi-session or architectural work).",
122177
+ "Size is communicated by the counted todo rows; do not write hours or days.",
122178
+ "</plan-format-warning>"
122179
+ ].join(`
122180
+ `);
122181
+ }
122104
122182
  function analyzeStructuredSections(content) {
122105
122183
  const lines = content.split(/\r?\n/);
122106
122184
  const sections = [];
@@ -122217,7 +122295,17 @@ function createPlanFormatValidatorHook(_ctx) {
122217
122295
  const resolvedPath = resolve24(_ctx.directory, filePath);
122218
122296
  if (!existsSync83(resolvedPath))
122219
122297
  return;
122220
- const content = readFileSync56(resolvedPath, "utf-8");
122298
+ let content = readFileSync56(resolvedPath, "utf-8");
122299
+ const effort = normalizePlanEffort(content);
122300
+ if (effort !== null) {
122301
+ content = effort.content;
122302
+ writeFileSync21(resolvedPath, content, "utf-8");
122303
+ log2(`[plan-format-validator] Plan ${filePath}: Effort "${effort.original}" normalized to ${effort.band}`, {
122304
+ sessionID: input.sessionID,
122305
+ filePath
122306
+ });
122307
+ output.output = `${output.output}${buildEffortWarning(effort)}`;
122308
+ }
122221
122309
  const formatStats = analyzeStructuredSections(content);
122222
122310
  if (!formatStats.recognized)
122223
122311
  return;
@@ -127044,7 +127132,7 @@ import { pathToFileURL } from "url";
127044
127132
 
127045
127133
  // packages/omo-opencode/src/tools/look-at/image-converter.ts
127046
127134
  import * as childProcess2 from "child_process";
127047
- import { existsSync as existsSync93, mkdtempSync, readFileSync as readFileSync60, rmSync as rmSync5, unlinkSync as unlinkSync15, writeFileSync as writeFileSync21 } from "fs";
127135
+ import { existsSync as existsSync93, mkdtempSync, readFileSync as readFileSync60, rmSync as rmSync5, unlinkSync as unlinkSync15, writeFileSync as writeFileSync22 } from "fs";
127048
127136
  import { tmpdir as tmpdir7 } from "os";
127049
127137
  import { dirname as dirname41, join as join112 } from "path";
127050
127138
  var SUPPORTED_FORMATS = new Set([
@@ -127169,7 +127257,7 @@ function convertBase64ImageToJpeg(base64Data, mimeType) {
127169
127257
  try {
127170
127258
  const cleanBase64 = base64Data.replace(/^data:[^;]+;base64,/, "");
127171
127259
  const buffer = Buffer.from(cleanBase64, "base64");
127172
- writeFileSync21(inputPath, buffer);
127260
+ writeFileSync22(inputPath, buffer);
127173
127261
  log2(`[image-converter] Converting Base64 ${mimeType} to JPEG`);
127174
127262
  const outputPath = convertImageToJpeg(inputPath, mimeType);
127175
127263
  tempFiles.push(outputPath);
@@ -131490,7 +131578,7 @@ var TaskDeleteInputSchema = z54.object({
131490
131578
 
131491
131579
  // packages/omo-opencode/src/features/claude-tasks/storage.ts
131492
131580
  import { join as join113, dirname as dirname42, basename as basename18, isAbsolute as isAbsolute17 } from "path";
131493
- import { existsSync as existsSync94, mkdirSync as mkdirSync20, readFileSync as readFileSync62, writeFileSync as writeFileSync22, renameSync as renameSync8, unlinkSync as unlinkSync16, readdirSync as readdirSync25 } from "fs";
131581
+ import { existsSync as existsSync94, mkdirSync as mkdirSync20, readFileSync as readFileSync62, writeFileSync as writeFileSync23, renameSync as renameSync8, unlinkSync as unlinkSync16, readdirSync as readdirSync25 } from "fs";
131494
131582
  import { randomUUID as randomUUID9 } from "crypto";
131495
131583
  function ignoreClaudeTaskStorageError(error) {
131496
131584
  if (error instanceof Error)
@@ -131549,7 +131637,7 @@ function writeJsonAtomic(filePath, data) {
131549
131637
  ensureDir(dir);
131550
131638
  const tempPath = `${filePath}.tmp.${Date.now()}`;
131551
131639
  try {
131552
- writeFileSync22(tempPath, JSON.stringify(data, null, 2), "utf-8");
131640
+ writeFileSync23(tempPath, JSON.stringify(data, null, 2), "utf-8");
131553
131641
  renameSync8(tempPath, filePath);
131554
131642
  } catch (error) {
131555
131643
  try {
@@ -131589,7 +131677,7 @@ async function acquireLock2(dirPath, options = {}) {
131589
131677
  const waitTimeoutMs = options.waitTimeoutMs ?? resolveLockWaitTimeoutMs();
131590
131678
  const baseRetryDelayMs = options.retryDelayMs ?? DEFAULT_LOCK_RETRY_DELAY_MS;
131591
131679
  const createLock = (timestamp) => {
131592
- writeFileSync22(lockPath, JSON.stringify({ id: lockId, timestamp }), {
131680
+ writeFileSync23(lockPath, JSON.stringify({ id: lockId, timestamp }), {
131593
131681
  encoding: "utf-8",
131594
131682
  flag: "wx"
131595
131683
  });
@@ -140758,7 +140846,7 @@ import {
140758
140846
  readFileSync as readFileSync65,
140759
140847
  renameSync as renameSync10,
140760
140848
  unlinkSync as unlinkSync17,
140761
- writeFileSync as writeFileSync24
140849
+ writeFileSync as writeFileSync25
140762
140850
  } from "fs";
140763
140851
  import { basename as basename19, dirname as dirname43, join as join122 } from "path";
140764
140852
 
@@ -140788,7 +140876,7 @@ function getOpenCodeCliConfigDir(env = process.env) {
140788
140876
  }
140789
140877
 
140790
140878
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
140791
- import { chmodSync as chmodSync3, existsSync as existsSync97, readFileSync as readFileSync64, renameSync as renameSync9, writeFileSync as writeFileSync23 } from "fs";
140879
+ import { chmodSync as chmodSync3, existsSync as existsSync97, readFileSync as readFileSync64, renameSync as renameSync9, writeFileSync as writeFileSync24 } from "fs";
140792
140880
  import { join as join121 } from "path";
140793
140881
  var INDEX_FILE_NAME = "index.json";
140794
140882
  function isTokenIndex(value) {
@@ -140816,7 +140904,7 @@ function writeTokenIndex(storageDir, index) {
140816
140904
  try {
140817
140905
  const indexPath = getIndexPath(storageDir);
140818
140906
  const tempPath = `${indexPath}.tmp.${Date.now()}`;
140819
- writeFileSync23(tempPath, JSON.stringify(index, null, 2), { encoding: "utf-8", mode: 384 });
140907
+ writeFileSync24(tempPath, JSON.stringify(index, null, 2), { encoding: "utf-8", mode: 384 });
140820
140908
  chmodSync3(tempPath, 384);
140821
140909
  renameSync9(tempPath, indexPath);
140822
140910
  return true;
@@ -140942,7 +141030,7 @@ function writeTokenFile(filePath, token) {
140942
141030
  mkdirSync21(dir, { recursive: true });
140943
141031
  }
140944
141032
  const tempPath = `${filePath}.tmp.${Date.now()}`;
140945
- writeFileSync24(tempPath, JSON.stringify(token, null, 2), { encoding: "utf-8", mode: 384 });
141033
+ writeFileSync25(tempPath, JSON.stringify(token, null, 2), { encoding: "utf-8", mode: 384 });
140946
141034
  chmodSync4(tempPath, 384);
140947
141035
  renameSync10(tempPath, filePath);
140948
141036
  return true;
@@ -149334,7 +149422,7 @@ import {
149334
149422
  renameSync as renameSync11,
149335
149423
  statSync as statSync14,
149336
149424
  unlinkSync as unlinkSync18,
149337
- writeFileSync as writeFileSync25
149425
+ writeFileSync as writeFileSync26
149338
149426
  } from "fs";
149339
149427
 
149340
149428
  // packages/openclaw-core/src/reply-listener-paths.ts
@@ -149376,7 +149464,7 @@ function ignoreReplyListenerLogError(error) {
149376
149464
  }
149377
149465
  function writeSecureReplyListenerFile(filePath, content) {
149378
149466
  ensureReplyListenerStateDir();
149379
- writeFileSync25(filePath, content, { mode: REPLY_LISTENER_SECURE_FILE_MODE });
149467
+ writeFileSync26(filePath, content, { mode: REPLY_LISTENER_SECURE_FILE_MODE });
149380
149468
  try {
149381
149469
  chmodSync5(filePath, REPLY_LISTENER_SECURE_FILE_MODE);
149382
149470
  } catch (error) {
@@ -149452,7 +149540,7 @@ import { constants as constants23, closeSync as closeSync4, existsSync as exists
149452
149540
  import { randomUUID as randomUUID12 } from "crypto";
149453
149541
 
149454
149542
  // packages/openclaw-core/src/session-registry-storage.ts
149455
- import { existsSync as existsSync101, mkdirSync as mkdirSync24, readFileSync as readFileSync68, writeFileSync as writeFileSync26 } from "fs";
149543
+ import { existsSync as existsSync101, mkdirSync as mkdirSync24, readFileSync as readFileSync68, writeFileSync as writeFileSync27 } from "fs";
149456
149544
  import { dirname as dirname45 } from "path";
149457
149545
  function isSessionMapping(value) {
149458
149546
  if (typeof value !== "object" || value === null)
@@ -149506,13 +149594,13 @@ function rewriteRegistryUnsafe(mappings) {
149506
149594
  ensureRegistryDir();
149507
149595
  const registryPath = getRegistryPath();
149508
149596
  if (mappings.length === 0) {
149509
- writeFileSync26(registryPath, "", { mode: SECURE_FILE_MODE });
149597
+ writeFileSync27(registryPath, "", { mode: SECURE_FILE_MODE });
149510
149598
  return;
149511
149599
  }
149512
149600
  const content = mappings.map((mapping) => JSON.stringify(mapping)).join(`
149513
149601
  `) + `
149514
149602
  `;
149515
- writeFileSync26(registryPath, content, { mode: SECURE_FILE_MODE });
149603
+ writeFileSync27(registryPath, content, { mode: SECURE_FILE_MODE });
149516
149604
  }
149517
149605
 
149518
149606
  // packages/openclaw-core/src/session-registry-lock.ts
@@ -174155,7 +174243,7 @@ var OMO_CODEX_PLUGIN_CACHE_PUBLISHERS = new Set(["sisyphuslabs"]);
174155
174243
  import { join as join135 } from "path";
174156
174244
 
174157
174245
  // packages/utils/src/process-sweep/family-sweeper.ts
174158
- import { existsSync as existsSync109, mkdirSync as mkdirSync25, statSync as statSync16, utimesSync, writeFileSync as writeFileSync27 } from "fs";
174246
+ import { existsSync as existsSync109, mkdirSync as mkdirSync25, statSync as statSync16, utimesSync, writeFileSync as writeFileSync28 } from "fs";
174159
174247
  import { dirname as dirname48 } from "path";
174160
174248
  var DEFAULT_GRACE_MS = 2000;
174161
174249
  var DEFAULT_THROTTLE_MS = 60 * 60 * 1000;
@@ -174253,7 +174341,7 @@ function isSweepThrottled(stampFile, nowMs, throttleMs) {
174253
174341
  }
174254
174342
  function writeSweepStamp(stampFile, nowMs) {
174255
174343
  mkdirSync25(dirname48(stampFile), { recursive: true });
174256
- writeFileSync27(stampFile, `${new Date(nowMs).toISOString()}
174344
+ writeFileSync28(stampFile, `${new Date(nowMs).toISOString()}
174257
174345
  `);
174258
174346
  const stampDate = new Date(nowMs);
174259
174347
  utimesSync(stampFile, stampDate, stampDate);
@@ -146,6 +146,7 @@ No Metis, no plan file, no execution until the user approves. The UNCLEAR path a
146
146
  # <slug> - Work Plan
147
147
  ## TL;DR (For humans)
148
148
  (What you'll get / Why this approach / What it will NOT do / Effort / Risk / Decisions)
149
+ > Effort is exactly one band - Quick (single edit, minutes of agent work), Short (one focused change, a few files), Medium (multi-file feature in one session), Large (several waves, one long session), XL (multi-session or architectural work). NEVER write hours or days: the counted todo rows are the size signal, and a written duration is rewritten to a band before the user sees the plan.
149
150
  ## Scope
150
151
  ## Verification strategy
151
152
  ## Execution strategy
@@ -238,6 +238,7 @@ export function buildPlanSkeleton(slug, intent) {
238
238
  **What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
239
239
 
240
240
  **Effort:** <Quick | Short | Medium | Large | XL>
241
+ <!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
241
242
  **Risk:** <Low | Medium | High> - <one-line driver>
242
243
  ${decisionsLine}
243
244
 
package/dist/tui.js CHANGED
@@ -68446,7 +68446,7 @@ var init_format_on_mutation = __esm(() => {
68446
68446
  });
68447
68447
 
68448
68448
  // packages/omo-config-core/src/schema/config.ts
68449
- var OmoOpenCodeHarnessConfigSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
68449
+ var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
68450
68450
  var init_config = __esm(() => {
68451
68451
  init_zod();
68452
68452
  init_agent();
@@ -68460,6 +68460,7 @@ var init_config = __esm(() => {
68460
68460
  init_telemetry();
68461
68461
  init_format_on_mutation();
68462
68462
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
68463
+ OmoDisabledSkillsSchema = array(string2());
68463
68464
  OmoTypedHarnessConfigSchema = object({
68464
68465
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
68465
68466
  categories: OmoCategoriesConfigSchema.optional(),
@@ -68471,7 +68472,8 @@ var init_config = __esm(() => {
68471
68472
  model_profiles: OmoModelProfilesLayerSchema.optional(),
68472
68473
  model_profile: string2().optional(),
68473
68474
  memory: OmoMemorySettingsLayerSchema.optional(),
68474
- telemetry: OmoTelemetrySettingsLayerSchema.optional()
68475
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
68476
+ disabled_skills: OmoDisabledSkillsSchema.optional()
68475
68477
  }).strict();
68476
68478
  OmoConfigProfileSchema = object({
68477
68479
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -68485,6 +68487,7 @@ var init_config = __esm(() => {
68485
68487
  model_profile: string2().optional(),
68486
68488
  memory: OmoMemorySettingsLayerSchema.optional(),
68487
68489
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
68490
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
68488
68491
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
68489
68492
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
68490
68493
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -68502,6 +68505,7 @@ var init_config = __esm(() => {
68502
68505
  model_profile: string2().optional(),
68503
68506
  memory: OmoMemorySettingsSchema.optional(),
68504
68507
  telemetry: OmoTelemetrySettingsSchema.optional(),
68508
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
68505
68509
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
68506
68510
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
68507
68511
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -68522,6 +68526,7 @@ var init_config = __esm(() => {
68522
68526
  model_profile: string2().optional(),
68523
68527
  memory: OmoMemorySettingsLayerSchema.optional(),
68524
68528
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
68529
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
68525
68530
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
68526
68531
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
68527
68532
  "[codex]": OmoTypedHarnessConfigSchema.optional(),