# Release

> Pushes to master (directly or via PR) to trigger automated tag creation and GitHub Release. Supports both direct-master and feature-branch PR workflows.

- Skill: `kostiantyn-matsebora/release` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add kostiantyn-matsebora/release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kostiantyn-matsebora/release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: kostiantyn-matsebora (https://skillmd.com/u/kostiantyn-matsebora)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kostiantyn-matsebora/release

---


> **Runtime required.** This skill uses Canopy tree notation; canopy-runtime must be active.
>
> **Detect canopy-runtime** — present if either:
> - `canopy-runtime/SKILL.md` exists under `.claude/skills/`, `.github/skills/`, or `.agents/skills/`, OR
> - a canopy-runtime marker block exists in `CLAUDE.md` or `.github/copilot-instructions.md`.
>
> **If neither is present** — install canopy-runtime first (see the `compatibility` field for the source and install options), then re-invoke this skill.
>
> Do not interpret the `## Tree` without canopy-runtime active.

## Tree

* release
  * Read `package.json` to get `current_version`
  * Run `git branch --show-current` to get `current_branch`
  * Read `commands/release.sh` for `Get Latest Release` >> latest_release_version
  * Run `git status --porcelain` >> status_output
  * IF << status_output is non-empty
    * Report: Uncommitted changes detected. Commit or stash them first, then re-run `/release`.
    * END
  * IF << current_version equals latest_release_version
    * Report: Version `current_version` is already the latest GitHub release. Run `/bump-version` to increment the version, then re-run `/release`.
    * END
  * IF << current_branch equals "master"
    * SHOW_PLAN >> current_version | latest_release_version | action
    * ASK << Push master to trigger release? | Yes | No
    * Run `git push origin master`
    * VERIFY_EXPECTED << verify/release-expected.md
    * Report: Summary / Version / Next step: CI creates tag and publishes GitHub Release
  * ELSE
    * Read `commands/release.sh` for `Check Existing PR` >> existing_pr
    * IF << existing_pr found
      * Report: A PR already exists for branch `current_branch`: `<pr_url>`. Push the branch to update it or merge the existing PR.
      * END
    * SHOW_PLAN >> current_version | latest_release_version | current_branch | action
    * ASK << Push branch and open PR to master? | Yes | No
    * Run `git push origin <current_branch>`
    * Read `commands/release.sh` for `Create PR` >> pr_url
    * VERIFY_EXPECTED << verify/release-expected.md
    * Report: Summary / Version / PR URL / Next step: merge the PR to trigger the release

## Rules

- Always read `package.json` before comparing versions — never assume the current version from context
- Always run `gh release view` to get the live GitHub release — never assume the latest release version
- Do not push or create PR if ASK returns "No"
- Do not create a PR if one already exists for the current branch targeting master
- Do not use `--follow-tags` in either path — no local tag exists; CI creates the tag on push to master
- Always check for uncommitted changes before pushing — a dirty working tree means work would be excluded from the release

## Response: Summary / Version / Next step

