ワークフローファイルリファレンス
ワークフローファイルの各フィールドの書き方、指定できる値、デフォルト値、優先順位。
ワークフローファイルは、プライマリリポジトリの .codedag/dags/ ディレクトリに置く YAML または JSON のファイルです。必須なのは、tasks のリストと、各タスクの id、title、prompt だけです。それ以外のフィールドはすべて省略でき、省略した場合は、プロジェクト設定の値か、フィールドごとのデフォルト値が使われます。ワークフローファイルを一から書く手順は、ワークフローファイルを書くを参照してください。
やりたいことからフィールドを探す
フィールドには 2 つのレベルがあります。「ワークフロー」と記したフィールドは、ファイルのトップレベルに tasks と並べて書き、ワークフロー全体に適用されます。「タスク」と記したフィールドは、tasks の項目の中に書き、そのタスクだけに影響します。
| やりたいこと | フィールド | 書く場所 |
|---|---|---|
| ブランチの作成もコミットもせず、すべてのタスクを同じワークスペースでそのまま実行する | executionMode | ワークフロー |
| 同時に実行するタスクの数を制限する、または制限を外す | maxConcurrency | ワークフロー |
| ワークフローをどのコミットから始めるかを固定する | baseRef | ワークフロー |
| 一部のワークスペースを使わない(プライマリリポジトリを自分の開発用に残す場合など) | excludeWorkspaces | ワークフロー |
| 自動マージでコンフリクトが起きたときに、どのエージェントが解決するかを指定する | mergeConflictAgent | ワークフロー |
| 特定のタスクを完了後に止め、レビューを待たせる | autoAccepted | タスク |
| すべてのタスクを完了後に止め、レビューを待たせる | taskAutoAccepted | ワークフロー |
| ワークフロー全体を終了前に止め、結論を出すまで待たせる | dagAutoAccepted | ワークフロー |
| タスクを Claude Code と Codex のどちらが実行するかを選ぶ | agent | タスク |
| タスクが使うモデルと推論エフォートを指定する | model、effort | タスク |
| タスクの実行中に、どの操作で事前に許可が必要かを決める | mode。書き方は権限モードの構文を参照してください | タスク |
| タスクブランチに固定の名前を付ける | branchName | タスク |
| 用途やメンテナーなどの説明をファイルに記録する | metadata | ワークフロー |
ファイルの置き場所と形式
ワークフローファイルは、プライマリリポジトリの .codedag/dags/ ディレクトリか、その下の任意の階層のサブディレクトリに置きます。拡張子は .yaml、.yml、.json のいずれかです。それ以外の場所に置いたファイルや、それ以外の拡張子のファイルは、検証も投入もできません。コマンドでワークフローファイルを指定する方法は、ワークフローを指定するを参照してください。
ワークフローの名前は、.codedag/dags/ からのファイルの相対パスで決まります。相対パスから拡張子を除き、含まれている / をアンダースコアに置き換えたものが名前です。.codedag/dags/build.yaml の名前は build、.codedag/dags/team/build.yaml の名前は team_build になります。この名前はタスクブランチと統合ブランチの名前に使われ、このページでは <ワークフロー名> と書きます。したがって、2 つ目の例の統合ブランチは cdg/team_build/integration です。Git のブランチ名に使えない文字がほかに含まれている場合は、その文字もあわせて正規化されます。実際の名前がはっきりしないときは、cdg dag status が出力する Integration Branch で確認してください。
別々のサブディレクトリにある同名のファイルは、ワークフローとしては別の名前になります。ログファイルも同じ相対パスで保存されるため、互いに影響しません。一方、build.yaml と build.yml のように拡張子だけが異なる 2 つのファイルは同じ名前になり、同じブランチ名と同じログファイルを共有します。
YAML と JSON で使えるフィールドはまったく同じです。ファイルは、さらに次の制限も満たす必要があります。
- フィールド名: 大文字と小文字が区別され、すべて camelCase で書きます。CodeDAG が認識しないフィールドがあっても検証は失敗せず、そのフィールドは無視されて警告が出ます。検証するを参照してください。
- YAML の構文: アンカー(
&)、エイリアス(*)、マージキー(<<)はサポートされておらず、ファイルで使うと検証に失敗します。繰り返し使う内容は、その都度そのまま書いてください。文字列の内容に含まれる&と*の文字は、この制限を受けません。 - ネストの深さ: 64 階層を超えることはできません。通常の構造で書いたワークフローファイルが、この制限に近づくことはまずありません。
- ファイルサイズとタスク数: ワークフローファイル 1 つのサイズは 256 KiB までです。サイズは、ファイルの内容そのものの UTF-8 バイト数で数え、コメントと空白も含みます。1 つのワークフローに含められるタスクは、最大 1024 個です。この 2 つは、投入時にサーバー側でチェックされ、
cdg dag validateではチェックされません。上限を超えている場合、cdg dag submitは拒否されます。
ワークフローレベルのフィールド
ワークフローレベルのフィールドは、ファイルのトップレベルに書きます。tasks 以外はすべて省略できます。maxConcurrency、taskAutoAccepted、dagAutoAccepted を省略した場合は、まずプロジェクト設定にある同名のフィールドの値が使われます。優先順位の全体は、デフォルト値と優先順位を参照してください。
| フィールド | 型 | 必須 | 省略した場合 |
|---|---|---|---|
tasks | 配列 | はい | — |
executionMode | isolated-branches または shared-workspace | いいえ | isolated-branches |
maxConcurrency | 整数 | いいえ | プロジェクト設定の値。設定されていない場合は 1 |
taskAutoAccepted | always、done、none のいずれか | いいえ | プロジェクト設定の値。設定されていない場合は always |
dagAutoAccepted | always、done、none のいずれか | いいえ | プロジェクト設定の値。設定されていない場合は done |
baseRef | 文字列 | いいえ | ワークフローの実行開始時の、プライマリリポジトリの HEAD。プライマリリポジトリが除外されている場合は、除外されていない最初のレプリカの HEAD |
excludeWorkspaces | 文字列の配列 | いいえ | どのワークスペースも除外しません |
mergeConflictAgent | オブジェクト | いいえ | マージが行われる場面に応じて、エージェントが選ばれます。フィールドの説明を参照してください |
metadata | オブジェクト | いいえ | なし |
tasks
tasks はタスクのリストで、ワークフローファイルで唯一の必須フィールドです。値は配列で、タスクを 1 つ以上含める必要があります。各タスクには、少なくとも id、title、prompt を書きます。使えるフィールドの一覧は、タスクレベルのフィールドを参照してください。
tasks:
- id: 1
title: テストコマンドをまとめる
prompt: すべてのテストをローカルで実行するコマンドを調べて、docs/notes/testing.md に書いてください。executionMode
executionMode は、タスクをそれぞれのブランチで分離して実行するか、同じワークスペースでそのまま実行するかを決めます。省略可能なフィールドで、値は isolated-branches または shared-workspace です。省略した場合は isolated-branches になります。
| 値 | 意味 | 向いている作業 |
|---|---|---|
isolated-branches(デフォルト) | 分離ブランチモードです。各タスクは、いずれかのワークスペースで、同じベースから作られたタスクブランチ上で実行されます。下流のタスクが始まる前に、CodeDAG が上流の結果をそのタスクブランチにマージします。すべてのタスクが終わると、結果は統合ブランチ cdg/<ワークフロー名>/integration にマージされ、メインブランチは変更されません。 | コードを変更し、タスクごとの結果を個別に確認したり巻き戻したりする必要がある作業 |
shared-workspace | 共有ワークスペースモードです。すべてのタスクが、同じワークスペースの現在のブランチでそのまま実行されます。CodeDAG はブランチの作成も、マージも、コミットも行わず、結果は未コミットの変更としてそのワークスペースに残ります。 | ドキュメントの作成、調査、翻訳のように、コンパイルもテストの実行もしないタスク |
2 つのモードがある理由と、それぞれの代償は、実行モードを参照してください。どちらのモードを選ぶかによって、ほかのいくつかのフィールドとレビューのオプションの動作も変わります。
isolated-branches | shared-workspace | |
|---|---|---|
| タスクが実行される場所 | 実行中のタスクが、それぞれワークスペースを 1 つ占有します | すべてのタスクが、1 つのワークスペースを共有します。使われるのはプライマリリポジトリで、プライマリリポジトリが除外されている場合は、除外されていない最初のレプリカです |
| タスク開始前のチェック | ワークスペースに未コミットの変更があると、タスクは on-hold で止まります | ワークスペースがクリーンかどうかはチェックされません |
maxConcurrency | 実際の同時実行数は、利用できるワークスペースの数を超えません | ワークスペースの数による制限を受けません |
baseRef | すべてのタスクブランチが、ここから作られます | 記録されるだけで、ワークスペースは切り替えられません |
excludeWorkspaces | 除外されたワークスペースは、実行に使われません | どのワークスペースを使うかを決めます |
mergeConflictAgent | 有効です | マージを行わないため、無効です |
branchName | 使えます | 書くと検証に失敗します |
| 変更を何も残さずに完了したタスク | 自動承認されず、done で止まってレビューを待ちます | 通常どおり自動承認され、ステータスに zero output と表示されるだけです。自動承認に指定できる値を参照してください |
| レビュー | すべてのアクションとオプションを使えます | --code オプションと rework アクションは使えません。レビューコマンドの共有ワークスペースモードを参照してください |
executionMode: shared-workspace # タスクはプライマリリポジトリの現在のブランチでそのまま実行されるmaxConcurrency
maxConcurrency は、同時に実行するタスク数の上限で、省略可能な整数です。正の整数を書くと、最大でその数のタスクが同時に実行されます。0 または負の数を書くと、ワークフロー自体には上限を設けないという意味になります。省略した場合は、プロジェクト設定の maxConcurrency が使われます。cdg init がデフォルトで書き込む値は、レプリカの数に 1 を足した数です。プロジェクト設定にもない場合は 1 になり、タスクは 1 つずつ実行されます。
分離ブランチモードでは、実行中のタスクがそれぞれワークスペースを 1 つ占有します。そのため、実際の同時実行数が、利用できるワークスペースの数を超えることもありません。利用できるワークスペースとは、登録済みのワークスペースのうち、excludeWorkspaces で除外していないものです。0 または負の数にした場合、同時実行数は、利用できるワークスペースの数と同じになります。利用できるワークスペースが足りない場合は、先にレプリカを増やします。レプリカを準備するを参照してください。
共有ワークスペースモードでは、同時実行数はワークスペースの数による制限を受けません。0 または負の数にした場合は、開始できるタスクがすべて同時に始まります。これらのタスクは同じワークスペースに書き込み、CodeDAG はその変更を分離しません。そのため、同時に実行されるタスクには、それぞれ別のファイルに書き込ませる必要があります。
maxConcurrency: 2 # 最大 2 つのタスクを同時に実行するmaxConcurrency: 0 # ワークフローには上限を設けない。分離ブランチモードでは、利用できるワークスペースをすべて使うtaskAutoAccepted
taskAutoAccepted は、ワークフロー内のすべてのタスクに適用されるデフォルトのレビューポリシーです。タスクの完了後に自動承認するか、止まってレビューを待つかを決めます。省略可能なフィールドで、値は always、done、none のいずれかです。それぞれの意味は、自動承認に指定できる値を参照してください。省略した場合は、プロジェクト設定の taskAutoAccepted が使われます。プロジェクト設定にもない場合は always、つまり自動承認になります。
タスク自身に autoAccepted が書かれている場合は、タスクの値が優先されます。さらに、投入時に --task-auto-accepted オプションを付けると、その投入に限って、この両方を上書きできます。デフォルト値と優先順位を参照してください。
taskAutoAccepted: none # すべてのタスクが完了後に止まり、レビューを待つ
tasks:
- id: 1
title: コードをフォーマット
autoAccepted: always # このタスクは例外で、完了後に自動承認される
prompt: プロジェクトのフォーマットコマンドを実行し、すべてのソースファイルをフォーマットしてください。dagAutoAccepted
dagAutoAccepted は、ワークフロー全体のレビューポリシーです。すべてのタスクのレビューが終わったあとに、ワークフロー全体を自動承認するか、止まって結果全体についての結論を待つかを決めます。タスクのレビューポリシーとは独立しており、すべてのタスクが自動承認された場合でも、ワークフロー全体が止まるかどうかは、このフィールドで決まります。省略可能なフィールドで、値は always、done、none のいずれかです。それぞれの意味は、自動承認に指定できる値を参照してください。省略した場合は、プロジェクト設定の dagAutoAccepted が使われます。プロジェクト設定にもない場合は done、つまり自動承認になります。投入時に --dag-auto-accepted オプションを付けると、その投入に限って、このフィールドを上書きできます。
dagAutoAccepted: none # すべてのタスクが終わったあと、ワークフロー全体についての結論を待つbaseRef
baseRef は、ワークフローのベースを指定します。分離ブランチモードでは、すべてのタスクブランチがこのコミットから作られます。省略可能な、空でない文字列で、次のいずれの形式でも書けます。
| 書き方 | 例 |
|---|---|
| ローカルブランチ名 | main、feature/auth |
| リモート追跡ブランチ名 | origin/main |
| タグ名 | v1.4.0 |
| コミット ID。完全な形、または 7 桁以上の短縮形 | 4f3c2b1 |
| 完全な参照名 | refs/heads/main、refs/tags/v1.4.0 |
| Git がコミットに解決できる、そのほかの式 | main~1、HEAD~2 |
書いた値は、ただ 1 つのコミットに対応していなければなりません。同じ名前のブランチとタグが両方ある場合や、短縮したコミット ID が複数のコミットに一致する場合、CodeDAG はどれを指しているかを推測しません。前者の場合は refs/heads/... や refs/tags/... のような完全な参照名に書き換え、後者の場合はコミット ID をより長く書いてください。
baseRef が特定のコミットに解決されるのは、投入コマンドの実行時ではなく、ワークフローの実行が実際に始まるときです。そのため、baseRef: main と書いた場合、ベースは、ワークフローが始まった時点で main が指しているコミットになり、キューで待っている間に main に追加されたコミットも含まれます。検証でチェックされるのは、空文字列でないことだけです。参照が存在するかどうか、ただ 1 つに決まるかどうかは、ワークフローが始まるまで確定しません。解決に失敗した場合、ワークフローは on-hold で止まります。対処方法は、ワークフローが実行を開始できないを参照してください。
baseRef を省略した場合、ベースは、ワークフローの実行開始時の、プライマリリポジトリの HEAD です。プライマリリポジトリが excludeWorkspaces で除外されている場合は、除外されていない最初のレプリカの HEAD です。前のワークフローが終了すると、プライマリリポジトリは、そのワークフローの統合ブランチをチェックアウトしたままになります。そのため、baseRef を書いていない次のワークフローは、前のワークフローの結果の続きから始まります。ワークフローの終了後、リポジトリはどのブランチにあるかを参照してください。どんな場合でも main から始めたいときは、baseRef: main と書きます。
共有ワークスペースモードでは、baseRef は解決されて記録されるだけで、CodeDAG がそれに合わせてワークスペースを切り替えることはありません。共有ワークスペースモードのタスクを特定のバージョンで実行したい場合は、先に自分でそのワークスペースを目的のコミットに切り替えてから、ワークフローを投入します。
baseRef: main # ワークフローの開始時に main が指しているコミットから始めるbaseRef: v1.4.0 # タグ v1.4.0 から始めるexcludeWorkspaces
excludeWorkspaces には、このワークフローで使わないワークスペースを列挙します。省略可能な文字列の配列で、各項目はワークスペースのパスです。. はプライマリリポジトリを表します。相対パスはプライマリリポジトリのルートを基準とし、絶対パスで書くこともできます。どの項目も、現在のプロジェクトに登録済みのワークスペースでなければならず、そうでない場合は検証に失敗します。ワークスペースの登録は、ワークスペースの登録と更新を参照してください。省略した場合は、登録済みのワークスペースをすべて使えます。
分離ブランチモードでは、除外されたワークスペースでは、ブランチが切り替えられることも、タスクが実行されることもありません。その分だけ利用できるワークスペースが減り、実際の同時実行数も下がることがあります。共有ワークスペースモードでは、ワークフローは、除外されていない最初のワークスペースで実行されます。順序は、プライマリリポジトリが先頭で、そのあとにレプリカが登録順に並びます。どちらのモードでも、ワークスペースを少なくとも 1 つ残す必要があります。登録済みのワークスペースをすべて除外すると検証に失敗し、ワークフローは投入されません。
プライマリリポジトリを除外すると、ワークフローはレプリカだけで実行され、プライマリリポジトリでは開発を続けられます。その場合は、baseRef も一緒に書いておくことをおすすめします。書かないと、ベースは、最初のレプリカにその時点でチェックアウトされているコミットになります。方法は、ワークフローの実行中に自分でも開発を続けるを参照してください。
excludeWorkspaces: ["."] # プライマリリポジトリを使わず、ワークフローはレプリカだけで実行する
baseRef: mainexcludeWorkspaces:
- ../my-app-wt-2 # このレプリカを使わない(別の作業で使用中の場合など)mergeConflictAgent
mergeConflictAgent は、自動マージでコンフリクトが起きたときに、どのエージェントが解決するかを指定します。省略可能なオブジェクトで、分離ブランチモードでだけ有効です。分離ブランチモードでは、CodeDAG は 2 つの場面で自動マージを行います。下流のタスクが始まる前に、上流の結果をそのタスクブランチにマージするときと、すべてのタスクが終わったあとに、結果を統合ブランチにマージするときです。どちらの場面でコンフリクトが起きても、CodeDAG は解決のためのエージェントセッションを起動します。解決できなかった場合は、対応するタスクまたはワークフローが on-hold で止まります。仕組みは合流ノードでのマージとコンフリクト、対処の手順はマージコンフリクトを参照してください。
| サブフィールド | 必須 | 値 | 省略した場合 |
|---|---|---|---|
agent | はい | claude または codex。プロジェクトで使えるエージェントでなければなりません | — |
mode | いいえ | タスクの mode と同じ書き方で、選んだ agent に合わせてチェックされます。権限モードの構文を参照してください | yolo |
model | いいえ | 選んだエージェントが対応しているモデル名 | エージェント側で設定されているデフォルトのモデル |
mergeConflictAgent を省略した場合は、2 つの場面のそれぞれに、別々のデフォルトがあります。
| コンフリクトが起きる場面 | mergeConflictAgent を省略した場合に解決するエージェント |
|---|---|
| 下流のタスクが始まる前に、上流の結果をマージするとき | その下流タスク自身の agent と model |
| すべてのタスクが終わったあとに、統合ブランチにマージするとき | ワークフローの投入時に確定した、プロジェクトのデフォルトのエージェント |
mergeConflictAgent を書いた場合は、どちらの場面でも、そのオブジェクトに書いた agent、mode、model が使われます。model を省略しても、下流タスクの model が引き継がれることはありません。
コンフリクト解決のセッションには、許可リクエストに応答する手段がありません。そのため、このセッションはタスクの mode を引き継ぎません。mergeConflictAgent に mode を書いていない場合は、フィールド全体を省略した場合も含めて、常に yolo で動作し、無人実行でもマージを終えられます。mode を書くのは、別のアクセスレベルに変えたい場合だけです。止まって許可を求めるレベルに変えると、セッションは許可リクエストが出た時点で止まり、マージを先へ進められなくなります。
mergeConflictAgent: # すべてのマージコンフリクトの解決を Claude Code に任せる
agent: claude
model: opusmetadata
metadata は、ワークフローの用途、メンテナー、バージョンなど、人が読むための説明を記録するフィールドです。省略可能なオブジェクトで、内容は自由に決められます。CodeDAG がその内容を読み取ることも、チェックすることもありません。cdg init が生成するテンプレートファイルには、version や description などの項目がいくつか入っています。必要に応じて、そのまま残しても、変更しても、削除してもかまいません。
metadata:
description: 週次の依存関係アップグレードと回帰テスト
owner: platform-teamタスクレベルのフィールド
タスクレベルのフィールドは、tasks の各項目の中に書き、そのタスクにだけ適用されます。
| フィールド | 型 | 必須 | 省略した場合 |
|---|---|---|---|
id | 正の整数 | はい | — |
title | 文字列 | はい | — |
prompt | 文字列 | details と合わせて、少なくとも一方が必須 | — |
description | 文字列 | いいえ | 空 |
dependencies | 整数の配列 | いいえ | []。どのタスクも待ちません |
agent | claude または codex | いいえ | プロジェクトのデフォルトのエージェント |
mode | 文字列 | いいえ | エージェント自身の権限設定 |
model | 文字列 | いいえ | エージェント側で設定されているデフォルトのモデル |
effort | 文字列 | いいえ | エージェント自身の設定、またはモデルのデフォルトの推論エフォート |
autoAccepted | always、done、none のいずれか | いいえ | ワークフローの taskAutoAccepted |
branchName | 文字列 | いいえ | 自動で命名されます |
id
id は、タスクの番号です。dependencies と、cdg task 配下のコマンドは、この番号でタスクを指定します。必須の正の整数で、同じワークフロー内で重複してはいけません。ただし、1 から始める必要も、連番にする必要もありません。
title
title は、タスクの名前です。ステータスボードとログに表示され、デフォルトのタスクブランチ名の生成にも使われます。必須の文字列で、空にはできません。タスクエージェントが受け取るのは prompt だけで、title は見えません。エージェントに伝える必要がある内容は、prompt に書いてください。
prompt
prompt は、タスクエージェントへの指示です。タスクのエージェントセッションは、これを最初の入力として受け取ります。必須の文字列で、互換用の書き方である details を代わりに使うこともできます。少なくとも、どちらか一方を書く必要があります。一方だけを書く場合は、どちらを書いても動作は同じです。両方を書いた場合は prompt だけが使われ、details の内容は使われません。prompt を書く場合は、空にはできません。空文字列でも、空白だけの文字列でも、検証に失敗します。
どのタスクも新しいエージェントセッションで、ほかのタスクの会話は見えません。そうしたセッションが単独でやり遂げられるプロンプトの書き方は、プロンプトを書く:新しいセッションが単独でやり遂げられるようにするを参照してください。
- id: 2
title: 検索APIを実装
prompt: |
docs/plans/search.md を読み、まず計画にある新しい API のそれぞれにユニットテストを書いてから、
計画に沿って検索 API を実装し、すべてのテストが通るまで実行してください。
変更するのは server/ ディレクトリだけにしてください。description
description は、人が読むための補足説明です。省略可能な文字列で、デフォルトは空です。タスクエージェントには渡されないため、エージェントに伝えたい内容は prompt に書いてください。
dependencies
dependencies には、このタスクが待つ上流タスクの id を列挙します。省略可能な整数の配列で、デフォルトは空の配列です。空の配列の場合、タスクはどのタスクも待たず、ワークフローが始まればすぐに実行の対象になります。列挙する id は、どれも同じワークフローに存在するタスクのものでなければなりません。依存関係が循環していてもいけません。タスクが自分自身に依存している場合も、循環とみなされます。
タスクは、すべての上流が完了し、レビューを通ってから開始されます。自動承認も、レビューを通ったものとして扱われます。分離ブランチモードでは、タスクが始まる前に、上流の結果がそのタスクブランチにマージされます。
- id: 4
title: テストを実行して修正
dependencies: [2, 3] # タスク 2 とタスク 3 がどちらもレビューを通ってから開始する
prompt: すべてのテストを実行し、すべて通るまで失敗を修正してください。agent
agent は、このタスクを実行するエージェントを指定します。claude は Claude Code、codex は Codex を表します。省略可能なフィールドで、省略した場合は、プロジェクトのデフォルトのエージェントが使われます。これはプロジェクト設定の defaultAgent のことで、通常は cdg init のときに決まります。指定するエージェントは、プロジェクトで使えるエージェントに含まれていなければならず、そうでない場合は検証に失敗します。
タスクの mode の書き方は、そのタスクが実際に使うエージェントに合わせてチェックされます。agent を省略した場合、mode はプロジェクトのデフォルトのエージェントに合わせてチェックされます。デフォルトのエージェントは通常ローカル設定に記録されているため、同じファイルでも、デフォルトのエージェントが異なるマシンに持っていくと、検証に失敗することがあります。そのため、mode を書いたタスクには、agent も明記しておくことをおすすめします。
- id: 3
title: 実装をレビュー
agent: claude # このタスクだけを Claude Code に任せる
mode: bypassPermissions
prompt: server/ ディレクトリに今回追加されたコードをレビューし、見つかった問題を docs/review.md に書いてください。mode
mode は、タスクエージェントの権限モードです。タスクの実行中に、どの操作をそのまま実行でき、どの操作でいったん止まって許可を待つかを決めます。省略可能な、空でない文字列です。省略した場合、CodeDAG はエージェントに権限モードを渡さず、エージェントは自身の設定に従って動作します。たとえば、Claude Code のプロジェクト設定またはユーザー設定にある permissions.defaultMode や、Codex の ~/.codex/config.toml です。この場合、タスクの実際のアクセスレベルは、ワークフローファイルからは読み取れません。
mode の書き方は、エージェントによって異なります。権限モードの構文を参照してください。タスクを無人実行で最後まで進めたい場合や、各タスクのアクセスレベルをファイルで固定したい場合は、mode を明記します。無人実行と有人実行のどちらを選ぶかは、無人実行か有人実行かを決めるを参照してください。
- id: 1
title: 実装計画を書く
agent: codex
mode: yolo # Codex:許可を求めず、サンドボックスも使わない
prompt: docs/spec/search.md を読み、実装計画を docs/plans/search.md に書いてください。
- id: 2
title: 検索APIを実装
dependencies: [1]
agent: claude
mode: acceptEdits # Claude Code:ファイルの編集はそのまま実行し、それ以外のコマンドは事前に許可を求める
prompt: docs/plans/search.md に沿って検索 API を実装してください。model
model は、タスクが使うモデルを指定します。省略可能な、空でない文字列で、エージェントの --model オプションにそのまま渡されます。省略した場合は、エージェント側で設定されているデフォルトのモデルが使われます。CodeDAG はモデル名をチェックしません。名前を書き間違えても検証には通り、タスクの実行時になって初めて、エージェントがエラーを出します。
Claude Code では、sonnet、opus、haiku のようなエイリアスを書けるほか、完全なモデル名も書けます。Claude Code のモデル設定のドキュメントを参照してください。Codex では、モデル名を書きます。使えるモデルは、Codex のモデルのドキュメントを参照してください。
- id: 3
title: 実装をレビュー
agent: claude
model: sonnet # 最新の Sonnet モデルを使う
prompt: server/ ディレクトリに今回追加されたコードをレビューし、見つかった問題を docs/review.md に書いてください。effort
effort は、モデルの推論エフォートを指定します。省略可能な、空でない文字列で、エージェントにそのまま渡されます。省略した場合は、エージェント自身の設定か、使用するモデルのデフォルト値で決まります。CodeDAG は値をチェックしません。値を書き間違えても、タスクの実行時になるまで問題は表面化しません。
| エージェント | エージェントへの渡し方 | よく使われる値 |
|---|---|---|
| Claude Code | --effort オプション | low、medium、high、xhigh、max |
| Codex | 設定項目 model_reasoning_effort | low、medium、high、xhigh。一部のモデルは、max などのさらに高いレベルにも対応しています |
どちらのエージェントでも、使えるレベルは選んだモデルによって決まり、上位のいくつかのレベルを使えないモデルもあります。詳しくは、Claude Code のモデル設定のドキュメントと、Codex のモデルのドキュメントを参照してください。
- id: 1
title: 実装計画を書く
agent: codex
effort: high # 計画は後続のすべてのタスクを左右するので、高めの推論エフォートを使う
prompt: docs/spec/search.md を読み、実装計画を docs/plans/search.md に書いてください。autoAccepted
autoAccepted は、このタスクのレビューポリシーです。タスクの完了後に自動承認するか、止まってレビューを待つかを決めます。省略可能なフィールドで、値は always、done、none のいずれかです。それぞれの意味は、自動承認に指定できる値を参照してください。省略した場合は、ワークフローの taskAutoAccepted が引き継がれます。ワークフローにも書かれていない場合は、プロジェクト設定、最終的なデフォルト値の always の順に使われます。投入時に --task-auto-accepted オプションを付けると、その投入に限って、すべてのタスクのこのフィールドを上書きできます。デフォルト値と優先順位を参照してください。
- id: 1
title: 実装計画を書く
autoAccepted: none # 計画を書き終えたら止まる。承認して初めて、下流のタスクが開始される
prompt: docs/spec/search.md を読み、実装計画を docs/plans/search.md に書いてください。branchName
branchName は、このタスクのタスクブランチ名を指定します。省略可能な、空でない文字列です。使えるのは分離ブランチモードだけで、共有ワークスペースモードで書くと検証に失敗します。省略した場合、CodeDAG はタスクブランチに cdg/<ワークフロー名>/t<id>-<タイトル> という名前を自動で付けます。
branchName を書いた場合、CodeDAG はその名前をそのまま使い、プレフィックスもサフィックスも付けません。名前は次の条件を満たしている必要があり、満たしていない場合は検証に失敗します。
- Git のブランチ名の規則に従っていること。つまり、
git check-ref-formatを通ること。 - 同じワークフロー内のほかのタスクと重複していないこと。
- このワークフローの統合ブランチ
cdg/<ワークフロー名>/integrationと同じ名前ではなく、スナップショットブランチのプレフィックスcdg/<ワークフロー名>/snapshots/で始まってもいないこと。
同じ名前のブランチがすでに存在する場合、検証は branch-name-conflict の警告を出します。たとえば、同じワークフローの前回の実行で残ったブランチがある場合です。対処せずに投入すると、ワークフローの実行がこのタスクまで進んだところで、タスクは on-hold で止まります。警告には、その名前を何が使っているかが示されます。古いブランチを片付ければ、元の名前を引き続き使えます。方法は、指定したタスクブランチ名を使うを参照してください。自動で命名されるタスクブランチでは、この問題は起きません。そのため、branchName を書くのは、ブランチ名を固定する必要が本当にある場合だけにしてください。たとえば、あとでそのブランチをリモートにプッシュして、プルリクエストを作成する場合です。
- id: 2
title: 検索APIを実装
branchName: feature/search-api
prompt: docs/plans/search.md に沿って検索 API を実装してください。自動承認に指定できる値
always、done、none の 3 つの値は、レビューポリシーのすべての設定で使います。タスクの autoAccepted、ワークフローの taskAutoAccepted と dagAutoAccepted、プロジェクト設定にある同名のフィールド、そして cdg dag submit の --task-auto-accepted オプションと --dag-auto-accepted オプションです。名前に dag が含まれる設定はワークフロー全体に適用され、それ以外はタスクに適用されます。それぞれの値が、この 2 種類の設定で持つ意味は次のとおりです。
| 値 | タスクに使う場合 | ワークフロー全体に使う場合 |
|---|---|---|
always | タスクは完了後に自動承認され、下流のタスクはすぐに開始できるようになります | すべてのタスクのレビューが終わったあと、ワークフロー全体が自動承認されます。分離ブランチモードでは、結果が統合ブランチにマージされ、ワークフローはキューを離れます |
done | always と同じです | always と同じです |
none | タスクは完了後に止まり、レビューを待ちます。結論を出すまで、下流のタスクは開始されません。分離ブランチモードでは、その間、このタスクがワークスペースを占有し続けます | すべてのタスクのレビューが終わったあとに止まり、cdg dag review で結論を出すのを待ちます。それまで、キューでこのワークフローの後ろに並んでいるワークフローは開始されません |
0.1.0 では、always と done の動作は同じで、どちらも自動承認を表します。最終的なデフォルト値は、タスクが always、ワークフローが done です。そのため、何も書かなければ、タスクもワークフローも自動承認されます。
自動承認には、例外が 1 つあります。分離ブランチモードでは、完了したタスクが変更を何も残していない場合、always に設定していても自動承認されず、止まってレビューを待ちます。共有ワークスペースモードでは、ゼロ出力のタスクも通常どおり自動承認され、ステータスにその旨が表示されるだけです。
none は、自分の目で確認したい箇所に使います。たとえば、後続のタスクがすべて依存する計画のタスクや、初めて実行する新しいワークフローです。どのノードにこの設定をする価値があるか、なぜ自動承認がデフォルトなのかは、自動承認を参照してください。止まったあとのレビューの方法は、タスクとワークフローをレビューするを参照してください。
権限モードの構文
mode は、タスクと mergeConflictAgent に書けます。書き方は、対応するエージェントによって決まります。Claude Code ではモード名を 1 つ書き、Codex では省略形を 1 つ書くか、カンマで区切ったキーと値のペアを書きます。検証では、対応するエージェントに合わせて形式がチェックされます。一方のエージェント向けの書き方を、もう一方のエージェントのタスクに使うと、検証に失敗します。
Claude Code
Claude Code のタスクの mode には、モード名を 1 つ書きます。モード名には、スペース、カンマ、= を含められません。CodeDAG は、それを --permission-mode オプションとして Claude Code に渡します。CodeDAG は、エイリアスを 2 つ用意しています。yolo は bypassPermissions と同じで、askForPermissions は default と同じです。それ以外のモード名は、そのまま Claude Code に渡されます。CodeDAG がチェックするのは形式だけで、名前が有効かどうかは Claude Code が判断します。
| 値 | 許可なしで実行できる操作 | CodeDAG のタスクでの動作 |
|---|---|---|
bypassPermissions、エイリアスは yolo | すべての操作。権限チェックはスキップされます。ただし、Claude Code が保護しているごく一部の操作は除きます | 実行中に許可待ちで止まることはほとんどなく、無人実行に向いています。信頼できるタスクと、自分で管理できる環境でだけ使ってください |
auto | すべての操作。Claude Code の安全分類器がバックグラウンドでレビューし、ブロックされた操作は実行されません | 使用するモデルとアカウントが、auto モードに対応している必要があります。対応していない場合、セッションは default モードで起動し、タスクは許可が必要な操作で止まります |
acceptEdits | 読み取り、ファイルの編集、mkdir、mv、cp などのよく使うファイルシステムコマンド | それ以外のコマンドを実行する前に止まり、許可を待ちます |
default、エイリアスは askForPermissions | 読み取りだけ | ファイルの編集、コマンドの実行、ネットワークへのアクセスにあたる操作のほとんどで、実行前に止まり、許可を待ちます。Claude Code の画面では Manual と呼ばれます |
dontAsk | 読み取りと、Claude Code の権限ルールであらかじめ許可したツール | 許可待ちで止まることはなく、それ以外の操作はそのまま拒否されます |
plan | 読み取りと、auto モードが使える場合に分類器が通したコマンド | ユーザーが計画を許可するまで、ファイルは変更されません。ファイルを変更する必要があるタスクには向きません |
各モードの完全な説明は、Claude Code の権限モードのドキュメントで確認してください。
mode: acceptEdits # ファイルの編集はそのまま実行し、それ以外のコマンドは実行前に許可を求めるCodex
Codex のタスクの mode は、2 通りの書き方のどちらかで書きます。mode 全体を 1 つの省略形にするか、カンマで区切った複数の キー=値 にするかです。2 つの書き方は混ぜられず、approve-for-me,search=true のような書き方は検証に失敗します。
2 つの省略形は、それぞれが権限設定一式を表します。
yolo: Codex は、どの操作でも許可を求めず、サンドボックスも使わず、リアルタイムの Web 検索を有効にします。あらゆるファイルの読み書き、ネットワークへのアクセス、あらゆるコマンドの実行ができるため、信頼できるタスクと、自分で管理できる環境でだけ使ってください。Codex 自身のオプション名であるdangerously-bypass-approvals-and-sandboxと書いても、同じ動作になります。approve-for-me(autoと書いてもかまいません): Codex は workspace-write サンドボックスの中で動作し、サンドボックスの外に出る必要があるときは、その都度許可を求めます。ただし、許可リクエストはまず Codex の自動レビューが判断するため、人を待って止まることはありません。リクエストが拒否された場合、エージェントは自分でやり方を調整して作業を続けます。無人実行ができるうえ、レビューの段階も 1 つ残ります。
キーと値で書く場合は、次の 5 つのキーを使えます。各キーを書けるのは 1 回までで、カンマの前後にはスペースを入れてもかまいません。書かなかったキーは Codex に渡されず、Codex 自身の設定で決まります。
| キー | 値 | 意味 |
|---|---|---|
ask-for-approval | on-request、never | on-request:いつ止まって許可を求めるかを、モデルが判断します。たとえば、サンドボックスの外に出る必要があるときです。never:許可を一切求めません。サンドボックスが許さない操作はその場で失敗し、タスクが人を待って止まることはありません |
sandbox | read-only、workspace-write、danger-full-access | read-only:コマンドは読み取りしかできません。workspace-write:どの場所も読み取れますが、書き込めるのはタスクのワークスペースだけで、デフォルトではネットワークにアクセスできません。danger-full-access:制限は一切ありません |
approvals_reviewer | user、auto_review | 許可リクエストを誰が判断するかを決めます。user はユーザー本人で、セッションは止まって応答を待ちます。auto_review は Codex の自動レビューで、人を待って止まることはありません。ask-for-approval=never の場合、Codex は許可リクエストを出さないため、このキーも効果を持ちません |
search | true、false | true:リアルタイムの Web 検索を有効にします。false:Web 検索ツールを無効にします。省略した場合は Codex 自身の設定に従い、Codex のデフォルトでは、キャッシュされた検索結果が使われます |
network_access | true、false | workspace-write サンドボックス内のコマンドに、ネットワークへのアクセスを許可するかどうかを決めます。省略した場合は Codex 自身の設定に従い、Codex のデフォルトでは許可されません |
5 つのキーは、自由に組み合わせられます。追加の条件があるのは network_access だけで、これを書く場合は、sandbox=workspace-write も必ず明記します。表にないキー名、表にない値、重複したキーは、いずれも cdg dag validate と cdg dag submit の段階でエラーになり、そのまま Codex に渡されることはありません。表に挙げているのは、現在のバージョンの Codex が受け付ける値です。Codex の以前の許可ポリシーである untrusted と、Codex ですでに非推奨になった on-failure は、どちらも含まれていません。これらを書くと、ask-for-approval must be on-request or never, received 'untrusted' のようなエラーになります。
# タスクのワークスペースへの書き込みだけを許可し、その外に出るときはモデルが許可を求める
mode: "ask-for-approval=on-request,sandbox=workspace-write"# 上の設定に加えて、コマンドのネットワークアクセスを許可する(依存関係のインストールやテスト用サービスへのアクセスなど)
mode: "ask-for-approval=on-request,sandbox=workspace-write,network_access=true"# 許可リクエストを Codex の自動レビューに任せる。ユーザーの応答を待って止まることはない
mode: "approvals_reviewer=auto_review,ask-for-approval=on-request,sandbox=workspace-write,network_access=true"# リアルタイムの Web 検索を有効にするが、コマンドのネットワークアクセスは許可しない
mode: "sandbox=workspace-write,search=true"# 許可を一切求めない:サンドボックス内でできる操作はそのまま実行し、できない操作はその場で失敗する。タスクが人を待って止まることはない
mode: "ask-for-approval=never,sandbox=workspace-write,network_access=true"許可とサンドボックスの詳しい動作は、Codex の設定のドキュメントで確認してください。
デフォルト値と優先順位
同じ設定項目は、複数の場所に書けます。cdg dag submit のオプション、タスクのフィールド、ワークフローのフィールド、プロジェクトのローカル設定 .codedag/local/settings.local.jsonc、共有設定 .codedag/settings.jsonc です。CodeDAG は投入時に、次の表の左から右の順に調べ、値が書かれている最初の設定元を使います。どこにも書かれていない場合は、最終的なデフォルト値を使います。
| 設定項目 | 優先順位(高い順) | 最終的なデフォルト値 |
|---|---|---|
| タスクのレビューポリシー | --task-auto-accepted → タスクの autoAccepted → ワークフローの taskAutoAccepted → ローカル設定 → 共有設定 | always |
| ワークフロー全体のレビューポリシー | --dag-auto-accepted → ワークフローの dagAutoAccepted → ローカル設定 → 共有設定 | done |
| 同時実行数の上限 | ワークフローの maxConcurrency → ローカル設定 → 共有設定 | 1 |
| タスクのエージェント | タスクの agent → プロジェクトのデフォルトのエージェント。設定の defaultAgent のことで、ローカル設定が共有設定より優先されます | codex。プロジェクトで Codex を使えない場合は claude |
タスクの mode、model、effort | タスクのフィールド → エージェント自身の設定 | エージェントの組み込みのデフォルト |
値は投入時に確定します。そのあとでファイルや設定を変更しても、すでに投入したその実行には影響しません。表の最後の行は例外です。タスクに mode、model、effort が書かれていない場合、CodeDAG は代わりに値を決めません。エージェントが、セッションを起動するたびに、その時点の自身の設定に従って決めます。そのため、投入後にエージェントの設定を変更すると、まだ起動していないタスクは新しい設定で動作します。その実行で特定の権限モードやモデルを固定して使いたい場合は、タスクに明記してください。
投入コマンドの 2 つのオプションは、その投入にだけ適用され、どのファイルも変更しません。使い方は、今回の投入に限ってレビュー設定を調整するを参照してください。ローカル設定と共有設定にそれぞれ何を書くか、自分にだけ適用するにはどうするかは、設定を書く場所を参照してください。自動マージでコンフリクトが起きたときにどのエージェントを使うかには、別のルールがあります。mergeConflictAgent を参照してください。
そのほかの設定例
次の 2 つのファイルは、どちらも完結したワークフローです。そのまま .codedag/dags/ に保存し、自分のプロジェクトに合わせてプロンプトを書き換えて使えます。
1 つ目のワークフローは、レプリカだけで実行され、常に main から始まります。そのため、同時にプライマリリポジトリで開発を続けられます。タスク 1 とタスク 2 は同時に実行され、それぞれレプリカを 1 つ占有するため、プロジェクトにはレプリカを 2 つ以上登録しておく必要があります。タスク 3 が始まる前に、CodeDAG は先の 2 つのタスクの結果を、タスク 3 のタスクブランチにマージします。
baseRef: main # main から始める。プライマリリポジトリが今どのブランチにあるかには左右されない
excludeWorkspaces: ["."] # プライマリリポジトリを使わず、ワークフローはレプリカだけで実行する
maxConcurrency: 2
tasks:
- id: 1
title: フロントエンドの依存関係をアップグレード
agent: codex
mode: yolo
prompt: |
web/ ディレクトリの依存関係を、現在のメジャーバージョン内の最新バージョンにアップグレードし、
web/ のすべてのテストを実行して、失敗したテストを修正してください。変更するのは web/ ディレクトリだけにしてください。
- id: 2
title: バックエンドの依存関係をアップグレード
agent: codex
mode: yolo
prompt: |
server/ ディレクトリの依存関係を、現在のメジャーバージョン内の最新バージョンにアップグレードし、
server/ のすべてのテストを実行して、失敗したテストを修正してください。変更するのは server/ ディレクトリだけにしてください。
- id: 3
title: アップグレード内容を記録
dependencies: [1, 2]
agent: codex
mode: yolo
prompt: |
今回のアップグレード前後の依存関係のバージョンを比較し、どの依存関係をアップグレードしたか、注意が必要な変更は何かを
docs/notes/deps-upgrade.md に書いてください。書くのはこのファイルだけです(すでにある場合はそのまま上書きします)。2 つ目のワークフローは、まず計画を書き、書き終えたところで止まって確認を待ちます。そのあと、2 つのタスクが API とページをそれぞれ実装します。2 つの実装タスクには固定のブランチ名を使っているので、あとで個別にプッシュしやすくなります。すべてのタスクが終わったあと、統合ブランチへのマージでコンフリクトが起きた場合は、Claude Code に解決を任せます。
mergeConflictAgent: # マージでコンフリクトが起きたら、Claude Code に解決を任せる
agent: claude
tasks:
- id: 1
title: 実装計画を書く
agent: codex
mode: yolo
autoAccepted: none # 計画を書き終えたら止まり、確認を待ってから実装を始める
prompt: |
docs/spec/search.md を読み、検索機能の実装計画を docs/plans/search.md に書いてください。
変更するモジュール、API の変更点、テストの要点を挙げてください。書くのは計画だけで、コードは変更しないでください。
- id: 2
title: 検索APIを実装
dependencies: [1]
agent: codex
mode: yolo
branchName: feature/search-api
prompt: |
docs/plans/search.md に沿って検索 API を実装し、対応するユニットテストを追加してください。
すべてのテストが通るまで実行してください。
- id: 3
title: 検索ページを実装
dependencies: [1]
agent: claude
mode: bypassPermissions
branchName: feature/search-ui
prompt: |
docs/plans/search.md に沿って検索ページを実装し、対応するコンポーネントテストを追加してください。
すべてのテストが通るまで実行してください。関連ページ
- ワークフローファイルを書く:最小構成からワークフローファイルを書き始め、投入前に検証します。
- エージェント、モデル、権限モードを選ぶ:タスクごとに、エージェント、モデル、アクセスレベルを選びます。
- プロジェクト設定:共有設定とローカル設定のフィールドと、そのデフォルト値。
- 検証と投入:
cdg dag validateとcdg dag submitの引数とオプション。
最終更新