Kiro CLI Provider
July 8, 2026 · View on GitHub
Overview
The Kiro CLI provider enables CLI Agent Orchestrator (CAO) to work with Kiro CLI, an AI-powered coding assistant that operates through agent-based conversations with customizable profiles.
Quick Start
Prerequisites
- AWS Credentials: Kiro CLI authenticates via AWS
- Kiro CLI: Install the CLI tool
- tmux: Required for terminal management
# Install Kiro CLI
npm install -g @anthropic-ai/kiro-cli
# Verify authentication
kiro-cli --version
Using Kiro CLI Provider with CAO
# Start the CAO server
cao-server
# Launch a Kiro CLI-backed session (agent profile is required)
cao launch --agents developer --provider kiro_cli
Via HTTP API:
curl -X POST "http://localhost:9889/sessions?provider=kiro_cli&agent_profile=developer"
Note: Kiro CLI requires an agent profile — it cannot be launched without one.
Features
Status Detection
The Kiro CLI provider detects terminal states by analyzing ANSI-stripped output:
- IDLE: Agent prompt visible (legacy
[profile_name] >or new TUIask a question, or describe a task), no response content - PROCESSING: No idle prompt found in output (agent is generating response)
- COMPLETED: Green arrow (
>) response marker (legacy) or▸ Credits:marker (TUI) present + idle prompt after it - WAITING_USER_ANSWER: Permission prompt visible (
Allow this action? [y/n/t]:) - ERROR: Known error indicators present (e.g., "Kiro is having trouble responding right now")
Status detection priority: no prompt → PROCESSING → ERROR → WAITING_USER_ANSWER → COMPLETED → IDLE.
The provider supports both the legacy UI prompt format and the new TUI format for all status detection and message extraction.
Dynamic Prompt Pattern
The provider supports two prompt formats:
Legacy UI (used with --legacy-ui flag):
[developer] > # Basic prompt
[developer] !> # Prompt with pending changes
[developer] 50% > # Prompt with progress indicator
[developer] λ > # Prompt with lambda symbol
[developer] 50% λ > # Combined progress and lambda
Pattern: \[{agent_profile}\]\s*(?:\d+%\s*)?(?:\u03bb\s*)?!?>\s*
New TUI (default in latest Kiro CLI):
code_supervisor · claude-opus-4.6-1m · ◔ 1%
ask a question, or describe a task ↵
The new TUI idle state is detected by the ask a question, or describe a task pattern, and completion is detected by the ▸ Credits: marker followed by an idle prompt. The provider launches in TUI mode by default and auto-detects which format is active.
Message Extraction
The provider uses a dual-path extraction strategy:
Legacy mode (green arrow markers):
- Strip ANSI codes from output
- Find all green arrow (
>) markers (response start) - Take the last one
- Find the next idle prompt after it (response end)
- Extract and clean text between them
TUI mode (separator + Credits markers):
- Find the last
▸ Credits:line (response end marker) - Find the last separator (
────) before Credits (response start area) - Extract text between separator and Credits
- Skip the first paragraph (user message echo)
- Clean remaining text (ANSI, escape sequences, control characters)
The provider tries legacy extraction first; if no green arrows are found, it falls back to TUI extraction. This is backward compatible with --legacy-ui wrapper scripts.
Permission Prompts
Kiro CLI shows Allow this action? [y/n/t]: prompts for sensitive operations (file edits, command execution). The provider detects these as WAITING_USER_ANSWER status. Unlike Claude Code, Kiro CLI does not have a trust folder dialog.
Configuration
Agent Profile (Required)
Kiro CLI always requires an agent profile. CAO passes it via:
kiro-cli chat --agent {profile_name}
The profile name determines the prompt pattern used for status detection. Built-in profiles include developer and reviewer.
Launch Command
The provider launches using kiro-cli's default UI, with automatic --legacy-ui fallback:
kiro-cli chat --agent developer
The provider auto-detects whether the terminal is in legacy or TUI mode and uses the appropriate detection patterns. If initialization times out, the provider automatically exits and retries with --legacy-ui. Both TUI and legacy detection patterns are fully supported.
Implementation Notes
- ANSI stripping: All pattern matching operates on ANSI-stripped output for reliability
- Green arrow pattern:
^>\s*matches the start of agent responses (after ANSI stripping) - Generic prompt pattern:
\x1b\[38;5;13m>\s*\x1b\[39m\s*$matches the purple-colored prompt in raw output (used for log monitoring) - Error detection: Checks for known error strings like "Kiro is having trouble responding right now"
- Multi-format cleanup: Extraction strips ANSI codes, escape sequences, and control characters
- Exit command:
/exitviaPOST /terminals/{terminal_id}/exit
Status Values
TerminalStatus.IDLE: Ready for inputTerminalStatus.PROCESSING: Working on taskTerminalStatus.WAITING_USER_ANSWER: Waiting for permission confirmationTerminalStatus.COMPLETED: Task finishedTerminalStatus.ERROR: Error occurred
End-to-End Testing
The E2E test suite validates handoff, assign, and send_message flows for Kiro CLI.
Running Kiro CLI E2E Tests
# Start CAO server
uv run cao-server
# Run all Kiro CLI E2E tests
uv run pytest -m e2e test/e2e/ -v -k kiro_cli
# Run specific test types
uv run pytest -m e2e test/e2e/test_handoff.py -v -k kiro_cli
uv run pytest -m e2e test/e2e/test_assign.py -v -k kiro_cli
uv run pytest -m e2e test/e2e/test_send_message.py -v -k kiro_cli
uv run pytest -m e2e test/e2e/test_supervisor_orchestration.py -v -k KiroCli -o "addopts="
Troubleshooting
Common Issues
-
"Agent profile required" Error:
- Kiro CLI cannot be launched without an agent profile
- Always specify
--agentswhen launching:cao launch --agents developer --provider kiro_cli
-
Permission Prompts Blocking:
- Kiro CLI shows
[y/n/t]prompts for operations - The provider detects these as
WAITING_USER_ANSWER - In multi-agent flows, the supervisor or user must handle these
- Kiro CLI shows
-
Authentication Issues:
# Verify AWS credentials aws sts get-caller-identity # Set credentials via environment export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... export AWS_DEFAULT_REGION=... -
Prompt Pattern Not Matching:
- The provider supports both legacy (
[name] >) and new TUI (ask a question, or describe a task) formats - TUI mode is the default; the provider auto-detects which format is active
- If you need legacy mode, add
--legacy-uivia a wrapper script - Check with:
kiro-cli chat --agent your_profile
- The provider supports both legacy (
-
JSON-Only Agent Profiles (AIM-Installed):
- Agents installed via AIM (Agent Install Manager) may only have
.jsonprofiles (e.g.,~/.kiro/agents/librarian/agent-spec.json) - CAO's
load_agent_profile()primarily scans for.mdfiles - If the agent is not found, CAO gracefully falls back — kiro-cli resolves
.jsonprofiles natively - As a workaround, you can create a stub
.mdfile alongside the.jsonprofile
- Agents installed via AIM (Agent Install Manager) may only have
kiro-cli 2.11+ Notes
Starting with kiro-cli 2.11, the TUI changed how it accepts pasted input and how it renders the processing indicator. CAO's kiro_cli provider handles these:
- Paste submission: kiro 2.11 needs two Enter keystrokes after a
bracketed paste to submit the message (first Enter finalizes the paste, second
submits). The provider sets
paste_enter_count = 2andpaste_submit_delay = 1.0s. Older kiro versions submitted on a single Enter. - Processing indicator: kiro 2.11 replaced
"Kiro is working"with"Thinking..."(with an optional"(esc to cancel)"suffix). The provider matches either variant inTUI_PROCESSING_PATTERN. - Idle placeholder always visible: The
"ask a question or describe a task"placeholder text remains in the raw buffer even during processing. The provider's Check 6 inget_status()requires a bordered response box (two separators + ≥2 content lines between them) before a bare idle-prompt match is treated as COMPLETED — otherwise the worker would be torn down within seconds of a task being sent. - Spinner animation floods the event bus: kiro 2.11's TUI redraws a braille
spinner (
⠋⠙⠹⠸⠼⠴⠦⠧) roughly 10 times per second while an agent is thinking. Each redraw is a separate FIFO write. Without coalescing, that produces thousands ofterminal.{id}.outputevents per turn — enough to overflow the shared async queue and drop the worker's real state transitions along with the animation noise. CAO's FIFO reader batches chunks arriving within a 50ms window into one publish (_COALESCE_WINDOW), reducing publish rate ~20x during bursts. Consumers see the same bytes in the same order; only the event boundaries change. If handoff/assign start hanging on a newer kiro release, check whether the animation frame rate increased beyond what 50ms can absorb.
If you upgrade kiro-cli and handoffs stop working (worker gets killed prematurely, or the task sits unsent in the input box), check whether the paste-submit behavior or processing-indicator text changed in the new version and update the provider constants accordingly.