Thanks for improving the Netlify skills! This guide covers how to make changes and how releases work.
- Edit
skills/only — it's the source of truth for every output format. - Never edit
cursor/rules/orcodex/. They're auto-generated fromskills/by CI: on same-repo PRs and on every push tomain, the workflow rebuilds and commits them, so hand edits get overwritten. (Fork PRs can't be auto-committed — include the regenerated output, or leave it for a maintainer.) To preview the generated output locally:bash scripts/build-cursor-rules.shandbash scripts/build-codex-skills.sh. context/holds steering guides (e.g.POWER.md);.claude-plugin/,.grok-plugin/, and.mcp.jsonconfigure plugin distribution.
Each skill is a skills/<name>/SKILL.md with YAML frontmatter (name, description) and a markdown body. Keep skills factual and platform-focused — "how does this Netlify feature work?", not workflow or framework opinions. Keep SKILL.md under 500 lines and put deeper content in a references/ subdirectory.
Skill changes can be validated against representative agent scenarios with AXIS. From the repo root:
npx axis runAXIS runs locally only — it's non-deterministic and intentionally not part of CI. See axis-scenarios/README.md for how to run it, read reports, and write scenarios.
We use Conventional Commits. A CI check (lint-pr-title) enforces that every PR title is conventional. An optional scope is allowed, e.g. feat(netlify-database): add connection pooling guidance.
| Prefix | Use for | Release effect (while in 0.x) |
|---|---|---|
feat: |
A new skill or a new capability in a skill | minor (0.8 → 0.9) |
fix: |
Correcting wrong or broken guidance | patch (0.8.0 → 0.8.1) |
feat!: / BREAKING CHANGE: |
Removing/renaming a skill, or other breaking change | minor (stays sub-1.0) |
docs: |
Clarifying existing guidance (no behavior change) | none — appears in the changelog only |
chore: ci: test: refactor: |
Tooling, CI, evals, internal cleanup | none |
Heads-up on
docs:— for a skills repo, clarifying a skill is often the real work, butdocs:does not cut a release. If a change adds a capability, usefeat:; if it corrects something wrong, usefix:. Reservedocs:for pure clarifications you don't need a release for.
PRs currently merge as merge commits (not squashed), so release-please reads the feat:/fix: commits inside your branch to decide the version bump — the PR title is enforced for consistency and changelog readability. Make sure your branch has at least one conventional commit for the change to be released. (If the repo later switches to squash-merge, the enforced PR title becomes the single release-driving commit.)
Releases are automated with release-please — you never tag or write release notes by hand:
- Merges to
mainaccumulate in a standing "Release PR" that bumps the version and updatesCHANGELOG.md. - Merge that Release PR when you want to ship. It tags the release, updates
package.jsonandCHANGELOG.md, and publishes a GitHub Release.
We're on a 0.x line and will bump to 1.0.0 deliberately when the skill set is declared stable.