Skip to main content

CLI tool for managing oh-my-openagent (OMO) profiles

Project description

omoctl

CLI tool for managing oh-my-openagent profiles in OpenCode.

Define profiles, patch models across providers, and switch between configurations with a single command.

Install

Run on demand with no install:

uvx omoctl --help

Or install permanently:

uv tool install omoctl
omoctl --help

Examples in this README use the bare omoctl form. If you prefer uvx, prefix every command (uvx omoctl update, uvx omoctl switch claude, ...).

Prerequisites

  • Python 3.11+
  • bun or npm (for fetching OMO configs via oh-my-opencode)
  • OpenCode installed with a populated model cache (~/.cache/opencode/models.json — run opencode once to seed it)

Quick Start

omoctl update          # fetch & build all profiles
omoctl list            # see what's available
omoctl switch claude   # activate a profile
omoctl                 # show active profile
omoctl validate        # check config against available models/agents

Commands

Command Description
omoctl Show active profile
omoctl list List all profiles
omoctl switch <profile> Switch to a profile (by name or alias)
omoctl update [profile] Fetch fresh OMO configs, apply patches, save. All profiles if omitted
omoctl remove <profile> Remove a stored profile
omoctl validate Validate config against available models, agents, and categories
omoctl show [-a|-n|-j] Show active profile: header + JSON by default; -a alias only, -n name only, -j JSON only
omoctl version Print version

Config

Located at ~/.config/omoctl/config.yaml. Created on first run.

Minimal example

profiles:
  - name: Claude
    providers: [claude]

That's it. One profile, one provider. Run omoctl update and you're done.

Full example

active_profile: no-copilot

overrides:
  disabled_hooks:
    - context-window-monitor

patches:
  - source: { provider: google }
    target: { provider: proxy }

profiles:
  - name: Claude
    providers: [claude]

  - name: Claude & OpenAI
    providers: [claude, openai]

  - name: No Copilot
    providers: [claude, gemini, openai]
    patches:
      - source: { provider: google, model: gemini-3.1-pro-preview }
        target: { provider: proxy, model: gemini-3-1-pro-xhigh, variant: null }
    overrides:
      disabled_hooks:
        - context-window-monitor
        - some-other-hook

Fields

Field Type Description
active_profile string Profile to auto-activate after update. Optional
overrides dict OMO config overrides applied to all profiles
patches list Global patches applied to all profiles (see Patches)
profiles list Profile definitions (at least one required)

Profile fields

Field Type Description
name string Required. Display name. Also determines the alias (e.g. "No Copilot" -> no-copilot)
providers list Required. OMO providers to enable. Run omoctl validate to see available providers
patches list Profile-specific patches. Take priority over global patches
overrides dict OMO config overrides. Deep-merged on top of the global overrides

Patches

Patches rewrite models in the OMO config before saving. A patch has a source (what to match) and a target (what to replace it with).

Source

The source specifies what to match. All fields are optional but at least one must be set.

Field Type Description
provider string Match models from this provider (e.g. google, anthropic)
model string, list, or dict Filter which models to match (see Model Filters)
agent string Match a specific agent (e.g. sisyphus, oracle)
category string Match a specific category (e.g. deep, quick)

These combine: { agent: sisyphus, provider: google } matches sisyphus only when it uses a google model.

Target

Field Type Description
provider string Target provider. Falls back to source provider if omitted
model string, list, or dict Target model (see Model Filters)
variant string or null "max" sets variant, null removes it, omit to keep existing

Examples

patches:
  # Redirect all google models to a proxy provider
  - source: { provider: google }
    target: { provider: proxy }

  # Redirect a specific model to a specific target
  - source: { provider: google, model: gemini-3.1-pro-preview }
    target: { provider: proxy, model: gemini-3-1-pro-xhigh, variant: null }

  # Override a specific agent
  - source: { agent: sisyphus }
    target: { provider: anthropic, model: claude-opus-4-7, variant: max }

  # Override a category
  - source: { category: ultrabrain }
    target: { provider: openai, model: gpt-5.4, variant: xhigh }

Priority

  1. Profile patches are checked before global patches
  2. Agent/category patches take priority over provider-only patches
  3. Exact model matches beat filter matches
  4. More specific filters beat less specific ones

Model Filters

The model field in source/target accepts three formats:

Exact match — a string:

model: gemini-3.1-pro-preview

Keyword filter — a list of terms that must all match:

model: [gemini, pro]

Include/exclude filter — fine-grained control:

model:
  include: [gemini, pro]
  exclude: [flash]

Model IDs are split into words and numbers (e.g. claude-opus-4-7 -> words: [claude, opus], numbers: [4, 7]). Filters match against these parts.

File Layout

~/.config/omoctl/
  config.yaml              # your config
  active                   # current active profile alias
  profiles/
    claude.json            # stored OMO config per profile
    no-copilot.json

~/.config/opencode/
  oh-my-openagent.jsonc    # active profile config (plain JSON, read by oh-my-openagent plugin)

Validation

omoctl validate checks your config against live data:

  • Patch source/target providers exist in the model cache
  • Patch source/target models exist in their provider
  • Patch agent names exist in the OMO config
  • Patch category names exist in the OMO config

On failure, it prints each error with available options:

Validation failed with 2 error(s):

  • global patch [0]: source provider 'nonexistent' not found.
  • profile 'Test' patch [0]: source agent 'fake' not found. Available: atlas, explore, ...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omoctl-0.1.1.tar.gz (20.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

omoctl-0.1.1-py3-none-any.whl (18.4 kB view details)

Uploaded Python 3

File details

Details for the file omoctl-0.1.1.tar.gz.

File metadata

  • Download URL: omoctl-0.1.1.tar.gz
  • Upload date:
  • Size: 20.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for omoctl-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4d7c029df5d4798adfc3876818d533a1890729ad7502902500b086ed3573277f
MD5 1e9cab599484985512944e069ca51b88
BLAKE2b-256 6b05a7b605404d46bfe676a0037c82dc31722516a8faf02027c7a42fb3ad2eee

See more details on using hashes here.

Provenance

The following attestation bundles were made for omoctl-0.1.1.tar.gz:

Publisher: release.yml on anfreire/omoctl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file omoctl-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: omoctl-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for omoctl-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d6b8bea029015308cfbcebbddc097afe5c1f2503a8cd0340c775089fddc0673d
MD5 c27aea691614d235444c7ffc86f36d2f
BLAKE2b-256 e14cebbda8528246dad5c100d01b94f00a3f5736e9ae5f56987a7a8b9b82b44f

See more details on using hashes here.

Provenance

The following attestation bundles were made for omoctl-0.1.1-py3-none-any.whl:

Publisher: release.yml on anfreire/omoctl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page