VS Code + Cline で ”Devin 風”開発を行う方法④ - マルチエージェントループ構築編

前回は、Cline の Kanban 機能を使って、AI エージェントがタスクを自動生成できる環境を構築しました。

そこで今回からは、AI エージェントごとに役割を分離し、

  • タスクを計画する Planner Agent
  • 実装を担当する Worker Agent
  • レビューを行う Reviewer Agent

のように責務を分担しながら、マルチエージェント形式で開発ループを回してみます。

特にローカル LLM 環境では、クラウド版の高性能モデルほど柔軟に補完してくれないため、

  • タスクが曖昧になる
  • 同じ処理を繰り返す
  • レビューが機能しない
  • 無限ループのような状態になる

といった問題が発生しやすくなることが予想されます。

Devin のような完全自律型にはまだ遠いものの、「ローカル LLM でどこまで実用的な開発ループを構築できるのか」を検証していきます。

※当初はワークフローを書けば構築できると考えていましたが、実際に行ってみると色々な問題が出てきました。

本記事ではまず開発ループを構築するところまでの手順をご紹介します。実際に開発ループを回す処理については、次回ご紹介する予定です。

今回も記事を作成するにあたり、以下の講座で勉強させていただきました。コードを 1 行も書かずに、リアルタイムチャートと AI アシスタンス機能付きの株取引アプリ (トレーディング・ワークステーション) を構築されています。英語の講座ですが、Udemy の「トランスクリプション」という機能を使用すると講義内容がテキスト形式で右側に表示されるので、Chrome などの「翻訳機能」を使用すると日本語で表示できます。Microsoft Edge ブラウザーを使用すればビデオ内の字幕を直接日本語に変換できるようです。

Udemy

AI Coder: Complete Claude Code & Coding Agents Course

この記事で使用している実行環境は以下のようになっています。

  • VS Code (Windows 版)・・・バージョン 1.122.0
  • Node.js (Windows 版)・・・バージョン 24.15.0
  • Cline・・・バージョン 3.0.14
  • Kanban・・・バージョン 0.1.68

※本記事でご紹介している内容は、確立された手法ではなく著者の独自の解釈に基づいています。その点をご理解のうえご参照ください。

実装方針について

ローカル LLM では特に長時間セッションを維持すると指示が崩れやすいため、本記事ではタスクを細かく分割して、分割されたタスクごとに毎回新しいループを回す、いわゆる「fresh session loop」などと呼ばれる手法に近い構成を採用します。

以下のエージェントを定義してタスクごとにループを回します。

  • Planner Agent・・・タスクから実装計画を作成
  • Worker Agent・・・実装を担当
  • Reviewer Agent・・・レビューを行う
    必要であれば修正タスクを作成してループ処理を行う

Planner Agent には「考える役割」だけを与え、コード変更は Worker Agent に限定します。

また、Planner が作成するタスク形式を固定することで、ローカル LLM でも安定して Kanban 上に作業単位を展開できるようにします。

各エージェントは毎回 Kanban 上の新規タスクとして起動し、必要な情報はルールファイルや、Git、memory-bank などから取得します。処理された結果は Kanban タスクや Git、memory-bank へ保持して、次のタスクで必要な箇所が参照されます。

具体的には以下のフォルダ&ファイル構成になっています。

YelpCampCleanArch/
├─ .clinerules/
│  ├─ kanban/
│  │  ├─ 00-common.md         # 全エージェント共通ルール
│  │  ├─ 10-planner.md        # Planner 専用ルール
│  │  ├─ 20-worker.md         # Worker 専用ルール
│  │  ├─ 30-reviewer.md       # Reviewer 専用ルール
│  │  └─ 40-tester.md         # Tester 専用ルール
│  └─ workflows/
│     ├─ planner-workflow.md  # Planner ワークフロー
│     ├─ reviewer-workflow.md # Reviewer ワークフロー
│     └─ worker-workflow.md   # Worker ワークフロー
├─ memory-bank/
│  └─ kanban/
│     ├─ plan.md              # 現在の実装タスク
│     ├─ review.md            # レビュー項目
│     ├─ status.json          # ループステータス
│     ├─ tasks.md             # 実装するすべてのタスク
│     └─ work.md              # 実装項目
└─ app/

それぞれの相関は以下のようになっています。なお、タスクのループ処理は概念図になります。実際の Kanban では同一タスクを再利用してループするのではなく、Reviewer Task が必要に応じて新しい Fix Task を生成することで、Worker → Reviewer などのループを実現します。

各エージェントは毎回新しいセッションとして起動し、必要な情報は memory-bank や Git、Kanban タスクから再読み込みされます。

・Planner Task の責務

Planner Task は以下の責務を受け持ちます。

  • ループの状態を管理する「status.json」ファイルの作成と更新を行います。
  • 「tasks.md」ファイルから未完了のタスクを選択して、「plan.md」ファイルを作成します。
  • plan.md ファイルの内容を元に実装プラン (work.md) ファイルを作成します。
  • plan.md ファイルの内容を元にレビュープラン (review.md) ファイルを作成します。
  • 「Worker Task」、「Reviewer Task」を作成して、連続して実行できるようにリンクを作成します。
  • 「Worker Task」を実行します。

これらの処理は「planner-workflow.md」ファイルに記述します。

・Worker Task の責務

Worker Task は以下の責務を受け持ちます。

  • 実装プラン (work.md) ファイルを読み込んでコードを修正します。
  • 実装が完了したら、Kanban のリンク機能により「Reviewer Task」を起動します。

これらの処理は「worker-workflow.md」ファイルに記述します。(今回はまだ実装していません。)

・Reviewer Task の責務

Reviewer Task は以下の責務を受け持ちます。

  • レビュープラン (review.md) ファイルを読み込んでレビューを実施します。
  • レビュー結果が NG の場合は、「plan.md」ファイルを修正して再度「Planner Task」を作成して実行します。

これらの処理は「reviewer-workflow.md」ファイルに記述します。(今回はまだ実装していません。)

この処理を結果が OK になるまで、または規定回数に達するまで行います。ループのカウントは「status.json」ファイルに保持します。

また本記事では、AI エージェントへ完全に自由な実行権限を与えるのではなく、「ガードレール」を設けながら動作させていきます。

ここでいうガードレールとは、

  • 使用可能なコマンドを制限する
  • 実行形式を固定する
  • ルールファイルを毎回読み込ませる
  • タスク形式を統一する

といった、「AI が不安定な動作をしないようにするための制約」のことです。

特にローカル LLM 環境では、クラウド版の高性能モデルほど柔軟に補完できないため、「AI の性能に頼る」のではなく、「失敗しにくい構造を設計する」ことが重要になります。

各エージェントのルールを作成します

以下のフォルダ内に各エージェント用のルールを記述していきます。

YelpCampCleanArch/
└─ .clinerules/
   └─ kanban/
      ├─ 00-common.md        # 全エージェント共通ルール
      ├─ 10-planner.md       # Planner 専用ルール
      ├─ 20-worker.md        # Worker 専用ルール
      ├─ 30-reviewer.md      # Reviewer 専用ルール
      └─ 40-tester.md        # Tester 専用ルール
・00-common.md

すべてのエージェントに共通のルールを記述します。

# 共通ルール - MUST FOLLOW

## プロジェクトの目的

* 本プロジェクトは既存 MVC アプリを段階的に Clean Architecture 化する。
* リファクタリング中も既存機能は維持すること。
* 既存ルートを意図せず破壊してはいけない。

## アーキテクチャルール

* Controller は adapter 層として扱う。
* 業務ロジックを Controller に書いてはいけない。
* UseCase は infrastructure に依存してはいけない。
* domain 層は framework に依存してはいけない。
* 依存関係は dependency injection を優先すること。

## タスク実行ルール

* 現在の Kanban タスクのみ作業すること。
* 無関係な改善を実施してはいけない。
* タスクは小さく deterministic に保つこと。
* 必要以上に多くのファイルを変更してはいけない。

## 安全ルール

* 既存機能を代替なしで削除してはいけない。
* 明示的な指示なしに大規模 rewrite をしてはいけない。
* DB スキーマを自動変更してはいけない。
* route の破壊的変更を黙って行ってはいけない。

## レビュールール

* architecture violation を発見した場合は新しい Kanban タスクを作成すること。
* テスト失敗を無視してはいけない。
* 大規模修正より follow-up task を優先すること。

## コマンド実行ルール

* タスク生成は必ず以下を経由すること:
  `.kanban/scripts/kanban/kanban-task.ps1`
* 直接 `npx kanban task` を実行してはいけない。
* PowerShell wrapper のみ使用すること。

## Auto Review / Auto Commit 共存ルール

タスクは Kanban の auto review / auto commit が有効な状態で実行される場合があります。

ただし、Planner Agent は以下を行ってはいけません。

- git add
- git commit
- git cherry-pick
- git stash
- git switch
- git worktree 操作

コミットを行うには以下のスクリプトを使用してください。
`.kanban\scripts\kanban\commit-all.ps1 <message>`

## Memory 読み込みルール

作業開始前に必ず以下を読むこと:

* memory-bank/kanban/tasks.md
・10-planner.md

Planner Agent 用のルールを作成します。

# Planner Agent ルール - MUST FOLLOW

## 役割

あなたは Planner Agent です。

責務:

* タスク選択
* Kanban タスク生成
* 依存関係定義
* 完了条件定義

禁止事項:

* production code を変更してはいけない
* 自分で機能実装してはいけない
* architecture rewrite をしてはいけない
* `memory-bank\kanban` 以外のフォルダは操作してはいけない
* 現在のブランチおよびコミット位置を変更してはいけない

## タスク選択

* `memory-bank\kanban\tasks.md` から次に処理すべきタスクを1件選択する。
* 対象タスクは以下の優先順位で選択する。
  1. `Status: FAILED`
  2. `Status: TODO`
* 選択されたタスクの `Status:` は `PROCESSING` に変更する。

## 完了条件

* `Status: FAILED` および `Status: TODO` のタスクが存在しない場合は、以下を出力して終了すること。
```test
 NO_TODO_TASK
```
・20-worker.md

Worker Agent 用のルールを作成します。

# Worker Agent ルール - MUST FOLLOW

## 役割

あなたは Worker Agent です。

責務:

* 現在の Kanban タスクを実装する
* 必要最小限のファイルのみ変更する
* Clean Architecture ルールを守る

禁止事項:

* 無関係な機能追加
* 無関係なリファクタリング
* architecture decision の変更
* 完了済みタスクの勝手な再変更

## 実装ルール

* 最小変更を優先すること。
* 既存コードを可能な限り再利用すること。
* 後方互換性を維持すること。
* 大規模 rewrite を避けること。

## Controller ルール

* Controller は薄く保つこと。
* 業務ロジックは UseCase に置くこと。
* Controller が行ってよいのは:

  * request mapping
  * UseCase 呼び出し
  * redirect
  * flash message

## 例外処理ルール

* ApplicationException は分離して処理すること。
* 想定外例外は generic message を返すこと。

## 完了条件

完了前に以下を確認すること:

* code が compile 可能
* route が動作する
* 明らかな architecture violation がない
・30-reviewer.md

Reviewer Agent 用のルールを作成します。

# Reviewer Agent ルール - MUST FOLLOW

## 役割

あなたは Reviewer Agent です。

責務:

* Worker の変更をレビューする
* architecture violation を検出する
* regression risk を検出する
* 必要に応じて follow-up task を作成する

禁止事項:

* 大規模 rewrite
* 無関係な改善
* 問題の黙殺

## Review Checklist

### Clean Architecture

* Controller に業務ロジックがないか
* UseCase の依存方向が正しいか
* domain が infrastructure に依存していないか

### リファクタリング安全性

* 既存 route が維持されているか
* 後方互換性が維持されているか
* session 動作が変わっていないか

### コード品質

* login ロジックが重複していないか
* naming が統一されているか
* exception handling が適切か

## レビュー結果ルール

問題を発見した場合:

* 新しい Kanban task を作成する
* 問題内容を明確に説明する
* 小さな isolated fix を優先する

問題がない場合:

* reviewed として完了扱いにする
・40-tester.md
# 今回はまだ実装していません。
各エージェントのワークフローを作成します

以下のフォルダ内に各エージェント用のワークフローを記述していきます。

YelpCampCleanArch/
└─ .clinerules/
   └─ workflows/
      ├─ planner-workflow.md  # Planner ワークフロー
      ├─ reviewer-workflow.md # Reviewer ワークフロー
      └─ worker-workflow.md   # Worker ワークフロー

最初は以下のように自然言語で記述していましたが、どうもうまく動作しないようです。

# Planner ワークフロー

あなたは Planner Agent です。

以下のルールを必ず読んでください。

- `.clinerules\kanban\00-common.md`
- `.clinerules\kanban\10-planner.md`

## 1. plan.md ファイルの作成

* `memory-bank\kanban\tasks.md` からタスクを1つ選択します。
* 該当するタスクがない場合は終了します。
* `.kanban\templates\plan-template.md` ファイルのフォーマットで `memory-bank\kanban\tasks.md` ファイルを作成します。

仕方がないので、これらの処理はスクリプト (PowerShell) で記述して、AI エージェントから呼び出してもらう方式で実装していきます。

・Planner ワークフロー

色々記述してありますが、内容としては AI エージェントに tasks.md ファイルから対象の「タスクID」を選択してもらい、後述する PowerShell スクリプト (loop-builder.ps1) を呼び出す内容になっています。このスクリプトで Planner Task のすべての責務を実行するので、呼び出してもらえれば安定して処理が実行できます。

# Planner ワークフロー

あなたは Planner Agent です。

以下のルールを必ず読んでください。

- `.clinerules\AGENTS.md`
- `.clinerules\kanban\00-common.md`
- `.clinerules\kanban\10-planner.md`

指定されていない `memory-bank` フォルダ内のファイルは読まない。

## 1. 初期化

1. `memory-bank\kanban\status.json` がない場合は以下のコマンドを先に実行する。
  - `/init <branch>`


## 2. `.kanban\scripts\loop-builder TASK_ID` の実行

### 実行手順

1. `memory-bank\kanban\tasks.md` を読み込む。
2. `Status: TODO` のタスクを先頭から1件だけ選択する。
3. 選択したタスクの ID を TASK_ID として記録する。
4. `.kanban\scripts\loop-builder TASK_ID` を実行する。
  実行形式:
  ```powershell
  powershell -NoProfile -ExecutionPolicy Bypass -File .kanban\scripts\loop-builder.ps1 TASK_ID
  ```

### 完了条件

- `memory-bank\kanban\plan.md` が作成されている。
- `memory-bank\kanban\work.md` が作成されている。
- `memory-bank\kanban\review.md` が作成されている。
- 選択したタスクの Status が PROCESSING になっている。
- production code を変更していない。

### 禁止事項

- `.kanban\scripts\kanban` フォルダ内のスクリプトは直接実行してはいけない。

### 完了時出力

正常に完了した場合は、最後に以下を出力する。

```text
BUILD_LOOP_DONE
```
・Worker ワークフロー

今回はまだ実装していません。

・Reviewer ワークフロー

今回はまだ実装していません。

ループを起動する仕組みを考えます

最初の Planner Task を毎回手動で作成するのは面倒なので、Kanban Agent の入力欄にスラッシュコマンドで「/start refactor/login」などと入力すると自動でタスクを生成してループ処理を行う仕組みを考えます。

「.clinerules\AGENTS.md」ファイルを以下のように修正します。

# High Priority Rules - MUST FOLLOW

## 必須ルール読み込み
- kanban タスクを作成する前に以下のルールを必ず読み込む:
  `.clinerules\kanban\kanban-task-rules.md`

## Slash Command Rules

### /start <branch>
Kanban ループを開始する。

実行形式:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .kanban\scripts\bootstrap.ps1 -baseRef <branch>
```

### /init <branch>
指定された branch で Kanban 用 status.json を初期化する。

実行形式:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .kanban\scripts\initialize.ps1 -baseRef <branch>
```

### /commit <message>
追加、変更されたファイルをすべてコミットする。

実行形式:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File .kanban\scripts\kanban\commit-all.ps1 -message <message>
```

### /workflow planner
→ .clinerules/workflows/planner-workflow.md を読んで内容を実行

### /workflow worker
→ .clinerules/workflows/worker-workflow.md を読んで内容を実行

### /workflow reviewer
→ .clinerules/workflows/reviewer-workflow.md を読んで内容を実行

各コマンドの意味は以下のようになっています。

コマンド機能
/start <branch>Kanban ループを開始する
/init <branch>指定された branch で Kanban 用 status.json を初期化する
/commit <message>追加、変更されたファイルをすべてコミットする
/workflow plannerPlanner ワークフローを実行する
/workflow workerWorker ワークフローを実行する
/workflow reviewerReviewer ワークフローを実行する

画像が小さくて見にくいですが、以下の手順でループが起動します。

詳しい起動手順は以下のようになっています。(起動ブランチが main と仮定してます。)

  1. main ブランチで「/start <branch>」コマンドを実行します。
  2. Kanban が「bootstrap.ps1 -baseRef <branch>」スクリプトを実行します。
  3. bootstrap スクリプトが <branch> コンテキストで「bootstrap」タスクを作成して起動します。

    bootstrap タスクのプロンプトは以下のようになっています。
    • .clinerules\AGENTS.md を読む。
    • /init ${baseRef} を実行する。
    • /workflow planner を実行する。
  4. 手順に従い、bootstrap タスクが「AGENTS.md」ファイルを読み込みます。
  5. 次に「/init <branch>」(initialize.ps1 スクリプト) を実行します。
    このスクリプトで「status.json」ファイルが作成されます。
  6. 最後に「/workflow planner」コマンド (loop-builder.ps1 スクリプト) が実行されて、Planner Task の作業が終了します。

あとは「/workflow planner」コマンドで作成された「Worker Task」を実行すればループ処理が開始します。(今回はまだ実装していません。)

・実際に動作するか確認します

実際に試してみたい場合は、以下のアプリがインストールされている必要があります。

  • Node.js

こちら から今回のアプリをダウンロードして、任意のフォルダに展開してから VS Code で開きます。Ctrl + @ キーでターミナル画面を開いて以下のコマンドを実行します。

git init
git add .
git commit -m "init commit"

動作確認用に「refactor/login」という作業用のブランチを作成します。

git checkout -b refactor/login 

Kanban のタスクは git の「worktree」という仕組みを利用して実行されています。すでにチェックアウトされているブランチでは作業できないため、main または master ブランチなどをチェックアウトしておきます。

git checkout main # (または master) 

コンソール画面に以下のコマンドを入力すると、Kanban がブラウザで起動します。

kanban 2>$null

「Kanban Agent」タブを選択して、入力欄に「/start refactor/login」と入力して Enter キーを押します。

より確実に動作させるためには、あらかじめ「.clinerules\AGENTS.md ファイルを読み込んでください。」などと事前に入力しておきます。

自動的に bootstrap タスクが作成されます。

その後自動的に実行されます。

実行中のタスクをクリックすると、現在行っている処理内容が表示されます。(以下の画像は終了画面になっています。)

トップ画面に戻り、「Projects」タブを選択すると Kanban が作成したプロジェクトが追加されているのでクリックします。

新たに「Worker Task」と「Reviewer Task」というタスクが生成されて、リンクされています。

Kanban が作成したプロジェクトは「%USERPROFILE%\.cline\worktrees」という場所に作成されますので、VS Code にこのフォルダを追加してみると必要なファイルなども作成されているようです。

今回は行いませんが、あとは生成された「Worker Task」を自動的に実行すれば開発ループが開始されます。

スクリプトファイルについて

今回作成したスクリプトファイルは以下のようになっています。数が多くて大変そうに見えますが、Kanban Agent のプロンプトで仕様を入力して、かなりの部分を自動で作成してもらいました。

YelpCampCleanArch/
└─ .kanban/
   └─ scripts/
      ├─ common/
      │  ├─ encode-utf8.ps1
      │  ├─ git.psm1
      │  ├─ invoke-git.psm1
      │  ├─ invoke-task.psm1
      │  ├─ json.psm1
      │  ├─ logger.psm1
      │  └─ task.psm1
      ├─ kanban/
      │  ├─ commit-all.ps1
      │  ├─ create-plan.ps1
      │  ├─ create-review.ps1
      │  ├─ create-work.ps1
      │  ├─ kanban-task.ps1
      │  └─ update-task-status.ps1
      ├─ bootstrap.ps1
      ├─ initialize.ps1
      └─ loop-builder.ps1

主要なファイルをご紹介します。

・bootstrap.ps1

bootstrap タスクを作成して実行します。「/start <branch>」と入力すると呼び出されます。

#
# 指定ブランチで起動する最初のタスクを作成します。
#
param(
  [string]$baseRef
)

Import-Module (Join-Path $PSScriptRoot "common\logger.psm1")
Import-Module (Join-Path $PSScriptRoot "common\task.psm1")

Write-Header
$Command = $MyInvocation.MyCommand.Name
$Arguments = "-baseRef $baseRef"
Write-log -m "Command: $Command $Arguments" -i $IndentLevel

if ([string]::IsNullOrEmpty($baseRef)) {
    Write-Log -m "Empty branch name." -t "ERROR"
    exit 1
}

$TaskId = New-KanbanTask `
  -title "bootstrap" `
  -prompt ".clinerules\AGENTS.md を読む。/init ${baseRef} を実行する。/workflow planner を実行する。" `
  -baseref $baseRef `
  -autoreview $false `
  -i 1

Start-Sleep -Seconds 1

$StartText = Start-KanbanTask -t $TaskId -i 1

Write-Output $StartText

Write-log -m "Task $TaskId started."

exit 0
・initialize.ps1

bootstrap タスクから呼び出されます。「status.json」ファイルを作成します。

#
# タスクループの情報を管理する status.json ファイルを作成します。
#
param(
    [string]$baseRef
)

$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ProjectRoot = Resolve-Path (Join-Path $ScriptDir "..\..")

Import-Module (Join-Path $PSScriptRoot "common\logger.psm1")
Import-Module (Join-Path $PSScriptRoot "common\json.psm1")
Import-Module (Join-Path $PSScriptRoot "common\git.psm1")

Write-Header
$Command = $MyInvocation.MyCommand.Name
$Arguments = "-baseRef $baseRef"
Write-log -m "Command: $Command $Arguments" -i $IndentLevel

if ([string]::IsNullOrEmpty($baseRef)) {
    Write-Log -m "Empty branch name." -t "ERROR"
    exit 1
}

Push-Location $ProjectRoot

try {
    # 指定ブランチへ切り替え
    Switch-Branch $baseRef -i 1

    # status.json ファイル作成
    $statusPath = Join-Path $ProjectRoot "memory-bank\kanban\status.json"

    Set-Property -f $statusPath -p "baseRef" -v $baseRef -i 1

    # 変更をコミット
    Commit -f $statusPath -m "chore: initialize kanban status" -i 1

    Write-Log -m "INIT_DONE"

    exit 0
}
finally {
    Pop-Location
}
・loop-builder.ps1

同じく bootstrap タスクから呼び出されます。Planner Task の責務に基づき開発ループを作成します。

#
# Kanban 開発ループを構築します。
#
param(
    [string]$taskId
)

$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ProjectRoot = Resolve-Path (Join-Path $ScriptDir "..\..")

Import-Module (Join-Path $PSScriptRoot "common\logger.psm1")
Import-Module (Join-Path $PSScriptRoot "common\json.psm1")
Import-Module (Join-Path $PSScriptRoot "common\git.psm1")
Import-Module (Join-Path $PSScriptRoot "common\task.psm1")

$UpdateTaskStaus = Join-Path $PSScriptRoot "kanban\update-task-status.ps1"
$CreatePlan = Join-Path $PSScriptRoot "kanban\create-plan.ps1"
$CreateWork = Join-Path $PSScriptRoot "kanban\create-work.ps1"
$CreateReview = Join-Path $PSScriptRoot "kanban\create-review.ps1"

Write-Header
$Command = $MyInvocation.MyCommand.Name
$Arguments = "-taskId $taskId"
Write-log -m "Command: $Command $Arguments"

if ([string]::IsNullOrEmpty($taskId)) {
    Write-Log -m "TaskId is required." -t "ERROR"
    exit 1
}

Push-Location $ProjectRoot

try {
    # status.json ファイル更新
    $statusPath = Join-Path $ProjectRoot "memory-bank\kanban\status.json"

    Set-Property -f $statusPath -p "currentTask" -v $taskId -i 1

    # 変更をコミット
    Commit -f $statusPath -m "chore: update kanban status" -i 1

    # タスクステータス更新
    & $UpdateTaskStaus -t $taskId -s "PROCESSING" -i 1

    # plan.md ファイル作成
    & $CreatePlan -t $taskId -i 1

    # work.md ファイル作成
    & $CreateWork -t $taskId -i 1

    # review.md ファイル作成
    & $CreateReview -t $taskId -i 1

    # worker タスク作成
    $baseRef = Get-Property -f $statusPath -p "baseRef" -i 1

    $WorkerTaskId = New-KanbanTask `
        -title "Worker Task" `
        -prompt ".clinerules\AGENTS.md を読む。/workflow worker を実行する。" `
        -baseref $baseRef `
        -autoreview $true `
        -i 1

    # reviewer タスク作成
    $ReviewerTaskId = New-KanbanTask `
        -title "Reviewer Task" `
        -prompt ".clinerules\AGENTS.md を読む。/workflow reviewer を実行する。" `
        -baseref $baseRef `
        -autoreview $true `
        -i 1

    # リンクを作成します
    New-KanbanLink `
        -SourceTaskId $WorkerTaskId `
        -TargetTaskId $ReviewerTaskId

    Write-Log -m "LOOP_BUILDER_DONE"

    exit 0
}
finally {
    Pop-Location
}

それ以外のスクリプトファイルは こちら からダウンロードできるプロジェクトファイルに含まれています。

その他

今回の実装で得た知見などをまとめています。

・PowerShell のデバッグ方法

スクリプトファイルが増えてくると、デバッグ機能があった方が何かと便利です。あまり利用する機会は少ないかもしれませんが、PowerShell スクリプトのデバッグ方法をご紹介します。

VS Code の左側にある「拡張機能」ボタンを押して、検索欄に「powershell」と入力します。表示された拡張機能から Microsoft 社製のプラグインを選択してインストールします。

「.vscode\launch.json」というファイルを作成して以下の内容を書き込みます。(「script」や「args」項目内容はご使用の環境に合わせて修正してください。)

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "PowerShell",
            "request": "launch",
            "name": "Debug loop-builder",
            "script": "${workspaceFolder}/.kanban/scripts/loop-builder.ps1",
            "args": [
                "-taskId",
                "T0001"
            ]
        }
    ]
}

対象のファイルを開いてブレークポイントを設定します。あとはデバッグ画面を開いて設定項目を選んでからデバッグを開始すると、専用のターミナル画面が開いて設定したブレークポイントで停止します。

スクリプトによって呼び出すときのファイル名や引数などが変わるので、スクリプトごとにデバッグ用の設定項目を追加する必要があります。

・シェルスクリプトの日本語対応

スクリプトファイル内に記述しているプロンプトなどに日本語を使用している場合、文字化けで処理が止まることがあります。そのような場合は文字コードを変更すると解決する場合があります。

文字化けするファイルをエディタで開いて、ステータスバーにある文字コード部分をクリックします。

上部に表示されたメニューから「エンコード付きで保存」を選択します。

表示されたリストから「UTF-8 with BOM」を選択します。

たいていの場合は BOM 付きに変更すれば解決するようですが、どうしても改善しない場合は一部英語化も検討します。(今回の実装では plan.md などのファイルを生成するためのテンプレートファイルのセクション名などを日本語にすると動作が不安定になりました。)

まとめ

想定より実装量が増えてしまったため、今回は Planner Agent による

  • status.json の初期化
  • plan.md の生成
  • work.md の生成
  • review.md の生成
  • Worker Task / Reviewer Task の生成

までを実装しました。

次回は Worker Agent と Reviewer Agent を実装し、実際にマルチエージェントループを回してみたいと思います。