This runbook defines the supported release-facing behavior for the staged
rust-cli skill family.
The final publish stage uses this runbook for:
report_onlyreadiness summaries- repository-owned packaging reviews of generated package inputs
- local
dry_runreview - exact-mirror
rehearsal - the supported GitHub Actions
live_releasepath
- Source release branch:
main - Supported runtime: Node.js
22.xand npm10.x - semantic-release config:
.releaserc.json - Tracked release config:
release/skill-release.config.json - Destination path: repository root
- Publication mode:
exact_mirror
Published repository paths:
SKILL.mdREADME.mdconstitution.mdstages/instructions/templates/docs/release/skill-release-runbook.md.github/workflows/release.ymlrelease/skill-release.config.jsonscripts/release/.releaserc.jsonpackage.jsonpackage-lock.jsonCHANGELOG.md
Generated-skill boundary:
- generated skills may include package-local packaging-ready metadata or support fixtures when the selected capability or packaging path requires them
- repository-owned CI workflows, release scripts, semantic-release config, and destination publish automation stay in this source package and are not copied into generated skill outputs
- A clean release branch with Conventional Commit history.
- A current validation result for the latest substantive change.
- A configured destination repository in
release/skill-release.config.jsonor theSKILL_RELEASE_DESTINATION_REPOSITORYenvironment variable. - A destination write credential in
DESTINATION_REPOSITORY_TOKENfor real cross-repository publication.
SKILL_RELEASE_DESTINATION_REPOSITORY only selects where a successful release
is published. It does not bypass semantic-release: if semantic-release detects
no new releasable version, the destination publish step does not run. In
GitHub Actions, destination configuration is checked before semantic-release
starts so missing destination inputs fail before a release tag is created, and
the prepared publish tree is deployed through peaceiris/actions-gh-pages@v4.
- Install the local tooling surface:
npm install
- Confirm the formatting baseline:
npm run format:check
- Ensure husky installed
.husky/_duringnpm install.
Before any packaging-oriented mode, confirm which assets belong to which side of the boundary:
- generated package inputs:
- the generated skill root files and directories
- any package-local support fixtures or metadata required by the chosen path
- repository-owned packaging automation:
.github/workflows/release.ymlrelease/skill-release.config.jsonscripts/release/.releaserc.jsonpackage.json
Packaging review should talk about both surfaces without implying the repository-owned automation is copied into every generated skill package.
Use when the workflow has reached publish, but the user did not request a
release action.
- summarize readiness, blockers, and next actions
- point to
dry_run,rehearsal, andlive_releaseas explicit follow-ups - do not run release commands
Run:
GITHUB_TOKEN=<valid GitHub token> \
npm run release:dry-runExpected review points:
- semantic-release can distinguish release vs no-release outcomes
- an initial release is evaluated without a prior tag
CHANGELOG.md,package.json, andpackage-lock.jsonare prepared in-memory before publish.work/release/publish/is not pushed anywhere during the dry run
@semantic-release/github participates in the release pipeline, so local dry
runs require either GITHUB_TOKEN or GH_TOKEN to authenticate the repository
checks that happen before notes and release metadata are generated. A literal
placeholder such as github_pat_or_actions_token will fail those repository
auth checks until you replace it with a real token value.
You can rehearse the destination publish preparation step before using real credentials.
- Point the publish preparation step at any non-placeholder destination slug
or local path:
SKILL_RELEASE_DESTINATION_REPOSITORY=owner/repo \ node scripts/release/publish-skill-to-target-repo.mjs \ 0.0.0-local \ v0.0.0-local \ "$(git rev-parse HEAD)" - Inspect
.work/release/publish/and confirm:SKILL.md,README.md, andconstitution.mdexist at the publish rootstages/,instructions/, andtemplates/existdocs/release/skill-release-runbook.mdexists.github/workflows/release.ymlexistsrelease/skill-release.config.jsonexistsscripts/release/exists.releaserc.json,package.json,package-lock.json, andCHANGELOG.mdexist- stale files were removed because the publish tree is rebuilt as an exact mirror
.release-manifest.jsonexists at the root of.work/release/publish/- the manifest clearly distinguishes repository-owned packaging evidence from final distributable artifacts or generated package inputs
- Inspect
.work/release/last-publication-receipt.jsonand confirm it records the source version, source tag, destination repository, destination branch, and destination path that the workflow will hand to the gh-pages action
The supported real release path is GitHub Actions in
.github/workflows/release.yml.
- Push a releasable commit to
main, or useworkflow_dispatch. - The workflow installs tooling with
npm ci. node scripts/release/verify-release-config.mjschecks destination repository resolution and required credentials.npm run release:ciruns semantic-release.- semantic-release updates release metadata in the runner workspace, creates
the source Git tag and GitHub Release, and prepares
.work/release/publishplus.work/release/last-publication-receipt.json. node scripts/release/prepare-destination-commit-message.mjsbuilds the target-repository commit message with the version number as the title and the current version's changelog section as the body.peaceiris/actions-gh-pages@v4publishes the prepared single-skill tree to the repository root of the configured external repository.- The workflow ends after the destination repository publish; it does not create a matching destination tag or destination GitHub Release.
The GitHub Actions workflow is repository-owned packaging automation. It may package or verify generated package inputs, but it is not itself a generated skill output.
- Allowed planning scopes:
plan,spec,tasks - Planning scopes must not create a release.
docs,style,test,build,ci, andrevertcommits create patch releases unless blocked by a planning scope.chore(deps)creates a patch release.feat,fix, andperffollow semantic-release defaults unless blocked by a non-releasing scope such asplan,spec, ortasks.
- Pre-commit hook:
.husky/pre-commitRunsnpm run lint-stagedso only stagedmd,json,yml,yaml,cjs, andmjsfiles are formatted. - Commit-message hook:
.husky/commit-msgRunsnpx commitlint --edit "$1"and blocks non-conforming Conventional Commit messages.
Choose one of the following configuration patterns:
- Tracked config update:
Edit
release/skill-release.config.jsonand replaceREPLACE_WITH_OWNER/REPOwith the real destination repository slug. - Environment override:
Keep the tracked placeholder and set
SKILL_RELEASE_DESTINATION_REPOSITORYin GitHub Actions as a repository variable or secret. - Manual dispatch override:
Use the
workflow_dispatchinputdestination_repositoryfor a one-off release override without editing tracked config.
Destination resolution precedence in GitHub Actions is:
workflow_dispatch input destination_repository >
SKILL_RELEASE_DESTINATION_REPOSITORY repository variable >
SKILL_RELEASE_DESTINATION_REPOSITORY repository secret >
release/skill-release.config.json.
The tracked destination branch is main. If the destination repository uses a
different publication branch, update release/skill-release.config.json.
Required secrets and variables:
- Secret:
DESTINATION_REPOSITORY_TOKEN - Optional variable:
SKILL_RELEASE_DESTINATION_REPOSITORY - Optional secret:
SKILL_RELEASE_DESTINATION_REPOSITORY
- Missing destination credential:
Set
DESTINATION_REPOSITORY_TOKENand re-run the workflow. The gh-pages publish step uses this token as the external-repository credential. - Local dry-run authentication failed:
Replace placeholder
GITHUB_TOKENorGH_TOKENvalues with a real GitHub token that can authenticate the source repository, then re-runnpm run release:dry-run. - Placeholder destination repository:
Replace
REPLACE_WITH_OWNER/REPOinrelease/skill-release.config.jsonor defineSKILL_RELEASE_DESTINATION_REPOSITORY. - Missing runtime destination configuration:
Set the
workflow_dispatchinputdestination_repository, defineSKILL_RELEASE_DESTINATION_REPOSITORYas a repository variable or secret, or updaterelease/skill-release.config.json. The workflow fails in the preflight check before semantic-release creates a release tag. - No release-worthy commits:
Confirm commit scope and type, then use a releasable commit such as
docs: refresh release runbook. - semantic-release reported
Found 0 commits since last releaseorThere are no relevant changes, so no new version is released: This is a no-release outcome, sopublish-skill-to-target-repo.mjsis skipped and nothing is pushed to the destination repository.
The first-release rehearsal should fit inside 15 minutes:
npm install- Configure the destination repository or variable
- Run
npm run format:check - Run
GITHUB_TOKEN=<valid GitHub token> npm run release:dry-run - Rehearse
scripts/release/publish-skill-to-target-repo.mjsand inspect.work/release/publish/plus.work/release/last-publication-receipt.json - Confirm the destination publish tree contains the staged workflow assets and
.release-manifest.jsonas a reviewable metadata surface