workflow.yaml specification for Codemod Workflows.
Complete Example
This example demonstrates all five step types working together in a migration workflow:workflow.yaml
Workflow Structure
A workflow has four top-level keys:workflow.yaml
Nodes
Nodes are execution units in your workflow. They can be automatic or manual, depend on other nodes, and may define strategy (matrix), trigger, runtime, env, and an ordered list of steps.Unique identifier within the workflow.
Display name shown in logs and UI.
automatic or manual.Upstream node IDs that must complete before this node runs. See Cyclic Dependencies.
{ type: manual } creates an approval gate. See Manual Triggers.Matrix configuration for parallel fan-out. See Matrix Strategy.
Environment variables for all steps in this node.
Git Automation (Campaign/Cloud Runs)
In Campaign/cloud runs, each task executes on its own git branch. Codemod creates that branch before the node’s steps run, can create commits after successful steps, and pushes the branch plus opens a pull request when the node ends with commits.These git automation fields are only used in Campaign/cloud runs. Local
codemod workflow run execution does not create branches, commits, or pull requests automatically.Branch name template for Campaign/cloud runs. The branch is created before the node’s steps run. If omitted, Codemod uses
codemod-<task.signature>.Pull request customization for Campaign/cloud runs. If the node ends with commits, Codemod pushes the task branch and attempts to create a pull request. This field customizes the PR metadata; omitting it does not disable PR creation.
Pull request title template.
Optional pull request body template.
Create the pull request as a draft.
Base branch to merge into. If omitted, Codemod auto-detects the remote default branch.
Default Campaign/cloud behavior:If the node ends with commits and
pull_request is omitted, Codemod attempts to open a pull request using the node name as the default title. If no explicit commit checkpoint was created and changes remain at the end of the node, Codemod attempts a fallback commit using the node name before pushing and opening the pull request.Steps
Steps are atomic actions inside a node. They run sequentially and each step performs one transformation or action.Common Step Fields
All step types supportname, if, env, and commit.
Step label.
Conditional expression to gate step execution. Current runtime support for generic step conditions includes
params.x, state.x, and matrix.x. See Variable Resolution.Step-level environment variables applied to the process environment.
Optional commit checkpoint for Campaign/cloud runs. After a successful step, Codemod stages the configured paths and creates a git commit. If no step creates a commit but changes remain at the end of the node, Codemod attempts to create a fallback commit using the node name before pushing and opening the pull request.
Commit message template.
Paths to stage before committing. If omitted, Codemod stages the entire working tree for that task branch.
If
true, skip the checkpoint when nothing is staged. If false, the step fails when there are no staged changes to commit.Commit checkpoints are Campaign/cloud-only. They run after successful steps on the task branch created for the node.
JSSG Step
Executes a JavaScript/TypeScript codemod using ast-grep for pattern matching and AST manipulation.Step label.
Conditional expression to gate step execution. Supports
params.x, state.x, and matrix value keys. Operators: ==, !=, >, <, &&, ||. See Variable Resolution.Path to the JS/TS file that implements the codemod.
Target language (e.g.,
typescript, tsx, javascript, jsx).Include glob patterns.
Exclude glob patterns.
Base path for resolving globs.
Maximum concurrent threads.
Perform a dry run without applying changes.
JSSG Documentation
Learn how to write JavaScript/TypeScript codemods.
AI Step
Calls an AI agent with a prompt for LLM-powered transformations.Step label.
Conditional expression to gate step execution. See Variable Resolution.
Prompt to send to the AI agent.
Model identifier. Overrides
LLM_MODEL if set.System prompt to scope the AI agent’s behavior.
Maximum number of agent steps before stopping.
LLM provider/protocol. Supported:
openai, anthropic, google_ai, azure_openai.LLM base URL. Defaults to the provider’s standard endpoint.
API key for LLM access.
Environment variables for AI steps
Install Skill Step
Installs package skill behavior into a supported harness via the Codemod CLI. Use this in skill-only or workflow + skill packages when you want authored skill files from the package to be installable for coding-agent workflows.--install-skill. See CLI reference.
Install Skill Step Parameters:
Step label.
Conditional expression to gate step execution. See Variable Resolution.
Package identifier to install, for example
@codemod/jest-to-vitest.Optional authored skill source path inside the package. Defaults to the conventional
agents/skill/<skill-name>/SKILL.md layout.Target harness adapter:
auto, claude, goose, opencode, cursor, or codex.Install scope:
project or user.Overwrite existing skill files if needed.
YAML ast-grep Step
Executes ast-grep using declarative YAML rules for simple, fast pattern matching.Step label.
Conditional expression to gate step execution. See Variable Resolution.
Path to the ast-grep configuration file (.yaml).
Include glob patterns.
Exclude glob patterns.
Base path for resolving globs.
Maximum concurrent threads.
Codemod Registry Step
Runs another codemod by package name or local path.Step label.
Conditional expression to gate step execution. See Variable Resolution.
Codemod source (registry package or local path). Supports version pinning:
@scope/pkg@1.2.3.CLI arguments passed to the codemod.
Environment variables used during execution.
Working directory for execution.
You can aggregate multiple codemods by adding multiple
codemod steps in the same node. Steps run sequentially from top to bottom.Shell Command Step
Runs shell commands on the host for setup, cleanup, or external tools.Step label.
Conditional expression to gate step execution. See Variable Resolution.
Inline shell command to execute.
Step-level environment variables applied to the process environment.
Shard Step
Evaluates file shards and writes results to workflow state for use with matrix strategies. Supports built-in grouping algorithms (directory, codeowner) and custom shard functions.Step label.
Sharding method. Either
{ type: "directory" | "codeowner", max_files_per_shard: N } for built-in methods, or { function: "path/to/shard.ts" } for custom logic.Root directory to scan for files. Defaults to the workflow run target.
State key to write shard results to.
JSSG codemod configuration for pre-filtering. Dry-runs the codemod and only shards files where the transform produces changes.
Glob pattern for eligible files (used when
js-ast-grep is not set).Sharding Guide
Full guide covering built-in methods, custom functions, re-evaluation, and examples.
Matrix Strategy
Matrix strategies fan out a node into multiple parallel tasks. Use them to shard work by team, directory, or configuration.from_state field references an array in your workflow’s state schema. Each array item spawns a parallel task.
Accessing Matrix Values:
In JSSG transforms via options.matrixValues:
from_state changes:
- New tasks are created for new items
- Tasks are marked
WontDoif their item is removed - Existing tasks remain untouched if their item persists
Manual Triggers
Add approval gates to pause execution until manual intervention:Shared State
State enables workflows to persist data across runs and coordinate work:State Updates
| Syntax | Meaning | Example |
|---|---|---|
KEY=VAL | Set state key to value | count=10 |
KEY@=VAL | Append value to array | shards@={"team":"core","shardId":"1"} |
| Dot notation | Set nested fields | config.retries=5 |
| JSON values | Use valid JSON | user={"name":"Alice","id":123} |
State updates must be valid JSON if not primitive. Updates are applied only if the task exits successfully.
Parameters
Parameters make workflows configurable and reusable:Accessing Parameters
In JSSG transforms viaoptions.params:
PARAM_ prefixed environment variables:
env_ prefix:
Advanced Parameter Usage
Complete parameter patterns and examples in JSSG.
Variable Resolution
Workflow expressions are evaluated in a few different runtime contexts today. The available variables are not identical across all of them.Template interpolation
${{ ... }} interpolation is used in:
runai.promptbranch_namecommit.messagepull_request.titlepull_request.body
| Syntax | Available today |
|---|---|
${{ params.x }} | Available in all of the interpolation sites above |
${{ state.x }} | Available in run, ai.prompt, and commit.message, but not in branch_name or pull_request.title/body |
${{ matrix.x }} | Available in all of the interpolation sites above |
${{ task.id }} | Available only in branch_name, commit.message, and pull_request.title/body during Campaign/cloud runs |
${{ task.signature }} | Available only in the same Campaign/cloud git automation fields; default branch names use this value |
${{ env.x }} and generic steps.<id>.outputs.* interpolation are not wired into workflow runtime expression resolution.if Conditions
Current generic workflow if evaluation receives:
params.*state.*matrix.*
if evaluation does not receive:
task.*env.*steps.<id>.outputs.*
if conditions: ==, !=, >, <, >=, <=, &&, ||
Task Statuses
| Status | Description |
|---|---|
Pending | Queued; waiting for runner |
Running | Currently executing |
Completed | Succeeded; diff applied |
Failed | Script exited non-zero; diff discarded |
AwaitingTrigger | Waiting for manual approval |
Blocked | Dependencies not finished |
WontDo | Matrix item removed; task skipped |
Cyclic Dependencies
Workflows cannot have circular dependencies:Templates
Templates define reusable step blocks (planned feature):Roadmap
Next Steps
Package Structure
Directory layout and codemod.yaml reference.
CLI Reference
Validate and run workflows from the command line.
JSSG Quickstart
Write JavaScript/TypeScript codemods.
Publishing
Share your codemod via the Registry.