Loading...
Loading...
Complete changelog and release notes infrastructure. Audits current state, implements missing components, and verifies the release pipeline works end-to-end.
npx skill4agent add phrazzld/claude-config changelog# Configuration
[ -f ".releaserc.js" ] || [ -f ".releaserc.json" ] && echo "✓ semantic-release" || echo "✗ semantic-release"
[ -f "commitlint.config.js" ] || [ -f "commitlint.config.cjs" ] && echo "✓ commitlint" || echo "✗ commitlint"
grep -q "commit-msg" lefthook.yml 2>/dev/null && echo "✓ commit-msg hook" || echo "✗ commit-msg hook"
# GitHub Actions
[ -f ".github/workflows/release.yml" ] && echo "✓ release workflow" || echo "✗ release workflow"
grep -q "semantic-release" .github/workflows/release.yml 2>/dev/null && echo "✓ runs semantic-release" || echo "✗ doesn't run semantic-release"
grep -q "GEMINI_API_KEY" .github/workflows/release.yml 2>/dev/null && echo "✓ LLM synthesis configured" || echo "✗ LLM synthesis missing"
# Public page
ls app/changelog/page.tsx src/app/changelog/page.tsx 2>/dev/null && echo "✓ changelog page" || echo "✗ changelog page"
# Health
gh release list --limit 3 2>/dev/null || echo "✗ no releases"git log --oneline -10 | while read line; do
echo "$line" | grep -qE "^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?: " || echo "NON-CONVENTIONAL: $line"
done/changelog/changelog.xml/changelog/rsspnpm add -D semantic-release @semantic-release/changelog @semantic-release/git @semantic-release/github.releaserc.jsmodule.exports = {
branches: ['main'],
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
['@semantic-release/changelog', { changelogFile: 'CHANGELOG.md' }],
['@semantic-release/git', { assets: ['CHANGELOG.md', 'package.json'] }],
'@semantic-release/github',
],
};pnpm add -D @commitlint/cli @commitlint/config-conventionalcommitlint.config.jsmodule.exports = { extends: ['@commitlint/config-conventional'] };lefthook.ymlcommit-msg:
commands:
commitlint:
run: pnpm commitlint --edit {1}.github/workflows/release.ymlchangelog-setupREQUIRED: Before implementing, readllm-infrastructure/references/model-research-required.mdDo NOT use model names from this document or your training data. Run the OpenRouter fetch script and web search to determine current best model for this task.
# Query OpenRouter for current fast/cheap models
python3 ~/.claude/skills/llm-infrastructure/scripts/fetch-openrouter-models.py \
--task fast --filter "google|anthropic|openai" --top 10
# Web search: "best LLM for text summarization 2026"
# Web search: "Gemini API current models 2026"scripts/synthesize-release-notes.mjsOPENROUTER_API_KEYLLM_MODEL_SYNTHESISchangelog-pageapp/changelog/page.tsxNEXT_PUBLIC_APP_VERSION<Link href="/changelog">changelog</Link>
<Link href="/support">support</Link>
<Link href="/privacy">privacy</Link><div className="flex items-center justify-between">
<span>Version</span>
<span className="font-mono">{process.env.NEXT_PUBLIC_APP_VERSION || '0.1.0'}</span>
</div>
<Link href="/changelog">View changelog →</Link>echo "bad message" | pnpm commitlint
# Should fail
echo "feat: valid message" | pnpm commitlint
# Should pass# Try to commit with bad message (should be rejected)
git commit --allow-empty -m "bad message"
# Should fail due to commitlint hookfeat:fix:/changelogCommit with conventional format (enforced by Lefthook)
↓
Push/merge to main
↓
GitHub Actions runs semantic-release
↓
Version bumped, CHANGELOG.md updated, GitHub Release created
↓
Post-release action triggers LLM synthesis
↓
LLM (via OpenRouter) transforms changelog → user notes
↓
Enhanced notes stored in GitHub Release
↓
Public /changelog page displays latestchore:/changelog