Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a new CLI agent provider for CAO (CLI Agent Orchestrator). Use this skill whenever the user wants to add support for a new CLI-based AI agent (e.g., a new coding assistant CLI), integrate a new provider, or scaffold a provider implementation. Also use when the user asks about the provider architecture, what files to modify, or how providers work in CAO.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 268% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 44% | 0% |
Guide for creating a new CLI agent provider for CLI Agent Orchestrator. A "provider" is an adapter that lets CAO interact with a specific CLI-based AI agent through tmux.
A provider translates between CAO's unified interface and a specific CLI tool's terminal output. It needs to:
Gather this information about the target CLI:
claude, kiro-cli chat, codex)> , ❯ , ask a question)⏺, inside a box, plain text)--dangerously-skip-permissions or similar flags?/exit, /quit, Ctrl+C)File: src/cli_agent_orchestrator/models/provider.py
pythonclass ProviderType(str, Enum): # ... existing providers ... NEW_CLI = "new_cli"
The value string is used everywhere — in API requests, database, config. Use snake_case.
File: src/cli_agent_orchestrator/providers/new_cli.py
Read references/provider-template.md for the full annotated template. The key sections:
Regex patterns — Define at module level, not inside methods. You need patterns for:
r"\x1b\[[0-9;]*m")⏺ for Claude Code)Status detection priority — The order in get_status() matters. Read references/lessons-learnt.md for the critical "stale buffer" lesson. The recommended pattern:
1. Strip ANSI codes from terminal output
2. Check WAITING_USER_ANSWER first (permission prompts need immediate attention)
3. Check COMPLETED (response marker + idle prompt both present in recent lines)
4. Check IDLE (just idle prompt, no response marker)
5. Check PROCESSING (spinner/thinking indicator in recent lines only)
6. Default to ERRORMessage extraction — Find the last response boundary in the terminal output and extract everything between it and the next prompt. Always strip ANSI codes from the final extracted text.
File: src/cli_agent_orchestrator/providers/manager.py
Add the import and elif branch:
pythonfrom cli_agent_orchestrator.providers.new_cli import NewCliProvider # In create_provider(): elif provider_type == ProviderType.NEW_CLI.value: provider = NewCliProvider( terminal_id, tmux_session, tmux_window, agent_profile, allowed_tools )
File: src/cli_agent_orchestrator/cli/commands/launch.py
If the provider executes code or accesses the filesystem, add it:
pythonPROVIDERS_REQUIRING_WORKSPACE_ACCESS = { # ... existing ... "new_cli", }
There are three approaches depending on the CLI's capabilities. Read docs/tool-restrictions.md for full context.
Hard enforcement via CLI flags (e.g., Claude Code, Copilot CLI): Add the provider to TOOL_MAPPING in src/cli_agent_orchestrator/utils/tool_mapping.py to translate CAO vocabulary to native tool names.
Hard enforcement via agent JSON (e.g., Kiro CLI): The CLI reads allowedTools from the agent profile. No TOOL_MAPPING entry needed — CAO passes vocabulary directly.
Soft enforcement via system prompt (e.g., Kimi CLI, Codex): No native restriction mechanism. CAO prepends restriction instructions to the system prompt. No TOOL_MAPPING entry needed.
Only add a TOOL_MAPPING entry if the CLI has its own native tool names that differ from CAO's vocabulary.
Many CLIs show cascading prompts on first launch (workspace trust, permission bypass, terms acceptance). Handle these in initialize() or a dedicated _handle_startup_prompts() method using a polling loop — not a single check. See references/lessons-learnt.md #17 for the stabilization loop pattern. Also consider shell warm-up (#14) and TERM variable compatibility (#15).
File: test/providers/test_new_cli_unit.py
Read references/test-guide.md for the full test structure. Minimum coverage:
Use unittest.mock.patch to mock tmux_client. Create fixture files in test/providers/fixtures/.
Add test classes to existing e2e test files and a fixture in test/e2e/conftest.py. Read references/test-guide.md for the full list of e2e test classes to add.
This is the canonical multi-agent e2e test. It exercises assign (non-blocking), handoff (blocking), send_message (async inbox), and status detection under concurrent load. Use the examples/assign/ profiles:
bashcao install examples/assign/data_analyst.md cao install examples/assign/report_generator.md cao install examples/assign/analysis_supervisor.md cao launch --agents analysis_supervisor --provider new_cli --auto-approve
Test flow: Supervisor assigns 3x data_analyst workers in parallel + handoff 1x report_generator (blocking) → analysts send_message results back to supervisor → supervisor combines template + results into final report.
If any step fails, investigate:
See test/e2e/test_assign.py for the automated version. Reference: https://github.com/awslabs/cli-agent-orchestrator/tree/feature/kimi-cli/examples/assign
Create docs/new-cli.md with prerequisites, launch examples, agent profile format, known limitations, and troubleshooting. Update README.md provider table and CHANGELOG.md.
When your provider is complete, verify you've touched all these files:
src/cli_agent_orchestrator/models/provider.py — ProviderType enumsrc/cli_agent_orchestrator/providers/new_cli.py — Provider classsrc/cli_agent_orchestrator/providers/manager.py — Import + elif branchsrc/cli_agent_orchestrator/cli/commands/launch.py — PROVIDERS_REQUIRING_WORKSPACE_ACCESSsrc/cli_agent_orchestrator/utils/tool_mapping.py — TOOL_MAPPING (only if CLI needs translation)test/providers/test_new_cli_unit.py — Unit teststest/providers/fixtures/new_cli_*.txt — Test fixturestest/e2e/conftest.py — require_new_cli fixturetest/e2e/test_*.py — E2E test classesdocs/new-cli.md — Provider documentationREADME.md — Provider tableCHANGELOG.md — New provider entryOther measured skills in the registry, with their headline benchmark lift.