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.string
required
Unique identifier within the workflow.
string
required
Display name shown in logs and UI.
string
default:"automatic"
automatic or manual.string[]
Upstream node IDs that must complete before this node runs. See Cyclic Dependencies.
object
{ type: manual } creates an approval gate. See Manual Triggers.object
Matrix configuration for parallel fan-out. See Matrix Strategy.
object
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.string
Branch name template for Campaign/cloud runs. The branch is created before the node’s steps run. If omitted, Codemod uses
codemod-<task.signature>.object
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.
string
required
Pull request title template.
string
Optional pull request body template.
boolean
default:"false"
Create the pull request as a draft.
string
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.
string
required
Step label.
string
Conditional expression to gate step execution. Current runtime support for generic step conditions includes
params.x, state.x, and matrix.x. See Variable Resolution.object
Step-level environment variables applied to the process environment.
object
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.
string
required
Commit message template.
string[]
Paths to stage before committing. If omitted, Codemod stages the entire working tree for that task branch.
boolean
default:"true"
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.string
required
Step label.
string
Conditional expression to gate step execution. Supports
params.x, state.x, and matrix value keys. Operators: ==, !=, >, <, &&, ||. See Variable Resolution.string
required
Path to the JS/TS file that implements the codemod.
string
Target language (e.g.,
typescript, tsx, javascript, jsx).string[]
Include glob patterns.
string[]
Exclude glob patterns.
string
Base path for resolving globs.
number
Maximum concurrent threads.
boolean
default:"false"
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.string
required
Step label.
string
Conditional expression to gate step execution. See Variable Resolution.
string
required
Prompt to send to the AI agent.
string
default:"gpt-4o"
Model identifier. Overrides
LLM_MODEL if set.string
System prompt to scope the AI agent’s behavior.
number
default:"30"
Maximum number of agent steps before stopping.
string
default:"openai"
LLM provider/protocol. Supported:
openai, anthropic, google_ai, azure_openai.string
LLM base URL. Defaults to the provider’s standard endpoint.
string
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.
The target package must expose an authored SKILL.md with valid frontmatter and the authored-package markers:
mcs-v1, that is the marker for the built-in Codemod core skill profile, not for authored package skills installed by this workflow step.
Install Skill Step Parameters:
string
required
Step label.
string
Conditional expression to gate step execution. See Variable Resolution.
string
required
Package identifier to install, for example
@codemod/jest-to-vitest.string
Optional authored skill source path inside the package. Defaults to the conventional
agents/skill/<skill-name>/SKILL.md layout.string
default:"auto"
Target harness adapter:
auto, claude, goose, opencode, cursor, or codex.string
default:"project"
Install scope:
project or user.boolean
default:"false"
Overwrite existing skill files if needed.
YAML ast-grep Step
Executes ast-grep using declarative YAML rules for simple, fast pattern matching.string
required
Step label.
string
Conditional expression to gate step execution. See Variable Resolution.
string
required
Path to the ast-grep configuration file (.yaml).
string[]
Include glob patterns.
string[]
Exclude glob patterns.
string
Base path for resolving globs.
number
Maximum concurrent threads.
Codemod Registry Step
Runs another codemod by package name or local path.string
required
Step label.
string
Conditional expression to gate step execution. See Variable Resolution.
string
required
Codemod source (registry package or local path). Supports version pinning:
@scope/pkg@1.2.3.string[]
CLI arguments passed to the codemod.
object
Environment variables used during execution.
string
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.string
required
Step label.
string
Conditional expression to gate step execution. See Variable Resolution.
string
required
Inline shell command to execute.
object
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.string
required
Step label.
object
required
Sharding method. Either
{ type: "directory" | "codeowner", max_files_per_shard: N } for built-in methods, or { function: "path/to/shard.ts" } for custom logic.string
default:"."
Root directory to scan for files. Defaults to the workflow run target.
string
required
State key to write shard results to.
object
JSSG codemod configuration for pre-filtering. Dry-runs the codemod and only shards files where the transform produces changes.
string
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
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
${{ 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
Cyclic Dependencies
Workflows cannot have circular dependencies:Templates
Templates define reusable step blocks (planned feature):Roadmap
Container runtime support
Support for
runtime: docker and other container runtimes.Nested matrix strategies
Matrix strategies within matrix strategies for complex fan-out.
Next Steps
Package Structure
Directory layout and codemod.yaml reference.
CLI Reference
Validate and run workflows from the command line.
JSSG Intro
Write JavaScript/TypeScript codemods.
Publishing
Share your codemod via the Registry.