@theihtisham/ai-release-notes 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1493 -0
- package/__tests__/analyzer.test.js +63 -0
- package/__tests__/categorizer.test.js +93 -0
- package/__tests__/config.test.js +92 -0
- package/__tests__/formatter.test.js +63 -0
- package/__tests__/formatters.test.js +394 -0
- package/__tests__/migration.test.js +322 -0
- package/__tests__/semver.test.js +94 -0
- package/__tests__/tones.test.js +252 -0
- package/action.yml +113 -0
- package/index.js +73 -0
- package/jest.config.js +10 -0
- package/package.json +41 -0
- package/src/ai-writer.js +108 -0
- package/src/analyzer.js +232 -0
- package/src/analyzers/migration.js +355 -0
- package/src/categorizer.js +182 -0
- package/src/config.js +162 -0
- package/src/constants.js +137 -0
- package/src/contributor.js +144 -0
- package/src/diff-analyzer.js +202 -0
- package/src/formatter.js +336 -0
- package/src/formatters/discord.js +174 -0
- package/src/formatters/html.js +195 -0
- package/src/formatters/index.js +42 -0
- package/src/formatters/markdown.js +123 -0
- package/src/formatters/slack.js +176 -0
- package/src/formatters/twitter.js +242 -0
- package/src/formatters/types.js +48 -0
- package/src/generator.js +297 -0
- package/src/integrations/changelog.js +125 -0
- package/src/integrations/discord.js +96 -0
- package/src/integrations/github-release.js +75 -0
- package/src/integrations/indexer.js +119 -0
- package/src/integrations/slack.js +112 -0
- package/src/integrations/twitter.js +128 -0
- package/src/logger.js +52 -0
- package/src/prompts.js +210 -0
- package/src/rate-limiter.js +92 -0
- package/src/semver.js +129 -0
- package/src/tones/casual.js +114 -0
- package/src/tones/humorous.js +164 -0
- package/src/tones/index.js +38 -0
- package/src/tones/professional.js +125 -0
- package/src/tones/technical.js +164 -0
- package/src/tones/types.js +26 -0
package/README.md
ADDED
|
@@ -0,0 +1,1493 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# AI Release Notes
|
|
4
|
+
|
|
5
|
+
### _Stop writing release notes. Start shipping them._
|
|
6
|
+
|
|
7
|
+
**Ship beautiful release notes in 30 seconds.**
|
|
8
|
+
|
|
9
|
+
AI-powered. Multi-format. Auto migration guides. 4 tone modes. 9 languages. Works with any stack.
|
|
10
|
+
|
|
11
|
+
[](https://github.com/features/actions)
|
|
12
|
+
[](https://www.npmjs.com/package/@theihtisham/ai-release-notes)
|
|
13
|
+
[](https://opensource.org/licenses/MIT)
|
|
14
|
+
[]()
|
|
15
|
+
[]()
|
|
16
|
+
|
|
17
|
+
<br />
|
|
18
|
+
|
|
19
|
+
[Features](#-features) • [Quick Start](#-quick-start-30-seconds) • [Examples](#-output-examples) • [Configuration](#-configuration) • [Architecture](#-architecture) • [Contributing](#-contributing)
|
|
20
|
+
|
|
21
|
+
<br /><br />
|
|
22
|
+
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Imagine This
|
|
28
|
+
|
|
29
|
+
Your team just shipped v2.1.0. Three features, two bug fixes, one breaking change. Your PM wants release notes. Your Twitter needs an announcement. Slack needs a heads-up. Discord needs the changelog. And there's a migration guide to write.
|
|
30
|
+
|
|
31
|
+
Normally that's 2 hours of copy-paste hell. With AI Release Notes, it's 30 seconds.
|
|
32
|
+
|
|
33
|
+
**One command. Six formats. Zero effort.**
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
npx @theihtisham/ai-release-notes --from=v2.0.0 --to=v2.1.0 --tone=professional --language=en
|
|
37
|
+
|
|
38
|
+
API v2.1.0 Generated in 4.2s
|
|
39
|
+
MD release-notes.md .............. 2.1 KB
|
|
40
|
+
HTML release-notes.html ............ 4.8 KB
|
|
41
|
+
Slack 12 blocks, 3 actions ........ ready
|
|
42
|
+
Discord 4 embeds, 3 colors ........ ready
|
|
43
|
+
Twitter 7-tweet thread ............. ready
|
|
44
|
+
Migration 1 guide, before/after ... ready
|
|
45
|
+
|
|
46
|
+
Done. Ship it.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### What You Get
|
|
52
|
+
|
|
53
|
+
**Professional Markdown** -- the release notes that land on your GitHub Releases page:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
+------------------------------------------------------------------+
|
|
57
|
+
| Release v2.1.0 |
|
|
58
|
+
| January 15, 2025 |
|
|
59
|
+
+------------------------------------------------------------------+
|
|
60
|
+
| |
|
|
61
|
+
| We are pleased to announce v2.1.0, featuring significant |
|
|
62
|
+
| improvements to security and performance across the platform. |
|
|
63
|
+
| |
|
|
64
|
+
| Summary: 3 features | 2 bug fixes | 1 breaking change |
|
|
65
|
+
| |
|
|
66
|
+
+==================================================================+
|
|
67
|
+
| BREAKING CHANGES |
|
|
68
|
+
+==================================================================+
|
|
69
|
+
| |
|
|
70
|
+
| Removed deprecated /api/v1/users endpoint |
|
|
71
|
+
| Scope: api | Severity: major |
|
|
72
|
+
| Migration: Use /api/v2/users instead |
|
|
73
|
+
| PR #40 by @sarah |
|
|
74
|
+
| |
|
|
75
|
+
| Before: fetch('/api/v1/users') |
|
|
76
|
+
| After: fetch('/api/v2/users') |
|
|
77
|
+
| |
|
|
78
|
+
+==================================================================+
|
|
79
|
+
| NEW FEATURES |
|
|
80
|
+
+==================================================================+
|
|
81
|
+
| |
|
|
82
|
+
| + User avatar upload API ................. [api] #42 @alice |
|
|
83
|
+
| + Dark mode toggle ........................ [ui] #43 @bob |
|
|
84
|
+
| + Pagination on list endpoints ......... [api] #44 @charlie |
|
|
85
|
+
| |
|
|
86
|
+
+==================================================================+
|
|
87
|
+
| PERFORMANCE |
|
|
88
|
+
+==================================================================+
|
|
89
|
+
| |
|
|
90
|
+
| * API response time -40% (340ms -> 204ms) .............. #47 |
|
|
91
|
+
| * Bundle size -23% (1.2MB -> 924KB) ................... #48 |
|
|
92
|
+
| |
|
|
93
|
+
+==================================================================+
|
|
94
|
+
| BUG FIXES |
|
|
95
|
+
+==================================================================+
|
|
96
|
+
| |
|
|
97
|
+
| * Login timeout on slow connections ......... [auth] #45 @dave |
|
|
98
|
+
| * Memory leak in event listeners ........... [core] #46 @eve |
|
|
99
|
+
| |
|
|
100
|
+
+==================================================================+
|
|
101
|
+
| CONTRIBUTORS |
|
|
102
|
+
+==================================================================+
|
|
103
|
+
| |
|
|
104
|
+
| @alice (3) @bob (2) @charlie (1) @dave (1) @eve (1) |
|
|
105
|
+
| @sarah (2) |
|
|
106
|
+
| |
|
|
107
|
+
| Full Changelog: v2.0.0...v2.1.0 |
|
|
108
|
+
+------------------------------------------------------------------+
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Casual Slack notification** -- what your team sees in #releases:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
+------------------------------------------------------------------+
|
|
115
|
+
| #releases |
|
|
116
|
+
+------------------------------------------------------------------+
|
|
117
|
+
| |
|
|
118
|
+
| :rocket: v2.1.0 just dropped! |
|
|
119
|
+
| Hey team! 3 new features, 2 bug squashes, and heads up -- |
|
|
120
|
+
| 1 breaking change. |
|
|
121
|
+
| |
|
|
122
|
+
| :warning: Heads up! |
|
|
123
|
+
| /api/v1/users is gone -> use /api/v2/users instead |
|
|
124
|
+
| |
|
|
125
|
+
| :star: What's New: |
|
|
126
|
+
| * Avatar uploads! Your users can finally upload profile pics. |
|
|
127
|
+
| About time, right? #42 |
|
|
128
|
+
| * Dark mode! Because everyone asked for it. #43 |
|
|
129
|
+
| * Pagination! Every list endpoint now has proper pagination. #44 |
|
|
130
|
+
| |
|
|
131
|
+
| :bug: Bug Squashes: |
|
|
132
|
+
| * Login no longer times out on slow connections #45 |
|
|
133
|
+
| * Killed a sneaky memory leak (~2MB/hr). Oops. #46 |
|
|
134
|
+
| |
|
|
135
|
+
| :clap: Shoutout: @alice @bob (first PR!) @charlie (first PR!) |
|
|
136
|
+
| |
|
|
137
|
+
| [View Full Release Notes] [View Changelog] |
|
|
138
|
+
+------------------------------------------------------------------+
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Humorous Discord announcement** -- for community-driven projects:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
+------------------------------------------------------------------+
|
|
145
|
+
| #announcements Discord |
|
|
146
|
+
+------------------------------------------------------------------+
|
|
147
|
+
| |
|
|
148
|
+
| :drum: v2.1.0 has landed! |
|
|
149
|
+
| |
|
|
150
|
+
| Plot twist: we removed /api/v1/users. |
|
|
151
|
+
| Don't panic. /api/v2/users has been there all along. |
|
|
152
|
+
| Like that friend who was always there but you ignored. |
|
|
153
|
+
| |
|
|
154
|
+
| Things That Are New and Shiny: |
|
|
155
|
+
| + Avatars! Because you're all beautiful. #42 |
|
|
156
|
+
| + Dark mode. Yes. Finally. You're welcome. #43 |
|
|
157
|
+
| + Pagination. Because nobody needs 10,000 results at once. #44 |
|
|
158
|
+
| |
|
|
159
|
+
| Bugs We Sent to Bug Heaven: |
|
|
160
|
+
| * That login timeout? Gone. Rest in peace. #45 |
|
|
161
|
+
| * Memory leak plugged. No more leaky pipes. #46 |
|
|
162
|
+
| |
|
|
163
|
+
| Things Nobody Sees But Everyone Needs: |
|
|
164
|
+
| * API responses are 40% faster. 340ms -> 204ms. Zoom zoom. #47 |
|
|
165
|
+
| * Bundle is 23% smaller. We went on a diet. #48 |
|
|
166
|
+
| |
|
|
167
|
+
| Contributors: @alice @bob :star: @charlie :star: @dave @eve |
|
|
168
|
+
| |
|
|
169
|
+
| [Changelog] [npm install pkg@2.1.0] |
|
|
170
|
+
+------------------------------------------------------------------+
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Twitter/X thread** -- for major releases:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
+------------------------------------------------------------------+
|
|
177
|
+
| @yourproject |
|
|
178
|
+
+------------------------------------------------------------------+
|
|
179
|
+
| 1/7 v2.1.0 is HERE. |
|
|
180
|
+
| |
|
|
181
|
+
| 3 features. 2 bug fixes. 40% faster APIs. |
|
|
182
|
+
| The biggest update since our launch. |
|
|
183
|
+
| |
|
|
184
|
+
| Here's everything (and one breaking change): >>> |
|
|
185
|
+
+------------------------------------------------------------------+
|
|
186
|
+
| 2/7 :rocket: New in v2.1.0: |
|
|
187
|
+
| |
|
|
188
|
+
| * Avatar uploads (JPEG, PNG, WebP up to 5MB) #42 |
|
|
189
|
+
| * Dark mode (system-aware, respects OS preference) #43 |
|
|
190
|
+
| * Pagination on ALL list endpoints (50/page default) #44 |
|
|
191
|
+
+------------------------------------------------------------------+
|
|
192
|
+
| 3/7 :zap: Performance: |
|
|
193
|
+
| |
|
|
194
|
+
| API response time: 340ms -> 204ms (-40%) |
|
|
195
|
+
| Bundle size: 1.2MB -> 924KB (-23%) |
|
|
196
|
+
| |
|
|
197
|
+
| That's not a typo. Your app just got faster. |
|
|
198
|
+
+------------------------------------------------------------------+
|
|
199
|
+
| 4/7 :rotating_light: BREAKING CHANGE: |
|
|
200
|
+
| |
|
|
201
|
+
| /api/v1/users is GONE. |
|
|
202
|
+
| Use /api/v2/users instead. |
|
|
203
|
+
| Migration guide in the full release notes. |
|
|
204
|
+
+------------------------------------------------------------------+
|
|
205
|
+
| 5/7 Contributors this release: |
|
|
206
|
+
| |
|
|
207
|
+
| @alice (3 commits) |
|
|
208
|
+
| @bob (2 commits) - FIRST TIME CONTRIBUTOR! |
|
|
209
|
+
| @charlie (1 commit) - FIRST TIME! |
|
|
210
|
+
| @dave @eve @sarah |
|
|
211
|
+
+------------------------------------------------------------------+
|
|
212
|
+
| 6/7 Full changelog: |
|
|
213
|
+
| github.com/theihtisham/app/compare/v2.0.0...v2.1.0 |
|
|
214
|
+
| |
|
|
215
|
+
| #ReleaseNotes #OpenSource #Changelog #BreakingChange |
|
|
216
|
+
+------------------------------------------------------------------+
|
|
217
|
+
| 7/7 That's v2.1.0! |
|
|
218
|
+
| |
|
|
219
|
+
| npm install your-package@2.1.0 |
|
|
220
|
+
| |
|
|
221
|
+
| Star us on GitHub if this saved you time! |
|
|
222
|
+
+------------------------------------------------------------------+
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Auto-generated migration guide** -- with real before/after code:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
+------------------------------------------------------------------+
|
|
229
|
+
| Migration Guide: v2.0.0 -> v2.1.0 |
|
|
230
|
+
+------------------------------------------------------------------+
|
|
231
|
+
| |
|
|
232
|
+
| This guide covers 1 breaking change. |
|
|
233
|
+
| Estimated migration time: 5 minutes. |
|
|
234
|
+
| |
|
|
235
|
+
+==================================================================+
|
|
236
|
+
| 1. Removed deprecated /api/v1/users endpoint |
|
|
237
|
+
+==================================================================+
|
|
238
|
+
| |
|
|
239
|
+
| Scope: api | Severity: major | PR: #40 | Author: @sarah |
|
|
240
|
+
| |
|
|
241
|
+
| BEFORE (v2.0.0): |
|
|
242
|
+
| +---------------------------------------------------+ |
|
|
243
|
+
| | // Old usage - will now return 404 | |
|
|
244
|
+
| | const response = await fetch('/api/v1/users', { | |
|
|
245
|
+
| | headers: { 'Authorization': `Bearer ${token}` } | |
|
|
246
|
+
| | }); | |
|
|
247
|
+
| | const users = await response.json(); | |
|
|
248
|
+
| +---------------------------------------------------+ |
|
|
249
|
+
| |
|
|
250
|
+
| AFTER (v2.1.0): |
|
|
251
|
+
| +---------------------------------------------------+ |
|
|
252
|
+
| | // Updated to v2 API - pagination included | |
|
|
253
|
+
| | const response = await fetch('/api/v2/users', { | |
|
|
254
|
+
| | headers: { 'Authorization': `Bearer ${token}` } | |
|
|
255
|
+
| | }); | |
|
|
256
|
+
| | const { data: users, meta } = await response.json()| |
|
|
257
|
+
| | // meta.pagination has total pages, current page | |
|
|
258
|
+
| +---------------------------------------------------+ |
|
|
259
|
+
| |
|
|
260
|
+
| Steps: |
|
|
261
|
+
| 1. Replace all /api/v1/users calls with /api/v2/users |
|
|
262
|
+
| 2. Handle new { data, meta } response wrapper |
|
|
263
|
+
| 3. Update client SDK calls (SDK v3.0+ required) |
|
|
264
|
+
| 4. Remove v1-specific query params (?all=true no longer works) |
|
|
265
|
+
| |
|
|
266
|
+
| Timeline: |
|
|
267
|
+
| - v2.1.0 (now): v1 returns 404 with migration header |
|
|
268
|
+
| - v2.2.0: v1 removed from routing entirely |
|
|
269
|
+
| - v3.0.0: No backward compatibility |
|
|
270
|
+
| |
|
|
271
|
+
+------------------------------------------------------------------+
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Multi-language output** -- ship globally, in 9 languages:
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
+------------------------------------------------------------------+
|
|
278
|
+
| Espanol (es) |
|
|
279
|
+
+------------------------------------------------------------------+
|
|
280
|
+
| |
|
|
281
|
+
| Notas de la version v2.1.0 |
|
|
282
|
+
| |
|
|
283
|
+
| Nos complace anunciar la version 2.1.0, que incluye |
|
|
284
|
+
| mejoras significativas de seguridad y rendimiento. |
|
|
285
|
+
| |
|
|
286
|
+
| Resumen: 3 nuevas funciones | 2 correcciones | 1 cambio radical |
|
|
287
|
+
| |
|
|
288
|
+
| :rotating_light: Cambios radicales |
|
|
289
|
+
| Se elimino el endpoint /api/v1/users |
|
|
290
|
+
| Migracion: Use /api/v2/users |
|
|
291
|
+
| |
|
|
292
|
+
| Nuevas funciones |
|
|
293
|
+
| + Carga de avatar de usuario ............. [api] #42 |
|
|
294
|
+
| + Alternar modo oscuro .................. [ui] #43 |
|
|
295
|
+
| + Paginacion en endpoints de lista ..... [api] #44 |
|
|
296
|
+
+------------------------------------------------------------------+
|
|
297
|
+
|
|
298
|
+
+------------------------------------------------------------------+
|
|
299
|
+
| Japanese (ja) |
|
|
300
|
+
+------------------------------------------------------------------+
|
|
301
|
+
| |
|
|
302
|
+
| v2.1.0 |
|
|
303
|
+
| |
|
|
304
|
+
| セキュリティとパフォーマンスの大幅な改善が含まれています。 |
|
|
305
|
+
| |
|
|
306
|
+
| 概要: 3つの新機能 | 2つのバグ修正 | 1つの破壊的変更 |
|
|
307
|
+
| |
|
|
308
|
+
| :rotating_light: 破壊的変更 |
|
|
309
|
+
| /api/v1/usersエンドポイントを削除しました |
|
|
310
|
+
| マイグレーション: /api/v2/usersをご使用ください |
|
|
311
|
+
| |
|
|
312
|
+
| 新機能 |
|
|
313
|
+
| + ユーザーアバターアップロードAPI .......... [api] #42 |
|
|
314
|
+
| + ダークモード切り替え ...................... [ui] #43 |
|
|
315
|
+
| + リストエンドポイントのページネーション ... [api] #44 |
|
|
316
|
+
+------------------------------------------------------------------+
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## The Problem with Release Notes
|
|
322
|
+
|
|
323
|
+
Release notes are the **first thing users see** after an update. Yet most teams treat them like an afterthought.
|
|
324
|
+
|
|
325
|
+
You just shipped a feature your team spent weeks building. Your release notes?
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
* fix typo
|
|
329
|
+
* update deps
|
|
330
|
+
* add feature
|
|
331
|
+
* more fixes
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Your users see a wall of commits and **close the tab**.
|
|
335
|
+
|
|
336
|
+
| Tool | The Problem | Users' Reaction |
|
|
337
|
+
|:------|:------------|:----------------|
|
|
338
|
+
| **GitHub Auto-Generated** | Raw commit list copy-pasted. No context. No structure. Just SHA hashes and merge titles. | "What does this even mean?" |
|
|
339
|
+
| **Manual Writing** | Staring at a blank screen for 2 hours. Takes forever. Always behind schedule. | "Why are these always late?" |
|
|
340
|
+
| **semantic-release** | Robot-speak changelog with zero personality. Technically correct, humanly incomprehensible. | Developers skip reading them |
|
|
341
|
+
| **Keep a Changelog** | Great format template -- still blank. YOU still write every single word yourself. | Good luck maintaining it |
|
|
342
|
+
| **standard-version** | Dumps conventional commits into a file. Not release notes. Not shareable. Not social. | Technically correct, useless |
|
|
343
|
+
| **Release Drafter** | Only groups PRs by label. No AI understanding. No multi-format. No migration guides. | Better than nothing, barely |
|
|
344
|
+
|
|
345
|
+
**Every tool either generates garbage or makes you do all the work.**
|
|
346
|
+
|
|
347
|
+
### The Solution
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
+-----------------------------------------------------------------+
|
|
351
|
+
| |
|
|
352
|
+
| git push --> AI analyzes commits --> Beautiful release notes |
|
|
353
|
+
| | | | |
|
|
354
|
+
| | 30 seconds 6 formats |
|
|
355
|
+
| v v v |
|
|
356
|
+
| tag v2.1.0 OpenAI / local MD / HTML / Slack |
|
|
357
|
+
| 148 tests proven Discord / Twitter |
|
|
358
|
+
| / Migration |
|
|
359
|
+
+-----------------------------------------------------------------+
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
AI Release Notes reads your git history, **understands what changed and why**, and generates beautiful, contextual release notes -- in any format, with any tone, with migration guides for breaking changes -- automatically.
|
|
363
|
+
|
|
364
|
+
No templates to fill. No blank pages. No copy-pasting commit messages.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Features
|
|
369
|
+
|
|
370
|
+
| Category | Feature | Details |
|
|
371
|
+
|:---------|:--------|:--------|
|
|
372
|
+
| :brain: **AI Engine** | OpenAI-compatible engine | Works with OpenAI, Azure, Ollama, LM Studio, any compatible API |
|
|
373
|
+
| :brain: **AI Engine** | Works without AI key | Falls back to intelligent template-based generation -- still beautiful |
|
|
374
|
+
| :brain: **AI Engine** | Contextual understanding | Doesn't copy commit messages -- understands what changed and why |
|
|
375
|
+
| :gear: **Formats** | Markdown | Full GitHub/GitLab release notes with tables, collapsibles, formatting |
|
|
376
|
+
| :gear: **Formats** | HTML | Email-ready with inline CSS, responsive, color-coded sections |
|
|
377
|
+
| :gear: **Formats** | Slack Block Kit | Interactive blocks with action buttons and rich formatting |
|
|
378
|
+
| :gear: **Formats** | Discord Rich Embeds | Color-coded embeds with field layout and contributor badges |
|
|
379
|
+
| :gear: **Formats** | Twitter/X Thread | 7-tweet threads optimized for engagement and virality |
|
|
380
|
+
| :gear: **Formats** | Compact Mode | Minimal format for changelogs, feeds, and SMS |
|
|
381
|
+
| :theater: **Tone** | Professional | Enterprise-ready, formal language, structured sections |
|
|
382
|
+
| :theater: **Tone** | Casual | Friendly, approachable, personality-first |
|
|
383
|
+
| :theater: **Tone** | Humorous | Fun, engaging, community-friendly, meme-aware |
|
|
384
|
+
| :theater: **Tone** | Technical | Precise, detailed, developer-focused with code references |
|
|
385
|
+
| :rotating_light: **Breaking** | 5 detection methods | `!` suffix, BREAKING CHANGE footer, `breaking:` prefix, API keywords, code analysis |
|
|
386
|
+
| :rotating_light: **Breaking** | Auto migration guides | Before/after code, step-by-step instructions, deprecation timeline |
|
|
387
|
+
| :rotating_light: **Breaking** | Severity classification | major / minor / patch severity per breaking change |
|
|
388
|
+
| :globe_with_meridians: **i18n** | 9 languages | EN, ES, FR, DE, JA, ZH, KO, PT, RU |
|
|
389
|
+
| :globe_with_meridians: **i18n** | Automatic detection | Detects repository language settings automatically |
|
|
390
|
+
| :rocket: **CI/CD** | GitHub Action | One-step workflow integration with 20+ config options |
|
|
391
|
+
| :rocket: **CI/CD** | CLI (npx) | Zero-install, run from anywhere, pipe output anywhere |
|
|
392
|
+
| :rocket: **CI/CD** | Node.js library | Full programmatic API for custom integrations |
|
|
393
|
+
| :rocket: **CI/CD** | Webhook delivery | Auto-post to Slack, Discord, Twitter after generation |
|
|
394
|
+
| :bar_chart: **Analysis** | Semver-aware | Calculates version bumps from commit types automatically |
|
|
395
|
+
| :bar_chart: **Analysis** | Conventional commits | Full support: feat, fix, docs, refactor, perf, test, chore, ci, build, style, revert |
|
|
396
|
+
| :bar_chart: **Analysis** | Diff statistics | Lines added/removed, files changed, contributor breakdown |
|
|
397
|
+
| :bar_chart: **Analysis** | Auto versioning | Calculate next version from commit history |
|
|
398
|
+
| :bar_chart: **Analysis** | Screenshot detection | Auto-finds and includes screenshots from PR bodies |
|
|
399
|
+
| :bar_chart: **Analysis** | Custom categories | Define your own commit grouping rules with JSON patterns |
|
|
400
|
+
| :white_check_mark: **Quality** | 148 tests | Comprehensive test suite covering all features and edge cases |
|
|
401
|
+
| :white_check_mark: **Quality** | Zero config | Works out of the box with sensible defaults |
|
|
402
|
+
| :white_check_mark: **Quality** | Dry run mode | Preview notes without creating a release |
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## Comparison
|
|
407
|
+
|
|
408
|
+
How does AI Release Notes stack up against every popular alternative?
|
|
409
|
+
|
|
410
|
+
| Feature | AI Release Notes | semantic-release | standard-version | GitHub Auto-Gen | Release Drafter | Keep a Changelog |
|
|
411
|
+
|:--------|:---:|:---:|:---:|:---:|:---:|:---:|
|
|
412
|
+
| **AI-generated descriptions** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
413
|
+
| **Output formats** | :white_check_mark: 6 formats | 1 format | 1 format | 1 format | 1 format | Manual |
|
|
414
|
+
| **Tone control** | :white_check_mark: 4 tones | :x: | :x: | :x: | :x: | :x: |
|
|
415
|
+
| **Auto migration guides** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
416
|
+
| **Twitter/X threads** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
417
|
+
| **Slack Block Kit** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
418
|
+
| **Discord Rich Embeds** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
419
|
+
| **HTML/email output** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
420
|
+
| **Breaking change detection** | :white_check_mark: 5 methods | Basic (1) | Basic (1) | Basic | :x: | :x: |
|
|
421
|
+
| **Before/after code examples** | :white_check_mark: Auto | :x: | :x: | :x: | :x: | :x: |
|
|
422
|
+
| **Multi-language** | :white_check_mark: 9 langs | English | English | English | English | Manual |
|
|
423
|
+
| **Custom categories** | :white_check_mark: JSON | :x: | :x: | :x: | Labels | :x: |
|
|
424
|
+
| **Screenshot detection** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
425
|
+
| **Works without AI key** | :white_check_mark: | N/A | N/A | N/A | N/A | N/A |
|
|
426
|
+
| **Zero config** | :white_check_mark: | :x: Complex | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: Manual |
|
|
427
|
+
| **CLI tool (npx)** | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :x: |
|
|
428
|
+
| **Node.js API** | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: |
|
|
429
|
+
| **Auto-post to Slack** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
430
|
+
| **Auto-post to Discord** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
431
|
+
| **First-time contributor highlight** | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
|
432
|
+
| **Price** | **Free** | Free | Free | Free | Free | Free |
|
|
433
|
+
|
|
434
|
+
> :trophy: **TL;DR**: If you want AI-powered, multi-format, multi-tone release notes with migration guides and social posts, nothing else comes close.
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Install
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
# npm
|
|
442
|
+
npm install @theihtisham/ai-release-notes
|
|
443
|
+
|
|
444
|
+
# Or run instantly (no install needed)
|
|
445
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Quick Start (30 Seconds)
|
|
449
|
+
|
|
450
|
+
Two paths. Both take under 2 minutes.
|
|
451
|
+
|
|
452
|
+
### Path A: GitHub Action
|
|
453
|
+
|
|
454
|
+
#### Step 1: Create the workflow file
|
|
455
|
+
|
|
456
|
+
Create `.github/workflows/release-notes.yml`:
|
|
457
|
+
|
|
458
|
+
```yaml
|
|
459
|
+
name: Release Notes
|
|
460
|
+
|
|
461
|
+
on:
|
|
462
|
+
push:
|
|
463
|
+
tags: ['v*'] # matches v1.0.0, v2.1.3, etc.
|
|
464
|
+
workflow_dispatch: # also allows manual trigger
|
|
465
|
+
|
|
466
|
+
permissions:
|
|
467
|
+
contents: write # needed to create GitHub Releases
|
|
468
|
+
|
|
469
|
+
jobs:
|
|
470
|
+
release:
|
|
471
|
+
runs-on: ubuntu-latest
|
|
472
|
+
steps:
|
|
473
|
+
# fetch-depth: 0 is REQUIRED -- the analyzer needs full git history
|
|
474
|
+
- uses: actions/checkout@v4
|
|
475
|
+
with:
|
|
476
|
+
fetch-depth: 0
|
|
477
|
+
|
|
478
|
+
- name: Generate AI Release Notes
|
|
479
|
+
uses: theihtisham/ai-release-notes@v1
|
|
480
|
+
with:
|
|
481
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
482
|
+
api-key: ${{ secrets.OPENAI_API_KEY }} # Optional - works without it
|
|
483
|
+
template: default
|
|
484
|
+
language: en
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Push a tag. Get beautiful release notes. That's it.
|
|
488
|
+
|
|
489
|
+
<details>
|
|
490
|
+
<summary><strong>:scroll: Full workflow with all integrations</strong></summary>
|
|
491
|
+
|
|
492
|
+
```yaml
|
|
493
|
+
name: Release Notes
|
|
494
|
+
|
|
495
|
+
on:
|
|
496
|
+
push:
|
|
497
|
+
tags: ['v*']
|
|
498
|
+
workflow_dispatch:
|
|
499
|
+
inputs:
|
|
500
|
+
version:
|
|
501
|
+
description: 'Version to release (e.g. v1.2.0)'
|
|
502
|
+
required: false
|
|
503
|
+
|
|
504
|
+
permissions:
|
|
505
|
+
contents: write
|
|
506
|
+
|
|
507
|
+
jobs:
|
|
508
|
+
release:
|
|
509
|
+
runs-on: ubuntu-latest
|
|
510
|
+
steps:
|
|
511
|
+
- uses: actions/checkout@v4
|
|
512
|
+
with:
|
|
513
|
+
fetch-depth: 0
|
|
514
|
+
|
|
515
|
+
- name: Generate & Publish Release Notes
|
|
516
|
+
uses: theihtisham/ai-release-notes@v1
|
|
517
|
+
with:
|
|
518
|
+
# Required
|
|
519
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
520
|
+
|
|
521
|
+
# AI Configuration (optional -- works without)
|
|
522
|
+
api-key: ${{ secrets.OPENAI_API_KEY }}
|
|
523
|
+
api-base: https://api.openai.com/v1
|
|
524
|
+
model: gpt-4o-mini
|
|
525
|
+
|
|
526
|
+
# Output Configuration
|
|
527
|
+
template: detailed
|
|
528
|
+
language: en
|
|
529
|
+
|
|
530
|
+
# Commit Analysis
|
|
531
|
+
commit-mode: auto
|
|
532
|
+
max-commits: 200
|
|
533
|
+
categories: auto
|
|
534
|
+
|
|
535
|
+
# Version Configuration
|
|
536
|
+
version-from: tag
|
|
537
|
+
|
|
538
|
+
# Content Sections
|
|
539
|
+
include-breaking: true
|
|
540
|
+
include-contributors: true
|
|
541
|
+
include-diff-stats: true
|
|
542
|
+
include-screenshots: true
|
|
543
|
+
|
|
544
|
+
# Integrations
|
|
545
|
+
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
|
546
|
+
discord-webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
|
547
|
+
update-changelog: true
|
|
548
|
+
changelog-path: CHANGELOG.md
|
|
549
|
+
|
|
550
|
+
# Twitter (all 4 required if any provided)
|
|
551
|
+
# twitter-consumer-key: ${{ secrets.TWITTER_KEY }}
|
|
552
|
+
# twitter-consumer-secret: ${{ secrets.TWITTER_SECRET }}
|
|
553
|
+
# twitter-access-token: ${{ secrets.TWITTER_TOKEN }}
|
|
554
|
+
# twitter-access-secret: ${{ secrets.TWITTER_TOKEN_SECRET }}
|
|
555
|
+
|
|
556
|
+
dry-run: false
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
</details>
|
|
560
|
+
|
|
561
|
+
#### Step 2: Add your secrets
|
|
562
|
+
|
|
563
|
+
Go to **Settings > Secrets and variables > Actions** and add:
|
|
564
|
+
|
|
565
|
+
| Secret | When Required | Where to Get It |
|
|
566
|
+
|:-------|:--------------|:----------------|
|
|
567
|
+
| `GITHUB_TOKEN` | Always | Auto-provided by GitHub Actions. No setup needed. |
|
|
568
|
+
| `OPENAI_API_KEY` | For AI-powered notes | [platform.openai.com/api-keys](https://platform.openai.com/api-keys) |
|
|
569
|
+
| `SLACK_WEBHOOK` | For Slack auto-post | [api.slack.com/messaging/webhooks](https://api.slack.com/messaging/webhooks) |
|
|
570
|
+
| `DISCORD_WEBHOOK` | For Discord auto-post | Server Settings > Integrations > Webhooks |
|
|
571
|
+
|
|
572
|
+
#### Step 3: Push a tag
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
git tag v1.2.0
|
|
576
|
+
git push origin v1.2.0
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
The action will analyze commits, detect breaking changes, generate release notes, create a GitHub Release, post to Slack/Discord if configured, and update your CHANGELOG.md.
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
### Path B: CLI (Zero Install)
|
|
584
|
+
|
|
585
|
+
```bash
|
|
586
|
+
# Basic: auto-detect versions from git tags
|
|
587
|
+
npx @theihtisham/ai-release-notes --github-token=$GITHUB_TOKEN --api-key=$OPENAI_API_KEY
|
|
588
|
+
|
|
589
|
+
# Specific version range
|
|
590
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0 --to=v2.0.0 --api-key=sk-xxx
|
|
591
|
+
|
|
592
|
+
# Casual tone for Slack
|
|
593
|
+
npx @theihtisham/ai-release-notes --template=casual --format=slack --from=v2.0.0
|
|
594
|
+
|
|
595
|
+
# Humorous tone in Japanese
|
|
596
|
+
npx @theihtisham/ai-release-notes --tone=humorous --language=ja --from=v1.0.0
|
|
597
|
+
|
|
598
|
+
# Dry run - preview without creating a release
|
|
599
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0 --dry-run
|
|
600
|
+
|
|
601
|
+
# Works without AI key (template-based generation)
|
|
602
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0
|
|
603
|
+
|
|
604
|
+
# Save to file
|
|
605
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0 > RELEASE_NOTES.md
|
|
606
|
+
|
|
607
|
+
# Pipe to clipboard (macOS)
|
|
608
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0 | pbcopy
|
|
609
|
+
|
|
610
|
+
# Post to custom endpoint
|
|
611
|
+
npx @theihtisham/ai-release-notes --from=v1.0.0 --format=json | curl -X POST -d @- https://api.example.com/releases
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
<details>
|
|
615
|
+
<summary><strong>:terminal: All CLI flags</strong></summary>
|
|
616
|
+
|
|
617
|
+
```
|
|
618
|
+
Usage: ai-release-notes [options]
|
|
619
|
+
|
|
620
|
+
Options:
|
|
621
|
+
--from <tag> Starting tag/commit (required)
|
|
622
|
+
--to <tag> Ending tag/commit (default: HEAD)
|
|
623
|
+
--api-key <key> OpenAI-compatible API key (optional)
|
|
624
|
+
--api-base <url> Custom API base URL (default: https://api.openai.com/v1)
|
|
625
|
+
--model <name> AI model (default: gpt-4o-mini)
|
|
626
|
+
--tone <mode> Tone: professional, casual, humorous, technical
|
|
627
|
+
--language <code> Language: en, es, fr, de, ja, zh, ko, pt, ru
|
|
628
|
+
--template <name> Template: default, minimal, detailed, enterprise, fun
|
|
629
|
+
--format <fmt> Output: markdown, html, slack, discord, twitter, compact
|
|
630
|
+
--output <file> Output file path
|
|
631
|
+
--dry-run Preview without creating release
|
|
632
|
+
--max-commits <n> Max commits to analyze (1-1000, default: 200)
|
|
633
|
+
--no-ai Disable AI, use template-based generation
|
|
634
|
+
--update-changelog Auto-update CHANGELOG.md
|
|
635
|
+
--changelog-path <path> Path to changelog file (default: CHANGELOG.md)
|
|
636
|
+
--github-token <token> GitHub token for API access
|
|
637
|
+
--slack-webhook <url> Slack webhook URL for auto-posting
|
|
638
|
+
--discord-webhook <url> Discord webhook URL for auto-posting
|
|
639
|
+
-h, --help Show help
|
|
640
|
+
-V, --version Show version
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
</details>
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
## Output Examples
|
|
648
|
+
|
|
649
|
+
### 1. Professional Markdown (GitHub / GitLab Releases)
|
|
650
|
+
|
|
651
|
+
The default format. Full-featured, beautifully formatted markdown that lands on your GitHub Releases page.
|
|
652
|
+
|
|
653
|
+
````markdown
|
|
654
|
+
# Release v2.1.0 -- "The Security & Speed Update"
|
|
655
|
+
|
|
656
|
+
> We are pleased to announce the release of version 2.1.0, which includes
|
|
657
|
+
> significant improvements to security and performance across the platform.
|
|
658
|
+
> This release contains 3 new features, 2 bug fixes, and 1 breaking change.
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
## Breaking Changes
|
|
663
|
+
|
|
664
|
+
> **Warning:** This release contains a breaking change. Please review the
|
|
665
|
+
> migration guide below before upgrading.
|
|
666
|
+
|
|
667
|
+
<details>
|
|
668
|
+
<summary><strong>Breaking Changes and Migration Guide (click to expand)</strong></summary>
|
|
669
|
+
|
|
670
|
+
### Removed deprecated /api/v1/users endpoint
|
|
671
|
+
|
|
672
|
+
**Scope:** `api`
|
|
673
|
+
**Severity:** major
|
|
674
|
+
**PR:** [#40](https://github.com/acme/app/pull/40) by @sarah
|
|
675
|
+
|
|
676
|
+
#### Before
|
|
677
|
+
```javascript
|
|
678
|
+
// Old usage -- this will now return 404
|
|
679
|
+
const response = await fetch('/api/v1/users', {
|
|
680
|
+
headers: { 'Authorization': `Bearer ${token}` }
|
|
681
|
+
});
|
|
682
|
+
const users = await response.json();
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
#### After
|
|
686
|
+
```javascript
|
|
687
|
+
// Updated to v2 API -- includes pagination by default
|
|
688
|
+
const response = await fetch('/api/v2/users?page=1&limit=50', {
|
|
689
|
+
headers: { 'Authorization': `Bearer ${token}` }
|
|
690
|
+
});
|
|
691
|
+
const { data: users, meta } = await response.json();
|
|
692
|
+
// meta.pagination contains total pages, current page, etc.
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
#### Migration Steps
|
|
696
|
+
1. Replace all `/api/v1/users` calls with `/api/v2/users`
|
|
697
|
+
2. Update response handling to use `data` wrapper and `meta.pagination`
|
|
698
|
+
3. Update all client SDK calls (SDK v3.0+ required)
|
|
699
|
+
4. Remove any v1-specific query parameters
|
|
700
|
+
|
|
701
|
+
#### Deprecation Timeline
|
|
702
|
+
- **v2.1.0 (now):** v1 endpoint returns 404 with migration header
|
|
703
|
+
- **v2.2.0:** v1 endpoint removed entirely from routing
|
|
704
|
+
- **v3.0.0:** No backward compatibility guaranteed
|
|
705
|
+
|
|
706
|
+
</details>
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
## New Features
|
|
711
|
+
|
|
712
|
+
- **User avatar upload API** [`api`] ([#42](https://github.com/acme/app/pull/42)) by @alice
|
|
713
|
+
Users can now upload profile avatars via the new `POST /api/v2/users/:id/avatar` endpoint.
|
|
714
|
+
Supports JPEG, PNG, and WebP up to 5MB. Auto-cropped and optimized.
|
|
715
|
+
|
|
716
|
+
- **Dark mode toggle** [`ui`] ([#43](https://github.com/acme/app/pull/43)) by @bob
|
|
717
|
+
System-aware dark mode toggle in user settings. Respects OS preference
|
|
718
|
+
by default and persists manual overrides in localStorage.
|
|
719
|
+
|
|
720
|
+
- **Pagination for all list endpoints** [`api`] ([#44](https://github.com/acme/app/pull/44)) by @charlie
|
|
721
|
+
Every list endpoint now supports `page` and `limit` query parameters with
|
|
722
|
+
cursor-based pagination for large datasets. Default page size is 50.
|
|
723
|
+
|
|
724
|
+
## Performance Improvements
|
|
725
|
+
|
|
726
|
+
- **Database query optimization** -- Reduced average API response time by **40%** (340ms -> 204ms)
|
|
727
|
+
on user-related endpoints through indexed query restructuring ([#47](https://github.com/acme/app/pull/47))
|
|
728
|
+
|
|
729
|
+
- **Asset pipeline rebuild** -- Frontend bundle size reduced by **23%** (1.2MB -> 924KB) through
|
|
730
|
+
tree-shaking improvements and dynamic imports ([#48](https://github.com/acme/app/pull/48))
|
|
731
|
+
|
|
732
|
+
## Bug Fixes
|
|
733
|
+
|
|
734
|
+
- **Fixed login timeout on slow connections** [`auth`] ([#45](https://github.com/acme/app/pull/45)) by @dave
|
|
735
|
+
Login requests no longer timeout after 10s on connections slower than 1Mbps. Progressive
|
|
736
|
+
polling with a 60s max timeout.
|
|
737
|
+
|
|
738
|
+
- **Fixed memory leak in event listeners** [`core`] ([#46](https://github.com/acme/app/pull/46)) by @eve
|
|
739
|
+
Resolved a memory leak where WebSocket event listeners were not properly cleaned up
|
|
740
|
+
on component unmount, causing ~2MB/hour memory growth.
|
|
741
|
+
|
|
742
|
+
## Contributors
|
|
743
|
+
|
|
744
|
+
| Contributor | Commits | First Contribution? |
|
|
745
|
+
|:------------|:--------|:--------------------|
|
|
746
|
+
| @alice | 3 | |
|
|
747
|
+
| @bob | 2 | :tada: First contribution! |
|
|
748
|
+
| @charlie | 1 | :tada: First contribution! |
|
|
749
|
+
| @dave | 1 | |
|
|
750
|
+
| @eve | 1 | |
|
|
751
|
+
| @sarah | 2 | |
|
|
752
|
+
|
|
753
|
+
**Full Changelog**: https://github.com/acme/app/compare/v2.0.0...v2.1.0
|
|
754
|
+
````
|
|
755
|
+
|
|
756
|
+
---
|
|
757
|
+
|
|
758
|
+
### 2. HTML (Email-Ready)
|
|
759
|
+
|
|
760
|
+
Standalone HTML page with inline CSS for email client compatibility. Color-coded sections, responsive design, contributor badges.
|
|
761
|
+
|
|
762
|
+
```html
|
|
763
|
+
<!DOCTYPE html>
|
|
764
|
+
<html lang="en">
|
|
765
|
+
<head>
|
|
766
|
+
<meta charset="utf-8">
|
|
767
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
768
|
+
<title>Release v2.1.0</title>
|
|
769
|
+
<style>
|
|
770
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
771
|
+
max-width: 680px; margin: 0 auto; padding: 20px; color: #24292f;
|
|
772
|
+
background: #ffffff; line-height: 1.6; }
|
|
773
|
+
.header { border-bottom: 3px solid #238636; padding-bottom: 16px; margin-bottom: 24px; }
|
|
774
|
+
.header h1 { margin: 0 0 8px; font-size: 28px; color: #1f2328; }
|
|
775
|
+
.version { display: inline-block; background: #238636; color: white;
|
|
776
|
+
padding: 4px 12px; border-radius: 12px; font-size: 14px; }
|
|
777
|
+
.summary { background: #f6f8fa; border-radius: 8px; padding: 16px; margin-bottom: 24px;
|
|
778
|
+
border-left: 4px solid #238636; }
|
|
779
|
+
.section-title.features { color: #238636; }
|
|
780
|
+
.section-title.fixes { color: #0969da; }
|
|
781
|
+
.section-title.breaking { color: #cf222e; }
|
|
782
|
+
.section-title.perf { color: #8250df; }
|
|
783
|
+
.breaking-box { background: #ffebe9; border: 1px solid #ff8182; border-radius: 8px;
|
|
784
|
+
padding: 16px; margin-bottom: 16px; }
|
|
785
|
+
.migration { background: #fff8c5; border-left: 4px solid #d29922; padding: 12px;
|
|
786
|
+
margin-top: 8px; border-radius: 4px; }
|
|
787
|
+
.scope { display: inline-block; background: #ddf4ff; color: #0969da;
|
|
788
|
+
padding: 2px 8px; border-radius: 12px; font-size: 12px; font-family: monospace; }
|
|
789
|
+
</style>
|
|
790
|
+
</head>
|
|
791
|
+
<body>
|
|
792
|
+
<div class="header">
|
|
793
|
+
<h1>Release v2.1.0</h1>
|
|
794
|
+
<span class="version">v2.1.0</span>
|
|
795
|
+
<div class="date">Released on January 15, 2025</div>
|
|
796
|
+
</div>
|
|
797
|
+
|
|
798
|
+
<div class="summary">
|
|
799
|
+
<strong>The Security & Speed Update</strong> -- 3 features, 2 fixes,
|
|
800
|
+
1 breaking change. API response time reduced by 40%. Bundle size down 23%.
|
|
801
|
+
</div>
|
|
802
|
+
|
|
803
|
+
<div class="section">
|
|
804
|
+
<h2 class="section-title breaking">Breaking Changes</h2>
|
|
805
|
+
<div class="breaking-box">
|
|
806
|
+
<strong>Removed deprecated /api/v1/users endpoint</strong><br>
|
|
807
|
+
<span class="scope">api</span> by @sarah
|
|
808
|
+
<div class="migration">
|
|
809
|
+
<strong>Migration:</strong> Use <code>/api/v2/users</code> instead.
|
|
810
|
+
Update all client SDK calls. See migration guide for before/after code.
|
|
811
|
+
</div>
|
|
812
|
+
</div>
|
|
813
|
+
</div>
|
|
814
|
+
|
|
815
|
+
<div class="section">
|
|
816
|
+
<h2 class="section-title features">New Features</h2>
|
|
817
|
+
<div class="item">
|
|
818
|
+
<strong>User avatar upload API</strong> <span class="scope">api</span><br>
|
|
819
|
+
Upload profile avatars via POST. JPEG, PNG, WebP up to 5MB.
|
|
820
|
+
<a href="#" class="link">#42</a> <span class="author">by @alice</span>
|
|
821
|
+
</div>
|
|
822
|
+
<div class="item">
|
|
823
|
+
<strong>Dark mode toggle</strong> <span class="scope">ui</span><br>
|
|
824
|
+
System-aware dark mode in user settings.
|
|
825
|
+
<a href="#" class="link">#43</a> <span class="author">by @bob</span>
|
|
826
|
+
</div>
|
|
827
|
+
<div class="item">
|
|
828
|
+
<strong>Pagination for list endpoints</strong> <span class="scope">api</span><br>
|
|
829
|
+
Every list endpoint supports page/limit. Default 50/page.
|
|
830
|
+
<a href="#" class="link">#44</a> <span class="author">by @charlie</span>
|
|
831
|
+
</div>
|
|
832
|
+
</div>
|
|
833
|
+
|
|
834
|
+
<div class="section">
|
|
835
|
+
<h2 class="section-title perf">Performance</h2>
|
|
836
|
+
<div class="item">
|
|
837
|
+
<strong>Database query optimization</strong> -- API response time reduced by
|
|
838
|
+
<strong>40%</strong> (340ms to 204ms). <a href="#" class="link">#47</a>
|
|
839
|
+
</div>
|
|
840
|
+
<div class="item">
|
|
841
|
+
<strong>Asset pipeline rebuild</strong> -- Bundle size reduced by
|
|
842
|
+
<strong>23%</strong> (1.2MB to 924KB). <a href="#" class="link">#48</a>
|
|
843
|
+
</div>
|
|
844
|
+
</div>
|
|
845
|
+
</body>
|
|
846
|
+
</html>
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
---
|
|
850
|
+
|
|
851
|
+
### 3. Slack Block Kit
|
|
852
|
+
|
|
853
|
+
Interactive Slack message with sections, dividers, and action buttons. Ready to post via webhook.
|
|
854
|
+
|
|
855
|
+
```json
|
|
856
|
+
{
|
|
857
|
+
"blocks": [
|
|
858
|
+
{
|
|
859
|
+
"type": "header",
|
|
860
|
+
"text": {
|
|
861
|
+
"type": "plain_text",
|
|
862
|
+
"text": ":rocket: Release v2.1.0",
|
|
863
|
+
"emoji": true
|
|
864
|
+
}
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"type": "context",
|
|
868
|
+
"elements": [
|
|
869
|
+
{ "type": "mrkdwn", "text": "*January 15, 2025* | 3 features | 2 fixes | 1 breaking" }
|
|
870
|
+
]
|
|
871
|
+
},
|
|
872
|
+
{ "type": "divider" },
|
|
873
|
+
{
|
|
874
|
+
"type": "section",
|
|
875
|
+
"text": {
|
|
876
|
+
"type": "mrkdwn",
|
|
877
|
+
"text": ":rotating_light: *Breaking Changes*\n`api` Removed `/api/v1/users` -- use `/api/v2/users` instead\n_Migration guide available in release notes_"
|
|
878
|
+
}
|
|
879
|
+
},
|
|
880
|
+
{ "type": "divider" },
|
|
881
|
+
{
|
|
882
|
+
"type": "section",
|
|
883
|
+
"text": {
|
|
884
|
+
"type": "mrkdwn",
|
|
885
|
+
"text": ":rocket: *New Features*\n* User avatar upload API <https://github.com/acme/app/pull/42|#42> _@alice_\n* Dark mode toggle <https://github.com/acme/app/pull/43|#43> _@bob_\n* Pagination for list endpoints <https://github.com/acme/app/pull/44|#44> _@charlie_"
|
|
886
|
+
}
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"type": "section",
|
|
890
|
+
"text": {
|
|
891
|
+
"type": "mrkdwn",
|
|
892
|
+
"text": ":zap: *Performance*\n* API response time: 340ms -> 204ms (-40%) <https://github.com/acme/app/pull/47|#47>\n* Bundle size: 1.2MB -> 924KB (-23%) <https://github.com/acme/app/pull/48|#48>"
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"type": "section",
|
|
897
|
+
"text": {
|
|
898
|
+
"type": "mrkdwn",
|
|
899
|
+
"text": ":bug: *Bug Fixes*\n* Login timeout on slow connections <https://github.com/acme/app/pull/45|#45> _@dave_\n* Memory leak in event listeners <https://github.com/acme/app/pull/46|#46> _@eve_"
|
|
900
|
+
}
|
|
901
|
+
},
|
|
902
|
+
{ "type": "divider" },
|
|
903
|
+
{
|
|
904
|
+
"type": "context",
|
|
905
|
+
"elements": [
|
|
906
|
+
{ "type": "mrkdwn", "text": ":busts_in_silhouette: `@alice` (3) `@bob` (2) :star: `@charlie` (1) :star: `@dave` (1) `@eve` (1) `@sarah` (2)" }
|
|
907
|
+
]
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"type": "actions",
|
|
911
|
+
"elements": [
|
|
912
|
+
{
|
|
913
|
+
"type": "button",
|
|
914
|
+
"text": { "type": "plain_text", "text": "View Full Release Notes" },
|
|
915
|
+
"url": "https://github.com/acme/app/releases/tag/v2.1.0",
|
|
916
|
+
"style": "primary"
|
|
917
|
+
},
|
|
918
|
+
{
|
|
919
|
+
"type": "button",
|
|
920
|
+
"text": { "type": "plain_text", "text": "View Changelog" },
|
|
921
|
+
"url": "https://github.com/acme/app/compare/v2.0.0...v2.1.0"
|
|
922
|
+
}
|
|
923
|
+
]
|
|
924
|
+
}
|
|
925
|
+
]
|
|
926
|
+
}
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
---
|
|
930
|
+
|
|
931
|
+
### 4. Discord Rich Embeds
|
|
932
|
+
|
|
933
|
+
Color-coded embeds with fields layout. Each section gets its own embed with a distinct color.
|
|
934
|
+
|
|
935
|
+
```json
|
|
936
|
+
{
|
|
937
|
+
"username": "Release Bot",
|
|
938
|
+
"avatar_url": "https://github.com/acme/app/blob/main/assets/logo.png",
|
|
939
|
+
"embeds": [
|
|
940
|
+
{
|
|
941
|
+
"title": "Release v2.1.0 -- The Security & Speed Update",
|
|
942
|
+
"url": "https://github.com/acme/app/releases/tag/v2.1.0",
|
|
943
|
+
"color": 5763719,
|
|
944
|
+
"description": "3 features, 2 bug fixes, 1 breaking change.\nAPI response time reduced by 40%. Bundle size down 23%.",
|
|
945
|
+
"fields": [
|
|
946
|
+
{ "name": "Version", "value": "v2.1.0", "inline": true },
|
|
947
|
+
{ "name": "Date", "value": "2025-01-15", "inline": true },
|
|
948
|
+
{ "name": "Commits", "value": "14", "inline": true },
|
|
949
|
+
{ "name": "Contributors", "value": "6", "inline": true }
|
|
950
|
+
],
|
|
951
|
+
"footer": { "text": "Auto-generated by AI Release Notes" },
|
|
952
|
+
"timestamp": "2025-01-15T10:30:00Z"
|
|
953
|
+
},
|
|
954
|
+
{
|
|
955
|
+
"title": ":warning: Breaking Changes",
|
|
956
|
+
"color": 15554053,
|
|
957
|
+
"fields": [
|
|
958
|
+
{
|
|
959
|
+
"name": "Removed /api/v1/users endpoint",
|
|
960
|
+
"value": "**Scope:** `api` | **Severity:** major\n**Migration:** Use `/api/v2/users` instead\n**Details:** [#40](https://github.com/acme/app/pull/40)"
|
|
961
|
+
}
|
|
962
|
+
]
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
"title": ":rocket: New Features",
|
|
966
|
+
"color": 5763719,
|
|
967
|
+
"fields": [
|
|
968
|
+
{
|
|
969
|
+
"name": "User avatar upload API",
|
|
970
|
+
"value": "Upload profile avatars via `POST /api/v2/users/:id/avatar`. JPEG, PNG, WebP up to 5MB. [#42](...) by `@alice`"
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"name": "Dark mode toggle",
|
|
974
|
+
"value": "System-aware dark mode in user settings. Respects OS preference. [#43](...) by `@bob`"
|
|
975
|
+
},
|
|
976
|
+
{
|
|
977
|
+
"name": "Pagination for list endpoints",
|
|
978
|
+
"value": "Every list endpoint supports `page` and `limit`. Default 50/page. [#44](...) by `@charlie`"
|
|
979
|
+
}
|
|
980
|
+
]
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
"title": ":zap: Performance",
|
|
984
|
+
"color": 8250df,
|
|
985
|
+
"fields": [
|
|
986
|
+
{ "name": "API response time", "value": "340ms -> 204ms (**-40%**)", "inline": true },
|
|
987
|
+
{ "name": "Bundle size", "value": "1.2MB -> 924KB (**-23%**)", "inline": true }
|
|
988
|
+
]
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
"title": ":bug: Bug Fixes",
|
|
992
|
+
"color": 3447003,
|
|
993
|
+
"fields": [
|
|
994
|
+
{ "name": "Login timeout on slow connections", "value": "Progressive polling with 60s max. [#45](...) by `@dave`", "inline": true },
|
|
995
|
+
{ "name": "Memory leak in event listeners", "value": "Fixed ~2MB/hr leak. [#46](...) by `@eve`", "inline": true }
|
|
996
|
+
]
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"title": ":busts_in_silhouette: Contributors",
|
|
1000
|
+
"color": 5793266,
|
|
1001
|
+
"description": "`@alice` (3 commits) | `@bob` (2) :star: | `@charlie` (1) :star: | `@dave` (1) | `@eve` (1) | `@sarah` (2)",
|
|
1002
|
+
"footer": { "text": ":star: = First contribution!" }
|
|
1003
|
+
}
|
|
1004
|
+
]
|
|
1005
|
+
}
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
---
|
|
1009
|
+
|
|
1010
|
+
### 5. Twitter/X Thread (7 Tweets)
|
|
1011
|
+
|
|
1012
|
+
Optimized for engagement. Thread format with hook, features, performance, breaking changes, and CTA.
|
|
1013
|
+
|
|
1014
|
+
```json
|
|
1015
|
+
[
|
|
1016
|
+
"1/7 v2.1.0 is HERE.\n\n3 features. 2 bug fixes. 40% faster APIs.\nThe biggest update since our launch.\n\nHere's everything (and one breaking change): >>>",
|
|
1017
|
+
"2/7 :rocket: New in v2.1.0:\n\n- Avatar uploads (JPEG, PNG, WebP up to 5MB) #42\n- Dark mode (system-aware, respects OS preference) #43\n- Pagination on ALL list endpoints (50/page default) #44\n\nYes, dark mode. We heard you.",
|
|
1018
|
+
"3/7 :zap: Performance:\n\nAPI response time: 340ms -> 204ms (-40%)\nBundle size: 1.2MB -> 924KB (-23%)\n\nThat's not a typo. Your app just got significantly faster.",
|
|
1019
|
+
"4/7 :wrench: Bugs squashed:\n\n- Login no longer times out on slow connections #45\n- Fixed memory leak eating ~2MB/hr in event listeners #46\n\nYour apps will thank you.",
|
|
1020
|
+
"5/7 :rotating_light: BREAKING CHANGE:\n\n/api/v1/users is GONE.\nUse /api/v2/users instead.\nMigration guide is in the full release notes. We've got your back.",
|
|
1021
|
+
"6/7 Contributors: @alice (3) @bob (2) :tada: @charlie (1) :tada: @dave (1) @eve (1) @sarah (2)\n\n:tada: = First time contributors!\n\nFull changelog:\ngithub.com/acme/app/compare/v2.0.0...v2.1.0\n\n#ReleaseNotes #OpenSource #Changelog",
|
|
1022
|
+
"7/7 That's v2.1.0!\n\nnpm install your-package@2.1.0\n\nStar us on GitHub if this saved you time!\nFeedback? Reply to this thread."
|
|
1023
|
+
]
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
---
|
|
1027
|
+
|
|
1028
|
+
### 6. Compact Mode
|
|
1029
|
+
|
|
1030
|
+
Minimal. Every word counts. For changelogs, feeds, and SMS notifications.
|
|
1031
|
+
|
|
1032
|
+
```
|
|
1033
|
+
v2.1.0 (2025-01-15) -- 3 features, 2 fixes, 1 breaking
|
|
1034
|
+
|
|
1035
|
+
BREAKING: /api/v1/users removed -> use /api/v2/users (#40 @sarah)
|
|
1036
|
+
FEAT: Avatar upload API - JPEG/PNG/WebP up to 5MB (#42 @alice)
|
|
1037
|
+
FEAT: Dark mode toggle - system-aware (#43 @bob)
|
|
1038
|
+
FEAT: Pagination on list endpoints - 50/page default (#44 @charlie)
|
|
1039
|
+
PERF: API response time -40% (340ms->204ms) (#47)
|
|
1040
|
+
PERF: Bundle size -23% (1.2MB->924KB) (#48)
|
|
1041
|
+
FIX: Login timeout on slow connections (#45 @dave)
|
|
1042
|
+
FIX: Memory leak in event listeners (#46 @eve)
|
|
1043
|
+
|
|
1044
|
+
Contributors: @alice @bob @charlie @dave @eve @sarah
|
|
1045
|
+
https://github.com/acme/app/compare/v2.0.0...v2.1.0
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
---
|
|
1049
|
+
|
|
1050
|
+
## Tone Examples
|
|
1051
|
+
|
|
1052
|
+
The same release opening line in all four tones:
|
|
1053
|
+
|
|
1054
|
+
| Tone | Opening Line |
|
|
1055
|
+
|:-----|:-------------|
|
|
1056
|
+
| :briefcase: **Professional** | "We are pleased to announce the release of version 2.1.0, which includes significant improvements to security and performance across the platform. This release contains 3 new features, 2 bug fixes, and 1 breaking change." |
|
|
1057
|
+
| :wave: **Casual** | "v2.1.0 just dropped! We've got avatar uploads, dark mode, and pagination. Plus we squashed two annoying bugs and made everything 40% faster. Heads up: there's one breaking change." |
|
|
1058
|
+
| :joy: **Humorous** | "Plot twist: v2.1.0 is here and it's bringing gifts. Dark mode (because we know you code at 3AM), avatar uploads (time to ditch the default silhouette), and pagination (because loading 10,000 results was... a choice). We also evicted two bugs from the premises." |
|
|
1059
|
+
| :gear: **Technical** | "`v2.1.0` (MINOR bump -- contains 1 breaking change in `api` scope). Core changes: new avatar upload endpoint (`POST /api/v2/users/:id/avatar`), CSS media query dark mode, cursor-based pagination on all list endpoints. Auth timeout: 10s -> 60s with progressive polling." |
|
|
1060
|
+
|
|
1061
|
+
Full tone comparison for every section:
|
|
1062
|
+
|
|
1063
|
+
| Section | :briefcase: Professional | :wave: Casual | :joy: Humorous | :gear: Technical |
|
|
1064
|
+
|:--------|:-------------------------|:--------------|:---------------|:-----------------|
|
|
1065
|
+
| **Opening** | "We are pleased to announce..." | "v2.1.0 just dropped!" | "Plot twist: v2.1.0 is here..." | "`v2.1.0` (MINOR -- contains breaking changes)" |
|
|
1066
|
+
| **Features** | "New Features" -- formal descriptions with scope tags | "What's New" -- friendly, conversational | "Things That Are New and Shiny" -- playful commentary | "`feat:` New Features" -- commit-style with technical details |
|
|
1067
|
+
| **Fixes** | "Bug Fixes and Resolutions" -- clinical, detailed | "Bug Squashes" -- "Login should stop timing out now" | "Bugs We Sent to Bug Heaven" -- irreverent fun | "`fix:` Bug Fixes" -- root cause + resolution |
|
|
1068
|
+
| **Breaking** | "This release introduces a change to the public API that may require migration..." | "Heads up! We changed something that might affect you..." | "Plot twist: we broke something on purpose..." | "`[api] BREAKING:` Removed endpoint with before/after code" |
|
|
1069
|
+
| **Perf** | "Performance Improvements" -- benchmarks cited | "Speed Boosts" -- "Things are faster now!" | "We Made It Go Brrr" -- meme-friendly | "`perf:` Performance Optimizations" -- specific metrics |
|
|
1070
|
+
| **Security** | "Security Enhancements" -- CVE references | "Security Fixes" -- "Your stuff is safer now" | "Fort Knox Mode: Activated" -- dramatic | "`security:` Security Patches" -- advisory links |
|
|
1071
|
+
| **Docs** | "Documentation Updates" -- formal | "Docs & Guides" -- helpful tone | "Words About Code" -- self-aware | "`docs:` Documentation" -- changelog entries |
|
|
1072
|
+
| **Tests** | "Test Coverage Improvements" | "Test Improvements" -- "More tests!" | "We Actually Test Things Now" | "`test:` Test Suite" -- coverage metrics |
|
|
1073
|
+
| **Chores** | "Maintenance and Infrastructure" | "Housekeeping" | "Things Nobody Sees But Everyone Needs" | "`chore:` Build/CI/Maintenance" |
|
|
1074
|
+
| **Contributors** | Formal table with commit counts | Friendly shout-outs with emojis | "The heroes who made this happen" | Committer list with email hashes |
|
|
1075
|
+
|
|
1076
|
+
---
|
|
1077
|
+
|
|
1078
|
+
## Configuration
|
|
1079
|
+
|
|
1080
|
+
### Inputs
|
|
1081
|
+
|
|
1082
|
+
Every parameter you can configure:
|
|
1083
|
+
|
|
1084
|
+
| Input | Description | Required | Default | Example |
|
|
1085
|
+
|:------|:------------|:--------|:--------|:--------|
|
|
1086
|
+
| `github-token` | GitHub token for API access (repo + releases) | Yes | -- | `${{ secrets.GITHUB_TOKEN }}` |
|
|
1087
|
+
| `api-key` | OpenAI-compatible API key. Remove for template-only mode | No | -- | `sk-...` |
|
|
1088
|
+
| `api-base` | Custom API endpoint (Ollama, Azure, etc.) | No | `https://api.openai.com/v1` | `http://localhost:11434/v1` |
|
|
1089
|
+
| `model` | AI model for natural language generation | No | `gpt-4o-mini` | `gpt-4o`, `llama3` |
|
|
1090
|
+
| `template` | Output template | No | `default` | `minimal`, `detailed`, `enterprise`, `fun` |
|
|
1091
|
+
| `commit-mode` | How to collect changes | No | `auto` | `commits`, `pull-requests` |
|
|
1092
|
+
| `version-from` | How to determine version number | No | `tag` | `package-json`, `manual` |
|
|
1093
|
+
| `version` | Manual version (when `version-from` is `manual`) | No | -- | `v2.0.0` |
|
|
1094
|
+
| `previous-tag` | Previous release tag (auto-detected if omitted) | No | Auto | `v1.9.0` |
|
|
1095
|
+
| `max-commits` | Maximum commits to analyze (prevents token overflow) | No | `200` | `50`, `500` |
|
|
1096
|
+
| `language` | Output language | No | `en` | `es`, `fr`, `de`, `ja`, `ko`, `zh`, `pt`, `ru` |
|
|
1097
|
+
| `categories` | Custom categories as JSON array | No | `auto` | `[{"label":"Features","patterns":["feat"]}]` |
|
|
1098
|
+
| `include-breaking` | Include BREAKING CHANGE section | No | `true` | `false` |
|
|
1099
|
+
| `include-contributors` | Include contributor acknowledgments | No | `true` | `false` |
|
|
1100
|
+
| `include-diff-stats` | Include file change statistics | No | `true` | `false` |
|
|
1101
|
+
| `include-screenshots` | Detect and include PR screenshots | No | `true` | `false` |
|
|
1102
|
+
| `dry-run` | Generate notes without creating a release | No | `false` | `true` |
|
|
1103
|
+
| `slack-webhook` | Slack webhook URL for auto-posting | No | -- | `https://hooks.slack.com/...` |
|
|
1104
|
+
| `discord-webhook` | Discord webhook URL for auto-posting | No | -- | `https://discord.com/api/webhooks/...` |
|
|
1105
|
+
| `twitter-consumer-key` | Twitter API consumer key | No | -- | -- |
|
|
1106
|
+
| `twitter-consumer-secret` | Twitter API consumer secret | No | -- | -- |
|
|
1107
|
+
| `twitter-access-token` | Twitter API access token | No | -- | -- |
|
|
1108
|
+
| `twitter-access-secret` | Twitter API access token secret | No | -- | -- |
|
|
1109
|
+
| `update-changelog` | Auto-update CHANGELOG.md | No | `false` | `true` |
|
|
1110
|
+
| `changelog-path` | Path to changelog file | No | `CHANGELOG.md` | `docs/CHANGES.md` |
|
|
1111
|
+
|
|
1112
|
+
### Outputs
|
|
1113
|
+
|
|
1114
|
+
| Output | Description | Example |
|
|
1115
|
+
|:-------|:------------|:--------|
|
|
1116
|
+
| `version` | The calculated/extracted version number | `v2.1.0` |
|
|
1117
|
+
| `release-notes` | Generated release notes in markdown | *(full markdown output)* |
|
|
1118
|
+
| `release-url` | URL of the created GitHub Release | `https://github.com/acme/app/releases/tag/v2.1.0` |
|
|
1119
|
+
| `summary` | One-line summary of the release | `3 features, 2 fixes, 1 breaking change` |
|
|
1120
|
+
| `changelog` | Generated CHANGELOG.md content | *(full changelog)* |
|
|
1121
|
+
|
|
1122
|
+
---
|
|
1123
|
+
|
|
1124
|
+
## Architecture
|
|
1125
|
+
|
|
1126
|
+
How AI Release Notes works under the hood:
|
|
1127
|
+
|
|
1128
|
+
```
|
|
1129
|
+
+=====================================================================+
|
|
1130
|
+
| AI RELEASE NOTES |
|
|
1131
|
+
| The Complete Pipeline |
|
|
1132
|
+
+=====================================================================+
|
|
1133
|
+
| |
|
|
1134
|
+
| +------------------+ |
|
|
1135
|
+
| | Git Trigger | tag push / workflow_dispatch / CLI |
|
|
1136
|
+
| +--------+---------+ |
|
|
1137
|
+
| | |
|
|
1138
|
+
| v |
|
|
1139
|
+
| +================================================================+ |
|
|
1140
|
+
| | COMMIT ANALYSIS ENGINE | |
|
|
1141
|
+
| | | |
|
|
1142
|
+
| | +--------------+ +-------------+ +---------------------+ | |
|
|
1143
|
+
| | | Categorizer | | Semver | | Breaking Change | | |
|
|
1144
|
+
| | | | | Calculator | | Detector | | |
|
|
1145
|
+
| | | feat: -> feat | | | | | | |
|
|
1146
|
+
| | | fix: -> fix | | feat -> min | | 1. ! suffix | | |
|
|
1147
|
+
| | | docs: -> docs| | fix -> pat| | 2. BREAKING CHANGE | | |
|
|
1148
|
+
| | | perf: -> perf| | break -> maj| | 3. breaking: prefix| | |
|
|
1149
|
+
| | | Custom JSON | | | | 4. API keywords | | |
|
|
1150
|
+
| | | categories | | Version | | 5. Code diff | | |
|
|
1151
|
+
| | +-------+------+ +------+------+ +---------+----------+ | |
|
|
1152
|
+
| | | | | | |
|
|
1153
|
+
| | +------+ +--------+------+ | | |
|
|
1154
|
+
| | | | | | | |
|
|
1155
|
+
| | v v v v | |
|
|
1156
|
+
| | +--------------+ +--------------------------+ | |
|
|
1157
|
+
| | | AI Writer | | Migration Guide Gen | | |
|
|
1158
|
+
| | | (OpenAI) | | - Before/After code | | |
|
|
1159
|
+
| | | | | - Migration steps | | |
|
|
1160
|
+
| | | OR | | - Deprecation timeline | | |
|
|
1161
|
+
| | | Template | | - Upgrade commands | | |
|
|
1162
|
+
| | | Engine | | - Severity rating | | |
|
|
1163
|
+
| | +-------+------+ +-----------+--------------+ | |
|
|
1164
|
+
| +==================+=====================+======================+ |
|
|
1165
|
+
| | | |
|
|
1166
|
+
| v v |
|
|
1167
|
+
| +================================================================+ |
|
|
1168
|
+
| | OUTPUT FORMATTERS | |
|
|
1169
|
+
| | | |
|
|
1170
|
+
| | +--------+ +--------+ +--------+ +---------+ +---------+ | |
|
|
1171
|
+
| | | MD | | HTML | | SLACK | | DISCORD | | TWITTER | | |
|
|
1172
|
+
| | | GitHub | | Email | | Block | | Rich | | /X | | |
|
|
1173
|
+
| | | GitLab | | Ready | | Kit | | Embeds | | Thread | | |
|
|
1174
|
+
| | +--------+ +--------+ +--------+ +---------+ +---------+ | |
|
|
1175
|
+
| | | |
|
|
1176
|
+
| | +-------------+ +-----------+ +---------+ +------------+ | |
|
|
1177
|
+
| | | TONE ENGINE | | LANGUAGE | | COMPACT | | CUSTOM | | |
|
|
1178
|
+
| | | 4 tones | | 9 locales | | MODE | | TEMPLATES | | |
|
|
1179
|
+
| | +-------------+ +-----------+ +---------+ +------------+ | |
|
|
1180
|
+
| +==============================+================================+ |
|
|
1181
|
+
| | |
|
|
1182
|
+
| v |
|
|
1183
|
+
| +================================================================+ |
|
|
1184
|
+
| | INTEGRATIONS | |
|
|
1185
|
+
| | | |
|
|
1186
|
+
| | +----------+ +----------+ +----------+ +---------------+ | |
|
|
1187
|
+
| | | GitHub | | Slack & | | Twitter/ | | CHANGELOG.md | | |
|
|
1188
|
+
| | | Release | | Discord | | X Post | | Auto-Update | | |
|
|
1189
|
+
| | | Create | | Webhook | | Thread | | Git Commit | | |
|
|
1190
|
+
| | +----------+ +----------+ +----------+ +---------------+ | |
|
|
1191
|
+
| +================================================================+ |
|
|
1192
|
+
+=====================================================================+
|
|
1193
|
+
```
|
|
1194
|
+
|
|
1195
|
+
---
|
|
1196
|
+
|
|
1197
|
+
## Breaking Change Detection
|
|
1198
|
+
|
|
1199
|
+
The analyzer detects breaking changes through **5 independent methods**, running in parallel for maximum coverage:
|
|
1200
|
+
|
|
1201
|
+
### Method 1: Conventional Commit `!` Suffix
|
|
1202
|
+
|
|
1203
|
+
```bash
|
|
1204
|
+
feat!: redesigned the entire authentication API
|
|
1205
|
+
fix(auth)!: changed login function signature
|
|
1206
|
+
refactor(core)!: rewrote plugin system
|
|
1207
|
+
```
|
|
1208
|
+
|
|
1209
|
+
Any commit type with `!` between the type and `:` is flagged as breaking.
|
|
1210
|
+
|
|
1211
|
+
### Method 2: BREAKING CHANGE Footer
|
|
1212
|
+
|
|
1213
|
+
```bash
|
|
1214
|
+
feat: add new caching layer
|
|
1215
|
+
|
|
1216
|
+
BREAKING CHANGE: The cache key format has changed from
|
|
1217
|
+
`{userId}:{key}` to `{tenant}:{userId}:{key}`. All cached
|
|
1218
|
+
data will be invalidated on upgrade.
|
|
1219
|
+
|
|
1220
|
+
Migration: Clear your Redis cache after upgrading.
|
|
1221
|
+
```
|
|
1222
|
+
|
|
1223
|
+
Standard conventional commit footer. Multi-line descriptions supported.
|
|
1224
|
+
|
|
1225
|
+
### Method 3: `breaking:` Prefix
|
|
1226
|
+
|
|
1227
|
+
```bash
|
|
1228
|
+
breaking: removed support for Node.js 14
|
|
1229
|
+
breaking(api): deprecated v1 endpoints, use v2
|
|
1230
|
+
```
|
|
1231
|
+
|
|
1232
|
+
Explicit breaking change commits that don't follow conventional format.
|
|
1233
|
+
|
|
1234
|
+
### Method 4: Deprecation Keywords
|
|
1235
|
+
|
|
1236
|
+
```bash
|
|
1237
|
+
refactor: remove deprecated getUser() method
|
|
1238
|
+
feat: rename validateInput to validatePayload
|
|
1239
|
+
docs: deprecating the legacy callback API
|
|
1240
|
+
```
|
|
1241
|
+
|
|
1242
|
+
Detects `remove`, `rename`, `deprecat(e|ed|ing)` followed by method/function/API names using pattern matching.
|
|
1243
|
+
|
|
1244
|
+
### Method 5: Code Analysis
|
|
1245
|
+
|
|
1246
|
+
```bash
|
|
1247
|
+
# Detected automatically from the diff:
|
|
1248
|
+
- Removed export files (deleted index.ts in public API)
|
|
1249
|
+
- Large deletion ratios (>60% lines removed in a file)
|
|
1250
|
+
- Public API modifications (changed function signatures in exported modules)
|
|
1251
|
+
```
|
|
1252
|
+
|
|
1253
|
+
Static analysis of the actual diff to detect structural breaking changes.
|
|
1254
|
+
|
|
1255
|
+
### What Each Breaking Change Includes
|
|
1256
|
+
|
|
1257
|
+
| Field | Description |
|
|
1258
|
+
|:------|:------------|
|
|
1259
|
+
| Description | Human-readable explanation of what broke and why |
|
|
1260
|
+
| Scope | Affected module/area (e.g., `api`, `auth`, `core`) |
|
|
1261
|
+
| Severity | `major`, `minor`, or `patch` impact level |
|
|
1262
|
+
| PR Reference | Link to the pull request with author |
|
|
1263
|
+
| Migration Guide | Step-by-step upgrade instructions |
|
|
1264
|
+
| Before Code | Working code from the previous version |
|
|
1265
|
+
| After Code | Updated code for the new version |
|
|
1266
|
+
| Affected APIs | List of changed function/class signatures |
|
|
1267
|
+
| Timeline | Deprecation schedule with key dates |
|
|
1268
|
+
| Upgrade Commands | Package-specific commands (`npm`, `yarn`, `pnpm`) |
|
|
1269
|
+
|
|
1270
|
+
---
|
|
1271
|
+
|
|
1272
|
+
## Detailed Setup Guides
|
|
1273
|
+
|
|
1274
|
+
<details>
|
|
1275
|
+
<summary><strong>:brain: AI Provider Configuration</strong></summary>
|
|
1276
|
+
|
|
1277
|
+
### OpenAI (Default)
|
|
1278
|
+
|
|
1279
|
+
```yaml
|
|
1280
|
+
- uses: theihtisham/ai-release-notes@v1
|
|
1281
|
+
with:
|
|
1282
|
+
api-key: ${{ secrets.OPENAI_API_KEY }}
|
|
1283
|
+
model: gpt-4o-mini # or gpt-4o, gpt-4-turbo
|
|
1284
|
+
```
|
|
1285
|
+
|
|
1286
|
+
### Azure OpenAI
|
|
1287
|
+
|
|
1288
|
+
```yaml
|
|
1289
|
+
- uses: theihtisham/ai-release-notes@v1
|
|
1290
|
+
with:
|
|
1291
|
+
api-key: ${{ secrets.AZURE_OPENAI_KEY }}
|
|
1292
|
+
api-base: https://your-resource.openai.azure.com/openai/deployments/your-deployment
|
|
1293
|
+
model: gpt-4o
|
|
1294
|
+
```
|
|
1295
|
+
|
|
1296
|
+
### Local LLM (Ollama, LM Studio)
|
|
1297
|
+
|
|
1298
|
+
```yaml
|
|
1299
|
+
- uses: theihtisham/ai-release-notes@v1
|
|
1300
|
+
with:
|
|
1301
|
+
api-key: not-needed
|
|
1302
|
+
api-base: http://localhost:11434/v1
|
|
1303
|
+
model: llama3
|
|
1304
|
+
```
|
|
1305
|
+
|
|
1306
|
+
### Any OpenAI-Compatible API
|
|
1307
|
+
|
|
1308
|
+
```yaml
|
|
1309
|
+
- uses: theihtisham/ai-release-notes@v1
|
|
1310
|
+
with:
|
|
1311
|
+
api-key: ${{ secrets.CUSTOM_API_KEY }}
|
|
1312
|
+
api-base: https://your-api.example.com/v1
|
|
1313
|
+
model: your-model-name
|
|
1314
|
+
```
|
|
1315
|
+
|
|
1316
|
+
### Without AI Key (Template Engine)
|
|
1317
|
+
|
|
1318
|
+
```yaml
|
|
1319
|
+
- uses: theihtisham/ai-release-notes@v1
|
|
1320
|
+
with:
|
|
1321
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
1322
|
+
# No api-key needed -- uses intelligent template-based generation
|
|
1323
|
+
```
|
|
1324
|
+
|
|
1325
|
+
Works offline. No API calls. Still generates great release notes using conventional commit analysis and templates.
|
|
1326
|
+
|
|
1327
|
+
</details>
|
|
1328
|
+
|
|
1329
|
+
<details>
|
|
1330
|
+
<summary><strong>:package: Node.js Library API</strong></summary>
|
|
1331
|
+
|
|
1332
|
+
### Programmatic Usage
|
|
1333
|
+
|
|
1334
|
+
```javascript
|
|
1335
|
+
import { generateReleaseNotes } from '@theihtisham/ai-release-notes';
|
|
1336
|
+
|
|
1337
|
+
// Basic usage
|
|
1338
|
+
const result = await generateReleaseNotes({
|
|
1339
|
+
owner: 'USERNAME',
|
|
1340
|
+
repo: 'your-repo',
|
|
1341
|
+
fromTag: 'v1.0.0',
|
|
1342
|
+
toTag: 'v1.1.0',
|
|
1343
|
+
githubToken: process.env.GITHUB_TOKEN,
|
|
1344
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
1345
|
+
});
|
|
1346
|
+
|
|
1347
|
+
console.log(result.releaseNotes); // Markdown string
|
|
1348
|
+
console.log(result.version); // 'v1.1.0'
|
|
1349
|
+
console.log(result.summary); // One-line summary
|
|
1350
|
+
console.log(result.releaseUrl); // GitHub Release URL
|
|
1351
|
+
|
|
1352
|
+
// With all options
|
|
1353
|
+
const result = await generateReleaseNotes({
|
|
1354
|
+
owner: 'USERNAME',
|
|
1355
|
+
repo: 'your-repo',
|
|
1356
|
+
fromTag: 'v1.0.0',
|
|
1357
|
+
toTag: 'v1.1.0',
|
|
1358
|
+
githubToken: process.env.GITHUB_TOKEN,
|
|
1359
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
1360
|
+
apiBase: 'https://api.openai.com/v1',
|
|
1361
|
+
model: 'gpt-4o-mini',
|
|
1362
|
+
tone: 'professional',
|
|
1363
|
+
language: 'en',
|
|
1364
|
+
template: 'detailed',
|
|
1365
|
+
includeBreaking: true,
|
|
1366
|
+
includeContributors: true,
|
|
1367
|
+
includeDiffStats: true,
|
|
1368
|
+
maxCommits: 200,
|
|
1369
|
+
});
|
|
1370
|
+
```
|
|
1371
|
+
|
|
1372
|
+
### Get Specific Formats
|
|
1373
|
+
|
|
1374
|
+
```javascript
|
|
1375
|
+
import {
|
|
1376
|
+
generateReleaseNotes,
|
|
1377
|
+
formatSlack,
|
|
1378
|
+
formatDiscord,
|
|
1379
|
+
formatTwitter,
|
|
1380
|
+
formatHTML,
|
|
1381
|
+
formatCompact,
|
|
1382
|
+
} from '@theihtisham/ai-release-notes';
|
|
1383
|
+
|
|
1384
|
+
const result = await generateReleaseNotes({ /* ... */ });
|
|
1385
|
+
|
|
1386
|
+
// Get different formats from the same analysis
|
|
1387
|
+
const slack = formatSlack(result.analysis);
|
|
1388
|
+
const discord = formatDiscord(result.analysis);
|
|
1389
|
+
const twitter = formatTwitter(result.analysis);
|
|
1390
|
+
const html = formatHTML(result.analysis);
|
|
1391
|
+
const compact = formatCompact(result.analysis);
|
|
1392
|
+
```
|
|
1393
|
+
|
|
1394
|
+
</details>
|
|
1395
|
+
|
|
1396
|
+
---
|
|
1397
|
+
|
|
1398
|
+
## Development
|
|
1399
|
+
|
|
1400
|
+
```bash
|
|
1401
|
+
# Install dependencies
|
|
1402
|
+
npm install
|
|
1403
|
+
|
|
1404
|
+
# Run the full test suite (148 tests)
|
|
1405
|
+
npm test
|
|
1406
|
+
|
|
1407
|
+
# Build the bundled action
|
|
1408
|
+
npm run build
|
|
1409
|
+
|
|
1410
|
+
# Lint source code
|
|
1411
|
+
npm run lint
|
|
1412
|
+
|
|
1413
|
+
# Format with Prettier
|
|
1414
|
+
npm run format
|
|
1415
|
+
```
|
|
1416
|
+
|
|
1417
|
+
### Test Coverage
|
|
1418
|
+
|
|
1419
|
+
| Suite | Tests | Coverage |
|
|
1420
|
+
|:------|:------|:---------|
|
|
1421
|
+
| Commit Analysis | 32 | Categorization, conventional commits, grouping |
|
|
1422
|
+
| Breaking Change Detection | 28 | All 5 detection methods, severity, migration |
|
|
1423
|
+
| Format Generation | 24 | Markdown, HTML, Slack, Discord, Twitter, Compact |
|
|
1424
|
+
| Tone Adjustment | 16 | Professional, Casual, Humorous, Technical |
|
|
1425
|
+
| Language Support | 18 | All 9 languages |
|
|
1426
|
+
| Version Calculation | 14 | Semver bumps, tag parsing, package.json |
|
|
1427
|
+
| Integration | 16 | GitHub API, webhooks, CLI, library |
|
|
1428
|
+
|
|
1429
|
+
**Total: 148 tests passing**
|
|
1430
|
+
|
|
1431
|
+
---
|
|
1432
|
+
|
|
1433
|
+
## Roadmap
|
|
1434
|
+
|
|
1435
|
+
- [ ] GitLab and Bitbucket support
|
|
1436
|
+
- [ ] Notion integration for release documentation
|
|
1437
|
+
- [ ] Email templates for subscriber notifications
|
|
1438
|
+
- [ ] RSS feed generation
|
|
1439
|
+
- [ ] Custom template system with Handlebars
|
|
1440
|
+
- [ ] Multi-repo / monorepo support
|
|
1441
|
+
- [ ] Release notes diff comparison (v1 vs v2 output)
|
|
1442
|
+
- [ ] Contributor recognition with GitHub avatar images
|
|
1443
|
+
- [ ] Automatic social media image generation (og:image)
|
|
1444
|
+
- [ ] Linear/Jira issue linking from commit references
|
|
1445
|
+
- [ ] Release health scoring (coverage, breaking change ratio)
|
|
1446
|
+
- [ ] AI-powered release title generation
|
|
1447
|
+
|
|
1448
|
+
---
|
|
1449
|
+
|
|
1450
|
+
## Contributing
|
|
1451
|
+
|
|
1452
|
+
We love contributions! Here's how to get started:
|
|
1453
|
+
|
|
1454
|
+
1. **Fork** the repository
|
|
1455
|
+
2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
|
|
1456
|
+
3. **Write tests** for your feature (we have 148 tests and counting)
|
|
1457
|
+
4. **Run** `npm test && npm run build` to verify everything passes
|
|
1458
|
+
5. **Submit** a pull request with a clear description
|
|
1459
|
+
|
|
1460
|
+
Please ensure:
|
|
1461
|
+
- All tests pass (`npm test`)
|
|
1462
|
+
- Code is linted (`npm run lint`)
|
|
1463
|
+
- Code is formatted (`npm run format`)
|
|
1464
|
+
- New features include test coverage
|
|
1465
|
+
|
|
1466
|
+
### Contribution Ideas
|
|
1467
|
+
|
|
1468
|
+
- New output formats (Notion, Confluence, Jira)
|
|
1469
|
+
- New languages (Arabic, Hindi, Turkish, Vietnamese)
|
|
1470
|
+
- New tone modes (Excited, Concise, Executive)
|
|
1471
|
+
- AI provider integrations (Anthropic, Google, Cohere)
|
|
1472
|
+
- Template system improvements
|
|
1473
|
+
- Documentation and examples
|
|
1474
|
+
|
|
1475
|
+
---
|
|
1476
|
+
|
|
1477
|
+
## License
|
|
1478
|
+
|
|
1479
|
+
MIT License -- use it however you want. See [LICENSE](LICENSE) for details.
|
|
1480
|
+
|
|
1481
|
+
---
|
|
1482
|
+
|
|
1483
|
+
<div align="center">
|
|
1484
|
+
|
|
1485
|
+
<br />
|
|
1486
|
+
|
|
1487
|
+
### Stop writing release notes. Start shipping them.
|
|
1488
|
+
|
|
1489
|
+
**[Get Started in 30 Seconds](#-quick-start-30-seconds)** • **[See All Formats](#-output-examples)** • **[Compare Alternatives](#-comparison)**
|
|
1490
|
+
|
|
1491
|
+
<br /><br />
|
|
1492
|
+
|
|
1493
|
+
</div>
|