Loading...
Loading...
Full changelog infrastructure from scratch. Greenfield workflow. Installs semantic-release, commitlint, GitHub Actions, LLM synthesis, public page.
npx skill4agent add phrazzld/claude-config changelog-setupchangelog-assesspnpm add -D semantic-release \
@semantic-release/changelog \
@semantic-release/git \
@semantic-release/github \
@commitlint/cli \
@commitlint/config-conventional.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',
],
};commitlint.config.jsmodule.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],
},
};lefthook.ymlcommit-msg:
commands:
commitlint:
run: pnpm commitlint --edit {1}pnpm lefthook install.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.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"scripts/synthesize-release-notes.mjsreferences/llm-synthesis-script.mdchangelog-page/app/changelog/page.tsx/app/changelog.xml/route.ts/lib/github-releases.tsGITHUB_TOKENGEMINI_API_KEYNPM_TOKEN# Add Gemini API key to GitHub secrets
gh secret set GEMINI_API_KEY --body "your-api-key"changelog-verifychangelog-verify/changelog/changelog.xmlfeat:fix: