- release-changelog: Step 0 checks for existing changelog file before generating. Asks reviewer to keep/regenerate/update. Never overwrites silently. Clarifies this skill never triggers version bumps. - release: Step 0 idempotency table covering all steps. Tag check before npm publish prevents double-release. Task search before creation prevents duplicate follow-up tasks. Supports iterating on changelogs pre-publish. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
264 lines
8.2 KiB
Markdown
264 lines
8.2 KiB
Markdown
---
|
|
name: release
|
|
description: >
|
|
Coordinate a full Paperclip release across engineering, website publishing,
|
|
and social announcement. Use when CTO/CEO requests "do a release" or
|
|
"release vX.Y.Z". Runs pre-flight checks, generates changelog via
|
|
release-changelog, executes npm release, creates cross-project follow-up
|
|
tasks, and posts a release wrap-up.
|
|
---
|
|
|
|
# Release Coordination Skill
|
|
|
|
Run the full Paperclip release process as an organizational workflow, not just
|
|
an npm publish.
|
|
|
|
This skill coordinates:
|
|
- App release execution (`scripts/release.sh`)
|
|
- User-facing changelog generation (`release-changelog` skill)
|
|
- Website publishing task creation
|
|
- CMO announcement task creation
|
|
- Final release summary with links
|
|
|
|
---
|
|
|
|
## Trigger
|
|
|
|
Use this skill when leadership asks for:
|
|
- "do a release"
|
|
- "release {patch|minor|major}"
|
|
- "release vX.Y.Z"
|
|
|
|
---
|
|
|
|
## Preconditions
|
|
|
|
Before proceeding, verify all of the following:
|
|
|
|
1. `skills/release-changelog/SKILL.md` exists and is usable.
|
|
2. The `release-changelog` dependency work is complete/reviewed before running this flow.
|
|
3. App repo working tree is clean.
|
|
4. There are commits since the last release tag.
|
|
5. You have release permissions (`npm whoami` succeeds for real publish).
|
|
6. If running via Paperclip, you have issue context for posting status updates.
|
|
|
|
If any precondition fails, stop and report the blocker.
|
|
|
|
---
|
|
|
|
## Inputs
|
|
|
|
Collect these inputs up front:
|
|
|
|
- Release request source issue (if in Paperclip)
|
|
- Requested bump (`patch|minor|major`) or explicit version (`vX.Y.Z`)
|
|
- Whether this run is dry-run or live publish
|
|
- Company/project context for follow-up issue creation
|
|
|
|
---
|
|
|
|
## Step 0 — Idempotency Guards
|
|
|
|
Each step in this skill is designed to be safely re-runnable. Before executing
|
|
any step, check whether it has already been completed:
|
|
|
|
| Step | How to Check | If Already Done |
|
|
|---|---|---|
|
|
| Changelog | `releases/v{version}.md` exists | Read it, ask reviewer to confirm or update. Do NOT regenerate without asking. |
|
|
| npm publish | `git tag v{version}` exists | Skip `release.sh` entirely. A tag means the version is already published. **Never re-run release.sh for an existing tag** — it will fail or create a duplicate. |
|
|
| Website task | Search Paperclip issues for "Publish release notes for v{version}" | Skip creation. Link the existing task. |
|
|
| CMO task | Search Paperclip issues for "release announcement tweet for v{version}" | Skip creation. Link the existing task. |
|
|
|
|
**The golden rule:** If a git tag `v{version}` already exists, the npm release
|
|
has already happened. Only post-publish tasks (website, CMO, wrap-up) should
|
|
proceed. Never attempt to re-publish.
|
|
|
|
**Iterating on changelogs:** You can re-run this skill with an existing changelog
|
|
to refine it _before_ the npm publish step. The `release-changelog` skill has
|
|
its own idempotency check and will ask the reviewer what to do with an existing
|
|
file. This is the expected workflow for iterating on release notes.
|
|
|
|
---
|
|
|
|
## Step 1 - Pre-flight and Version Decision
|
|
|
|
Run pre-flight in the App repo root:
|
|
|
|
```bash
|
|
LAST_TAG=$(git tag --sort=-version:refname | head -1)
|
|
git diff --quiet && git diff --cached --quiet
|
|
git log "${LAST_TAG}..HEAD" --oneline --no-merges | head -50
|
|
```
|
|
|
|
Then detect minimum required bump:
|
|
|
|
```bash
|
|
# migrations
|
|
git diff --name-only "${LAST_TAG}..HEAD" -- packages/db/src/migrations/
|
|
|
|
# schema deltas
|
|
git diff "${LAST_TAG}..HEAD" -- packages/db/src/schema/
|
|
|
|
# breaking commit conventions
|
|
git log "${LAST_TAG}..HEAD" --format="%s" | rg -n 'BREAKING CHANGE|BREAKING:|^[a-z]+!:' || true
|
|
```
|
|
|
|
Bump policy:
|
|
- Destructive migration/API removal/major changeset/breaking commit -> `major`
|
|
- Additive migrations or clear new features -> at least `minor`
|
|
- Fixes-only -> `patch`
|
|
|
|
If requested bump is lower than required minimum, escalate bump and explain why.
|
|
|
|
---
|
|
|
|
## Step 2 - Generate Changelog Draft
|
|
|
|
First, check if `releases/v{version}.md` already exists. If it does, the
|
|
`release-changelog` skill will detect this and ask the reviewer whether to keep,
|
|
regenerate, or update it. **Do not silently overwrite an existing changelog.**
|
|
|
|
Invoke the `release-changelog` skill and produce:
|
|
- `releases/v{version}.md`
|
|
- Sections ordered as: Breaking Changes (if any), Highlights, Improvements, Fixes, Upgrade Guide (if any)
|
|
|
|
Required behavior:
|
|
- Present the draft for human review.
|
|
- Flag ambiguous categorization items.
|
|
- Flag bump mismatches before publish.
|
|
- Do not publish until reviewer confirms.
|
|
|
|
---
|
|
|
|
## Step 3 - Run App Release
|
|
|
|
**Idempotency check:** Before running `release.sh`, verify the tag doesn't
|
|
already exist:
|
|
|
|
```bash
|
|
git tag -l "v{version}"
|
|
```
|
|
|
|
If the tag exists, this version has already been published. **Do not re-run
|
|
`release.sh`.** Skip to Step 4 (follow-up tasks). Log that the publish was
|
|
already completed and capture the existing tag metadata.
|
|
|
|
If the tag does NOT exist, proceed with the release:
|
|
|
|
```bash
|
|
# dry run
|
|
./scripts/release.sh {patch|minor|major} --dry-run
|
|
|
|
# live release (only after dry-run review)
|
|
./scripts/release.sh {patch|minor|major}
|
|
```
|
|
|
|
Then capture final release metadata:
|
|
|
|
```bash
|
|
NEW_TAG=$(git tag --sort=-version:refname | head -1) # e.g. v0.4.0
|
|
NEW_VERSION=${NEW_TAG#v}
|
|
NPM_URL="https://www.npmjs.com/package/@paperclipai/cli/v/${NEW_VERSION}"
|
|
```
|
|
|
|
If publish fails, stop immediately, keep issue in progress/blocked, and include
|
|
failure logs in the update.
|
|
|
|
---
|
|
|
|
## Step 4 - Create Cross-Project Follow-up Tasks
|
|
|
|
**Idempotency check:** Before creating tasks, search for existing ones:
|
|
|
|
```
|
|
GET /api/companies/{companyId}/issues?q=release+notes+v{version}
|
|
GET /api/companies/{companyId}/issues?q=announcement+tweet+v{version}
|
|
```
|
|
|
|
If matching tasks already exist (check title contains the version), skip
|
|
creation and link the existing tasks instead. Do not create duplicates.
|
|
|
|
Create at least two tasks in Paperclip (only if they don't already exist):
|
|
|
|
1. Website task: publish changelog for `v{version}`
|
|
2. CMO task: draft announcement tweet for `v{version}`
|
|
|
|
When creating tasks:
|
|
- Set `parentId` to the release issue id.
|
|
- Carry over `goalId` from the parent issue when present.
|
|
- Include `billingCode` for cross-team work when required by company policy.
|
|
- Mark website task `high` priority if release has breaking changes.
|
|
|
|
Suggested payloads:
|
|
|
|
```json
|
|
POST /api/companies/{companyId}/issues
|
|
{
|
|
"projectId": "{websiteProjectId}",
|
|
"parentId": "{releaseIssueId}",
|
|
"goalId": "{goalId-or-null}",
|
|
"billingCode": "{billingCode-or-null}",
|
|
"title": "Publish release notes for v{version}",
|
|
"priority": "medium",
|
|
"status": "todo",
|
|
"description": "Publish /changelog entry for v{version}. Include full markdown from releases/v{version}.md and prominent upgrade guide if breaking changes exist."
|
|
}
|
|
```
|
|
|
|
```json
|
|
POST /api/companies/{companyId}/issues
|
|
{
|
|
"projectId": "{workspaceProjectId}",
|
|
"parentId": "{releaseIssueId}",
|
|
"goalId": "{goalId-or-null}",
|
|
"billingCode": "{billingCode-or-null}",
|
|
"title": "Draft release announcement tweet for v{version}",
|
|
"priority": "medium",
|
|
"status": "todo",
|
|
"description": "Draft launch tweet with top 1-2 highlights, version number, and changelog URL. If breaking changes exist, include an explicit upgrade-guide callout."
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Step 5 - Wrap Up the Release Issue
|
|
|
|
Post a concise markdown update linking:
|
|
- Release issue
|
|
- Changelog file (`releases/v{version}.md`)
|
|
- npm package URL
|
|
- Website task
|
|
- CMO task
|
|
- Final changelog URL (once website publishes)
|
|
- Tweet URL (once published)
|
|
|
|
Completion rules:
|
|
- Keep issue `in_progress` until website + social tasks are done.
|
|
- Mark `done` only when all required artifacts are published and linked.
|
|
- If waiting on another team, keep open with clear owner and next action.
|
|
|
|
---
|
|
|
|
## Paperclip API Notes (When Running in Agent Context)
|
|
|
|
Use:
|
|
- `GET /api/companies/{companyId}/projects` to resolve website/workspace project IDs.
|
|
- `POST /api/companies/{companyId}/issues` to create follow-up tasks.
|
|
- `PATCH /api/issues/{issueId}` with comments for release progress.
|
|
|
|
For issue-modifying calls, include:
|
|
- `Authorization: Bearer $PAPERCLIP_API_KEY`
|
|
- `X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID`
|
|
|
|
---
|
|
|
|
## Failure Handling
|
|
|
|
If blocked, update the release issue explicitly with:
|
|
- what failed
|
|
- exact blocker
|
|
- who must act next
|
|
- whether any release artifacts were partially published
|
|
|
|
Never silently fail mid-release.
|