Skip to content

[#773] add-kiro-provider#776

Open
nrslib wants to merge 2 commits into
mainfrom
takt/773/add-kiro-provider
Open

[#773] add-kiro-provider#776
nrslib wants to merge 2 commits into
mainfrom
takt/773/add-kiro-provider

Conversation

@nrslib
Copy link
Copy Markdown
Owner

@nrslib nrslib commented May 29, 2026

Summary

背景

Kiro CLI には headless 実行があり、TAKT の provider として扱える可能性がある。
公式ドキュメント上は kiro-cli chat --no-interactiveKIRO_API_KEY--trust-all-tools / --trust-tools--resume-id、MCP 設定が提供されている。

TAKT では Cursor / Copilot と同様の CLI provider パターンで、独立した kiro provider として追加するのが自然。

目的

TAKT から Kiro CLI を provider として選択できるようにする。

provider: kiro

または provider profile で利用できるようにする。

provider_profiles:
  kiro:
    type: kiro

実装方針

  • ProviderType / provider schema に kiro を追加する。
  • src/infra/kiro/ を新設し、Kiro CLI 用 client を実装する。
  • src/infra/providers/kiro.ts を追加し、TAKT の Provider インターフェースへ接続する。
  • provider registry に kiro: new KiroProvider() を追加する。
  • global config に以下を追加する。
    • kiro_cli_path
    • kiro_api_key
  • env override を追加する。
    • TAKT_KIRO_CLI_PATH
    • TAKT_KIRO_API_KEY
  • kiro_api_key は child process env の KIRO_API_KEY として渡す。
  • CLI 実行は原則として以下の形にする。
kiro-cli chat --no-interactive <prompt>

権限マッピング案

Kiro CLI の headless mode ではユーザー承認ができないため、TAKT の permissionMode を Kiro の trust flag に変換する。

  • full: --trust-all-tools
  • edit: 必要に応じて --trust-tools=read,grep,write,shell 相当を検討
  • read: --trust-tools=read,grep 相当を検討

Kiro の tool category 名と TAKT の allowedTools の意味が完全一致するとは限らないため、初期実装では保守的に扱う。

初期スコープ

  • headless 実行に対応する。
  • stdout を plain text として AgentResponse.content に格納する。
  • abort signal、stdout/stderr buffer limit、ENOENT、認証失敗、非ゼロ exit code を既存 CLI provider と同じ水準で扱う。
  • supportsStructuredOutput = false とする。
  • Kiro CLI が返す session ID を直接 stdout から取れない場合は、まず sessionId 未取得でも許容する。
  • --resume-id が利用可能な場合は、TAKT の sessionId を渡せるようにする。

初期スコープ外

  • Kiro の model を TAKT の model から直接 CLI flag として渡すこと。
    • 公式 CLI command reference では chat の --model が確認できないため、初期実装では Kiro 側の chat.defaultModel または custom agent に任せる。
  • TAKT の mcpServers を実行ごとに直接 CLI 引数へ変換すること。
    • Kiro は .kiro/settings/mcp.json / ~/.kiro/settings/mcp.json を読む設計のため、初期実装では Kiro 側設定に任せる。
  • structured output / JSON schema 対応。

調査メモ

公式ドキュメント上の確認事項:

  • Headless mode: kiro-cli chat --no-interactive "your prompt here"
  • Headless auth: KIRO_API_KEY
  • Tool trust: --trust-all-tools, --trust-tools=<categories>
  • Session: --resume, --resume-id <ID>, --list-sessions
  • MCP: .kiro/settings/mcp.json または kiro-cli mcp add/import
  • Exit codes: 0 success, 1 failure, 3 MCP startup failure

ローカル確認では、現時点の環境に kiro-cli / kiro は PATH 上に存在しなかった。

確認方法

Kiro CLI が利用可能な環境で以下を確認する。

kiro-cli chat --no-interactive --trust-tools=read,grep "Say hello"
kiro-cli chat --list-sessions
kiro-cli chat --resume-id <ID> --no-interactive "Continue briefly"

TAKT 実装後は以下を確認する。

  • provider: kiro を config / workflow / provider profile で指定できる。
  • TAKT_KIRO_API_KEY または kiro_api_keyKIRO_API_KEY として Kiro CLI に渡る。
  • TAKT_KIRO_CLI_PATH または kiro_cli_path で executable path を上書きできる。
  • Kiro CLI 未インストール時に分かりやすいエラーになる。
  • 認証失敗時に分かりやすいエラーになる。
  • permissionMode に応じて trust flag が付与される。
  • abort 時に child process が後始末される。
  • 既存 provider の挙動を壊さない。

参考

Execution Report

Workflow takt-default completed successfully.

Closes #773

Summary by CodeRabbit

リリースノート

  • New Features

    • Kiro CLI を新しいプロバイダとして追加。プロバイダ選択や --provider 指定で利用可能になりました。
    • Kiro 用の API キー(環境変数: TAKT_KIRO_API_KEY)と CLI パス(環境変数: TAKT_KIRO_CLI_PATH)を設定できるようになりました。
  • Documentation

    • README、設定ガイド、CLI リファレンス、ワークフロー、CI/CD 等のドキュメントを Kiro 対応で更新しました。

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 29, 2026

📝 Walkthrough

Walkthrough

TAKT に Kiro CLI をプロバイダとして統合する包括的な実装です。プロバイダ型定義から設定管理、実行基盤、クライアント実装、Provider 登録、ユーティリティ、ドキュメント、テストまで全体をカバーしています。

Changes

Kiro CLI プロバイダ統合

Layer / File(s) Summary
プロバイダ型とスキーマ定義
src/shared/types/provider.ts, src/core/models/provider-profiles.ts, src/core/models/schema-base.ts
ProviderType'kiro' を追加し、ProviderProfileName と権限プロファイルスキーマを Kiro に対応させます。
グローバル設定スキーマと環境変数仕様
src/core/models/config-schemas.ts, src/core/models/config-types.ts, src/infra/config/env/global-current-env-specs.ts
kiro_cli_pathkiro_api_key をグローバル設定に追加し、環境変数仕様(TAKT_KIRO_CLI_PATHTAKT_KIRO_API_KEY)を定義します。
Kiro プロセス実行基盤
src/infra/kiro/types.ts, src/infra/kiro/process.ts
子プロセスとして Kiro CLI を実行するための低レベル基盤を実装。環境変数ホワイトリスト、バッファ制御、abort シグナルハンドリングを含みます。
Kiro クライアント実装
src/infra/kiro/client.ts, src/infra/kiro/index.ts
execKiro を用いた高レベルインターフェース(KiroClient/callKiro)を実装。プロンプト結合、権限モードマッピング(full/edit/readonly)、エラー分類・マスキングを含みます。
KiroProvider 実装と登録
src/infra/providers/kiro.ts, src/infra/providers/types.ts, src/infra/providers/index.ts
Kiro CLI を TAKT の Provider インターフェースに接続し、provider registry に登録します。未対応オプション(model、allowedTools、mcpServers など)は無視される設計です。
クロスプラットフォーム spawn ユーティリティ
src/shared/utils/spawn.ts, src/types/cross-spawn.d.ts, package.json
Windows では cross-spawn、非Windows では node:child_process の spawn を使い分ける crossSpawn ラッパーを実装。cross-spawn を依存に追加します。
権限プロファイル解決と設定
src/core/workflow/permission-profile-resolution.ts, src/infra/config/configNormalizers.ts
DEFAULT_PROVIDER_PROFILE_PERMISSION_MODE を導入し、複数プロバイダの権限プロファイルデフォルト値を一元管理します。
グローバル設定の読み込みと永続化
src/infra/config/global/globalConfigCore.ts, src/infra/config/global/globalConfigResolvers.ts, src/infra/config/global/globalConfigSerializer.ts, src/infra/config/global/globalConfig.ts, src/infra/config/global/index.ts
Kiro 設定項目(CLI パス、API キー)を YAML から読み込み、正規化し、保存します。resolveKiroCliPath()resolveKiroApiKey() を追加実装しています。
初期化時のプロバイダ選択
src/infra/config/global/initialization.ts
セットアップ時のプロバイダ選択肢に「Kiro CLI」を追加し、InitialSetupProvider 型(mock 除外)を導入します。
プロジェクト設定の型更新
src/infra/config/project/projectConfig.ts, src/infra/config/traced/tracedConfigSchema.ts
プロジェクト設定スキーマと traced config スキーマに Kiro キーを追加し、型整合を行います。
ドキュメント、サンプル設定、CLI 定義
README.md, docs/*.md, builtins/*.yaml, src/app/cli/program.ts
README、設定ドキュメント(日本語・英語)、ワークフロー例、CLI リファレンス、サンプル config.yaml に Kiro を追記。
包括的なテストスイート
src/__tests__/kiro-client.test.ts, src/__tests__/kiro-config.test.ts, src/__tests__/kiro-provider.test.ts, src/__tests__/kiro-provider-integration.test.ts, src/__tests__/spawn.test.ts, src/__tests__/provider-contract-docs.test.ts, src/__tests__/permission-profile-resolution.test.ts, src/__tests__/initialization.test.ts
ユニットテスト(client、config、provider)、統合テスト、契約整合テスト、spawn ユーティリティテストを追加。エラーハンドリング、abort、キー秘匿、設定優先順位などを検証します。

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • nrslib/takt#775: Codex retry/stream error handling の変更と重複する箇所があります(src/infra/codex/client.ts、関連テスト)。
  • nrslib/takt#767: Codex の再接続/リトライに関する修正があり、本 PR の Codex リトライ関連変更とコードレベルで関連します。
🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes intentional out-of-scope changes: modifying Codex client retry logic (unrelated to Kiro), adding brittle provider contract documentation tests, and unintended dependency downgrades in package.json. While Codex changes may be legitimate, dependency downgrades are concerning as they appear unintentional. Remove or justify unintended changes: restore package.json dependency versions to main branch (only add cross-spawn), clarify Codex client modifications, and either remove the brittle provider-contract-docs test or significantly relax its assertions to focus on code contracts rather than exact documentation text.
Docstring Coverage ⚠️ Warning Docstring coverage is 2.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check ❓ Inconclusive The PR addresses most core requirements from issue #773: Kiro provider type/schema additions, client implementation in src/infra/kiro/, provider registration, global config (kiro_cli_path, kiro_api_key), environment overrides (TAKT_KIRO_CLI_PATH, TAKT_KIRO_API_KEY), permission mode mapping, error handling, and supportsStructuredOutput=false. However, review comments identify unresolved issues: dependency version downgrades (not addressed), KIRO_HOME env missing from allowlist, and overly strict prompt validation that conflicts with Markdown task bodies. Address review feedback items before merge: restore package.json dependencies to main branch versions (revert claude-agent-sdk and @opentelemetry/sdk-node downgrades, keep only cross-spawn), add KIRO_HOME to env allowlist with tests, revise prompt validation to allow '-' prefixes, and relax brittle documentation tests.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title '[#773] add-kiro-provider' directly aligns with the main objective of adding Kiro CLI provider support to TAKT.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch takt/773/add-kiro-provider

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/__tests__/kiro-client.test.ts`:
- Around line 64-67: The test currently deletes process.env.KIRO_API_KEY in the
beforeEach hook causing cross-test side effects; modify the setup to capture the
original value (e.g., const originalKiroApiKey = process.env.KIRO_API_KEY)
before deleting it in beforeEach and add an afterEach hook that restores
process.env.KIRO_API_KEY = originalKiroApiKey (or deletes it if it was
undefined). Update or add the afterEach alongside the existing
beforeEach/vi.clearAllMocks() to ensure tests restore the environment variable
after each run.

In `@src/infra/kiro/process.ts`:
- Around line 146-153: The current handling in the stdoutBytes (and similarly
stderrBytes) overflow branch kills the child with SIGTERM and immediately calls
rejectOnce, which can leave a lingering CLI if it ignores SIGTERM; change this
to send SIGTERM via child.kill('SIGTERM'), then start a short fallback timer
(e.g., 1–2s) that will call child.kill('SIGKILL') if the process is still alive,
and only then call rejectOnce(createExecError(...)). Ensure the same pattern is
applied to both the stdoutBytes and stderrBytes branches, referencing
stdoutBytes, stderrBytes, KIRO_MAX_BUFFER_BYTES, child.kill, and
rejectOnce/createExecError so the code first attempts graceful termination and
then force kills before rejecting to avoid process residuals.
- Around line 39-50: The buildEnv function currently sets env.KIRO_API_KEY only
when the incoming kiroApiKey argument is provided, so a parent-process
KIRO_API_KEY in process.env is not propagated; update buildEnv (and where
KIRO_ENV_ALLOWLIST is considered) to set env.KIRO_API_KEY from kiroApiKey if
provided, otherwise fall back to process.env.KIRO_API_KEY when present (i.e., if
kiroApiKey === undefined and process.env.KIRO_API_KEY !== undefined then assign
env.KIRO_API_KEY = process.env.KIRO_API_KEY) so child processes receive the
parent auth token.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: aaac966a-303c-4aff-9b2b-f306fe9c9e21

📥 Commits

Reviewing files that changed from the base of the PR and between e0fee24 and 0a521eb.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (47)
  • README.md
  • builtins/en/config.yaml
  • builtins/ja/config.yaml
  • docs/README.ja.md
  • docs/ci-cd.ja.md
  • docs/ci-cd.md
  • docs/cli-reference.ja.md
  • docs/cli-reference.md
  • docs/configuration.ja.md
  • docs/configuration.md
  • docs/workflows.ja.md
  • docs/workflows.md
  • package.json
  • src/__tests__/initialization.test.ts
  • src/__tests__/kiro-client.test.ts
  • src/__tests__/kiro-config.test.ts
  • src/__tests__/kiro-provider-integration.test.ts
  • src/__tests__/kiro-provider.test.ts
  • src/__tests__/permission-profile-resolution.test.ts
  • src/__tests__/provider-contract-docs.test.ts
  • src/__tests__/spawn.test.ts
  • src/app/cli/program.ts
  • src/core/models/config-schemas.ts
  • src/core/models/config-types.ts
  • src/core/models/provider-profiles.ts
  • src/core/models/schema-base.ts
  • src/core/workflow/permission-profile-resolution.ts
  • src/infra/config/configNormalizers.ts
  • src/infra/config/env/global-current-env-specs.ts
  • src/infra/config/global/globalConfig.ts
  • src/infra/config/global/globalConfigCore.ts
  • src/infra/config/global/globalConfigResolvers.ts
  • src/infra/config/global/globalConfigSerializer.ts
  • src/infra/config/global/index.ts
  • src/infra/config/global/initialization.ts
  • src/infra/config/project/projectConfig.ts
  • src/infra/config/traced/tracedConfigSchema.ts
  • src/infra/kiro/client.ts
  • src/infra/kiro/index.ts
  • src/infra/kiro/process.ts
  • src/infra/kiro/types.ts
  • src/infra/providers/index.ts
  • src/infra/providers/kiro.ts
  • src/infra/providers/types.ts
  • src/shared/types/provider.ts
  • src/shared/utils/spawn.ts
  • src/types/cross-spawn.d.ts

Comment thread src/__tests__/kiro-client.test.ts
Comment thread src/infra/kiro/process.ts
Comment thread src/infra/kiro/process.ts
@nrslib
Copy link
Copy Markdown
Owner Author

nrslib commented May 31, 2026

レビューしました。CI は lint / test / e2e-mock が通っていますが、このままマージは待ったほうがよいです。

主な要修正点です。

  1. package.json / package-lock.json で無関係な依存ダウングレードが入っています。

@anthropic-ai/claude-agent-sdk^0.2.141 から ^0.2.119@opentelemetry/sdk-node^0.218.0 から ^0.217.0 に戻っています。Kiro provider 対応とは関係ないので、main 側のバージョンに戻し、cross-spawn 追加だけにしてください。

  1. src/infra/kiro/process.ts の env allowlist が KIRO_HOME を落としています。

Kiro 公式 docs では KIRO_HOME が global agents / prompts / skills / steering / settings / sessions の場所を変える環境変数です。これを child process に渡さないと、Kiro CLI をカスタム home で運用している環境で TAKT 経由だけ設定や session が見えなくなります。少なくとも KIRO_HOME は allowlist に入れてください。proxy/cert 系をどう扱うかも確認したほうがよいです。

  1. src/infra/kiro/client.ts の「prompt が - で始まると reject」は過剰に見えます。

TAKT のタスク本文は Markdown なので、箇条書きだけの依頼や - fix ... のような正当な入力を provider 側で失敗させます。CLI option 誤解釈を避けるなら、可能なら -- 区切りを使うか、Kiro CLI 仕様上どうしても無理な場合だけ制約として扱ってください。

  1. src/__tests__/provider-contract-docs.test.ts はドキュメント文言に対する brittle なテストです。

provider schema と CLI help の整合テストは有用ですが、Markdown の括弧内テキストや builtin config のコメント文字列まで unit test にするのは過剰です。以前の方針ともズレるので、消すか、コード契約のテストに絞るのがよいです。

全体として、kiro を独立 provider として追加している構造、registry/schema/config/env への配線、supportsStructuredOutput = false、model/MCP を初期スコープ外にしている判断は妥当です。上記を直せば再レビューできます。

@nrslib
Copy link
Copy Markdown
Owner Author

nrslib commented May 31, 2026

Summary

タスク指示書: PR #776 Kiro provider レビュー指摘対応

目的

PR #776 [#773] add-kiro-provider のレビュー指摘事項に対応し、Kiro provider 追加実装をマージ可能な状態にする。CodeRabbit の Active Review Threads と、nrslib のレビューコメントで指摘された問題を現在のコードで検証し、妥当なものを修正する。

対象

  • PR: [#773] add-kiro-provider #776
  • ブランチ/変更対象: takt/773/add-kiro-provider
  • 主な対象ファイル:
    • package.json
    • package-lock.json
    • src/infra/kiro/process.ts
    • src/infra/kiro/client.ts
    • src/__tests__/kiro-client.test.ts
    • src/__tests__/provider-contract-docs.test.ts
    • 関連する Kiro provider テストファイル

作業項目

高: 無関係な依存ダウングレードを戻す

対象:

  • package.json
  • package-lock.json

作業:

  • @anthropic-ai/claude-agent-sdk^0.2.141 から ^0.2.119 に戻っている場合、main 側の ^0.2.141 に戻す。
  • @opentelemetry/sdk-node^0.218.0 から ^0.217.0 に戻っている場合、main 側の ^0.218.0 に戻す。
  • Kiro provider 対応として必要な cross-spawn 追加は維持する。
  • lockfile も package.json と整合させる。

確認:

  • npm install または既存の lockfile 更新手順で package-lock.json を整合させる。
  • git diff package.json package-lock.json で、無関係な依存ダウングレードが残っていないことを確認する。

高: KIRO_API_KEY の親環境フォールバックを実装する

対象:

  • src/infra/kiro/process.ts

作業:

  • buildEnvkiroApiKey 引数が指定されている場合は、それを env.KIRO_API_KEY に設定する。
  • kiroApiKey 引数が未指定で、親プロセスの process.env.KIRO_API_KEY が存在する場合は、それを子プロセス env の KIRO_API_KEY に渡す。
  • 既存の env allowlist 処理との重複や優先順位を確認し、明示指定された kiroApiKey が親環境より優先されるようにする。

確認:

  • src/__tests__/kiro-client.test.ts または適切な Kiro process/client テストに、親環境の KIRO_API_KEY が子プロセス env に渡るケースを追加/更新する。
  • 明示指定の kiroApiKey が親環境より優先される既存/追加テストを確認する。

高: KIRO_HOME を Kiro child process に引き継ぐ

対象:

  • src/infra/kiro/process.ts
  • 関連テスト

作業:

  • Kiro CLI 実行時の env allowlist に KIRO_HOME を追加する。
  • KIRO_HOME が設定されている場合、子プロセス env に渡るようにする。
  • proxy/cert 系 env の扱いについて、既存 CLI provider や既存 spawn/env allowlist の方針をコード上で確認し、Kiro provider でも同等に扱う必要があるものは実装する。

確認:

  • KIRO_HOME が子プロセス env に渡るテストを追加/更新する。
  • proxy/cert 系 env を追加した場合は、それらもテストで確認する。

高: stdout/stderr バッファ超過時の child process 後始末を強化する

対象:

  • src/infra/kiro/process.ts
  • 関連テスト

作業:

  • stdout バッファ超過時、まず child.kill('SIGTERM') を送る。
  • 短い fallback timer を設定し、プロセスが残っている場合は child.kill('SIGKILL') を送る。
  • stderr バッファ超過時も同じ処理にする。
  • rejectOnce(createExecError(...)) の呼び出し、timer の cleanup、unref の有無を既存の abort/timeout 実装と整合させる。
  • 多重 reject や timer 残留が起きないようにする。

確認:

  • stdout 超過時に SIGTERM と fallback SIGKILL が設定されるテストを追加/更新する。
  • stderr 超過時も同様に確認する。
  • 既存の abort signal、非ゼロ exit、ENOENT、通常完了のテストが壊れていないことを確認する。

高: KIRO_API_KEY を削除するテストの環境復元を実装する

対象:

  • src/__tests__/kiro-client.test.ts

作業:

  • process.env.KIRO_API_KEY の初期値を保持する。
  • beforeEach で削除する場合、afterEach で初期値を復元する。
  • 初期値が undefined の場合は afterEach で削除状態に戻す。
  • vi.clearAllMocks() など既存 setup と整合させる。

確認:

  • src/__tests__/kiro-client.test.ts 単体を実行し、環境変数副作用が残らないことを確認する。
  • 可能であれば、該当 suite 内で親環境 KIRO_API_KEY を扱うテストと干渉しないことを確認する。

中: prompt が - で始まる入力の reject を見直す

対象:

  • src/infra/kiro/client.ts
  • 関連テスト

作業:

  • 現在のコードで、prompt が - で始まる場合に reject しているか確認する。
  • reject している場合、TAKT の Markdown タスク本文として正当な - fix ... や箇条書き入力が Kiro provider で失敗しないよう修正する。
  • CLI option 誤解釈を避けるため、Kiro CLI が -- 区切りを受け付ける実装/仕様であれば、prompt の前に -- を入れる。
  • -- が利用できない場合は、既存の引数構築方式で prompt が option として解釈されない安全な渡し方に修正する。

確認:

  • prompt が - fix ... のように - で始まっても reject されず、Kiro CLI 呼び出し引数に正しく含まれるテストを追加/更新する。
  • 既存の trust flag、resume id、no-interactive の引数順が壊れていないことを確認する。

中: brittle な provider contract docs テストを見直す

対象:

  • src/__tests__/provider-contract-docs.test.ts
  • 必要に応じて関連 docs/builtins

作業:

  • provider schema と CLI help の整合を確認するテストは維持する。
  • Markdown の括弧内テキストや builtin config のコメント文字列など、ドキュメント文言そのものに強く依存する unit test は削除するか、コード契約の検証に絞る。
  • テスト削除/変更に伴って不要になった helper や fixture があれば削除する。

確認:

  • docs の自然な文言変更で unit test が壊れない粒度になっていることを確認する。
  • Kiro provider の provider schema / CLI help / config contract の重要な整合性は引き続きテストで担保する。

中: コメント指摘事項への対応状況を整理する

対象:

  • 実装レポート/最終サマリー

作業:

  • CodeRabbit Active Review Threads 3件について、対応済みか、現在のコードでは不成立でスキップしたか、理由を整理する。
  • nrslib コメントの4件について、対応内容を整理する。
  • Resolved / Outdated コメントは原則修正対象にしない。ただし現在のコードに同じ問題が明確に残っている場合のみ対応する。

確認:

  • 最終出力で、各コメントに対する対応/スキップ理由が確認できること。

優先度一覧

優先度 項目
package.json / package-lock.json の無関係な依存ダウングレードを戻す
KIRO_API_KEY の親環境フォールバックを実装する
KIRO_HOME を Kiro child process に引き継ぐ
stdout/stderr バッファ超過時の child process 後始末を強化する
KIRO_API_KEY を削除するテストの環境復元を実装する
prompt が - で始まる入力の reject を見直す
brittle な provider contract docs テストを見直す
コメント指摘事項への対応状況を整理する

確認コマンド

最低限、以下を実行して結果を記録する。

npm run lint
npm test
npm run test:e2e:mock

変更内容に応じて、以下も実行する。

npm run build

個別確認として、関連テストを先に実行してよい。

npm test -- src/__tests__/kiro-client.test.ts
npm test -- src/__tests__/kiro-provider.test.ts
npm test -- src/__tests__/provider-contract-docs.test.ts

完了条件

  • CodeRabbit Active Review Threads の妥当な指摘が修正済みである。
  • nrslib の4件の要修正点が修正済みである。
  • package.json / package-lock.json に Kiro provider と無関係な依存ダウングレードが残っていない。
  • KIRO_API_KEYKIRO_HOME、必要な proxy/cert 系 env の child process 引き継ぎがテストで確認されている。
  • stdout/stderr バッファ超過時に graceful kill と force kill fallback が動作する。
  • - で始まる Markdown prompt が provider 側で不当に reject されない。
  • docs 文言に過度に依存する brittle な unit test が整理されている。
  • npm run lintnpm testnpm run test:e2e:mock の実行結果が記録されている。

Open Questions

  • Kiro CLI が prompt 前の -- 区切りを正式に受け付けるかは、実装コードまたは利用可能な CLI 仕様で確認すること。受け付けない場合は、prompt が option として解釈されない別方式で実装する。

Execution Report

Workflow review-fix-takt-default completed successfully.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/__tests__/dependency-versions.test.ts`:
- Around line 175-185: The new test "locks runtime transitive dependencies to
patched security releases" in src/__tests__/dependency-versions.test.ts is
unrelated to the Kiro provider change; either remove these assertions (the
expect(...) calls that use readPackageLock() and getLockedPackage(...)) from
this PR or move them into a separate PR/test file dedicated to
dependency-version locking; if you must keep them here, add a clear
justification in the PR description and commit message explaining why the
dependency-lock assertions (calls to readPackageLock and getLockedPackage for
ajv, express-rate-limit, fast-uri, hono, ip-address, protobufjs, qs) are
included despite scope rules.

In `@src/infra/codex/client.ts`:
- Line 44: This change introduces unrelated, breaking behavior in the Codex
client (e.g., addition of CODEX_RETRY_MAX_DELAY_MS, altered stream `error`
handler that no longer breaks, new failure detection when `turn.completed` is
not seen, and suppression of retries after stream errors); revert these
modifications from the Kiro feature branch and isolate them into a separate PR
instead: restore the original retry/backoff logic and event handling in the
Codex client (functions/classes referenced like CODEX_RETRY_MAX_DELAY_MS, the
stream `error` event handler, the `turn.completed` observation logic, and the
retry suppression behavior) so the Kiro provider changes only touch
Kiro-specific code, then open a dedicated PR for any intended Codex client
contract changes.

In `@src/infra/config/global/globalConfigCore.ts`:
- Line 168: provider_profiles の default_permission_mode
を必須化したため既存設定がパースエラーになる破壊的変更が発生します。CHANGELOG.md
に該当エントリを追加し、「default_permission_mode が必須になったこと」「許容値は 'readonly' | 'edit' |
'full' であること」「既存設定の移行手順(全ての provider_profiles に例えば default_permission_mode:
'readonly' を追加する方法や一括置換コマンドの例)」「影響を受けるコード箇所(ProviderPermissionProfileSchema と
normalizeProviderProfiles)を追記」してください。これによりユーザーが設定を更新してパースエラーを回避できるように記載してください。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d8571d8c-dff3-4faa-8010-5364b00c8a06

📥 Commits

Reviewing files that changed from the base of the PR and between 0a521eb and 6b0c9ca.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (15)
  • package.json
  • src/__tests__/codex-client-retry.test.ts
  • src/__tests__/dependency-versions.test.ts
  • src/__tests__/kiro-client.test.ts
  • src/__tests__/kiro-config.test.ts
  • src/__tests__/provider-contract-docs.test.ts
  • src/core/models/schema-base.ts
  • src/infra/codex/client.ts
  • src/infra/config/configNormalizers.ts
  • src/infra/config/global/globalConfigCore.ts
  • src/infra/config/project/projectConfig.ts
  • src/infra/kiro/client.ts
  • src/infra/kiro/process.ts
  • src/infra/kiro/types.ts
  • src/infra/providers/kiro.ts
💤 Files with no reviewable changes (3)
  • src/infra/kiro/types.ts
  • src/tests/provider-contract-docs.test.ts
  • src/infra/providers/kiro.ts

Comment on lines +175 to +185
it('locks runtime transitive dependencies to patched security releases', () => {
const packageLock = readPackageLock();

expect(getLockedPackage(packageLock, 'node_modules/ajv').version).toBe('6.15.0');
expect(getLockedPackage(packageLock, 'node_modules/express-rate-limit').version).toBe('8.5.2');
expect(getLockedPackage(packageLock, 'node_modules/fast-uri').version).toBe('3.1.2');
expect(getLockedPackage(packageLock, 'node_modules/hono').version).toBe('4.12.23');
expect(getLockedPackage(packageLock, 'node_modules/ip-address').version).toBe('10.2.0');
expect(getLockedPackage(packageLock, 'node_modules/protobufjs').version).toBe('7.6.1');
expect(getLockedPackage(packageLock, 'node_modules/qs').version).toBe('6.15.2');
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial | 💤 Low value

Kiro プロバイダとは無関係な依存関係テストの追加

このテストは、ランタイムの推移的依存関係のバージョンをロックする重要なセキュリティ対策ですが、Kiro プロバイダ機能とは直接関係ありません。PR の範囲が拡大している可能性があります。

As per coding guidelines: "Scope creep / incidental contract changes: don't change observable contracts (error messages, public API shapes, CLI help text expectations, provider registry behavior) unless required by the Kiro feature."

別の PR として分離することを検討してください。ただし、既にマージ準備が整っている場合は、このままでも問題ありません。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/__tests__/dependency-versions.test.ts` around lines 175 - 185, The new
test "locks runtime transitive dependencies to patched security releases" in
src/__tests__/dependency-versions.test.ts is unrelated to the Kiro provider
change; either remove these assertions (the expect(...) calls that use
readPackageLock() and getLockedPackage(...)) from this PR or move them into a
separate PR/test file dedicated to dependency-version locking; if you must keep
them here, add a clear justification in the PR description and commit message
explaining why the dependency-lock assertions (calls to readPackageLock and
getLockedPackage for ajv, express-rate-limit, fast-uri, hono, ip-address,
protobufjs, qs) are included despite scope rules.

Comment thread src/infra/codex/client.ts
const CODEX_TIMEOUT_MAX_RETRIES = 2;
const CODEX_RETRY_MAX_RETRIES = 8;
const CODEX_RETRY_BASE_DELAY_MS = 1000;
const CODEX_RETRY_MAX_DELAY_MS = 30_000;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚖️ Poor tradeoff

Kiro プロバイダとは無関係な Codex クライアントの大幅な変更

このファイルには、Codex SDK クライアントのリトライロジックとストリームエラー処理に対する重要な変更が含まれていますが、Kiro プロバイダ機能とは完全に無関係です:

  1. リトライ遅延の上限追加(30秒キャップ)
  2. error イベント処理の変更(即座に break せず継続)
  3. turn.completed が観測されない場合の失敗判定ロジック追加
  4. ストリームエラー後のリトライ抑制

これらは Codex プロバイダの動作を変更する重要な変更であり、別の PR として分離すべきです。

As per coding guidelines: "Scope creep / incidental contract changes: don't change observable contracts [...] unless required by the Kiro feature."

Codex クライアントの変更を別の PR に分離し、Kiro プロバイダの実装に集中することを推奨します。

Also applies to: 155-158, 358-390, 453-462, 480-480

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/infra/codex/client.ts` at line 44, This change introduces unrelated,
breaking behavior in the Codex client (e.g., addition of
CODEX_RETRY_MAX_DELAY_MS, altered stream `error` handler that no longer breaks,
new failure detection when `turn.completed` is not seen, and suppression of
retries after stream errors); revert these modifications from the Kiro feature
branch and isolate them into a separate PR instead: restore the original
retry/backoff logic and event handling in the Codex client (functions/classes
referenced like CODEX_RETRY_MAX_DELAY_MS, the stream `error` event handler, the
`turn.completed` observation logic, and the retry suppression behavior) so the
Kiro provider changes only touch Kiro-specific code, then open a dedicated PR
for any intended Codex client contract changes.

providerProfiles: normalizeProviderProfiles(
parsed.provider_profiles as Record<string, {
default_permission_mode: string;
default_permission_mode: 'readonly' | 'edit' | 'full';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check for default permission mode handling and migration guidance

# Search for default permission mode constants or fallbacks
rg -nP 'DEFAULT.*PERMISSION.*MODE' --type=ts

# Search for migration guides or changelog entries
fd -e md -e txt CHANGELOG MIGRATION

# Check test fixtures for provider_profiles without default_permission_mode
rg -nP 'provider_profiles.*:' --type=yaml --type=ts -A5 | rg -v 'default_permission_mode'

Repository: nrslib/takt

Length of output: 10104


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) 変更対象の実ファイル内容を確認
echo "---- globalConfigCore.ts (around default_permission_mode) ----"
nl -ba src/infra/config/global/globalConfigCore.ts | sed -n '140,210p'

echo "---- schema-base.ts (ProviderPermissionProfileSchema) ----"
# Try to locate by symbol name first
if rg -n "ProviderPermissionProfileSchema" src/core/models/schema-base.ts >/dev/null; then
  nl -ba src/core/models/schema-base.ts | sed -n '1,240p'
  # Narrow further if file is huge
  nl -ba src/core/models/schema-base.ts | sed -n '240,520p'
  rg -n "ProviderPermissionProfileSchema" -n src/core/models/schema-base.ts
else
  rg -n "default_permission_mode" src/core/models/schema-base.ts
  rg -n "PermissionProfileSchema" src/core/models/schema-base.ts
fi

# 2) default_permission_mode が YAML/fixtures/test で実際に書かれているか確認
echo "---- Search fixtures/configs for default_permission_mode ----"
rg -n "default_permission_mode" -S e2e fixtures builtins src/__tests__ src -g'*.yaml' -g'*.yml'

echo "---- Files that include provider_profiles but may omit default_permission_mode ----"
# List YAML files with provider_profiles
files=$(rg -l "provider_profiles:" -S -g'*.yaml' -g'*.yml' e2e fixtures builtins src/__tests__ src || true)
echo "$files" | sed 's/^/ - /'

# For each such file, check whether default_permission_mode appears anywhere in the file.
echo "---- provider_profiles files: contains default_permission_mode? ----"
if [ -n "${files:-}" ]; then
  for f in $files; do
    if rg -n "default_permission_mode" "$f" >/dev/null; then
      echo "[OK] $f has default_permission_mode"
    else
      echo "[MISS] $f lacks default_permission_mode"
    fi
  done
fi

# 3) CHANGELOG / migration 記載の探索(前回の fd の誤指定を回避)
echo "---- CHANGELOG references for permission mode / kiro provider / default_permission_mode ----"
ls -la
if [ -f CHANGELOG.md ]; then
  rg -n "kiro|default_permission_mode|permission_mode|provider_profiles" CHANGELOG.md || true
else
  echo "No CHANGELOG.md at repo root"
fi

echo "---- Search docs for MIGRATION ----"
rg -n "MIGRATION|migration" -S -g'*.md' . || true

# 4) 既存のデフォルト補完があるか(resolution 側)
echo "---- Permission mode resolution (permission-profile-resolution.ts) ----"
nl -ba src/core/workflow/permission-profile-resolution.ts | sed -n '1,120p'

echo "---- provider-profiles.ts (DEFAULT_PROVIDER_PROFILE_PERMISSION_MODE) ----"
nl -ba src/core/models/provider-profiles.ts | sed -n '1,120p'

Repository: nrslib/takt

Length of output: 179


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- globalConfigCore.ts (look for default_permission_mode) ----"
rg -n "default_permission_mode" src/infra/config/global/globalConfigCore.ts
sed -n '140,210p' src/infra/config/global/globalConfigCore.ts | cat -n

echo "---- schema-base.ts (look for ProviderPermissionProfileSchema / default_permission_mode) ----"
rg -n "ProviderPermissionProfileSchema" src/core/models/schema-base.ts || true
rg -n "default_permission_mode" src/core/models/schema-base.ts || true

# Show surrounding definitions for any match in schema-base.ts
for m in $(rg -n "default_permission_mode" src/core/models/schema-base.ts | cut -d: -f1 | head -n 20); do
  start=$((m-20))
  end=$((m+60))
  echo "---- schema-base.ts lines ${start}-${end} (around $m) ----"
  sed -n "${start},${end}p" src/core/models/schema-base.ts | cat -n
done

echo "---- Permission mode resolution (permission-profile-resolution.ts) ----"
rg -n "DEFAULT_PROVIDER_PROFILE_PERMISSION_MODE|defaultPermissionMode|permission mode" src/core/workflow/permission-profile-resolution.ts
sed -n '1,140p' src/core/workflow/permission-profile-resolution.ts | cat -n

echo "---- provider-profiles.ts (DEFAULT_PROVIDER_PROFILE_PERMISSION_MODE) ----"
sed -n '1,120p' src/core/models/provider-profiles.ts | cat -n

echo "---- Search for default_permission_mode in YAML/fixtures/builtins/tests ----"
rg -n "default_permission_mode" -S \
  -g'*.yaml' -g'*.yml' \
  e2e fixtures builtins src/__tests__ src || true

echo "---- Files containing provider_profiles but missing default_permission_mode ----"
files=$(rg -l "provider_profiles:" -S -g'*.yaml' -g'*.yml' e2e fixtures builtins src/__tests__ src || true)
if [ -z "${files}" ]; then
  echo "No provider_profiles YAML files found by search."
  exit 0
fi

fail=0
while IFS= read -r f; do
  if ! rg -n "default_permission_mode" "$f" >/dev/null 2>&1; then
    echo "[MISS] $f"
    fail=1
  fi
done <<< "$files"

exit $fail

Repository: nrslib/takt

Length of output: 15009


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- builtins/*/config.yaml around provider_profiles ----"
for f in builtins/en/config.yaml builtins/ja/config.yaml; do
  echo "### $f"
  rg -n "provider_profiles:" "$f" || true
  sed -n '70,110p' "$f" | cat -n
done

echo "---- e2e/fixtures/config.e2e.yaml: provider_profiles section ----"
rg -n "provider_profiles:|default_permission_mode:" e2e/fixtures/config.e2e.yaml || true
sed -n '1,60p' e2e/fixtures/config.e2e.yaml | cat -n

echo "---- e2e/specs/* for provider_profiles blocks (check for missing default_permission_mode) ----"
# Find test files that mention provider_profiles but not default_permission_mode anywhere in the file
spec_files=$(rg -l "provider_profiles:" e2e/specs -g'*.ts' || true)
if [ -z "${spec_files}" ]; then
  echo "No e2e/specs/*.ts with provider_profiles found."
else
  for f in $spec_files; do
    if ! rg -n "default_permission_mode" "$f" >/dev/null 2>&1; then
      echo "[MISS] $f has provider_profiles but no default_permission_mode"
      # show nearby snippet
      rg -n "provider_profiles:" "$f" -n -A8 | head -n 40
    else
      echo "[OK] $f"
    fi
  done
fi

echo "---- src/__tests__ for provider_profiles blocks (ts string) ----"
test_files=$(rg -l "provider_profiles:" src/__tests__ -g'*.ts' || true)
if [ -z "${test_files}" ]; then
  echo "No src/__tests__/*.ts with provider_profiles found."
else
  for f in $test_files; do
    if ! rg -n "default_permission_mode" "$f" >/dev/null 2>&1; then
      echo "[MISS] $f has provider_profiles but no default_permission_mode"
      rg -n "provider_profiles:" "$f" -A10 | head -n 60
    else
      echo "[OK] $f"
    fi
  done
fi

Repository: nrslib/takt

Length of output: 3803


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- CHANGELOG.md references ----"
if [ -f CHANGELOG.md ]; then
  rg -n "kiro|default_permission_mode|permission_mode|provider_profiles|migration" CHANGELOG.md || true
else
  echo "CHANGELOG.md not found"
fi

echo "---- provider_profiles: in all YAML/YML, check for default_permission_mode presence ----"
files=$(rg -l "provider_profiles:" -S -g'*.yaml' -g'*.yml' . || true)
echo "Found files:"
echo "$files" | sed 's/^/ - /'

fail=0
while IFS= read -r f; do
  if ! rg -n "default_permission_mode" "$f" >/dev/null 2>&1; then
    echo "[MISS] $f"
    fail=1
  fi
done <<< "$files"

exit $fail

Repository: nrslib/takt

Length of output: 1421


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n "function normalizeProviderProfiles|normalizeProviderProfiles" src/infra/config/global/globalConfigCore.ts
rg -n "normalizeProviderProfiles" src/infra/config/global/globalConfigCore.ts -n -A80 -B20

# If it lives elsewhere, locate it
rg -n "normalizeProviderProfiles" src/infra/config -S

Repository: nrslib/takt

Length of output: 10087


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- src/infra/config/configNormalizers.ts: normalizeProviderProfiles/denormalizeProviderProfiles ----"
sed -n '1,260p' src/infra/config/configNormalizers.ts | cat -n

echo "---- Search legacy migration for default_permission_mode / permission_mode ----"
rg -n "default_permission_mode|defaultPermissionMode|permission_mode|required_permission_mode" src/infra/config -S

echo "---- src/infra/config/global/globalConfigLegacyMigration.ts (focus around permission/profile migration) ----"
# show file with line numbers but only relevant segments
if [ -f src/infra/config/global/globalConfigLegacyMigration.ts ]; then
  rg -n "permission_mode|required_permission_mode|provider_profiles|default_permission_mode" src/infra/config/global/globalConfigLegacyMigration.ts || true
  sed -n '1,260p' src/infra/config/global/globalConfigLegacyMigration.ts | cat -n
else
  echo "File not found: src/infra/config/global/globalConfigLegacyMigration.ts"
fi

echo "---- Any other migration for global/project config (search) ----"
rg -n "legacyMigration|migrate|normalizeProviderProfiles|provider_profiles" src/infra/config/global src/infra/config/project -S

Repository: nrslib/takt

Length of output: 14455


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- CHANGELOG.md around provider_profiles section ----"
# Show the relevant area around the line numbers surfaced earlier
sed -n '1060,1120p' CHANGELOG.md | cat -n

echo "---- Search for 'default_permission_mode' in CHANGELOG.md (verbatim context) ----"
rg -n "default_permission_mode" CHANGELOG.md -n -C2 || true

echo "---- Search for 'migration' docs ----"
rg -n "MIGRATION|migration" -S -g'*.md' . || true

Repository: nrslib/takt

Length of output: 8156


default_permission_mode 必須化は既存設定に互換性影響(パースエラー)を生むため、注意喚起/移行記載が必要

provider_profilesdefault_permission_modesrc/core/models/schema-base.tsProviderPermissionProfileSchema で必須になっており、src/infra/config/configNormalizers.tsnormalizeProviderProfiles でも省略時の補完はありません。結果として provider_profiles 内に default_permission_mode が無い設定は設定パース時に失敗します。ユーザー影響(破壊的変更)として、CHANGELOG.md の該当エントリに「省略不可であること/既存設定の対応方法」を追記してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/infra/config/global/globalConfigCore.ts` at line 168, provider_profiles の
default_permission_mode を必須化したため既存設定がパースエラーになる破壊的変更が発生します。CHANGELOG.md
に該当エントリを追加し、「default_permission_mode が必須になったこと」「許容値は 'readonly' | 'edit' |
'full' であること」「既存設定の移行手順(全ての provider_profiles に例えば default_permission_mode:
'readonly' を追加する方法や一括置換コマンドの例)」「影響を受けるコード箇所(ProviderPermissionProfileSchema と
normalizeProviderProfiles)を追記」してください。これによりユーザーが設定を更新してパースエラーを回避できるように記載してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Kiro CLI provider support

1 participant