Skip to content

Running AI-DLC on Kiro CLI

[!NOTE] AI-DLC on Kiro CLI works best with Claude Opus 4.8, which requires a paid Kiro plan. On weaker models the conductor may skip optional stage steps (reviewer pass, learnings ritual) or rush approval gates. The IDE-targeted distribution is documented separately in Running AI-DLC on Kiro IDE.

One of the framework's harnesses: dist/kiro/ runs the same AI-DLC methodology on Kiro CLI. One deterministic core — the tools, 33 stage files, protocols, knowledge, sensors, scopes, and rules — is byte-shared across every harness; only the shell (skills, agent configs, hook wiring, activation) differs.

Prerequisites

  • Kiro CLI ≥ 2.6 (kiro-cli --version), logged in (kiro-cli login)
  • bun on your PATH (curl -fsSL https://bun.sh/install | bash)

Install

The copies below come from a clone of the aidlc-workflows repository on the v2 branch:

git clone https://github.com/awslabs/aidlc-workflows.git
cd aidlc-workflows
git checkout v2
mkdir -p your-project/.kiro your-project/aidlc
cp -R dist/kiro/.kiro/. your-project/.kiro/
cp -R dist/kiro/aidlc/. your-project/aidlc/    # the workspace shell (spaces/default/memory) — a sibling of .kiro/, not inside it
cp dist/kiro/AGENTS.md your-project/AGENTS.md  # merge if you already have one

The aidlc/ directory is the workspace shell — it ships the pre-built aidlc/spaces/default/memory/ method tree the engine reads. It is a sibling of .kiro/, so copy it separately (or copy the whole dist/kiro/ tree at once). /aidlc --doctor fails its "workspace shell ready" check if it is missing.

Then start a session in your project:

cd your-project && kiro-cli chat

The install ships .kiro/settings/cli.json with chat.defaultAgent: "aidlc", so the AI-DLC conductor agent is active by default — /aidlc just works. This workspace setting takes precedence over a global default agent you may have configured; if you prefer your own default, remove that setting and use kiro-cli chat --agent aidlc instead.

No shipped agent pins a model: a pinned ID resolves only when that model is enabled on the user's Kiro install, so the conductor and all 14 personas inherit your session model (/model). The same cli.json also ships one CONDITIONAL per-model reasoning-effort default via chat.modelDefaults: xhigh for claude-opus-4.8, applied only when your session actually runs that model (the recommended setup) — inert otherwise. Kiro has no per-agent effort surface, so effort can only ride on the model this way. This file is read by the Kiro CLI only — the Kiro IDE ignores cli.json and applies its extension's per-model defaults instead. Override per session with /effort <level> in chat or kiro-cli chat --effort <level> (low|medium|high|xhigh|max) — a session flag and your user-level ~/.kiro/settings/cli.json both take precedence over the workspace default.

Usage

Start kiro-cli chat in the project, then invoke the conductor with /aidlc <description>. /aidlc --status reports position; /aidlc --doctor, --stage, --phase, --depth, and --test-strategy all work. Workspace navigation uses /aidlc intent [name], /aidlc space [name], and /aidlc space-create <name>. The per-stage (/aidlc-domain-design) and per-scope (/aidlc-feature) runner skills are installed too.

Start the session from the project root. The conductor's engine calls are pre-approved as project-relative bun .kiro/tools/<tool>.ts commands, so a session whose working directory is elsewhere pushes the conductor toward command forms that need approval. Absolute paths, KIRO_PROJECT_DIR expansion, and cd <dir> && bun .kiro/tools/... chains deliberately remain gated. A path only has to be shaped like a tool path to match a pattern, not be trustworthy: pre-approving any /.../.kiro/tools/*.ts would also pre-approve a file planted in a world-writable directory, and neither a variable's value nor a chained working directory is knowable from the pattern.

Sessions with no approver stall rather than prompt. Anything outside the pre-approved set needs an interactive answer. Under kiro-cli chat --no-interactive there is nobody to ask, so Kiro refuses the command outright with non-interactive mode (no user to approve). Over ACP, your client must answer session/request_permission; a client that ignores those requests looks exactly like a permission failure. --trust-all-tools bypasses both the allow and deny lists, including the recursive-rm and git push denials. Use it only inside a disposable sandbox where blanket shell access is acceptable.

What's different on Kiro

Area Claude Code Kiro CLI
Gates & questions AskUserQuestion widget Numbered prose options (reply with a number); the questions FILE with [Answer]: tags stays the source of truth
Statusline Current stage + model + context % Not available — use /aidlc --status and the progress line at each gate
Dispatched stages (2.1 pipeline, 2.2 subagent, 2.4 mob, 3.5 subagent) Task tool Kiro subagent tool → the agent configs (all 14 personas ship configs)
Construction swarm Parallel Task floor, optional ultracode Workflow Subagent fan-out only; AIDLC_USE_SWARM=1 is announced as a no-op
Session audit events SESSION_STARTED/RESUMED/ENDED, SESSION_COMPACTED SESSION_STARTED only (Kiro has no session-end / pre-compaction hooks)
Forwarding-loop enforcement (Stop hook) Interactive + headless Interactive sessions only — --no-interactive runs do not honor the stop-hook block
Permissions settings.json allowlist aidlc agent config: only project-relative framework bun .kiro/tools/<tool>.ts calls and date -u are pre-approved; other shell commands prompt
Welcome message Rendered at session start from settings.json companyAnnouncements None — Kiro has no welcome-render equivalent; the session-start hook injects resume context only
MCP servers Ships 5 (.mcp.json: context7 + four AWS servers) Ships the same 5 in .kiro/settings/mcp.json, all disabled by default; flip "disabled": false per server to enable it. Context7 is keyless on Kiro because Kiro sends configured HTTP header values verbatim instead of expanding environment placeholders. All 14 delegated personas opt in through includeMcpJson: true plus @<server> tool grants; the conductor gets none.

Everything else — state machine, audit trail, artifacts under the intent record dirs (aidlc/spaces/<space>/intents/<YYMMDD>-<label>/), the learnings ritual, sensors, scopes, depth/test-strategy — behaves identically, because it IS identical: the same tools run from .kiro/tools/.

A project's aidlc/ workspace is harness-neutral. Moving a project between harnesses (or running both side by side) is supported-but-untested; /aidlc --doctor will warn if it detects a conflicting harness setup with an active workflow.

For framework developers

dist/kiro is generated from core/ + harness/kiro/ by bun scripts/package.ts kiro (core copy with the {{HARNESS_DIR}} token substituted to .kiro and the rules/steering/ rename). bun scripts/package.ts --check is the drift guard and runs in CI (t145). The authored Kiro surfaces live in harness/kiro/: the orchestrator skill (skills/aidlc/), the agent JSONs (agents/), the hook adapter (hooks/aidlc-kiro-adapter.ts), settings/cli.json, settings/mcp.json, and AGENTS.md — edit those (or core/), never the generated dist/kiro. See Porting to a New Harness.

A live TUI journey test exists alongside the Claude twins: tests/e2e/t-tui-kiro-intent-capture.serial.test.ts drives kiro-cli chat by keystroke against the shipped tree (numbered-prose gates answered with "1" = the recommended option, terminating on disk state). Opt in with AIDLC_KIRO_TUI_LIVE=1; it skips with a reason when tmux, kiro-cli, or a logged-in Kiro session is absent.

Next steps

Installed and activated? The methodology is the same on every harness — keep going with the neutral chapters:

Other harnesses: AI-DLC on Codex CLI · AI-DLC on Cursor · the harness family index.