Generates a structured CHANGELOG.md from VCS history and PR/issue references, categorized by change type. Use when cutting a release, when the user asks to update CHANGELOG.md, or when backfilling a changelog from git history.
Install with Tessl CLI
npx tessl i github:santosomar/general-secure-coding-agent-skills --skill change-log-generator100
Quality
100%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
A changelog is for developers who use your project. It answers one question: what do I need to know before I upgrade?
| This skill (CHANGELOG.md) | → release-notes-writer |
|---|---|
| Developers, maintainers | End users, stakeholders |
| Terse, categorized, complete | Narrative, highlights only |
| Every user-visible change | The 3 things anyone actually cares about |
| Lives in the repo | Goes in the release announcement |
git log <prev-tag>..HEAD --oneline --no-mergesIf there's no previous tag, the range is "since the last ## [x.y.z] heading in CHANGELOG.md" — grep it out.
Bucket every commit. One bucket per commit — if a commit is both a feature and a fix, it should have been two commits, but pick the more user-impacting bucket.
| Bucket | Commit message signals | What qualifies |
|---|---|---|
| Breaking | BREAKING CHANGE:, ! after type, removed API | Anything that breaks existing user code — always first, always loud |
| Added | feat:, add, new, implement | New capabilities the user can now use |
| Changed | refactor: (if user-visible), behavior changes | Existing features that work differently now |
| Fixed | fix:, bug, patch, Fixes #N | Things that were broken and now aren't |
| Security | security:, CVE refs, vuln | Separate section — people grep for this |
| Removed | remove, drop, delete (of user-facing things) | Deprecation follow-throughs |
| (drop) | chore:, ci:, docs:, test:, style: | Internal. Changelog readers don't care. |
The commit message is input, not output. Transform:
| Commit says | Changelog says |
|---|---|
fix: handle null in getUserEmail | getUserEmail() no longer throws when user has no email |
feat: add retry param | Client() now accepts retries=N to retry failed calls |
remove v1 endpoints | Breaking: /api/v1/* endpoints removed; use /api/v2/* |
Rules for rewriting:
the billing module not BillingServiceImpl.(#123) at the end.Input commits:
a1b2c3d feat(client): add timeout parameter
b2c3d4e fix: race in connection pool cleanup (fixes #891)
c3d4e5f chore: bump pytest to 8.0
d4e5f6a feat!: drop Python 3.8 support
e5f6a7b docs: fix typo in READMEOutput:
## [2.4.0] — 2026-03-09
### Breaking
- Dropped Python 3.8 support; minimum is now 3.9 (#94)
### Added
- `Client()` now accepts a `timeout` parameter (seconds, default 30) (#92)
### Fixed
- Connection pool no longer leaks connections under concurrent close (#891)Two commits dropped (chore:, docs:). Three kept, rewritten, linked.
docs/ is probably docs:. A commit that adds a test and changes one line is probably fix:. Classify by content.v1.0 and v1.1 is the ## [1.1.0] section.fix: thing is not an entry.## [Unreleased] section and call it done. Either pin a version or be explicit that it's unreleased.## [<version>] — <YYYY-MM-DD>
### Breaking
- <entry> (#<pr>)
### Added
- ...
### Changed
- ...
### Fixed
- ...
### Security
- ...Omit empty sections. Breaking first, always.
47d56bb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.