Finish release
Wrap up a production release by updating tickets to Done in the configured PM tool and drafting a client-facing release email. Use when the user says "finish release", "close release", "release done", "post-release", "release deployed", or asks to prepare a release email or mark released tickets as done.From its SKILL.md
npx -y skills add vecten/sdlc-toolkit --skill finish-releaseAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 2 commands, including `git log <TARGET_BRANCH>..HEAD --oneline --no-decorate` and 1 more.
SKILL.md
5.2 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
Finish Release
Post-deployment workflow that runs after a release branch has been merged to production. Two goals:
- Move all included tickets to Done in the configured PM tool.
- Draft a client-facing release email (if enabled in config).
This skill reads pm_tool from config. Currently supported: linear.
Config dependency
Read <workspace>/.cursor/skills-config.yaml before acting. If missing, tell the user to run bootstrap-config first.
Required config keys:
repos— to detect current repo from CWDgit.branches.<repo>.release_target— target branch for this repolinear.ticket_prefix— for extracting ticket keys from commitsrelease_email.enabled— whether to draft a release emailrelease_email.greeting,release_email.sign_offrelease_email.custom_input— system names, subject pattern, recipients, tone
Prerequisites
- Current directory is a git repository.
- Remote is
origin. - PM tool MCP is available for ticket lookup and status updates.
- The release has already been merged to the target branch.
Inputs
Collect release context using these sources (in priority order):
- Same-thread context — if the
create-releaseskill ran earlier in this conversation, reuse the release branch name, PR URL, target branch, and ticket list. - User-provided PR URL or number — extract ticket IDs from the PR body and commits.
- User-provided release branch name — derive the info from git.
If none of these are available, ask the user for the release branch name or PR URL.
Branch rules
Read from config:
- Detect current repo from CWD by matching against
repos.<name>.path. - Look up
git.branches.<repo>.release_target. - Auto-detect from repo context; ask only if ambiguous.
Workflow
1) Determine release context
Set target branch from config. Gather the list of commits included:
git log <TARGET_BRANCH>..HEAD --oneline --no-decorate
Or, if the release is already merged and you have the PR number:
gh pr view <PR_NUMBER> --json body,mergeCommit,commits
Extract all ticket keys using linear.ticket_prefix from config (e.g., <PREFIX>-\d+).
2) Fetch ticket details from the PM tool
For each extracted ticket key:
- Call
get_issue(Linear) or the equivalent PM tool API with the ticket ID. - Collect: title, description, status, priority, assignee, labels, URL.
Store this data for both the status update step and the email composition step.
3) Update tickets to Done
For each ticket that is not already in a completed/done state:
- Call
list_issue_statusesfor the ticket's team (cache per team — call once per unique team). - Find the status named Done (or the closest completed-type status).
- Call
save_issuewithidandstateset to the Done status. - Track which tickets were updated and which were already done.
If no clear "Done" status exists for a team, report the available statuses instead of guessing.
4) Compose the release email (conditional)
Skip this step if release_email.enabled is false.
Build a release email focused on client-facing impact. Before writing, if any ticket's user impact is unclear from the ticket data alone, ask the user for clarification on those specific tickets.
Read release_email.custom_input for:
- System display names (e.g., which friendly name to use for this repo)
- Subject line pattern
- Recipients
- Tone preferences
- Whether to include internal changes
Email structure
Subject: <from custom_input subject_pattern, or "Release Update — <date>">
<release_email.greeting>
We've deployed the latest updates to <system name from custom_input>. Here's a summary of what's new:
## What's New
<For each change, write 1-2 sentences in plain, non-technical language
describing the user-visible impact. Group related changes together.
Focus on what the user can now do, what was fixed, or what improved.
Avoid technical jargon, code references, or internal ticket IDs.>
<release_email.sign_off>
Composition guidelines
- Write from the user's perspective. Instead of "Fixed null constraint on practice settings model", write "Practice settings are now preserved correctly when data is updated from external systems."
- Group related changes under a single bullet when they address the same feature area.
- If a change is purely internal (infra, refactoring, CI) with no user-facing impact, omit it unless
custom_inputsays to include internal changes.
5) Present the email to the user
Output the full email text for the user to review, copy, and send.
Ask if any adjustments are needed (tone, missing context, grouping).
Final output
When finished, report:
- Number of tickets updated to Done (and list them)
- Any tickets that were already Done or could not be updated (and why)
- The full email draft (if enabled)
- Any tickets where you lacked context and made assumptions
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most ship operate skills give in ~1.1k tokens
Counted across 1,077 of the 1,713 authors here whose files we hold, read 2026-09-06
- Create GitHub releasein 44 of 1077, across 43 files
- Run the test suitein 30 of 1077, across 25 files
- Create and push git tagin 27 of 1077, across 26 files
- Push commits and tagsin 27 of 1077
- Create annotated tagin 25 of 1077, across 22 files
- Ensure working tree is cleanin 24 of 1077
- Check for product marketing context firstin 23 of 1077, across 6 files
- Commit version bump changesin 22 of 1077, across 21 files
- Update CHANGELOG.mdin 21 of 1077, across 20 files
- Structure launch marketing across three channel typesin 20 of 1077, across 5 files
- Commit and tag the releasein 20 of 1077, across 18 files
- Update the CHANGELOG for new releasesin 19 of 1077
Said here and by no other author read
- Read the skills config file before acting
- Collect release context from the conversation or user input
- Detect the current repository from the working directory
- Gather the list of commits included in the release
- Extract all ticket keys using the configured prefix
- Fetch ticket details from the PM tool
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.