cao-agent-plugin-audit
Audit an existing Agent Plugins 1.0.0 package - check its plugin.json manifest and mcp.json against CAO's vendored schemas, andโฆ
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
Claude Code
$ npx -y skills add awslabs/cli-agent-orchestrator --skill cao-provider --agent claude-code
Codex
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a codex -y
Cursor
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a cursor -y
Gemini CLI
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a gemini-cli -y
GitHub Copilot
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a github-copilot -y
OpenCode
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a opencode -y
Windsurf
$ npx skills add awslabs/cli-agent-orchestrator --skill cao-provider -a windsurf -y
name: cao-provider description: 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.
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:
1. **Launch** the CLI tool in a tmux window with the right flags 2. **Detect status** by parsing terminal output (IDLE, PROCESSING, COMPLETED, ERROR, WAITING_USER_ANSWER) 3. **Extract responses** from the terminal buffer after the agent finishes 4. **Clean up** when the terminal is deleted
Gather this information about the target CLI:
File: `src/cli_agent_orchestrator/models/provider.py`
class 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:
**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 ERROR
**Message 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:
from 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:
PROVIDERS_REQUIRING_WORKSPACE_ACCESS = {
# ... existing ...
"new_cli",
}Two separate questions, answered in two places. Read `docs/tool-restrictions.md` for full context.
**How CAO delivers the policy** (one of three mechanisms):
**Whether the CLI then enforces it** is a separate fact, recorded per provider in `src/cli_agent_orchestrator/utils/enforcement.py` (`native`, `prompt`, `none`) and shown to the operator on the launch gate. The mechanism does not decide it: OpenCode enforces its agent-file permission block (`native`, at install time), while Kiro is launched `--trust-all-tools` with `tools: ["*"]` and its `allowedTools` only suppresses approval prompts (`none`). Adding a provider means adding BOTH its delivery code and its `PROVIDER_ENFORCEMENT` row; `test/test_enforcement_tables.py` fails until the docs tables agree.
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)
CLI Agent Orchestrator (CAO) coordinates multiple AI coding CLIs so a supervisor can delegate work to specialist agents in parallel or sequence. ๐ Documentation โ guides, reference, and two interactive courses.
Audit an existing Agent Plugins 1.0.0 package - check its plugin.json manifest and mcp.json against CAO's vendored schemas, andโฆ
Author a new Agent Plugins 1.0.0 package from an empty directory - write the plugin.json manifest, lay out skills/, optionallyโฆ
Contribute changes to the CAO (CLI Agent Orchestrator) codebase โ the local
Create a new CAO (CLI Agent Orchestrator) plugin. Use this skill whenever the user wants to add a plugin that reacts to CAOโฆ
Find and select the best installed CAO agent profile for a task before
Find available CAO (CLI Agent Orchestrator) agent profiles, and talk to the
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also coversโฆ
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, fillingโฆ