Skip to content
Back to skills

Launch

ASecurity

Generate release artifacts — version bump, changelog, release tags

  • 7 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 26, 2026
developmentgobashgitapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add jhlee0409/all-for-claudecode --skill launch --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Launch?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Launch
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jhlee0409-launch/badge)](https://www.skillsdirectory.com/skills/jhlee0409-launch)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: afc:launch
description: "Generate release artifacts — version bump, changelog, release tags"
argument-hint: "[version tag or 'auto']"
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Glob
  - Grep
model: sonnet
---

# /afc:launch — Generate Release Artifacts

> Generates release artifacts (CHANGELOG entry, README updates, GitHub Release notes) from git history and optional spec context.
> This is a **standalone utility** — not part of the auto pipeline.
> Works with or without a prior afc pipeline run.

## Arguments

- `$ARGUMENTS` — (optional) One of:
  - Version tag: e.g. `"v2.2.1"` — uses this as the release version
  - `"auto"` — auto-detects version from package.json/Cargo.toml/pyproject.toml
  - Not specified: prompts for version

## Git Context (auto-loaded)

!`git describe --tags --abbrev=0 2>/dev/null || echo "[NO_TAGS]"`
!`git log $(git describe --tags --abbrev=0 2>/dev/null || echo "")..HEAD --pretty=format:"%h %s" --no-merges 2>/dev/null || git log --pretty=format:"%h %s" --no-merges`

## Execution Steps

### 1. Detect Project Context

1. **Version detection**:
   - If `$ARGUMENTS` is a version string (matches `v?\d+\.\d+\.\d+`): use it
   - If `$ARGUMENTS` = `"auto"`: read version from package.json → Cargo.toml → pyproject.toml → setup.py (first found)
   - If not specified: check package.json etc. for current version, present to user, confirm or override

2. **Previous version detection**:
   ```bash
   git describe --tags --abbrev=0 2>/dev/null || echo "none"
   ```
   - If a previous tag exists: diff range = `{previous_tag}..HEAD`
   - If no tags: diff range = all commits (warn user: "No previous release tag found. Including all history.")

3. **Changelog detection**:
   - Check for existing: `CHANGELOG.md` → `CHANGES.md` → `HISTORY.md`
   - If found: will prepend new entry
   - If not found: will create `CHANGELOG.md`

### 2. Gather Change Context

Collect all available context for high-quality release notes:

1. **Git history** (required):
   ```bash
   git log {previous_tag}..HEAD --pretty=format:"%h %s" --no-merges
   ```

2. **Changed files summary** (required):
   ```bash
   git diff --stat {previous_tag}..HEAD
   ```

3. **Spec context** (optional — enhances quality):
   - Glob `.claude/afc/specs/*/spec.md` — if any exist, read Overview and User Stories sections
   - This provides **intent context** that raw commit messages lack
   - If no specs found: rely on git history only (still produces good output)

4. **Review context** (optional):
   - Glob `.claude/afc/memory/reviews/*` — if any exist from this version cycle, note key findings
   - Skip if not found

5. **Breaking change detection**:
   - Grep commit messages for: `BREAKING`, `breaking change`, `!:` (conventional commits)
   - Grep diffs for: deleted public exports, renamed public APIs, changed function signatures
   - Flag any findings as breaking changes in the output

### 3. Generate CHANGELOG Entry

Prepend a new entry to the changelog file:

1. **Duplicate check**: Grep the changelog for `## [{version}]`. If an entry for this version already exists:
   - Ask user: "CHANGELOG already has an entry for {version}. (1) Overwrite (2) Abort"
   - If overwrite: replace the existing entry (from `## [{version}]` to the next `## [` line)
   - If abort: skip CHANGELOG generation

2. Follow the existing format if one exists; otherwise use [Keep a Changelog](https://keepachangelog.com/) format:

```markdown
## [{version}] - {YYYY-MM-DD}

### Added
- {new features, described from user perspective}

### Changed
- {modifications to existing functionality}

### Fixed
- {bug fixes}

### Removed
- {removed features or deprecated items}

### Breaking Changes
- {if any — empty section omitted}
```

**Quality rules**:
- Write from **user perspective**, not developer perspective ("Add dark mode support" not "Add ThemeProvider component")
- Group related changes into single entries (don't list every file)
- If spec context is available: use feature names from specs, not commit message fragments
- Omit empty sections (if no fixes, don't include "### Fixed")

### 4. Update README (conditional)

Only update README if meaningful changes warrant it:

1. **Check triggers**:
   - New CLI commands or API endpoints added?
   - Installation process changed?
   - New dependencies or requirements?
   - Feature that users need to know about?

2. **If no triggers match**: skip README update entirely (print: "README: no updates needed")

3. **If triggers match**: read current README, identify the relevant section, apply minimal targeted edit
   - Do NOT rewrite the entire README
   - Do NOT add badges, shields, or decorative elements
   - Only update sections directly affected by changes

### 5. Generate GitHub Release Notes

Create `.claude/afc/release-notes.md` (draft for `gh release create`):

```markdown
# {version}

{2-3 sentence summary of this release — what's the headline?}

## Highlights

- {top 1-3 user-facing changes, expanded with context}

## What's Changed

{CHANGELOG entry content, reformatted for GitHub}

## Breaking Changes

{if any — clear migration instructions}

**Full Changelog**: {previous_tag}...{version}
```

### 6. Present Summary and Next Steps

```
Release artifacts generated: {version}
├─ CHANGELOG.md: entry prepended ({N} items across {M} categories)
├─ README.md: {updated section / no updates needed}
├─ .claude/afc/release-notes.md: draft created
├─ Breaking changes: {count or "none"}
├─ Commits included: {N} (since {previous_tag})
└─ Specs referenced: {N or "none (git-only mode)"}

Next steps:
  git add CHANGELOG.md README.md
  git commit -m "docs: prepare release {version}"
  git tag {version}
  gh release create {version} --notes-file .claude/afc/release-notes.md
```

**Do NOT execute these commands automatically.** Present them for the user to review and run.

## Notes

- **Not part of the auto pipeline**. Launch is a standalone utility invoked when you're ready to release, not after every feature.
- **Non-destructive**: only creates/edits CHANGELOG and README (conditionally). Does not push, tag, or create releases automatically.
- **Git history is the source of truth**. Spec context enhances quality but is never required.
- **Conventional Commits awareness**: if the project uses conventional commits (`feat:`, `fix:`, `chore:`), the generated CHANGELOG respects those categories.
- **Idempotent**: running launch twice with the same version overwrites the release-notes.md draft and re-generates the CHANGELOG entry (warns before overwriting).
- **No scope for `clean`**: release-notes.md in `.claude/afc/` is a draft file. The user decides whether to keep or delete it after the release.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.