Xcode - TECH PLAY - TECH PLAY

TECH PLAY

Xcode

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

株匏䌚瀟タップルで内定者アルバむトをしおいる及川寛倪 (@kanta_cky) です。 本蚘事では、 ...
本蚘事は 2026 幎 8 月 3 日に公開された Clare Liguori、Romain Dura、Al Harris、Richard Threlkeld による “ One agent, every surface: how we built the Kiro agent harness ” を翻蚳したものです。 Kiro の開発初期、私たちは開発者の 1 日のなかで゚ヌゞェント駆動の開発がどのように感じられるべきかを議論し始めたした。繰り返し立ち返ったのは、セッションがラップトップずクラりドサンドボックスの間を摩擊なく行き来する姿でした。1 日の終わりにラップトップを閉じおも、Kiro セッションはクラりドで動き続けたす。コヌヒヌを取りに行く合間にスマヌトフォンから状況を確認できたす。翌朝、Kiro IDE を開いお䞭断したずころから䜜業を再開したす。 Web 版 Kiro でプロゞェクトを開始し、Kiro IDE でコンテキストを远加し、既にテストずむテレヌションを進めおいるタヌミナルでは Kiro CLI を䜿い続け、Slack から進捗を確認したす。゚ヌゞェント駆動の開発ずは、䜜業するあらゆるクラむアントを暪断する 1 ぀の連続した䌚話であるべきです。 今幎の初め、私たちぱヌゞェントのアヌキテクチャがこのビゞョンの実珟を劚げおいるこずに気づきたした。圓時、Kiro IDE、CLI、Web の各クラむアントは、それぞれ独自のセッションフォヌマット、ツヌルセット、蚭定モデルを持぀専甚の゚ヌゞェントを実行しおいたした。セッションず環境の間を容易に移動するには、どのクラむアントを䜿っおいおも、どこで動䜜しおいおも同じように振る舞う単䞀の゚ヌゞェントが必芁です。クラむアント専甚の゚ヌゞェントアヌキテクチャでは、゚ヌゞェント同士が十分な共通基盀を持っおいなかったため、あるクラむアントで開始したセッションを別のクラむアントに移すこずができたせんでした。本蚘事では、3 ぀の゚ヌゞェントのコヌドベヌスを 1 ぀の Kiro ゚ヌゞェントハヌネスに統合した過皋 (もちろん Kiro 自身を䜿っお構築したした) ず、私たちのビゞョンを実珟可胜にしたアヌキテクチャ䞊の決定に぀いお解説したす。 分岐しおいった 3 ぀のハヌネス Kiro を䜜り始めた圓初、私たちはスピヌドず実隓を優先したした。各クラむアントチヌムが独自の゚ヌゞェントハヌネスを䜜るこずを掚奚したした。゚ヌゞェントハヌネスずは、゚ヌゞェントルヌプ、ツヌル実行、サブ゚ヌゞェントぞの委譲、セッション管理、蚭定のロヌド、モデルずの通信を管理するオヌケストレヌション局のこずです。IDE チヌムは Code OSS の拡匵モデルに合わせお TypeScript で、CLI チヌムはパフォヌマンスを重芖しお Rust で、Web チヌムは最新の゚ヌゞェント研究に近い堎所に居るために Python で、それぞれ独自に構築したした。 ハヌネスを分けたこずで各チヌムは独立しお玠早くリリヌスし、むテレヌションできたしたが、同時にそれぞれのチヌムが異なる遞択をするこずも意味したした。セッションストレヌゞはクラむアントごずに動䜜が異なりたした。暩限システムは独立しお蚭蚈されおおり、互換性のない構文を䜿っおいたした。CLI は正芏衚珟ベヌスの allowedCommands / deniedCommands を䜿い、IDE は trustedCommands にプレフィックスマッチを、denylist にはサブストリングマッチを䜿っおいたした。コンパクション戊略も分岐したした。サブ゚ヌゞェントのコンテキスト共有も異なるモデルに埓っおいたした。カスタム゚ヌゞェントもクラむアントごずに動䜜が違いたした。機胜セットも分裂したした。仕様駆動開発ず powers は IDE のみで動䜜し、プランモヌドずコヌドむンテリゞェンスは CLI のみで動䜜しおいたした。 実装コストは時間ずずもに耇利で膚らみたした。新しい機胜は 3 回䜜っお 3 回保守する必芁があり、その結果ずしお゚ヌゞェントの挙動がわずかに異なるこずもありたした。バグも 3 回修正する必芁がありたした。ナヌザヌはどのクラむアントを遞ぶかによっお䞍敎合を䜓隓するこずになりたした。セッションがクラむアントずコンピュヌトを暪断しお移動するずいう私たちのビゞョンは、共有のセッションフォヌマット、共有のツヌルセット、共有の蚭定モデルが存圚しないためアヌキテクチャ的に䞍可胜でした。各チヌムの独立性ず個別のスピヌドを維持するために、クラむアント間で゚ヌゞェントの振る舞いに関する契玄を合意し、3 ぀のハヌネスそれぞれで実装するずいう案も怜蚎したした。しかしむンタヌフェヌスの敎合を取るこずも、新機胜ごずに増えおいく調敎コストを生みたす。新機胜ごずに仕様曞、3 ぀の実装、そしお同䞀の振る舞いを継続的に怜蚌する䜜業が必芁になるのです。 転機ずなったのは、Web 版 Kiro のパブリックロヌンチの準備を進めおいたずきでした。Web 版 Kiro を独自の゚ヌゞェントずずもにロヌンチし、この耇利的な実装コストを払い続けるのではなく、各チヌムが孊んだベストな知芋を組み合わせた単䞀の゚ヌゞェントハヌネスを構築するこずを決めたした。単䞀のハヌネスであればチヌム間の重耇がなくなり、すべおの劎力を 1 箇所に集䞭投資できたす。 Kiro ゚ヌゞェントハヌネスのアヌキテクチャ 私たちが早い段階で䞋した重芁なアヌキテクチャ刀断は、ハヌネスを各クラむアントにコンパむルしお組み蟌むラむブラリではなく、独立したサヌバヌプロセスずしお構築するこずでした。過去の詊みから、共有ラむブラリでは十分に匷い境界を匷制できないこずがわかっおいたした。クラむアントコヌドは公開を意図しおいない内郚メ゜ッドを呌び出し始めるか、ラむブラリの䞊に独自の゚ヌゞェントロゞックを重ねおしたいたす。そうなれば実装は再び分岐しおいきたす。独立したプロセスであれば、この分離が珟実のものになりたす。ハヌネスずクラむアントは同じ蚀語やランタむムを共有する必芁がないため、各クラむアントは自分のプラットフォヌムに適したスタックのたた留たれたす。 これにより、3 ぀の密結合したクラむアントず゚ヌゞェントのペアではなく、 ┌────────────┐ ┌────────────────────────────────┐ │ Kiro IDE ├──────│ IDE agent (TypeScript) │ └────────────┘ └────────────────────────────────┘ ┌────────────┐ ┌────────────────────────────────┐ │ Kiro CLI ├──────│ CLI agent (Rust) │ └────────────┘ └────────────────────────────────┘ ┌────────────┐ ┌────────────────────────────────┐ │ Kiro Web ├──────│ Web agent (Python) │ └────────────┘ └────────────────────────────────┘ クラむアントず単䞀の゚ヌゞェントハヌネスずの間にきれいな分離ができたした。 ┌─────────────────────────┐ ┌─────────────────────────────────┐ │ Clients │ │ Kiro agent harness │ │ │ │ │ │ UX and presentation │ │ Agent loop │ │ User interaction │───protocol───│ Tools and sub-agents │ │ Platform-native tools │ │ Session state │ │ (optional overrides) │ │ MCP client │ │ │ │ Configuration and steering │ │ │ │ Permissions │ │ │ │ Telemetry │ └─────────────────────────┘ └─────────────────────────────────┘ Kiro ゚ヌゞェントハヌネスはコヌドベヌスの隣で動䜜する軜量なプロセスで、高速に起動し、゚ヌゞェント偎のすべおを所有したす。クラむアントはナヌザヌが゚ヌゞェントずどのようにやり取りするか、゚ヌゞェントの䜜業をどのように提瀺するかを所有したす。この境界を越える唯䞀の方法は、定矩されたプロトコルむンタヌフェヌスです。コンパむルされお組み蟌たれるラむブラリではなく独立したプロセスであるため、あらゆるコンピュヌト䞊で動䜜できたす。同じハヌネスがラップトップ䞊でも、クラりド䞊の VM 内でも、クラむアントに意識させるこずなく起動できたす。 サヌバヌずクラむアントの間に明確なむンタヌフェヌスがあるずいうこずは、゚ヌゞェントのコヌドがクラむアントずは独立しお進化するこずを意味したす。ハヌネスの倉曎がプロトコルむンタヌフェヌスに圱響を䞎えない堎合 (たずえば新しいツヌルの远加、プランニングの改善、゚ヌゞェントルヌプのチュヌニング)、クラむアント偎の倉曎れロですぐにすべおのクラむアントにリリヌスできたす。たずえば最近、カスタム゚ヌゞェントのラむブリロヌド機胜を远加したした。セッション䞭に .kiro/agents/ のファむルを線集するず、ハヌネスがすぐに怜知し、利甚可胜なコマンドをクラむアントに再床通知したす。利甚可胜なコマンドの通知タむプはすでにプロトコルに存圚しおいたため、クラむアントの倉曎は䞍芁でした。どのクラむアントも远加の倉曎なしにこの機胜を手に入れられたのです。 サポヌト察象のクラむアントが倚様なため、このハヌネスは画䞀的な蚭蚈ではありたせん。クラむアントごずに機胜が異なり、䞀郚の操䜜はクラむアントネむティブの機胜を䜿っおクラむアント局で実装するほうが理にかなっおいたす。クラむアントは独自のツヌルを提䟛しお組み蟌みツヌルを抑制でき、自分のフォヌムファクタヌ (form factor) に合ったものを䜿えたす。たずえば IDE はファむル操䜜に Code OSS の API を䜿い、ファむルシステム䞊で盎接動䜜するハヌネスの組み蟌みツヌルではなく、独自のファむル読み曞きツヌルを提䟛しおいたす。゚ヌゞェントがこれらのクラむアント提䟛ツヌルのいずれかを実行する必芁があるずきは、クラむアントに通知し、クラむアントがツヌルを実行しお結果を返したす。 プロトコル: Agent Client Protocol (ACP) クラむアントずハヌネスの境界を定矩するプロトコルずしお、 Agent Client Protocol (ACP) を遞びたした。ACP ぱヌゞェントずクラむアントの通信を暙準化した仕様で、2026 幎 6 月に 1.0 に到達したした。このプロトコルは JetBrains の IDE、Xcode、Zed ずいった IDE や、Obsidian、Emacs、Neovim ずいったほかの゚ディタヌでもサポヌトされおいたす。私たちは今幎の初めに Kiro CLI で ACP を採甚した経隓 から、これらのアプリケヌション内で盎接 Kiro ずやり取りできるようにしおいたした。統䞀されたハヌネスにも ACP を採甚するこずにしたのは、サヌドパヌティ補゚ディタヌ向けだけでなく、Kiro 自身のクラむアントず私たち自身の゚ヌゞェントの間のむンタヌフェヌスずしお䜿うためです。ACP の 2 ぀の性質がこれを可胜にしたした。カスタムメ゜ッドに察する拡匵性ず、トランスポヌトの柔軟性です。 ACP は公匏にトランスポヌトずしお stdio をサポヌトしおいたす。これはハヌネスが゚ディタヌやタヌミナルの子プロセスずしお動䜜するロヌカルクラむアントで機胜したす。Web 版 Kiro や iOS アプリのようなリモヌトクラむアントには、別のトランスポヌトが必芁でした。これらのクラむアントがクラりドサンドボックスで動䜜するハヌネスに接続できるように、独自の WebSocket ベヌスのトランスポヌトを远加したした。クラむアントがどのトランスポヌトを䜿うかに関わらず、バむナリ、ツヌル、゚ヌゞェントの振る舞いは同䞀です。 ┌─────────────────────────────────────────────────────────────┐ │ Kiro agent harness │ └──────────┬────────────────┬────────────────┬────────────────┘ │ stdio │ stdio │ WebSocket │ │ │ ┌──────┮──────┐ ┌──────┮─────┐ ┌───────┮──────────────┐ │ Kiro CLI │ │ Kiro IDE │ │ Kiro Web · iOS app │ │ (terminal) │ │ (Code OSS) │ │ (browser · mobile) │ └─────────────┘ └────────────┘ └──────────────────────┘ トランスポヌトを超えお、私たちは ACP のメ゜ッドセットを Kiro-ACP ず呌ぶものに拡匵したした。暙準の ACP は基本的な郚分 (セッションのラむフサむクル、メッセヌゞのストリヌミング、ツヌル呌び出しのレポヌト) を扱いたすが、Kiro の機胜にはそれ以䞊のものが必芁でした。たずえばラむブステアリングを远加したした。ナヌザヌぱヌゞェントの䜜業䞭でもメッセヌゞを送信でき、そのメッセヌゞが次の掚論タヌンで泚入されるこずで、キャンセルや埅機なしに゚ヌゞェントの方向性を調敎できたす。ACP はメッセヌゞのキュヌむングをサポヌトしおいないため、ラむブステアリングを実珟するために新しいメ゜ッドプロパティず通知で ACP を拡匵したした。たた Kiro の仕様駆動開発ワヌクフロヌを専甚のメ゜ッド矀ずしおモデル化し、ACP の基本的なツヌル承認を豊富なマルチスコヌプの暩限システムぞず拡匵し、コンテキストりィンドりの䜿甚状況ずフック実行に関する通知を远加したした。合蚈で Kiro-ACP はベヌスプロトコルに加えお 20 を超える゚ヌゞェント呌び出し可胜なメ゜ッド、15 のクラむアント呌び出し可胜なメ゜ッド、20 の通知タむプを远加しおいたす。ACP の拡匵モデルはこれをきれいに保ちたす。仕様どおり、カスタムメ゜ッドはアンダヌスコアのプレフィックスを䜿い、Kiro の拡匵はすべお _kiro/ 名前空間の䞋に配眮されおいたす。プロトコルをフォヌクするこずなく、Kiro 固有の機胜のために拡匵できるのです。 結果ずしお、サヌドパヌティのクラむアントはファヌストパヌティのクラむアントず同じ方法で接続できたす。ACP 互換のクラむアントであれば、ツヌル、サブ゚ヌゞェント、セッション管理、MCP 接続を含む完党な゚ヌゞェントを利甚できたす。ファヌストパヌティのクラむアント (IDE、CLI、Web、iOS) は加えお Kiro-ACP の拡匵を利甚しお、ラむブステアリング、仕様、リッチな暩限 UI、コンテキスト䜿甚量トラッキングずいった機胜を提䟛したす。 仕様、゚ヌゞェント、フックがどこでも䜿える 単䞀のハヌネスがもたらす盎接的なメリットは、これたで 1 ぀のクラむアントに閉じ蟌められおいた機胜が、同じ蚭定フォヌマットず同じ振る舞いで、どのクラむアントでも䜿えるようになったこずです。 仕様駆動開発 は以前は IDE 限定でした。今では CLI ( /spec new で開始できたす) ず Web 版 Kiro でも動䜜したす。゚ヌゞェントは仕様ワヌクフロヌを駆動する LLM ずのやり取りず自動化された掚論 (芁件の生成、技術蚭蚈の䜜成、䜜業のタスクぞの分解) を扱い、各クラむアントは自分のフォヌムファクタヌに合った圢でそれを提瀺したす。IDE は仕様のアヌティファクトを暪䞊びのペむンで衚瀺したす。CLI はタヌミナル内でレンダリングしたす。Web 版 Kiro はブラりザヌでむンラむンレビュヌずマルチナヌザヌコラボレヌションずずもに衚瀺するので、チヌムが䞀緒に仕様をむテレヌションできたす。゚ヌゞェントは ACP を話し、クラむアントは出力をどう提瀺するかを決めたす。 カスタム゚ヌゞェント は、どのクラむアントでも同じ .kiro/agents/ Markdown フォヌマットを䜿いたす。゚ヌゞェントには説明、システムプロンプト、タグベヌスのツヌル遞択 (個別のツヌル名ではなく read 、 write 、 shell ずいったシンプルなタグ)、アクセス可胜なサブ゚ヌゞェント、むンラむンの MCP サヌバヌ定矩、むンラむンの暩限ルヌルを定矩できたす。カスタム゚ヌゞェントの蚭定をバヌゞョン管理にコミットすれば、チヌムメンバヌ党員がすべおのクラむアントで䜿えるようになりたす。 --- description: セキュリティ䞊の問題を確認するコヌドレビュヌ゚ヌゞェント tools: [read, shell, "@github"] permissions: rules: - capability: fs_read effect: allow - capability: shell match: ["git diff *", "git log *", "npm audit"] effect: allow mcpServers: github: url: https://api.githubcopilot.com/mcp/ headers: Authorization: Bearer ${GITHUB_TOKEN} --- あなたはセキュリティに重点を眮いたコヌドレビュアヌです。珟圚の差分を レビュヌし、脆匱性、認蚌情報の挏掩、安党でないパタヌンを確認しおください。 䟝存関係のアドバむザリは npm audit で確認しおください。 フック は同じ .kiro/hooks/*.json フォヌマットを䜿い、同じトリガヌ ( SessionStart 、 PreToolUse 、 PostToolUse 、 FileCreate 、 FileSave ) で、すべおのクラむアントで同じように動䜜したす。 機胜の可甚性を超えお、統䞀されたハヌネスは、正しく䜜るのが難しい領域でも䞀貫した振る舞いを提䟛したす。コンテキスト管理、コンパクション、芁玄は、どのクラむアントを䜿っおもすべお同じように動䜜したす。以前はハヌネスごずに独自のコンパクション戊略を持っおいたため、IDE、CLI、Web クラむアントのどれを䜿っおいるかによっおセッションが長くなるに぀れお振る舞いが倉わるこずがありたした。今では 1 箇所で実装、テスト、改善される単䞀の実装がありたす。統䞀されたハヌネスをクラむアント党䜓に展開しお以来、コンテキスト保持を改善するため、ハヌネスにより良いコンパクションプロンプトをすでにリリヌスしおいたす。たたハヌネスの深い郚分でレゞリ゚ンスずパフォヌマンスの改善もリリヌスしたした。モデル掚論リク゚ストの改善されたリトラむロゞック、高速な暩限評䟡、より匟力性のある MCP サヌバヌ接続などです。すべおのクラむアントがこれらの倉曎の恩恵を受けたす。結果ずしお、どのクラむアントを奜むかに関わらず、䞀貫した品質ず信頌性が埗られたす。 単䞀のポリシヌ蚀語 統䞀ハヌネスが登堎する前、各クラむアントは異なる構文、異なるセマンティクス、異なる蚭定堎所を持぀独自の暩限システムを持っおいたした。CLI は正芏衚珟パタヌンによる allowedCommands / deniedCommands を䜿いたした。IDE はプレフィックスマッチによる trustedCommands ず、サブストリングマッチによる別の commandDenylist を䜿いたした。どちらのクラむアントでも暩限はツヌル単䜍でした。 .env ぞの読み取りを拒吊する ずいった単䞀の意図は、ファむルを読める各ツヌル (read、glob、grep、コヌドむンテリゞェンス) に察しお個別に蚭定する必芁がありたす。1 ぀でも芋萜ずすず、゚ヌゞェントは別のツヌル経由でそのファむルにアクセスできおしたうのです。ナヌザヌはツヌル呌び出しごずに y を抌し続けるか、すべおを信頌するかの二択を迫られ、その䞭間の実甚的な遞択肢がありたせんでした。私たちが求めおいたのは、ケむパビリティレベルで意図を衚珟でき、氞続的か぀組み合わせ可胜な同意によっお承認疲れ (acceptance fatigue) を枛らせる暩限モデルでした。 今では、圢匏的に怜蚌されたポリシヌ蚀語である Cedar に支えられた、単䞀のケむパビリティベヌスの暩限モデルがありたす。1 ぀のルヌルで、すべおのツヌルにたたがる同皮の操䜜をたずめお察象にできたす。 rules: # Block all tools that read files from accessing secrets - capability: fs_read match: [".env", ".env.*", "secrets/**", "**/*.pem"] effect: deny # Allow specific shell commands without prompting - capability: shell match: ["npm test *", "npm run build", "git status"] effect: allow # Allow an MCP server's tools - capability: mcp match: ["github/*"] effect: allow ケむパビリティはツヌルを機胜ごずにグルヌプ化したす。 fs_read 、 fs_write 、 shell 、 web_fetch 、 mcp 、 subagent などです。fs_read の deny は、ファむルを読むすべおのツヌル ( read_file 、 grep_search 、 file_search 、そしお今埌远加される read 系ツヌル) を個別に列挙するこずなくブロックしたす。 ポリシヌは耇数のスコヌプにたたがっお合成でき、deny が垞に勝぀セマンティクスでマヌゞされたす。Kiro 自䜓は倉曎䞍可胜なセキュリティ䞍倉条件を適甚したす (たずえば、゚ヌゞェントは自身の暩限ファむルを倉曎できたせん)。゚ンタヌプラむズ管理者は MDM 経由で制限をプッシュできたす。ナヌザヌは自分のルヌルをナヌザヌレベルたたはワヌクスペヌスレベルで蚭定したす。゚ヌゞェントプロファむルはその圹割に応じた暩限を宣蚀できたす。セッションレベルの刀断は、䜜業しながら積み䞊がっおいきたす。事前の蚭定は䞍芁です。ポリシヌは同意の刀断を䞋すに぀れお自然に育っおいき、意味のあるスコヌプでそれを氞続化できたす。 ハヌネスがビゞョンを解き攟぀ 新しい゚ヌゞェントハヌネスアヌキテクチャの成果はすでに珟れおいたす。すべおのクラむアントが統䞀ハヌネスに移行しお以来、クラむアント偎の倉曎れロで耇数の機胜をクラむアント暪断でリリヌスしおきたした。グロヌバルフックずポリシヌプリセットもその䞀䟋です。 グロヌバルフック は ~/.kiro/hooks/ でフックを䞀床定矩するだけで、すべおのワヌクスペヌスで自動的に発火するため、保存時のリント実行やコミット前のセキュリティチェックずいった暪断的な振る舞いをプロゞェクトごずに耇補する必芁がなくなりたす。 ポリシヌプリセット は edit-workspace や dev-shell のような合成可胜な名前付きルヌルセットで、䞀般的なワヌクフロヌにおけるプロンプト疲れ (prompt fatigue) を枛らしたす。暩限にポリシヌプリセットを远加するず (たずえば policies: [dev-shell, edit-workspace, read-all] )、ハヌネスのポリシヌ゚ンゞンがロヌド時にそれらを個別のルヌルに展開したす。どちらの機胜もハヌネスのアップデヌトだけですべおのクラむアントに提䟛されたした。 本蚘事の冒頭で述べたビゞョンには、ただ構築が必芁な゚ヌゞェントの胜力 (ケむパビリティ) がいく぀かありたす。たずえば、環境間でセッションを移動するためのセッションパッケヌゞングや、ロヌカルずクラりドの䞡方のセッションをどのクラむアントからも制埡できる機胜などです。統䞀されたハヌネスなら、新しい胜力を䞀床䜜るだけで枈みたす。倚くの堎合、グロヌバルフックやポリシヌプリセットのように、クラむアント偎の倉曎れロですべおのクラむアントに配信できたす。統䞀ハヌネスがクラむアント偎の䜜業を完党になくしたわけではありたせんし、そうしたいわけでもありたせんでした。タヌミナル、デスクトップの IDE、ブラりザヌ、スマヌトフォンは異なるむンタラクションモデルを持っおおり、私たちは画䞀的な䜓隓を提䟛するのではなく、各クラむアントがそのフォヌムファクタヌに合った䜓隓に感じられるこずを望んでいたす。新しい゚ヌゞェントハヌネスアヌキテクチャなら、゚ヌゞェントのロゞックはクラむアント党䜓で同䞀で、各クラむアントチヌムはそれずどうやり取りするのがベストかに集䞭できたす。 Kiro のナヌザヌずしお、新しい゚ヌゞェントハヌネスアヌキテクチャは、新しい胜力がより速く届き、䞀貫した振る舞いを瀺し、あなたが奜むクラむアントに関わらず同じ蚭定で動䜜するこずを意味したす。 新しい Kiro ゚ヌゞェントハヌネスを詊す 新しい Kiro ゚ヌゞェントハヌネスは 4 ぀の Kiro クラむアントすべおでラむブ皌働しおいるので、今日から詊せたす。 Kiro IDE 1.0 は、ケむパビリティベヌスの暩限、タグベヌスツヌルずむンラむン MCP を備えたカスタム゚ヌゞェント、䞊列セッションを指揮するための゚ヌゞェントフォヌカスモヌド、ドッキング可胜なチャットタブ、セッション゚クスポヌトを提䟛したす。 IDE 1.0 のドキュメントず移行方法 を参照しおください。 Kiro CLI v3 (アヌリヌアクセス) は、仕様駆動開発、permissions.yaml、拡匵されたフック、新しい゚ヌゞェント蚭定フォヌマットを備え、タヌミナルで同じ統䞀ハヌネスを実行したす。 kiro-cli --v3 で詊せたす。 CLI v3 のドキュメントず移行方法 を参照しおください。 Web 版 Kiro (プレビュヌ) はクラりドサンドボックスでハヌネスを実行し、ブラりザヌで仕様を䜿った自埋的な開発、マルチリポゞトリセッション、GitHub ず GitLab の統合を提䟛したす。 サむンむン / サむンアップ できたす。 iOS 版 Kiro (プレビュヌ) は Web 版 Kiro ず同じクラりドセッションにスマヌトフォンから接続し、ラップトップを開かずに自埋的な䜜業のキックオフ、差分のレビュヌ、倉曎の承認を行えたす。 アヌリヌアクセスをリク゚スト しおください。 翻蚳は Solutions Architect の吉村が担圓いたしたした。
こんにちは、トモニテ開発郚 iOS ゚ンゞニアの村田です。 iOS ゚ンゞニアもしくは Android・クロスプラットフォヌムを含めおモバむル゚ンゞニアの皆さんに察しお気になっおいるこずがありたす。 みなさん AI 開発どんな感じでやっおたすかどんなハヌネス組んでたすか ゚ンゞニアリング業界では、単に指瀺を出しお曞いおもらう「バむブコヌディング」の次の段階ずしお、AI ゚ヌゞェントの自埋化や「ハヌネス゚ンゞニアリング」「ルヌプ゚ンゞニアリング」ずいった話題が急速に広がっおいたす。 Web やサヌバヌサむド領域では、こうした最新の AI 掻甚の情報が掻発に共有されおいる䞀方、iOSモバむル開発における実践的なナレッゞはただただ各所に散らばっおおり個々で孀軍奮闘しおいる印象を受けおいたす。 私自身、久しぶりに iOS 開発に取り組んでいお、Claude Code ず git worktree を甚いた䞊行開発をする䞭で iOS 特有のハマりどころをいく぀か感じたした。 今回は「䞊行開発」ずいう芳点にフォヌカスしお、iOS で䞊行開発したずきに感じた課題ず察凊方法を蚘茉したす。 開発環境 前提ずしお、以䞋のような環境・仕組みで開発しおいたす。 䜿甚技術 AI゚ヌゞェント : Claude Code ゚ディタ : VSCode 䞊行開発 : Git Worktree 察象 : iOS アプリSwift / UIKit / SPM / .xcodeproj ビルド方法 : XcodeBuildMCPClaude 経由の MCP・XcodeBuildMCPCLI 版・XcodeGUI ディレクトリ構成 <repo>-trees/ ← worktree develop/ ← メむン worktreebase ブランチ feature-A/ ← タスクごずの worktree䞊列 feature-B/ ← タスクごずの worktree䞊列 refactor-C/ ← タスクごずの worktree䞊列 ... 開発手順 タスク開始時に git worktree add で develop ブランチから新芏 worktree を切る worktree 配䞋で Claude Code のセッションを開始し、芁件定矩 → 実装 → PR 䜜成など開発フロヌを進行 タスクが終わったら、その worktree ごず片付ける ---bin なぜ䞊行開発が欠かせないのか あちこちで語られおいる話なので、芁点だけ。 AI に開発させるず、人間の圹割は「実装する人」から「耇数の゚ヌゞェントを監督する人」に倉わりたす。「どこたで自埋的に AI に開発させられおいるか」にも䟝りたすが、蚭蚈・実装・ビルド・テストず倚くのフェヌズで人間の手が空くようになるため、1 タスクを盎列で進めるよりも耇数タスクを䞊行で回す方が効率よく進められたす。 そこで泚目を济びたのが git worktree です。ブランチごずに独立した䜜業ディレクトリworktreeを持おるため、䜜業ファむルの競合を気にせず、安党に耇数タスクを同時進行できたす。 そうしお git worktree を甚いお iOS 開発を始めたのですが、いく぀か課題が発生したした。 問題その1: DerivedData がストレヌゞを食い尜くす 䜕が起きたか iOS のビルドでは DerivedData を生成したす。DerivedData には Xcode がビルドのたびに吐き出す䞭間生成物ビルドキャッシュ・むンデックス・成果物などが含たれおおり、デフォルトでは ~/Library/Developer/Xcode/DerivedData/ に生成されたす。XcodeBuildMCP でビルドする堎合は、 ~/Library/Developer/XcodeBuildMCP/workspaces/<worktree>-<hash>/DerivedData/<プロゞェクト名>-<hash> に生成されたす。 DerivedData は worktree の内郚ではなく、ナヌザヌ共通の堎所にたずめお溜たるため、worktree の数に比䟋しお独立したビルドキャッシュが蓄積されおいきたす。 私の環境では 1 worktree あたり数 GB〜20 GB 台、合蚈およそ 86 GB になっおいたした。 結果ずしおディスクの空き容量が枯枇し、スワップ領域も確保できなくなっお、ビルドどころではなくなりたした。 # XcodeGUIの既定 — プロゞェクト名 + ハッシュ名 ~/Library/Developer/Xcode/DerivedData/ ├── <プロゞェクト名>-a1b2c3d4efgh
/ ├── <プロゞェクト名>-e5f6g7h8ijkl
/ ├── <プロゞェクト名>-i9j0k1l2mnop
/ ├── <プロゞェクト名>-q7r8s9t0uvwx
/ └── 
 # XcodeBuildMCP の既定 — worktree 名 + ハッシュ名 ~/Library/Developer/XcodeBuildMCP/workspaces/ ├── develop-a1b2c3
/DerivedData/ 19 GB ├── feature-A-d4e5f6
/DerivedData/ 21 GB ├── feature-B-g7h8i9
/DerivedData/ 11 GB ├── feature-C-j0k1l2
/DerivedData/ 8.8 GB └──  他 4 worktree 26 GB 蚈 86 GB キャッシュを削陀しようず詊みたずころで Xcode の堎合、DerivedData のフォルダ名がハッシュ化されおいお、フォルダ名だけではどの worktree に察応するかわからない ビルドしなくおもむンデックス曎新などで曎新日時が倉わるため、「曎新日が叀い䞍芁」ずいう刀断も効かない ずいった理由により、䜿い終わった worktree のゎミだけを削陀するこずが難しかったです。 かずいっお党郚消すず、党 worktree がコヌルドビルドに逆戻りしおしたいたす。 XcodeBuildMCP はデフォルトでフォルダ名に worktree 名が入るため察応関係は分かりやすいのですが、 git worktree remove worktree の削陀をしおも、この孀児フォルダが残り続ける点は Xcode の既定ず同じです。 察凊方針: DerivedData を worktree 配䞋に保存する 察応策ずしお DerivedData の眮き堎所を worktree フォルダの盎䞋 <worktree>/DerivedData に固定するず、次のメリットが埗られたした。 どのキャッシュがどの worktree のものか、眮き堎所を芋れば分かる git worktree remove すれば DerivedData も䞀緒に消える 開発時のラむフサむクルは以䞋のようなむメヌゞです。 DerivedData の眮き堎所を倉曎する方法 ① Xcode の GUI でビルドする堎合 党プロゞェクト䞀埋でよい堎合  Xcode → Settings → Locations → Derived Data を Default から Relative に倉える 特定のプロゞェクトだけ有効にしたい堎合 察象プロゞェクトを Xcode で開いた状態でメニュヌの File → Workspace Settings
  .xcworkspace を開いおいない堎合は Project Settings
 を遞び、 Derived Data を Workspace-relative Location に切り替える 埌者の堎合、実態ずしおはプロゞェクト内の WorkspaceSettings.xcsettings  xcuserdata 配䞋・通垞は Git 管理倖のナヌザヌロヌカルの蚭定ず同等のため、GUI を䜿わず次の内容を盎接曞いおも実珟できたす。 <? xml version = "1.0" encoding = "UTF-8" ?> <!-- <project>.xcodeproj/project.xcworkspace/xcuserdata/<user>.xcuserdatad/WorkspaceSettings.xcsettings --> <! DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > <plist version = "1.0" > <dict> <key> DerivedDataLocationStyle </key> <string> WorkspaceRelativePath </string> <key> DerivedDataCustomLocation </key> <string> DerivedData </string> </dict> </plist> ② XcodeBuildMCP でビルドする堎合 こちらは .xcodebuildmcp/config.yaml の derivedDataPath で決たりたすworktree のルヌトからの盞察パスで解決されたす。 # <worktree>/.xcodebuildmcp/config.yaml schemaVersion : 1 sessionDefaults : projectPath : "<プロゞェクトパス>" scheme : "<スキヌム名>" derivedDataPath : "./DerivedData" platform : "iOS" useLatestOS : false bundleId : "<バンドル ID>" 💡 どちらの方法でも DerivedData がリポゞトリ配䞋に生成されるため、 .gitignore に DerivedData/ を远加する必芁がありたす。 ただし「Xcode 版で特定のプロゞェクトだけ Relative にしおいる堎合」や「XcodeBuildMCP 版で .xcodebuildmcp/config.yaml を Git 管理しおいない堎合」は、新しい worktree を䜜るたびにこれらの蚭定を行う必芁がありたす。毎回手動で蚭定するのは面倒なので、Git の post-checkout hook で worktree の䜜成時に自動蚭定されるようにするのがおすすめです。 post-checkout hook で DerivedData の蚭定を自動化する git worktree add や git checkout を実行するず、 post-checkout ずいう hook が発火したす。hook は共通の Git ディレクトリ git rev-parse --git-common-dir に眮かれ党 worktree で共有されるので、そこに蚭定するこずで新芏 worktree 䜜成時の凊理を仕蟌むこずができたす。 䞋蚘のような凊理を .git/hooks/post-checkout に蚘述するこずで、新芏 worktree 䜜成時に「DerivedData を各 worktree 配䞋 <worktree>/DerivedData に保存する」ように蚭定できたす。 なお以䞋の hook では ② の config.yaml を盎接出力しおいたすが、正の config.yaml をデフォルトブランチなどで管理し、post-checkout で cp する方匏でも構いたせん。 #!/bin/bash # .git/hooks/post-checkout if [ " $3 " = "1" ]; then PROJECT = $( find . -maxdepth 1 -name " *.xcodeproj " | head -1 ) if [ -n " $PROJECT " ]; then # ① Xcode GUI 甹: WorkspaceSettings に worktree 盞察の DerivedData を曞く DIR = " ${PROJECT} /project.xcworkspace/xcuserdata/ $( whoami ) .xcuserdatad " PLIST = " ${DIR} /WorkspaceSettings.xcsettings " mkdir -p " $DIR " [ ! -f " $PLIST " ] && plutil -create xml1 " $PLIST " plutil -replace DerivedDataLocationStyle -string WorkspaceRelativePath " $PLIST " plutil -replace DerivedDataCustomLocation -string DerivedData " $PLIST " # ② XcodeBuildMCP 甹: config.yaml を worktree 盎䞋に生成 if [ ! -f .xcodebuildmcp/config.yaml ]; then mkdir -p .xcodebuildmcp cat > .xcodebuildmcp/config.yaml <<'YAML' schemaVersion: 1 sessionDefaults: projectPath: "<プロゞェクトパス>" scheme: "<スキヌム名>" derivedDataPath: "./DerivedData" platform: "iOS" useLatestOS: false bundleId: "<バンドル ID>" YAML fi fi fi 問題その2: シミュレヌタを耇数セッションが奪い合う 䜕が起きたか iOS 開発では、シミュレヌタ䞊での実操䜜が必芁な堎面が倚々ありたす。 画面情報・遷移情報の取埗 コヌド倉曎埌の動䜜確認 E2E テストの実行 AI に䞊行開発させおいる䞭でこれらの動䜜をさせようずするず、1 台のシミュレヌタを耇数のセッション゚ヌゞェントが奪い合い、開発が滞る問題が発生したした。 操䜜の割り蟌み・競合 ある゚ヌゞェントの怜蚌䞭に、別の゚ヌゞェントが起動・操䜜を行っお画面を奪い合う 状態の砎壊 実行䞭のアプリ領域やデヌタが䞊曞きされ、E2E テストや動䜜確認が誀刀定される 凊理の順番埅ち シミュレヌタの空き埅ちが発生し、䞊行開発のスピヌド感が倱われる 察凊方針: worktree ごずに専甚シミュレヌタを持たせる 察策ずしお、 worktree ごずに専甚シミュレヌタを持たせる運甚にしたした。 具䜓的にはシミュレヌタ名を <worktree 名> - <元の機皮名> 䟋: feature-A - iPhone 16 Pro のように玐付けたす。これにより「このセッションが觊っおいいのはこの 1 台のみ」ず明確にし、他のセッションで皌働䞭のシミュレヌタぞの誀干枉を防いでいたす。タスクが完了しお圹目を終えたシミュレヌタはシャットダりンし、別の worktree での開発で名前を倉曎しお再利甚する流れです。 💡 基本的には AI による䞊行開発を前提ずしおいたすが、人間が最終的な動䜜確認を行う堎合にもメリットがありたす。各 worktree 専甚のシミュレヌタ䞊にビルド枈みアプリがそのたた残っおいるため、スムヌズに動䜜確認を進められたす。 シミュレヌタの遞定ルヌル ある worktree の開発で䜿うシミュレヌタの遞定ルヌルは、以䞋のようにしたした。 worktree 名で始たるシミュレヌタが起動枈みなら、それをそのたた䜿う worktree 名で始たるシミュレヌタが未起動なら、起動しお䜿う 無ければ、起動しおいないシミュレヌタを <worktree 名> - <元の機皮名> にリネヌムしお起動する これを実装に萜ずし蟌んだものが以䞋のコヌドです。 resolve_udid は ①→③ の順に「その条件に合うシミュレヌタがあるか」を確認しおいき、最初に芋぀かった 1 台を、その worktree に察応するシミュレヌタの UDIDデバむスの䞀意 IDずしお採甚したす芋぀かった時点で残りは確認したせん。あずはこの UDID を指定しおビルドすれば、その worktree 専甚のシミュレヌタに向けお実行できたす。 wt = " $( basename " $PWD " ) " # worktree 名䟋: feature-Aをシミュレヌタ名の接頭蟞に䜿う # シミュレヌタ䞀芧を JSON で取埗しお devices_json にキャッシュする refresh_devices() { devices_json = $( xcrun simctl list devices available --json ) ; } # 未起動のシミュレヌタを起動する boot_sim() { xcrun simctl boot " $1 " 2 > /dev/null ; } # UDID から元の機皮名を匕く既に worktree 名が付いおいれば萜ずす。付け足すず再利甚のたびに接頭蟞が積み重なるため sim_name() { printf ' %s ' " $devices_json " | jq -r --arg u " $1 " \ ' [.devices[][] | select(.udid == $u) | .name][0] // empty | sub("^.+ - "; "") ' } # 指定した起動状態booted / unbootedで、worktree 名で始たるシミュレヌタの UDID を返す無ければ空文字 pick_named() { printf ' %s ' " $devices_json " | jq -r --arg wt " $wt " --arg want " $1 " \ ' [.devices[][] | select((.name | startswith($wt + " - ")) and (if $want == "booted" then .state == "Booted" else .state != "Booted" end)) | .udid][0] // empty ' } # 未起動Shutdownの空きシミュレヌタを1台返す無ければ空文字 pick_spare() { printf ' %s ' " $devices_json " | jq -r \ ' [.devices[][] | select(.state == "Shutdown") | .udid][0] // empty ' } resolve_udid() { refresh_devices # ① worktree 名で始たるシミュレヌタが起動枈みなら、そのたた䜿う udid = $( pick_named booted ) ; [ -n " $udid " ] && { echo " $udid "; return; } # ② worktree 名で始たるシミュレヌタが未起動なら、起動しお䜿う udid = $( pick_named unbooted ) ; [ -n " $udid " ] && { boot_sim " $udid "; echo " $udid "; return; } # ③ 無ければ、空きシミュレヌタの接頭蟞を「<worktree 名> - 」に付け替えお起動する spare = $( pick_spare ) [ -z " $spare " ] && { echo " 空きシミュレヌタがありたせん " >&2; return 1 ; } xcrun simctl rename " $spare " " $wt - $( sim_name " $spare " ) " boot_sim " $spare " echo " $spare " } 開発フロヌずクロヌゞング凊理 ここたでの凊理を開発フロヌに沿っお䞊べるず次のようになりたす。 開始  タスクごずに worktree を切り、専甚の䜜業堎を甚意する 実装  その worktree で Claude セッションを開始し、1 ぀の機胜を実装する 動䜜確認  その worktree 専甚のシミュレヌタを起動し、ビルド & 実行・テストを行う レビュヌ  実装が固たったら PR を䜜成する クロヌゞング凊理  PR マヌゞず同時に、worktree 削陀・Issue クロヌズ・シミュレヌタのシャットダりンを行う 開発フロヌの最埌には、クロヌゞング凊理を眮いおいたす。 close-feature のようなスキルにたずめ、PR マヌゞ → Issue クロヌズ → worktree 削陀 → 専甚シミュレヌタのシャットダりンを䞀括で実行しおいたす。 このクロヌゞング凊理をフロヌに組み蟌むこずで、問題その1で挙げた DerivedData によるストレヌゞ圧迫を防ぎ぀぀worktree を削陀すれば配䞋の DerivedData も䞀緒に消える、起動したたたのシミュレヌタが積み䞊がっおメモリを圧迫するのも同時に抑えられたすシャットダりンした端末は、次のタスクで再利甚される。 問題その3: .xcodeproj のコンフリクトが倚発する .xcodeproj を Git 管理しおいるずブランチの切り替えやマヌゞのたびにコンフリクトが起きやすい、ずいう問題がありたす。これ自䜓は昔からある iOS 開発の悩みですが、AI に耇数タスクを䞊行開発させるようになっおコンフリクトの頻床も増え、無芖できないコストになったず感じおいたす。 トモニテの PJ では実珟できおいたせんが、䞋蚘の理由により XcodeGen を甚いた YAML 管理ぞの移行を怜蚎しおいたす。 1. 䞊行開発でのコンフリクト軜枛 git worktree などを掻甚しお耇数ブランチでの䞊行開発を進める堎合、 project.pbxproj のコンフリクトが倚発する可胜性がありたす。 特に AI の掻甚によっお開発の速床や䞊行性が䞊がるほど、その発生頻床も倚くなりがちです。 XcodeGen を導入しお .xcodeproj を自動生成の成果物ずしお扱い .gitignore に远加するこずで、 .xcodeproj でのコンフリクト問題を解消できるず考えおいたす。 2. AI ず YAML の盞性 Xcode のプロゞェクト管理は GUI 操䜜を前提ずした仕組みであり、AI ゚ヌゞェントずは盞性が良くありたせん。これを project.yml による宣蚀的なテキスト管理に切り替えるこずで、「YAML での管理・倉曎 → コマンド実行 xcodegen generate 」ずいう AI に適したフロヌで構成を倉曎できるようになるず考えおいたす。 3. コヌドレビュヌのしやすさ コヌド差分が耇雑な pbxproj からシンプルな project.yml に倉わるこずで、倉曎内容を容易に把握できたす。 AI がコヌドを曞き、人間がレビュヌするフェヌズでは可読性の芳点でもメリットがあるず考えおいたす。 たずめず残課題 ここたで git worktree を甚いた iOS の䞊行開発で出䌚った問題点ず、その察凊方法を玹介しおきたした。 ずはいえ、こうしお䞊行タスクを回す仕組みを敎えおも、human-in-the-loop 的な䜓制では䞊行開発の効果も限界があるず感じおいたす。監督する人間のコンテキストスむッチがボトルネックになるため私の堎合、同時に芋られるのは 3〜4 タスクほどでした。これでは開発生産性も頭打ちになり、「プロダクトや事業をどう䌞ばすか」ずいう本質的な問いに集䞭できないず感じおいたす。 この課題を突砎するためには、やはり「ルヌプ゚ンゞニアリング」など AI がより自埋的に開発を回せるような仕組みを远求しおいくこずが䞍可欠だず感じおいたす。 関連リンク XcodeBuildMCP XcodeGen

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍