uca

module
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 29, 2026 License: MIT

README

uca

uca updates multiple coding-agent CLIs with one command. Quiet by default, parallel by default.

Install

brew install chhoumann/tap/uca
Go install
go install github.com/chhoumann/uca@latest

Usage

uca [options]

Options:

  • -p, --parallel run updates in parallel (default)
  • --serial run updates sequentially
  • --safe safer execution (limits concurrency)
  • --timeout <duration> timeout per update command (default 15m, 0 disables)
  • --concurrency <n> max concurrent update commands (0 disables)
  • -v, --verbose show update command output for each agent
  • -q, --quiet suppress per-agent version lines (summary only)
  • -n, --dry-run print commands that would run, do not execute
  • -f, --force run update commands even for agents already at the latest version
  • --check report which agents are outdated, do not update (exit 10 if any are)
  • --explain show detection details and chosen update method
  • --json emit machine-readable JSON
  • --only <list> comma-separated agent list to include (e.g. claude,codex)
  • --skip <list> comma-separated agent list to exclude
  • --version show version
  • -h, --help show usage

Agents are selected with --only/--skip; positional arguments are rejected (uca claude exits with an error instead of silently updating everything). agent is accepted as an alias for cursor in --only and --skip.

When uca can prove an agent is already at the latest version from the package manager's own metadata (global package.json vs the npm registry, VS Code's extensions manifest vs the Marketplace), it skips that agent's update command and reports it unchanged. Use --force to run the update commands anyway. Brew agents and native updaters (like claude update) always run: a local tap clone is only as fresh as the last brew update, and only a native updater knows its own latest version.

Examples

Update everything:

uca

Parallel update with verbose logs:

uca -v

Serial update:

uca --serial

Dry run only for claude + codex:

uca --only claude,codex --dry-run

Explain detection and method:

uca --explain

Supported agents

  • amp (amp update)
  • gemini (npm/pnpm/yarn/bun @google/gemini-cli)
  • claude (claude update)
  • codex (npm/pnpm/yarn/bun @openai/codex)
  • opencode (npm/pnpm/yarn/bun opencode-ai)
  • opencode2 (npm/pnpm/yarn/bun @opencode-ai/cli@beta)
  • droid (npm/pnpm/yarn/bun droid or droid update)
  • cursor (agent update, falling back to cursor-agent update)
  • copilot (Homebrew copilot-cli or npm/pnpm/yarn/bun @github/copilot)
  • cline (npm/pnpm/yarn/bun cline or VS Code extension saoudrizwan.claude-dev)
  • roocode (VS Code extension RooVeterinaryInc.roo-cline)
  • aider (uv tool aider-chat or pip aider-chat)
  • pi (npm/pnpm/yarn/bun @earendil-works/pi-coding-agent)
  • omp (Homebrew omp, bun @oh-my-pi/pi-coding-agent, or omp update)
  • grok (npm/pnpm/yarn/bun @xai-official/grok or grok update)
  • muse (Muse launcher self-update)

Live output

When uca is run in a TTY, it shows a live status dashboard with progress, versions, and timings for installed agents. It also prints an instant boot line and streams agents into the dashboard as they’re detected. When output is piped (or --quiet), it prints only completed lines and the summary.

Custom agents (config)

Define extra agents in <user-config-dir>/uca/config.json (or $UCA_CONFIG). Entries with the same name override built-ins:

{"agents": [{
  "name": "mytool",
  "binary": "mytool",
  "versionCmd": ["mytool", "--version"],
  "strategies": [{"kind": "npm", "package": "mytool"}]
}]}

A strategy is one update mechanism, tried in order. Each kind requires the field it cannot work without, validated at load time: native needs command; npm/pnpm/yarn/bun need package (plus the agent-level binary for bin-dir matching, one strategy per manager you use); brew/pip/uv need package; vscode needs extensionId.

Detection strategy

uca only updates agents it can confidently detect. It checks:

  • built-in update commands for native CLIs
  • Homebrew formulas
  • npm/pnpm/yarn/bun global bins and package lists
  • uv tool installs
  • pip packages
  • VS Code extensions (via code, codium, or code-insiders)

If a tool is installed but managed by an unknown method, it is marked as manual and skipped.

Performance & reliability notes

  • Node-based agents are updated in batch per package manager when possible (e.g. one npm install -g ...@latest for multiple npm-managed agents).
  • Updates that mutate global package manager state are serialized per manager (e.g. only one npm global update at a time).
  • Cursor's cursor-agent fallback is selected only when detecting the installed CLI; failed agent update runs are reported as failures rather than retried with cursor-agent.

Output (default)

claude: 2.1.19 -> 2.1.19 (8s)
...
updated: amp claude codex opencode
unchanged: gemini
skipped (missing): cursor

Development

go build ./cmd/uca

License

MIT

Directories

Path Synopsis
cmd
uca command
--check mode: compare installed versions against latest without updating.
--check mode: compare installed versions against latest without updating.
internal
agentspec
Package agentspec resolves how to update an agent.
Package agentspec resolves how to update an agent.
detect
Package detect probes the environment to decide how each agent is installed: which package managers are present, what their global bin dirs and package lists contain, installed VS Code extensions, and the latest available versions.
Package detect probes the environment to decide how each agent is installed: which package managers are present, what their global bin dirs and package lists contain, installed VS Code extensions, and the latest available versions.
runner
Package runner runs external commands with consistent timeout, cancellation, and process-group handling.
Package runner runs external commands with consistent timeout, cancellation, and process-group handling.
ui
Package ui renders the live terminal dashboard.
Package ui renders the live terminal dashboard.
vercache
Package vercache persists the output of agent version commands between runs, keyed by the resolved binary's identity (path, size, mtime) plus the argv.
Package vercache persists the output of agent version commands between runs, keyed by the resolved binary's identity (path, size, mtime) plus the argv.
version
Package version holds the pure version parsing, formatting, and comparison helpers used to read agent `--version` output, registry "latest" lookups, and to decide whether an installed version is outdated.
Package version holds the pure version parsing, formatting, and comparison helpers used to read agent `--version` output, registry "latest" lookups, and to decide whether an installed version is outdated.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL