Directory Layout
Scaffold a new package with:my-codemod-package
codemod.yaml
workflow.yaml
scripts
codemod.ts
rules
config.yml
tests
basic-transform
input.tsx
expected.tsx
| File/Folder | Purpose |
|---|---|
codemod.yaml | Package metadata (name, version, author, etc.) |
workflow.yaml | Workflow definition with nodes and steps |
scripts/ | JavaScript/TypeScript codemods (JSSG) |
rules/ | YAML ast-grep rule definitions |
tests/ | Test fixtures with input.*/expected.* pairs or input/ + expected/ directory snapshots |
The
scripts/ and rules/ folders are conventional, not required—use any paths you prefer as long as you reference them correctly in workflow.yaml.Package Behavior
Codemod packages use a workflow-first model and can be:- Workflow-only:
workflow.yamlhas executable steps and noinstall-skillsteps. - Skill-only:
workflow.yamlhasinstall-skillsteps and no executable steps, with authored skill files underagents/skill/<skill-name>/. - Workflow + skill:
workflow.yamlhas both executable andinstall-skillsteps, with authored skill files underagents/skill/<skill-name>/.
codemod init(default) scaffolds workflow-only packages.codemod init --skillscaffolds skill-only packages.codemod init --with-skillscaffolds workflow + skill packages.--skilland--with-skillare mutually exclusive.--skilland--project-typeare mutually exclusive.codemod publishsupports workflow-only, skill-only, and workflow + skill packages by validating workflow behavior and skill layout.codemod workflow validate -w <package-root>validates package behavior:- workflow-only: workflow checks
- skill-only: skill structure/frontmatter/reference checks
- workflow + skill: both workflow and skill checks
npx codemod <package-id> and accept the skill-install prompt.
Package Metadata (codemod.yaml)
Thecodemod.yaml file defines your package’s metadata and configuration.
codemod.yaml
workflow: "workflow.yaml" and define install-skill steps in that workflow; authored skill content lives under agents/skill/<skill-name>/.
Available fields:
Codemod workflow schema version.
Codemod package name (unique within scope).Naming rules:
/^[a-z0-9-_/]+$/ (lowercase letters, numbers, hyphens, underscores, and / for scope separation only)Not allowed: uppercase letters, dots, commas, spaces, or other special charactersValid examples:-
remove-console-logs @scope/remove-console-logs(using@organization-or-project-scope/nameprovides better discoverability in the Codemod Registry)
Semantic version of the package.
Brief description of what the codemod does.
Author name and email, e.g.,
Jane Doe <jane@example.com>.License identifier (SPDX), e.g.,
MIT.Relative path to your workflow file (required for workflow-only, skill-only, and workflow + skill packages).
Category for the codemod.
Languages targeted by this codemod (selected language during
codemod init; editable later).Keyword tags are an optional feature helping developers quickly identify the purpose, scope, and relevance of a codemod. They also enable better search, filtering, and reporting when managing many codemods across frameworks and projects.Example:
1. Transformation Type TagsConsider these categories when describing why the codemod exists:
2. Target Version TagsUse these to indicate the framework/library version the codemod prepares for.
3. Framework / Library / SDK TagsAlways add the ecosystem name to improve discoverability.
4. Example Tag SetsHere are some examples to illustrate how tags combine:
keywords: ["react", "v18-to-v19", "migration"]Best practices and conventions
Best practices and conventions
- Keep tags concise (1–2 words).
- Use lowercase for consistency.
- Don’t overload with tags — 2–4 per codemod is ideal.
- Prioritize transformation type + framework/library + version (if relevant).
1. Transformation Type TagsConsider these categories when describing why the codemod exists:
upgrade– helps upgrade code to newer versions (encompasses both breaking changes and feature adoption). You may also consider adding one of the following tags:breaking-change– adapts code to framework/library breaking API changes.feature-adoption– helps adoption of new optional or incremental features.
security– addresses known vulnerabilities or unsafe patterns.cross-migration– replaces one library/framework with another.i18n– internationalization migrations or improvements.a11y– accessibility improvements and compliance.standardization– unifies patterns, conventions, or APIs across a codebase.code-mining– identifies, flags, or extracts patterns without transforming. Use if codemod is for detection-only.
breaking-change and feature-adoption in the same codemod.2. Target Version TagsUse these to indicate the framework/library version the codemod prepares for.
- Format:
vXorvX-to-vY(for upgrades). - Examples:
v17-to-v18(React 17 → 18)v5-to-v6(React Router 5 → 6)v16(Angular 16 breaking changes)
3. Framework / Library / SDK TagsAlways add the ecosystem name to improve discoverability.
- Examples:
reactnextjsnodejsangularmswi18next
4. Example Tag SetsHere are some examples to illustrate how tags combine:
- React Root API Upgrade (17 → 18)
- Tags:
upgrade,breaking-change,v17-to-v18,react
- Tags:
- Adopt React Hooks
- Tags:
upgrade,feature-adoption,react
- Tags:
- Migrate from Moment.js to Day.js
- Tags:
cross-migration,momentjs,dayjs
- Tags:
- Remove Hardcoded Strings for i18n
- Tags:
i18n,i18next
- Tags:
- Add ARIA labels for accessibility
- Tags:
a11y,react
- Tags:
- Detect Insecure crypto API usage
- Tags:
security,nodejs,crypto
- Tags:
Access controls who can run/use the codemod (once they can see it).
- public: Anyone can run the codemod.
- private: Only the owner can run the codemod.
- pro: Only Pro plan users can run the codemod.
Visibility controls who can see the package in the Registry (search, listings, and UI).
- public: Everyone can see the package in the Registry.
- private: Only the owner can see the package.
- org: Members of the package’s organization scope can see the package.
- user: Visible only to the publishing user (user-scoped visibility).
During scaffolding, the CLI sets
public/private based on —private. You can change to any supported value above when publishing.Array of capabilities required by this codemod for accessing sensitive operations.Available capabilities:
fs- File system access (fs,fs/promises)fetch- Network requests (globalfetch)child_process- Process spawning (child_process)