Stop making the agent guess which lever to pull.
agent-capability-router is a skill for Codex and Claude Code that routes a task into the right execution surface: local tools, plugins/connectors, skills, subagents, browser/docs lookup, completion goals, automations, hooks, memory capture, or verification.
It is not a permission slip. It is a routing layer: name the capability, name the cost, ask for approval when the move is broad or persistent, then prove the route worked.
Users usually ask in problem language:
- "Use your team to audit this."
- "Open localhost and check the UI."
- "Which plugin should handle this?"
- "Keep going until tests pass."
- "Remember this workflow."
- "Make sure this is safe before merge."
The router turns those signals into a concrete route, a cost/risk boundary, and a proof plan.
It stays quiet on small work. One file, one command, one obvious fix: just do the work. The router wakes up when the task shape suggests a better path.
| Capability | Codex | Claude Code | Notes |
|---|---|---|---|
| Skill discovery | ~/.codex/skills/agent-capability-router |
~/.claude/skills/agent-capability-router |
Same SKILL.md and references |
| Local tools | Shell, git, project CLIs | Shell, git, project CLIs | Prefer local proof for workspace facts |
| Plugins/connectors | Available MCP/app tools | Available MCP/app tools | Authenticated reads/writes are approval-gated |
| Subagents/workflows | Runtime-specific subagents/tools | Runtime-specific task/workflow tools | Use only when width or independent review pays off |
| Browser/docs/research | Runtime browser/docs/web tools | Runtime browser/docs/web tools | Use for rendered proof or current external facts |
| Automations/hooks/goals | Only when exposed by runtime | Only when exposed by runtime | Fallback is a checklist or proposed command |
bashor compatible shellpython3for validation and route preview scripts- write access to the target skills directory if installing:
- Codex:
~/.codex/skills - Claude Code:
~/.claude/skills
- Codex:
- explicit
--confirmfor any installer write
Clone the public repo:
git clone https://github.com/DeHor-Labs/agent-capability-router.git
cd agent-capability-routerPreview an install without writing:
./scripts/install-skill.sh --runtime both --dry-runInstall into both Codex and Claude Code:
./scripts/install-skill.sh --runtime both --mode copy --confirmInstall only for Codex:
./scripts/install-skill.sh --runtime codex --confirmInstall only for Claude Code:
./scripts/install-skill.sh --runtime claude --confirmReplace an existing install safely:
./scripts/install-skill.sh --runtime both --mode copy --replace --confirmExisting installs are backed up under .agent-capability-router-backups before replacement.
For local development, use a symlink:
./scripts/install-skill.sh --runtime both --mode symlink --dev-symlink --confirmUse --home /path/to/home when testing installs in temporary directories or CI.
The repository root is the skill folder, so direct clone install also works:
git clone https://github.com/DeHor-Labs/agent-capability-router.git ~/.codex/skills/agent-capability-routergit clone https://github.com/DeHor-Labs/agent-capability-router.git ~/.claude/skills/agent-capability-routerThe script-based install is preferred for updates because it copies only the skill payload and avoids repository-only test files.
Run the local checks:
./scripts/validate-skill.py
./scripts/check-agent-neutrality.py
python3 -m unittest discover -s testsFor Codex skill packaging validation:
python3 /path/to/skill-creator/scripts/quick_validate.py .Post-install spot check:
test -f ~/.codex/skills/agent-capability-router/SKILL.md
test -f ~/.claude/skills/agent-capability-router/SKILL.mdRoute a broad audit into orchestration plus verification:
./scripts/route-task.py "Audit all API routes with your team and verify CI findings"Expected route: orchestration. Approval required because it may spend subagent/workflow budget.
Route an authenticated service question into plugin selection:
./scripts/route-task.py "Which plugin should check the GitHub deployment status?"Expected route: tool-plugin-skill-routing, with risk_class set to authenticated_read.
Route a future obligation into recurring work:
./scripts/route-task.py "Schedule a weekly check of release readiness"Expected route: recurring-work. Approval required because it is persistent automation.
Route: the smallest useful capability.
Cost: what it spends or risks.
Approval: what needs explicit consent.
Proof: what evidence closes the loop.
That contract matters because agent work fails in two boring ways:
- underpowered: one agent grinds through work that should have been split, verified, or routed through a real service tool
- overpowered: a simple local task becomes a noisy proposal, a needless browser session, or a pile of subagents
This skill tries to stay in the middle: enough leverage to matter, enough restraint to remain useful.
agent-capability-router/
SKILL.md
agents/openai.yaml
references/
scripts/
tests/
SKILL.md stays small and routes to focused reference files only when needed.
- Start with
--dry-runbefore installing. - Installer writes require
--confirm. - Existing installs require
--replacebefore backup and replacement. - Symlink installs require
--dev-symlinkand are intended for local development. - The router does not invent runtime tools. If a capability is unavailable, it should propose a safe fallback.
- Sensitive or authenticated contexts should bias toward local/read-only checks unless explicitly approved.
--runtime is required:
Pass --runtime codex, --runtime claude, or --runtime both.
Refusing to write without --confirm:
Run with --dry-run first, then add --confirm when the target path is correct.
Existing install found:
Re-run with --replace --confirm to back up and replace the existing install.
route-task.py returns no route:
That is usually correct for simple tasks. The skill should stay quiet unless there are strong routing signals.
MIT