SuperPlane CLI Canvas Workflow
Use this workflow to build or debug canvases from the CLI.
Discover what exists
Run these first:
superplane index integrations
superplane integrations list
superplane index triggers
superplane index components
Narrow to one integration:
superplane index triggers --from github
superplane index components --from github
superplane index components --from semaphore
Use superplane integrations list to list organization-connected integration instances (not just available providers).
Inspect required config fields and example payloads:
superplane index integrations --name github
superplane index triggers --name github.onPush
superplane index components --name semaphore.runWorkflow
superplane index components --name github.runWorkflow
superplane index components --name approval
List runtime options for integration-resource fields:
superplane integrations list-resources --id <integration-id> --type <type> --parameters key1=value1,key2=value2
Use superplane integrations list first to find valid integration IDs.
Build canvas incrementally
Create a blank canvas first:
superplane canvases create <name>
superplane canvases get <name>
Edit a canvas file and update via:
superplane canvases update --file <canvas-file.yaml>
Use this resource header:
apiVersion: v1
kind: Canvas
metadata:
id: <canvas-id>
name: <canvas-name>
spec:
nodes: []
edges: []
Canvas YAML structure
Use this as the canonical shape when editing a canvas file.
Top-level fields:
apiVersion: alwaysv1kind: alwaysCanvasmetadata.id: canvas UUID (required for update)metadata.name: canvas namespec.nodes: list of trigger/component nodesspec.edges: list of directed graph connections
Node structure:
- Common fields:
id,name,type,configuration,position,paused,isCollapsed - Keep node
namevalues unique within a canvas. Duplicate names can produce warnings and make expressions/diagnostics ambiguous. typemust beTYPE_TRIGGERorTYPE_COMPONENT- Trigger nodes must include
trigger.name - Component nodes must include
component.name - Integration-backed nodes should include
integration.id(integration.namecan be empty string) errorMessageandwarningMessageare optional but useful for troubleshootingmetadatais optional and usually server-populated
Edge structure:
sourceId: upstream node idtargetId: downstream node idchannel: output channel from source node (default,passed,approved, etc.)
Minimal example:
apiVersion: v1
kind: Canvas
metadata:
id: <canvas-id>
name: <canvas-name>
spec:
nodes:
- id: trigger-main
name: github.onPush
type: TYPE_TRIGGER
trigger:
name: github.onPush
integration:
id: <github-integration-id>
name: ""
configuration:
repository: owner/repo
refs:
- type: equals
value: refs/heads/main
position:
x: 120
y: 100
paused: false
isCollapsed: false
- id: component-ci
name: semaphore.runWorkflow
type: TYPE_COMPONENT
component:
name: semaphore.runWorkflow
integration:
id: <semaphore-integration-id>
name: ""
configuration:
project: <project-id-or-name>
pipelineFile: .semaphore/semaphore.yml
ref: refs/heads/main
position:
x: 480
y: 100
paused: false
isCollapsed: false
edges:
- sourceId: trigger-main
targetId: component-ci
channel: default
Node and edge wiring rules
Use TYPE_TRIGGER for trigger nodes and TYPE_COMPONENT for component nodes.
For triggers, set:
trigger.nameto the trigger id (example:github.onPush)
For components, set:
component.nameto the component id (example:semaphore.runWorkflow)
For graph flow, set edges:
sourceIdandtargetIdfor connectionchannelwhen routing specific outputs (example:passed,approved)
Typical gated flow:
- Trigger -> CI component
- CI
passed->approval approvalapproved-> deploy component
Configure integration-backed fields correctly
When a field type is integration-resource (such as repository or project), the org must have a configured integration instance for that provider.
Symptoms of missing binding:
- Node
errorMessagecontainsintegration is required
How to resolve:
- Run
superplane integrations listand confirm required providers are connected for the org. - Use
superplane integrations get <integration-id>to inspect one connected integration when needed. - Ensure the provider integration (GitHub, Semaphore, etc.) is installed and authenticated for the organization.
- Reopen the node config and select valid provider resources for required fields.
- Use
superplane integrations list-resources --id <integration-id> --type <type> --parameters ...to inspect valid option IDs/names. - Re-run
superplane canvases get <name>and confirm node errors are cleared.
Troubleshooting checklist
Run this after every update:
superplane canvases get <name>
Check:
- All required
configurationfields are present. - Edges use the correct output channels.
- No node
errorMessageremains. - No node
warningMessageindicates duplicate names (for example:Multiple components named "semaphore.runWorkflow"). - Expressions reference existing node names.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.