This document is the single source for how changes land in a generated skill repository and how a release is cut. It is written for a human or an agent maintaining the repository, and it explains both the steps and the GitHub features that enforce them.
Template repository releases use a separate process. See docs/TEMPLATE-RELEASING.md.
Generated skill release workflows live under .template/generated/.github/workflows/ until the bootstrap agent installs them during cleanup. After cleanup they live at .github/workflows/.
The main branch is protected, so no change reaches it by a direct push, including from an administrator. Every change goes through a pull request that passes checks and is then squash-merged.
The flow for any change:
- Create a branch from
main. - Make the change and run
npm run validatelocally. - Push the branch and open a pull request into
main. - Wait for the required
Validate skill packagecheck to pass. - Resolve any review conversations.
- Squash-merge the pull request.
Dependabot changes follow the same path. It opens pull requests for GitHub Actions and dependency updates, which must pass the check and be squash-merged.
A repository ruleset on the default branch enforces these rules. The hardening commands that create it are in .template/bootstrap/cleanup-and-boundaries.md.
- A pull request is required before merging, with conversation resolution required and stale approvals dismissed on push.
- The
Validate skill packagestatus check must pass, and the branch must be up to date withmainfirst. - Force pushes and branch deletion are blocked.
- Linear history is required, and the only allowed merge method is squash.
- The rules are enforced for administrators too.
Required approvals are set to zero so a solo maintainer is not blocked. Raise this to one and require CODEOWNERS review if a second maintainer becomes active.
Secret scanning and push protection are enabled, so a credential pushed by mistake is caught before it reaches the public repository. Dependabot alerts and security updates are enabled, alongside the version updates configured in .github/dependabot.yml.
.github/workflows/ci.yml runs on pull requests and on pushes to main. Its job, Validate skill package, runs npm run validate and a packaging smoke test. This job is the required status check, so a pull request cannot merge unless validation and packaging succeed.
A release is a version bump landed through a pull request, followed by a tag.
- On a branch, update
skills/<name>/SKILL.mdand the relevant runtime references, then update rootINSTALL.md,README.md, maintenance fixtures, and the affected files indocs/. - Set the new version in
package.jsonand in bothpackaging/*/plugin.json. - Add a
## [vX.Y.Z]section toCHANGELOG.md, move any entries from## [Unreleased]into it, and reset## [Unreleased]to note no unreleased changes. The release workflow requires this exact heading for the tag. - Add
docs/releases/vX.Y.Z.mdwith the release notes. The release workflow requires this file for the tag. - Run
gh skill publish --dry-runfrom a clean checkout before generated files exist, then runnpm run validateandnpm run package -- vX.Y.Z. Assets are written to ignoreddist/assets/. - Open the pull request, let the check pass, and squash-merge it into
main.
After the version bump is on main, push a vX.Y.Z tag. Pushing a tag is not a push to the main branch, so the branch ruleset does not block it. The tag triggers .github/workflows/release-draft.yml, which validates the skill, packages the assets, creates or updates a draft GitHub release from docs/releases/vX.Y.Z.md, and uploads the ZIP assets. It refuses to run if the matching ## [vX.Y.Z] section in CHANGELOG.md or the release-notes file is missing.
An active tag ruleset should prevent updates and deletion for public v* release tags. Correct a release with a new version because moving a published tag breaks installed source identity and artifact provenance.
The workflow leaves the release as a draft with three ZIPs, SHA256SUMS, and provenance attestations. Review it on GitHub and publish it manually.
Do not use gh skill publish --tag for a generated repository with this release workflow. That preview command can push the branch and create an immediately published release without the generated packages, checksums, attestations, curated notes, or draft review.
Publishing the draft triggers .github/workflows/gh-skill-install.yml, which installs the versionless public release in an ephemeral runner and verifies its source metadata and runtime content without executing the skill.
Use tags in vX.Y.Z format as the release source of truth. The version in package.json, both plugin manifests, the CHANGELOG.md heading, and the docs/releases/vX.Y.Z.md file must all match the tag.