changelog-collect
Creates thematic weekly changelogs from git history while filtering out operational noise.
Install
mkdir -p .claude/skills/changelog-collect && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/18880" && unzip -o skill.zip -d .claude/skills/changelog-collect && rm skill.zipInstalls to .claude/skills/changelog-collect
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Generate a weekly changelog entry from git history. Collects commits for a date range, filters noise, clusters by theme, writes an editorial summary, and outputs a ChangelogEntry file. Default behavior stops for review; pass --commit to also commit.Key capabilities
- →Resolve date range for changelog generation
- →Collect git commits within a specified period
- →Strip operational noise from commit lists
- →Cluster commits by theme and scope
- →Write editorial summary and field notes for changelog
How it works
The skill resolves a date range, collects and filters git commits, clusters them by theme, and then generates a changelog entry with a headline, summary items, and field notes.
Inputs & outputs
When to use changelog-collect
- →Generate weekly changelog
- →Summarize recent commits
- →Prepare release entry
About this skill
Changelog Collection Skill
Generate a complete changelog entry for a given period. Default range is "since the previous published entry."
Invocation
/changelog-collect # from previous entry's `to` date → today
/changelog-collect 2026-03-17 2026-03-24 # explicit ISO range
/changelog-collect 2026-03-17 2026-03-24 --commit # also commit (default prints for review)
/changelog-collect 2026-03-17 2026-03-24 --force # allow overlap with an existing entry
Extended reference (edge cases, history, examples): read ./reference.md when needed.
Workflow
1. Resolve the date range
If two ISO dates are provided, use them as from and to.
Otherwise:
- List
src/data/changelogs/*.ts(excludeindex.ts,types.ts,__tests__/). - Pick the newest by filename; read its
dateRange.to. - Set
from = previous_to + 1 day,to = today.
Overlap guard: if the requested range intersects any existing entry's [from, to], refuse unless --force is passed. Report which entry it overlaps.
2. Collect commits
Use 8-char hashes (matches the card's slice(0, 8) display) and skip merges:
git log --no-merges --abbrev=8 --since="<from>" --until="<to> 23:59:59" --format="%h %s"
Keep the default newest-first ordering for commits[] — existing entries follow it.
3. Strip operational noise
Drop commits matching any of these patterns from both commits[] and cluster analysis:
^chore(\([^)]+\))?: update hotspot ratchet baseline^chore(\([^)]+\))?: refresh hotspot ratchet^chore(\([^)]+\))?: satisfy hotspot ratchet^chore(\([^)]+\))?: update .* coverage baseline^(docs|Docs|Agent Docs) cleanup$^\[skip ci\]^Merge branch 'worktree-agent-^Merge pull request #\d+ from [^ ]+/dependabot/^chore\(deps(-dev)?\): bump^Revert "Revert "→ treat as a no-op pair; drop both the revert-of-revert and its original revert if both appear
The two ^Merge … patterns are normally unreachable under --no-merges (step 2); they are kept only as a guard for commit lists collected without that flag.
If filtering removes >50% of the raw range, surface a note ("Filtered N noise commits — please sanity-check") in the review output.
4. Cluster by theme
Group the surviving commits by conventional prefix (feat, fix, docs, refactor, chore, test, ci, style, perf) and scope.
Aim for 5–8 clusters. Combine related work before adding filler; never split one story into two thin clusters to avoid hitting 9. A quiet 5-day cycle with one major shipping item is fine.
5. Detect milestone facts
Actively check these signals — they often belong in the headline or a labeled cluster:
- Stablecoin count crossings: compare the count in
shared/data/stablecoins/coins.generated.jsonagainst the previous entry's claim. A crossing (e.g., 192 → 194) is headline-worthy. - Methodology version bumps: grep filtered commits for
v\d+\.\d+\d?(e.g.,v6.93,v5.0). Map each bump to a cluster with the correcthref(see step 7). - New data source integrations: updates the about page too — flag so the reviewer can cross-check.
6. Write the headline (≤ 120 chars)
Template: [Big move 1], [big move 2], and [big move 3].
Each "big move" is a concrete, user-facing shipping fact.
Do: name shipped features; cite a number when meaningful; end with a period. Don't: open with "This week we…" / "Various improvements…" / "Multiple fixes across…"; don't write a purely infra headline unless infra genuinely is the story (a major migration, auth rollout, etc.).
7. Write summary items
For each cluster, one SummaryItem:
label(2–4 words, noun phrase): "Broader coverage", "Yield intelligence overhaul", "Stronger pipelines" — never "We broadened coverage".tag(always set explicitly — don't rely on the card'sinferTag()fallback):feature— new capabilities, scoring updates, integrationssecurity— auth, hardening, audit remediationcoverage— stablecoin additions, reserve expansion, data sourcesinfra— pipeline reliability, cron, sync, CI, status pagedesign— UI/UX polish, onboarding, motion, navigation
description(≤ 220 chars, 1–3 sentences): user-facing impact, not a git log. Combine related commits into one sentence about the area, not a bulleted enumeration.href(set whenever a methodology is versioned or touched).
8. Write Field Notes
Populate fieldNotes for every new entry. This is the recurring Editor's note
slot rendered above the structural summary list, so treat it as part of the
changelog contract rather than optional decoration. (The field is optional
in src/data/changelogs/types.ts; it is required by editorial policy — do
not "fix" this skill against the type.)
Requirements:
- 45-80 words.
- One paragraph.
- Editorial synthesis of what the week meant, not a commit summary.
- No bullets, commit hashes, Markdown, or "this release refactored..." phrasing.
- Modest claims when the evidence is mostly maintenance or validation work.
Use headline for the compact thesis, fieldNotes for the human framing, and
summary[] for the commit-derived facts.
9. Build the commits list
Format the surviving commits as CommitRef[]:
hash: 8-char abbreviation.message: full first line, unmodified.
Order: newest first (matches git log default and existing entries).
10. Self-check before writing
Hard checks (must pass):
commits.length === stats.totalCommits(the card rendersstats.totalCommits; divergence misleads readers).- Every
summary[i].tagis one of the five enum values. - Every
summary[i].description.length <= 220. headline.length <= 120.fieldNotesis present and 45-80 words.dateRange.from <= dateRange.to.- No existing changelog file overlaps the date range (re-verify after step 1 in case a parallel push landed).
Soft checks (warn, don't block):
summary.lengthoutside 5–8.- A cluster touches a methodology but has no
href. - A coin count / adapter count / methodology version cited in the summary doesn't match the source of truth.
stats.totalCommits reflects the filtered count (after step 3); every published entry satisfies commits.length === stats.totalCommits.
11. Write the entry file
Path: src/data/changelogs/<to>.ts (e.g., 2026-04-24.ts).
import type { ChangelogEntry } from "./types";
export const entry: ChangelogEntry = {
dateRange: { from: "<from>", to: "<to>" },
headline: "<one-sentence thesis, ≤120 chars>",
fieldNotes: "<45-80 word editor's note>",
summary: [
{ label: "...", tag: "feature", description: "...", href: "/methodology/..." },
// 5–8 items
],
stats: { totalCommits: <N> },
commits: [
{ hash: "<8-char>", message: "<first line>" },
// exhaustive, after noise filter
],
};
12. Update the barrel
Edit src/data/changelogs/index.ts:
- Insert the import in chronological order (existing convention — don't just append):
import { entry as e<YYYYMMDD> } from "./<YYYY-MM-DD>"; - Insert
e<YYYYMMDD>into theallarray, also in chronological order.
The barrel's .sort() handles runtime ordering; the chronological layout exists for diff readability.
13. Verify
Run the relevant gates locally:
npx tsc --noEmit # Catches bad tag enum, missing fields
npm run lint
npm test -- src/data/changelogs/ # Type + barrel tests
npm run check:stablecoin-data # If the summary cites a coin count
Cross-check any cited number (coin count, reserve adapter total, methodology version) against the source of truth.
Also confirm every href path exists under src/app/methodology/ before declaring done.
14. Present for review (default) or commit (--commit)
Default (no --commit): print to the user:
- Path of the new entry file
- Final
headline fieldNotes- Each summary
label(+tag) stats.totalCommits- Any filter-warning notes from step 3
- Any soft-check warnings from step 10
Then stop. Wait for review.
With --commit: stage and commit only after all hard checks in step 10 pass:
git add src/data/changelogs/<to>.ts src/data/changelogs/index.ts
git commit -m "docs(changelog): add changelog for <from> to <to>"
Before publishing, run the focused changelog checks above. Use pharos-release-runner for the protected branch/PR path; GitHub's required PR gate is authoritative, and the heavy local merge gate is an explicit rehearsal only.
When not to use it
- →When needing to generate a changelog for a range that overlaps an existing entry without `--force`
- →When writing a purely infrastructure headline unless it's the main story
- →When using bullets, commit hashes, or Markdown in field notes
Limitations
- →Refuses to generate for overlapping date ranges unless `--force` is passed
- →Field notes must be 45-80 words, one paragraph, without bullets or Markdown
- →Summary items have character limits for label and description
How it compares
This skill automates the creation of structured changelog entries from git history, including noise filtering and thematic clustering, providing a consistent and editorialized output unlike raw commit logs.
Compared to similar skills
changelog-collect side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| changelog-collect (this skill) | 0 | 13d | Review | Intermediate |
| openspec-archive-change | 4 | 5mo | Review | Intermediate |
| session-wrap | 1 | 6mo | Review | Intermediate |
| semantic-commits | 0 | 4mo | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by TokenBrice
View all by TokenBrice →You might also like
openspec-archive-change
studyzy
归档实验性工作流中已完成的变更。当用户想要在实现完成后最终确定并归档变更时使用。
session-wrap
team-attention
This skill should be used when the user asks to "wrap up session", "end session", "session wrap", "/wrap", "document learnings", "what should I commit", or wants to analyze completed work before ending a coding session.
semantic-commits
lipkau
>-
tbd
jlevy
|-
preserve
markwharton
Preserve the most recently approved plan to docs/plans/
release-closeout-engineer
ThiagoGuislotti
Close out a completed workstream by updating README artifacts when needed, producing a commit message, and applying changelog-ready content when the work is ready for commit. Use after review when a stable checkpoint is ready.