superplane-canvas-builder について
superplane-canvas-builderは、ワークフロー要件をSuperPlaneのcanvas YAMLに変換するスキルです。CLIでインテグレーション、トリガー、アクション、スキーマ、リソース値を確認してから、キャンバスを作成・更新する手順を示します。
主な機能
- 01要件からキャンバス YAML を作成
- 02CLIによるトリガーとアクションの検索
- 03インテグレーションとリソース値の検証
- 04グラフ接続とノード配置の指針
- 05式とペイロードの確認
活用シーン
- 01ワークフロー仕様からキャンバスを作成
- 02YAML生成前のインテグレーション確認
- 03実行ペイロードに基づく式の検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ superplanehq/ skills --skill superplane-canvas-builderインストール後、Claude Code で/superplane-canvas-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/components-and-triggers.mddaytona.mdgithub.mdsentry.md詳細
SuperPlane Canvas Builder
ワークフロー要件を SuperPlane キャンバス YAML に変換します。
クイックリファレンス
| タスク | コマンド |
|---|---|
| アクションを一覧表示 | superplane index actions |
| インテグレーションのアクションを一覧表示 | superplane index actions --from <integration> |
| アクションの詳細を表示 | superplane index actions --name <name> |
| トリガーを一覧表示 | superplane index triggers --from <integration> |
| 初期 YAML を生成 | superplane canvases init |
| キャンバスを作成 | superplane canvases create --file canvas.yaml |
| キャンバスを更新 | superplane canvases update <name-or-id> --draft -f canvas.yaml |
操作の順序
必ず次の順序で進めてください。CLI を主な手段として使用してください。CLI では、ドキュメントでは確実に代替できない正確な名前、ID、スキーマを確認できます。
1. CLI と接続を確認する
command -v superplane
パスが出力されない場合は、そこで停止してください。CLI を https://docs.superplane.com/installation/cli からインストールして、タスクを再実行するようユーザーに伝えてください。ユーザーに代わってインストールしようとしてはいけません。ドキュメントに基づく設計へ暗黙に切り替えてはいけません。
次に、現在のセッションを確認します。
superplane whoami
認証、DNS、タイムアウト、接続の問題が原因で whoami が失敗した場合、CLI はインストールされていますが、セッションはまだ使用できません。必要に応じて、接続、コンテキストの修正、またはネットワークアクセスの許可をユーザーに依頼してください。CLI セッションが正常に動作するまでは続行しないでください。
まだ接続されていない場合:
superplane connect <URL> <TOKEN>
superplane whoami
接続情報を確認できない場合は、そこで停止し、接続するか、必要な URL とトークンを提供するようユーザーに依頼してください。CLI セッションが正常に動作するまでは続行しないでください。
1b. 変更をドラフトとして適用する
この環境では常にバージョン管理が有効です。モードの検出は行わず、すべての superplane canvases update コマンドで --draft を使用してください。
superplane canvases update <name-or-id> --draft --file canvas.yaml
2. ワークフローを把握する
検出コマンドを実行する前に、ワークフローに必要なものを特定します。
- 何が開始のきっかけになりますか? → トリガー(スケジュール、Webhook、GitHub のプッシュ、手動)
- どのようなステップがありますか? → 各ステップはアクションノードです
- 判断が必要ですか? → 分岐には If または Filter アクションを使用します
- 待機が必要ですか? → Approval、Time Gate、Wait アクションを使用します
- どの外部システムを使用しますか? → それぞれがプロバイダーに対応します(例:GitHub、Slack、Daytona)
この分析から必要なプロバイダーの一覧を作成してください。次のステップで確認します。
3. インテグレーションを検出して確認する
superplane integrations list を実行して、組織内で接続されているすべてのインテグレーションを取得します。ステップ 2 で特定した必要なプロバイダーと照合してください。
必要なプロバイダーが接続されていない場合: YAML を作成する前に停止し、ユーザーに伝えてください。例:
このキャンバスには GitHub と Daytona のインテグレーションが必要です。組織では GitHub は接続されていますが、Daytona は接続されていません。続行する前に、SuperPlane UI(設定 → インテグレーション)で接続してください。
組織が接続していないプロバイダーを参照する YAML を生成してはいけません。該当するすべてのノードで「integration is required」エラーが発生します。
すべてのプロバイダーの接続を確認したら、正確な名前とスキーマを検出します。
superplane integrations list # connected instances → real integration IDs
superplane index triggers --from <provider> # exact trigger names
superplane index actions --from <provider> # exact action names
必要な設定フィールド、出力チャネル、ペイロードの形状を確認します。
superplane index triggers --name github.onPush --output json
superplane index actions --name semaphore.runWorkflow --output json
integration-resource フィールドの実行時オプションを一覧表示します。
superplane integrations list-resources --id <id> --type <type>
YAML の作成・適用前に必ず確認すること: 設定するすべての integration-resource フィールド値(例:repository、snapshot、sandbox、project)について、そのインテグレーションの list-resources 出力に正確な値が存在することを確認してください。存在しない場合は停止し、使用する有効な値をユーザーに確認してください。
スキーマの優先ルール: プロバイダーの参考例と、CLI のスキーマ出力(superplane index ... --output json)または現在の list-resources の値が矛盾する場合は、CLI の出力に従ってください。参考資料は補助情報であり、CLI が信頼できる情報源です。
4. アクションを選択してグラフを接続する
ステップ 3 のトリガー名とアクション名を正確に使用してください。ドキュメントから推測してはいけません。
- トリガーが組み込みのフィルタリング(コンテンツフィルター、アクションフィルター、ref フィルター)に対応している場合は、トリガーのレベルで設定します。トリガーのネイティブ設定では表現できないロジックが必要な場合にのみ、個別の Filter または If ノードを追加してください。
- 各アクションには、少なくとも 1 つの入力エッジが必要です。
- トリガーには入力エッジがありません。
- 分岐には名前付きチャネルを使用します(If →
true/false、Approval →approved/rejected)。 - Filter は、式が true の場合にのみ
defaultに出力します。false イベントは何も通知せずに停止します。 - 並列分岐を合流させるには Merge を使用します。
全リストについては、コンポーネントとトリガーのリファレンスを参照してください。
5. ノードを配置する
各ノードには position: { x, y } が必要です。ノードのサイズは幅 515px × 高さ 215pxです。重なりを防ぐため、次の間隔ルールを使用してください。
| 方向 | 増分 | 理由 |
|---|---|---|
| 水平方向(x) | 列ごとに +600px | 幅 515px + 間隔 85px |
| 垂直方向(y) | 行ごとに +300px | 高さ 215px + 間隔 85px |
最初のノード(トリガー)は { x: 120, y: 100 } に配置します。
線形パイプライン — y は同じにして、x を増やします。
Trigger: { x: 120, y: 100 } → Step A: { x: 720, y: 100 } → Step B: { x: 1320, y: 100 }
分岐 — 分岐は同じ x 列に配置し、y 方向に広げます。分岐元のノードは、分岐に対して垂直方向の中央に配置します。
┌─ Branch A: { x: 1320, y: 100 }
Source: { x: 720, y: 250 } ───┤
└─ Branch B: { x: 1320, y: 400 }
ファンイン(Merge) — 分岐の次の x 列に配置し、y は分岐間の中央にします。
Branch A: { x: 1320, y: 100 } ──┐
├── Merge: { x: 1920, y: 250 }
Branch B: { x: 1320, y: 400 } ──┘
3 つ以上の分岐がある場合は、分岐ごとに y を 300 ずつ増やし、分岐元と Merge の位置をそれに応じて中央に調整します。
6. 式を設定する
式を書く前に必ず確認してください。 確認していないペイロードフィールドを参照する式を書いてはいけません。トリガー名やアクション名からフィールドパスを推測しないでください。
エンベロープ
各ノードの出力は、{ data: {...}, timestamp, type } というエンベロープでラップされます。次の 3 つのアクセスパターンはすべてこのエンベロープを返すため、実際のペイロードにアクセスするには、常に .data. が必要です。
| パターン | 説明 |
|---|---|
$['Node Name'].data.field | 名前を指定して、上流にある任意のノードの出力にアクセスします |
root().data.field | 実行を開始したルートイベントにアクセスします |
previous().data.field | 直前の上流ノードの出力にアクセスします |
よくある間違い:
$['Create Sandbox'].data.idではなく、$['Create Sandbox'].idと書いてしまうことです。必ず.data.を含めてください。
重要 — サンプルペイロードはすでにエンベロープを表しています。
superplane index triggers --name <trigger>が出力する(また、このスキルのリファレンスファイルに示されている)サンプルペイロードは、外側の{ data: {...}, timestamp, type }を含む完全なエンベロープです。root().dataは最上位のdataオブジェクトを返します。その上に.dataをさらに追加しないでください。正しい式を作るには、サンプル JSON 内のdataキーを直接数えます。たどる必要のあるネストしたdataキーごとに.dataを 1 つ使い、それ以上は追加しません。ネストした
dataキー。 一部の Webhook(特に Sentry)では、ペイロード本体に独自のdataフィールドが含まれています。そのため、正しいパスには.dataが2 つ含まれます。root().data.data.issue.titleが正しく、3 つではありません。root().dataですでにエンベロープを展開しており、2 つ目の.dataは Webhook 独自のdataフィールドをたどります。root().data.data.data.…と書いている場合は、エンベロープを重複して数えています。
設定フィールドの式には、二重波括弧 {{ }} を使用します。
{{ $['GitHub onPush'].data.ref }}
ペイロードのフィールドを確認する方法
次の情報源を順に確認し、利用可能な最初のものを使用してください。
-
既存の実行 — 過去の実行から実際のペイロードを確認します(最も信頼性が高い方法です)。
superplane executions list --canvas-id <id> --node-id <nid> -o yaml -
このスキル内のプロバイダーのリファレンスファイル — 使用するプロバイダーの
references/ディレクトリを確認してください。ここにはペイロードの例と既知の注意点が記載されています。 -
SuperPlane のドキュメント — LLM 向けドキュメントからプロバイダーのアクションページを取得してください。
- コンパクトなインデックス:https://docs.superplane.com/llms.txt
- 全コンテンツ:https://docs.superplane.com/llms-full.txt
最初の実行が成功したら、必ず情報源 1 に戻って、式を確認し、必要に応じて修正してください。トリガー名とペイロードの構造は一対一で対応するとは限らないため、トリガーがどのウェブフックイベントに対応するのか、必ずプロバイダーのリファレンスファイルまたはドキュメントで確認してください。
6b. コマンドノードのベストプラクティス
アクションでシェルコマンド(例:daytona.executeCommand、ssh)を実行する場合:
- シェル文字列内で
cdやexportを使うのではなく、アクション固有のworkingDirectory/envVars設定を使用してください。これにより、引用符の処理が簡単になり、障害の発生しやすさを軽減できます。 - 詳細な出力はファイルにリダイレクトし、簡潔なステータスマーカー(例:
STEP_OK/STEP_FAILED)を標準出力に出力してください。標準出力が大きい場合やバイナリの場合、ノードの処理で問題が発生することがあります。 - シェル実行モデル、堅牢化されたコマンドテンプレート、およびその連携に固有の既知の障害パターンについては、プロバイダーのリファレンスファイル(
references/ディレクトリ)を確認してください。 - 複数のステップからなる長いスクリプトでは、
bash -lcで空白や改行の解析に関する問題を避けるため、折りたたみ形式の 1 行文字列ではなく YAML のブロックスカラー(command: |-)を使用してください。 - リリース前に手動でトリガーを 1 回実行し、実行 YAML 内のノードの
outputsを確認して、想定するチャネルへのルーティング(successとfailed)がエッジの配線と一致することを確認してください。
7. 適用
最初から作成する場合は、スターター YAML を生成します。
superplane canvases init --output-file canvas.yaml
# or start from a template:
superplane canvases init --template health-check-monitor --output-file canvas.yaml
次に、ファイルからキャンバスを作成するか、既存のキャンバスを更新します。
superplane canvases create --file canvas.yaml
# or update an existing canvas:
superplane canvases update <name-or-id> --draft --file canvas.yaml
YAML から新しいキャンバスを作成する場合、create --file はファイル内のグラフをすでに適用します。
superplane canvases create --file canvas.yaml
ワークフローのルール:
superplane canvases create --file canvas.yamlは、仕様に準拠したリソース形式の Canvas YAML(apiVersion、kind、metadata、spec)を受け付けます。- 作成後に
superplane canvases update ...を実行するのは、metadata.idを含む後続のファイルや、create のデフォルトとは異なる明示的な自動レイアウトフラグなど、追加の変更を意図的に適用する場合に限ってください。 - この環境では、すべての
superplane canvases update ...コマンドに--draftを含めてください。
その後、確認します。
superplane canvases get <name>
いずれかのノードに errorMessage または warningMessage がないか確認してください。
8. 完了の定義(キャンバスの作成)
キャンバスを「準備完了」とする前に、次のすべてを確認してください。
superplane integrations listでインテグレーション ID が解決されている- すべての
integration-resource値がsuperplane integrations list-resourcesで確認されている - 意図した YAML ペイロードからキャンバスが作成されている
superplane canvases get <name> -o yamlですべてのノードのerrorMessageとwarningMessageが空になっている- 少なくとも 1 回の実際のトリガー実行を確認し、重要な分岐ノードのチャネルレベルの
outputsも確認している
よくあるパターン
直線:トリガー → A → B → C
nodes:
- { id: trigger, ..., position: { x: 120, y: 100 } }
- { id: a, ..., position: { x: 720, y: 100 } }
- { id: b, ..., position: { x: 1320, y: 100 } }
- { id: c, ..., position: { x: 1920, y: 100 } }
edges:
- { sourceId: trigger, targetId: a, channel: default }
- { sourceId: a, targetId: b, channel: default }
- { sourceId: b, targetId: c, channel: default }
分岐:If → true / false
nodes:
- { id: trigger, ..., position: { x: 120, y: 250 } }
- { id: check, ..., action: { name: if }, position: { x: 720, y: 250 } }
- { id: on-true, ..., position: { x: 1320, y: 100 } }
- { id: on-false, ..., position: { x: 1320, y: 400 } }
edges:
- { sourceId: trigger, targetId: check, channel: default }
- { sourceId: check, targetId: on-true, channel: true }
- { sourceId: check, targetId: on-false, channel: false }
ゲート:Filter(通過または停止)
Filter は true の場合にのみ default に出力します。false のイベントは停止するため、エッジは不要です。
nodes:
- { id: trigger, ..., position: { x: 120, y: 100 } }
- { id: filter, ..., action: { name: filter }, position: { x: 720, y: 100 } }
- { id: next-step, ..., position: { x: 1320, y: 100 } }
edges:
- { sourceId: trigger, targetId: filter, channel: default }
- { sourceId: filter, targetId: next-step, channel: default }
ファンアウト/ファンイン
nodes:
- { id: trigger, ..., position: { x: 120, y: 250 } }
- { id: a, ..., position: { x: 720, y: 100 } }
- { id: b, ..., position: { x: 720, y: 400 } }
- { id: merge, ..., position: { x: 1320, y: 250 } }
- { id: final, ..., position: { x: 1920, y: 250 } }
edges:
- { sourceId: trigger, targetId: a, channel: default }
- { sourceId: trigger, targetId: b, channel: default }
- { sourceId: a, targetId: merge, channel: default }
- { sourceId: b, targetId: merge, channel: default }
- { sourceId: merge, targetId: final, channel: default }
承認ゲート
nodes:
- { id: ci-done, ..., position: { x: 120, y: 100 } }
- { id: timegate, ..., position: { x: 720, y: 100 } }
- { id: approval, ..., position: { x: 1320, y: 100 } }
- { id: deploy, ..., position: { x: 1920, y: 100 } }
edges:
- { sourceId: ci-done, targetId: timegate, channel: default }
- { sourceId: timegate, targetId: approval, channel: default }
- { sourceId: approval, targetId: deploy, channel: approved }
他のスキルを使用する場合
| 必要な内容 | 使用するスキル |
|---|---|
| CLI コマンドと認証 | superplane-cli |
| 失敗した実行のデバッグ | superplane-monitor |
ドキュメント
URL を取得できるエージェント向けに、SuperPlane の全ドキュメントを LLM 向け形式で利用できます。
- コンパクトなインデックス:https://docs.superplane.com/llms.txt
- 全コンテンツ:https://docs.superplane.com/llms-full.txt
参考資料
- アクションとトリガー — 組み込みのアクションとトリガーの種類
- GitHub — トリガー、アクション、ペイロードの例、注意点
- Daytona — アクション、ペイロードの例、注意点
- Sentry — トリガー、ペイロードの例、入れ子になった
data.dataの注意点