phrazzld

changelog-setup

2
1
# Install this skill:
npx skills add phrazzld/claude-config --skill "changelog-setup"

Install specific skill from multi-skill repository

# Description

|

# SKILL.md


name: changelog-setup
description: |
Full changelog infrastructure from scratch. Greenfield workflow.
Installs semantic-release, commitlint, GitHub Actions, LLM synthesis, public page.


Changelog Setup

Complete changelog and release notes infrastructure for a project that doesn't have one.

When to Use

Project has no release infrastructure. Starting fresh.

Workflow

This workflow installs components in sequence:

1. Assess (confirm greenfield)

Run changelog-assess to confirm this is actually greenfield. If partial infrastructure exists, consider audit/reconcile instead.

2. Install Dependencies

pnpm add -D semantic-release \
  @semantic-release/changelog \
  @semantic-release/git \
  @semantic-release/github \
  @commitlint/cli \
  @commitlint/config-conventional

3. Configure semantic-release

Create .releaserc.js:

// See references/semantic-release-config.md for full config
module.exports = {
  branches: ['main', 'master'],
  plugins: [
    '@semantic-release/commit-analyzer',
    '@semantic-release/release-notes-generator',
    ['@semantic-release/changelog', {
      changelogFile: 'CHANGELOG.md',
    }],
    '@semantic-release/npm', // or remove if not publishing to npm
    ['@semantic-release/git', {
      assets: ['CHANGELOG.md', 'package.json'],
      message: 'chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}',
    }],
    '@semantic-release/github',
  ],
};

4. Configure commitlint

Create commitlint.config.js:

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor',
      'perf', 'test', 'build', 'ci', 'chore', 'revert'
    ]],
    'subject-case': [2, 'always', 'lower-case'],
    'header-max-length': [2, 'always', 100],
  },
};

5. Add Lefthook Hook

Update lefthook.yml (create if doesn't exist):

commit-msg:
  commands:
    commitlint:
      run: pnpm commitlint --edit {1}

Run pnpm lefthook install to activate.

6. Create GitHub Actions Workflow

Create .github/workflows/release.yml:

# See references/github-actions-release.md for full workflow
name: Release

on:
  push:
    branches: [main, master]

permissions:
  contents: write
  issues: write
  pull-requests: write

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          persist-credentials: false

      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: 'pnpm'

      - run: pnpm install --frozen-lockfile
      - run: pnpm build

      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: pnpm semantic-release

  synthesize-notes:
    needs: release
    if: needs.release.outputs.new_release_published == 'true'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Synthesize Release Notes
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        run: |
          # See references/llm-synthesis.md for script
          node scripts/synthesize-release-notes.mjs

7. Configure LLM Synthesis

Create .release-notes-config.yml:

# App-specific configuration for release notes synthesis
app_name: "Your App Name"
personality: "professional, friendly, confident"
audience: "non-technical users"

tone_examples:
  - "We made it faster to find what you need"
  - "Your dashboard now shows more detail"

avoid:
  - Technical jargon (API, SDK, webhook, etc.)
  - Git commit references
  - Internal code names
  - Version numbers in descriptions

categories:
  feat: "New Features"
  fix: "Improvements"
  perf: "Performance"
  chore: "Behind the Scenes"
  refactor: "Behind the Scenes"
  docs: "Documentation"
  test: "Quality"

Create scripts/synthesize-release-notes.mjs:
(See references/llm-synthesis-script.md for full implementation)

8. Scaffold Public Changelog Page

Run changelog-page to scaffold:
- /app/changelog/page.tsx - Main page component
- /app/changelog.xml/route.ts - RSS feed
- /lib/github-releases.ts - GitHub API client

9. Set Up Secrets

Required GitHub secrets:
- GITHUB_TOKEN - Automatically provided
- GEMINI_API_KEY - Get from Google AI Studio
- NPM_TOKEN - Only if publishing to npm

# Add Gemini API key to GitHub secrets
gh secret set GEMINI_API_KEY --body "your-api-key"

10. Verify

Run changelog-verify to confirm everything works:
- Commit with conventional format succeeds
- commitlint rejects bad commits
- Push to main triggers release workflow
- GitHub Release created
- LLM synthesis runs
- Public page displays notes

Quality Gate

Do not consider setup complete until changelog-verify passes.

Handoff

When complete, the project should have:
- semantic-release configured
- commitlint enforcing conventional commits
- Lefthook running commitlint on commit-msg
- GitHub Actions workflow for releases
- LLM synthesis for user-friendly notes
- Public changelog page at /changelog
- RSS feed at /changelog.xml

Developer workflow:
1. Write code
2. Commit with feat:, fix:, etc.
3. Push/merge to main
4. Everything else is automatic

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.