Skip to main content
This reference documents the complete 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.
id
string
required
Unique identifier within the workflow.
name
string
required
Display name shown in logs and UI.
type
string
default:"automatic"
automatic or manual.
depends_on
string[]
Upstream node IDs that must complete before this node runs. See Cyclic Dependencies.
trigger
object
{ type: manual } creates an approval gate. See Manual Triggers.
strategy
object
Matrix configuration for parallel fan-out. See Matrix Strategy.
steps
array
required
Ordered list of steps to execute.
env
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.
branch_name
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>.
pull_request
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.
pull_request.title
string
required
Pull request title template.
pull_request.body
string
Optional pull request body template.
pull_request.draft
boolean
default:"false"
Create the pull request as a draft.
pull_request.base
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 support name, if, env, and commit.
name
string
required
Step label.
if
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.
env
object
Step-level environment variables applied to the process environment.
commit
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.
commit.message
string
required
Commit message template.
commit.add
string[]
Paths to stage before committing. If omitted, Codemod stages the entire working tree for that task branch.
commit.allow_empty
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.
JSSG Step Parameters:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. Supports params.x, state.x, and matrix value keys. Operators: ==, !=, >, <, &&, ||. See Variable Resolution.
js-ast-grep.js_file
string
required
Path to the JS/TS file that implements the codemod.
js-ast-grep.language
string
Target language (e.g., typescript, tsx, javascript, jsx).
js-ast-grep.include
string[]
Include glob patterns.
js-ast-grep.exclude
string[]
Exclude glob patterns.
js-ast-grep.base_path
string
Base path for resolving globs.
js-ast-grep.max_threads
number
Maximum concurrent threads.
js-ast-grep.dry_run
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.
AI Step Parameters:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. See Variable Resolution.
ai.prompt
string
required
Prompt to send to the AI agent.
ai.model
string
default:"gpt-4o"
Model identifier. Overrides LLM_MODEL if set.
ai.system_prompt
string
System prompt to scope the AI agent’s behavior.
ai.max_steps
number
default:"30"
Maximum number of agent steps before stopping.
ai.llm_protocol
string
default:"openai"
LLM provider/protocol. Supported: openai, anthropic, google_ai, azure_openai.
ai.endpoint
string
LLM base URL. Defaults to the provider’s standard endpoint.
ai.api_key
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.
In dry-run mode, this step is skipped. In non-interactive runs, it is also skipped by default unless the workflow is run with --install-skill. See CLI reference. The target package must expose an authored SKILL.md with valid frontmatter and the authored-package markers:
If you see 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:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. See Variable Resolution.
install-skill.package
string
required
Package identifier to install, for example @codemod/jest-to-vitest.
install-skill.path
string
Optional authored skill source path inside the package. Defaults to the conventional agents/skill/<skill-name>/SKILL.md layout.
install-skill.harness
string
default:"auto"
Target harness adapter: auto, claude, goose, opencode, cursor, or codex.
install-skill.scope
string
default:"project"
Install scope: project or user.
install-skill.force
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.
When to use YAML ast-grep vs JSSG
  • YAML ast-grep: Simple find/replace, no conditional logic, fastest to write
  • JSSG: Conditional logic, complex AST manipulations, cross-file coordination
YAML ast-grep Step Parameters:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. See Variable Resolution.
ast-grep.config_file
string
required
Path to the ast-grep configuration file (.yaml).
ast-grep.include
string[]
Include glob patterns.
ast-grep.exclude
string[]
Exclude glob patterns.
ast-grep.base_path
string
Base path for resolving globs.
ast-grep.max_threads
number
Maximum concurrent threads.

Codemod Registry Step

Runs another codemod by package name or local path.
Codemod Registry Step Parameters:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. See Variable Resolution.
codemod.source
string
required
Codemod source (registry package or local path). Supports version pinning: @scope/pkg@1.2.3.
codemod.args
string[]
CLI arguments passed to the codemod.
codemod.env
object
Environment variables used during execution.
codemod.working_dir
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.
Shell Command Step Parameters:
name
string
required
Step label.
if
string
Conditional expression to gate step execution. See Variable Resolution.
run
string
required
Inline shell command to execute.
env
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.
Shard Step Parameters:
name
string
required
Step label.
shard.method
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.
shard.target
string
default:"."
Root directory to scan for files. Defaults to the workflow run target.
shard.output_state
string
required
State key to write shard results to.
shard.js-ast-grep
object
JSSG codemod configuration for pre-filtering. Dry-runs the codemod and only shards files where the transform produces changes.
shard.file_pattern
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.
The 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:
In shell steps as environment variables:
Dynamic Matrix Task Recompilation: When the array referenced by from_state changes:
  1. New tasks are created for new items
  2. Tasks are marked WontDo if their item is removed
  3. Existing tasks remain untouched if their item persists
Matrix nodes have a master task that tracks all generated tasks.

Manual Triggers

Add approval gates to pause execution until manual intervention:
Resume paused tasks:

Shared State

State enables workflows to persist data across runs and coordinate work:
You can also use object map syntax:

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 via options.params:
In shell steps as PARAM_ prefixed environment variables:
In codemod steps forwarded with 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:
  • run
  • ai.prompt
  • branch_name
  • commit.message
  • pull_request.title
  • pull_request.body
Current variable availability:
In matrix tasks, each object key becomes an environment variable (e.g., $team, $shardId). Inside steps, matrix variables are unprefixed.
${{ 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.*
Current generic workflow if evaluation does not receive:
  • task.*
  • env.*
  • steps.<id>.outputs.*
Operators supported in if conditions: ==, !=, >, <, >=, <=, &&, ||

Task Statuses


Cyclic Dependencies

Workflows cannot have circular dependencies:
This produces an error:

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.