Skip to content

Commit 7e25d9b

Browse files
committed
Replace generate-release-log script with agent skill
Replace the old GitHub API-based script with a git-based agent skill that captures every commit between canary tags. Includes eval snapshots for 3 tag ranges to validate categorization consistency.
1 parent b61823d commit 7e25d9b

5 files changed

Lines changed: 348 additions & 118 deletions

File tree

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
name: generate-release-log
3+
description: >
4+
Generate a release changelog from git log between two tags. Use when the user
5+
asks to generate release notes, changelog, or release log for a Next.js version.
6+
user-invocable: true
7+
argument-hint: '[<from-tag> [<to-tag>]]'
8+
allowed-tools: [Bash, Grep, Read, Write]
9+
---
10+
11+
# Generate Release Log
12+
13+
Generate a changelog from git history between two canary tags.
14+
15+
## Usage
16+
17+
- `/generate-release-log` — auto-detect latest canary series
18+
- `/generate-release-log v16.1.1-canary.0` — from this tag to latest canary
19+
- `/generate-release-log v16.1.1-canary.0 v16.2.0-canary.103` — explicit range
20+
21+
## Determine range
22+
23+
Ensure full history and tags:
24+
25+
```bash
26+
if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then git fetch --unshallow; fi
27+
git fetch --tags
28+
```
29+
30+
**No args:** Get latest canary tag via `git tag -l 'v*-canary.*' --sort=-version:refname | head -1`, extract version prefix (e.g., `16.2.0`), derive `v<prefix>-canary.0` as from-tag. If `canary.0` doesn't exist, ask the user for the correct from-tag.
31+
32+
**1 arg:** Use as from-tag, latest canary as to-tag.
33+
34+
**2 args:** Use as-is.
35+
36+
Validate both tags exist with `git tag -l <tag>`. Stop if missing.
37+
38+
## Collect and parse commits
39+
40+
```bash
41+
git log --first-parent --format='%s|||%aE' <from>..<to>
42+
```
43+
44+
Filter out version bump commits matching `^v\d+\.\d+\.\d+(-canary\.\d+)?$`. If zero commits remain, report empty range and stop.
45+
46+
Extract from each line: **title** (strip `(#NNNNN)` suffix), **PR number** from that suffix.
47+
48+
## Categorize (first-match-wins)
49+
50+
| Category | Rules |
51+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
52+
| **Documentation** | Starts with `docs:`, `docs(`, `doc:`, `Docs:`, `Docs `, `[Docs]`, `[docs]`, `Guide:`, `CC Guide`; or subject is primarily documentation |
53+
| **Examples** | Starts with `fix(examples)`, `chore(examples)`, `example:`, `examples:`; or subject involves example apps |
54+
| **Core** | Clearly changes Next.js or Turbopack functionality: bug fixes, new APIs/features, config, server/build/rendering/routing/caching, Turbopack bundler changes. `Turbopack:` and `[turbopack]` prefixes go here unless they matched Docs/Examples first. |
55+
| **Misc** | Everything else (default). Includes `ci:`, `test:`, `chore:`, `bench:`, `perf(` prefixes; `Upgrade React`, `[react-sync]`, `Deflake`/`Unflake`, `Update Rspack`, `Update font data`, `chore(deps):`, `AGENTS.md`; and any commit whose category is uncertain. |
56+
57+
## Resolve credits
58+
59+
Extract GitHub usernames from author emails:
60+
61+
1. **Noreply:** `ID+username@users.noreply.github.com` or `username@users.noreply.github.com` → extract `username`
62+
2. **Non-noreply:** One `gh api repos/vercel/next.js/pulls/NNNNN --jq '.user.login'` call per unique email, using any PR from that author.
63+
64+
Deduplicate by resolved GitHub username.
65+
66+
## Format and write
67+
68+
Sections in order, chronological within each (oldest first). Omit empty sections. Write to `release-<version>.txt` in repo root (e.g., `release-16.2.0.txt`).
69+
70+
```
71+
### Core Changes
72+
73+
- Title: #NNNNN
74+
...
75+
76+
### Documentation Changes
77+
78+
- Title: #NNNNN
79+
...
80+
81+
### Example Changes
82+
83+
- Title: #NNNNN
84+
...
85+
86+
### Misc Changes
87+
88+
- Title: #NNNNN
89+
...
90+
91+
### Credits
92+
93+
Huge thanks to @user1, @user2, ..., and @userN for helping!
94+
```
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
### Core Changes
2+
3+
- fix: preserve cache behavior for PPR fallback shells with root params: #88556
4+
- Turbopack: Use a real file entrypoint for Workers (and SharedWorkers): #88602
5+
- Turbopack: Tweak retry loop for link creation to try to fix os error 80 on Windows: #88669
6+
- Turbopack: Use webpki-root-certs in addition to rustls-platform-verifier on Linux for bare-bones Linux images without root CA stores: #88869
7+
- stabilize browser log forward options: #88857
8+
- [devtools] Wrap long file names of stack frames in the error overlay: #88886
9+
- [devtools] Fix notch coloring of error overlay in forced colors mode: #88892
10+
- Turbopack: query conditions in rules follow-ups: #88801
11+
- Create-next-app update message: #88706
12+
- Turbopack: Fix next/font preloading for page.mdx: #88848
13+
- Remove `deploymentId` from App Router `RenderOptsPartial`: #88866
14+
- feat: implement LRU cache with invocation ID scoping for minimal mode response cache: #88509
15+
- [prebuilt-skew-protection] feat: adding in automatic deploymentId: #88496
16+
- [devtool] Add hydration diff indicator for diff lines: #88919
17+
- Turbopack: refactor data storage to avoid reverse task cache: #88492
18+
- Turbopack: change invalidator and immutable to data category: #88889
19+
- Turbopack: reduce cache size: #88929
20+
- Turbopack: improve module type error message: #88815
21+
- Turbopack: improve selective read support to allow `Equivalent` keys: #88760
22+
- Turbopack: add indirection layer for better caching during resolving: #80062
23+
- Revert "[prebuilt-skew-protection] feat: adding in automatic deploymentId": #88942
24+
- [turbopack] add task type infromation to the print_cache_item_size feature: #88925
25+
- Turbopack: add `?dpl=` to all asset urls returned by Turbopack: #88828
26+
- [Turbopack] Use a presized scratch buffer for task encoding: #88924
27+
- [Reapply] Add `useEffectEvent` to disallowed React APIs in Server Components: #88985
28+
- Apply fixes for onBuildComplete and route module: #88831
29+
- Rename `renderOpts.nextExport` to `isBuildTimePrerendering`: #88951
30+
- Turbopack: remove Asset supertrait from Module trait. Modules don't have content: #86416
31+
- Fix react-loadable-manifest chunk hash mismatch by preserving async loader mapping: #88775
32+
- refactor: consume global-error from loader tree: #88437
33+
- Fix chunk loading when using `__turbopack_load_by_url__` with query: #88899
34+
- [mcp] change the mcp endpoint response to JSON: #88911
35+
- Reapply "[turbopack] Add bundling support for worker_threads" (#88725): #88967
36+
- fix: ensure LRU cache items have minimum size of 1 to prevent unbounded growth: #89040
37+
- Use null-prototype objects in server actions manifests: #89069
38+
39+
### Documentation Changes
40+
41+
- Docs: Add Next.js Glossary: #88811
42+
- docs: Server functions rename: #86827
43+
- docs: Update Partytown URLs and package reference: #88928
44+
- docs: improve clarity in cache components and server/client docs: #88946
45+
- docs: revalidatePath w/ rewrites and trailing slash: #88956
46+
- docs: fix typos in `README.md`s: #89022
47+
- Cache Component Guide: Building public, _mostly_ static pages: #87248
48+
49+
### Misc Changes
50+
51+
- Turbopack: Add file write invalidation tracking to filesystem watcher fuzzing: #88665
52+
- Turbopack: Move fuzzer for fs watcher into a separate file/module: #88666
53+
- Upgrade React from `d2908752-20260119` to `b546603b-20260121`: #88860
54+
- Turbopack: Add a stress test / fuzzer that tries creating many symlinks in a tight loop: #88667
55+
- Turbopack: Make the priority_runner testcase deterministic: #88651
56+
- Turbopack: Various cleanup for turbo-tasks-fs, mostly retry logic and string formatting: #88668
57+
- feat: Replace InnerStorage with the generated TaskStorage struct: #88355
58+
- refactor: migrate to typed accessors and remove CachedDataItem adapter: #88397
59+
- docs: add skill for updating Next.js documentation: #88656
60+
- Turbopack: [chore] Fix Rust check warnings: #88871
61+
- Update Rspack production test manifest: #88882
62+
- [test] Skip failing deploy test in `searchparams-reuse-loading.test.ts`: #88821
63+
- [test] Skip flaky `prefetch-runtime` tests for deploy tests: #88826
64+
- remove gt workflow from agents.md: #88918
65+
- fix typo: #88934
66+
- Add Graphite workflow Cursor command: #88939
67+
- Upgrade React from `b546603b-20260121` to `24d8716e-20260123`: #88963
68+
- Update Rspack production test manifest: #88930
69+
- Update Rspack development test manifest: #88931
70+
- Improve performance and token usage of `/ci-failures` command: #88960
71+
- feat(next-codemod): add agents-md command for AI coding agents: #88961
72+
- Update font data: #88975
73+
- Improve agents-md prompt to force doc retrieval: #88997
74+
- Update Rspack development test manifest: #89004
75+
- Update Rspack production test manifest: #89003
76+
- [test] Improve deployment skew test for Pages Router data routes: #89038
77+
- Upgrade React from `24d8716e-20260123` to `8c34556c-20260126`: #89066
78+
- Fix reset deploy project script: #89001
79+
- Re-enable types-and-precompiled: #89070
80+
81+
### Credits
82+
83+
Huge thanks to @ztanner, @mmastrac, @bgw, @lukesandberg, @wyattjoh, @huozhi, @eps1lon, @sokra, @timneutkens, @mischnic, @brookemosby, @delbaoliveira, @icyJoseph, @gaojude, @hanzala-sohrab, @dango0812, @ijjk, @msmx-mnakagawa, and @unstubbable for helping!
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
### Core Changes
2+
3+
- fix(build): don't block SSG on telemetry flush, add persistence spans to trace-build: #91335
4+
- Move database compaction from write batch commit to backend idle loop: #91258
5+
- Turbopack: use ChunkGroupEntry::Shared, part 2: #91279
6+
- Ready in X - prints wrong timing on dev server restart: #90874
7+
- Show generated code from loaders in parse error messages: #89898
8+
- Remove unused layer from server actions manifest: #91425
9+
- Support accessing root params in `generateStaticParams`: #91189
10+
- Avoid `undefined` outer work unit store in `"use cache"`: #91190
11+
- Add `unstable_dynamicStaleTime` route segment config: #91437
12+
- Add `unstable_catchError()` API for custom error boundary: #89688
13+
- Turbopack: Enable server HMR by default for app pages: #91476
14+
- Allow blocking cross-site dev-only websocket connections from privacy sensitive origins: #91479
15+
- Disallow Server Action submissions from privacy-sensitive contexts: #91478
16+
- Fix startup warmup for empty-shell app route cache: #91470
17+
- Fix DataUriSource description to include "data:" prefix: #91455
18+
- Fix `unstable_catchError` type inference for fallback props: #91485
19+
- Support accessing root params in `"use cache"` functions: #91191
20+
- Improve RSC error messages: #90702
21+
- Fix inconsistent cache life/tags propagation for cache handler hits: #91454
22+
- Improve CSS parse error recovery and reporting: #90025
23+
- Turbopack: correctly apply effects for issue snapshots: #91511
24+
- Turbopack: treat unknown CSS selectors as warnings: #91513
25+
- Error when accessing undefined root params in `generateStaticParams`: #91519
26+
- Buffer prefetch response before passing to Flight client: #91487
27+
- [Segment Cache] Always upsert on prefetch completion: #91488
28+
- Track vary params during runtime prefetches: #89297
29+
- Remove devCacheControlNoCache experimental option (hard-code no-cache): #91503
30+
- fix allowedDevOrigins for no-cors requests: #91506
31+
- Remove webpack stats generation from Turbopack: #91515
32+
- Move adapterPath from experimental to stable top-level config: #91535
33+
- block disallowed dev origins by default: #91507
34+
35+
### Documentation Changes
36+
37+
- docs(turbopack): Fix all warnings in `cargo doc --no-deps --workspace`, and run rustdoc as part of our CI checks: #91339
38+
- docs: `unstable_catchError()`: #89847
39+
- docs(turbopack-core): Copy "layers" documentation from mdbook to rustdoc: #91350
40+
- docs(turbopack): Migrate chunking docs from mdbook, with proof-reading and minor updates from claude: #91472
41+
- docs(turbopack): Remove old `architecture.md` file from turbopack crate: #91473
42+
43+
### Misc Changes
44+
45+
- [test] Improve actions-tree-shaking tests: #91326
46+
- [test] More `instant-navs-devtools` deflaking: #91345
47+
- [next-playwright] Use unique cookie values for instant navigation testing lock: #91250
48+
- Patch improvements into `http-proxy` lib: #91480
49+
- Deflake per-page dynamic stale time test: #91492
50+
- Upgrade React from `5e9eedb5-20260312` to `c80a0750-20260312`: #91324
51+
- perf(turbopack-node): zero-copy Buffer transfer from node to rust: #91376
52+
- [react-sync] Allow locking in manual sync: #91509
53+
- Unflake two `"use cache"` tests: #91529
54+
- Skip catch-error-react-compiler test to unblock CI: #91528
55+
- [turbopack] update qfilter to 0.3.0-alpha: #91467
56+
- Upgrade React from `c80a0750-20260312` to `3f0b9e61-20260317`: #91522
57+
58+
### Credits
59+
60+
Huge thanks to @lukesandberg, @mischnic, @sokra, @unstubbable, @acdlite, @eps1lon, @devjiwonchoi, @wbinnssmith, @bgw, @ztanner, @gnoff, @xusd320, and @timneutkens for helping!
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
### Core Changes
2+
3+
- refactor: fix non-determinism in resolve package: #90058
4+
- segment cache: fix segment cache normalizer: #90111
5+
- Handle null history.state in client-side router popstate handler: #90083
6+
- Don't parse default postponedsizelimit: #89906
7+
- Turbopack: handle invalid RSC imports via importmap: #88146
8+
- Turbopack: use file_content.hash() consistently: #90078
9+
- ensure maxPostponedStateSize is always respected: #90060
10+
- [fragment-scroll] Stop focusing the first focusable host descendant: #89903
11+
- Turbopack: Enable tree-shaking for dynamic imports with destructuring: #89683
12+
- Simplify how `json` imports work by turning it into a source transform: #89631
13+
- fix: normalize loopback only in hostname: #90158
14+
- Only error for sync IO after runtime in segments that would be runtime prefetched: #89979
15+
- fix: use Buffer.indexOf in uint8array helpers for faster byte scanning (3/8): #89864
16+
- fix(cache): DCE to avoid pulling server internals into browser bundles (4/8): #89865
17+
- Attach active src route to next global: #90171
18+
- Fix OTEL propagation and add direct entrypoint e2e coverage: #90181
19+
- Simplify metadata tag rendering to flat imperative style: #90209
20+
- Prevent unhandled rejection filter from being bundled into the server runtime: #90205
21+
- Turbopack: fix static asset skew protection for edge and prerenders: #90238
22+
- Remove workStore from params/searchParams/pathname function signatures: #90215
23+
- Remove workStore from metadata resolution chain: #90217
24+
- [Instant] export "Instant" config type: #90257
25+
- Replace getDynamicParamFromSegment closure with interpolatedParams in metadata: #90249
26+
- [Instant] Dev Tools toggle for Instant Navigation Mode: #90222
27+
- [instant] Include declaration location of instant config in validation errors: #90169
28+
- feat(next/image): add lru disk cache and `images.maximumDiskCacheSize`: #89963
29+
- Turbopack: add Rope.content_hash and SHA hashing: #90235
30+
- Revert "Handle null history.state in client-side router popstate handler": #90268
31+
- [instant] Handle more instant declaration patterns: #90251
32+
- [devtools] Omit empty looking error messages: #90256
33+
- Fix runtime prefetch `isPartial` byte stripping when deployed: #90272
34+
- validate sync IO in generateMetadata according to Page's prefetchable status: #90164
35+
- Turbopack: support Subresource Integrity: #90152
36+
- Fix route.replace crash with --debug-build-paths: #90312
37+
- Turbopack: Aggregation update improvements: #90139
38+
- Next.js sticky scroll standards: #90197
39+
- [turbopack] Consider `ignoreList` of 3rd party sourcemaps in Redbox: #90317
40+
- Fix: Image component ignores images.qualities in Jest environment: #89536
41+
- Revert "keep next-env.d.s unchanged between dev and build": #90384
42+
- Fix route cache keying for unprefetched navigations: #90400
43+
- Add more known folders to is-folder-empty check in create-next-app: #88218
44+
- Add support for Next.js error telemetry for `AggregateError`: #90391
45+
- Fix `config.reactProductionProfiling` for Webpack: #90430
46+
- next-image: fix deployment id handling for unoptimized: #90416
47+
- next-image: fix dpl handling with unicode: #90420
48+
- [Instant] Validate blocking head: #89539
49+
- Turbopack: Fix experimental server hmr for pages router: #90398
50+
- [turbopack] Make compression in SST files optional: #89309
51+
52+
### Documentation Changes
53+
54+
- In-Depth Explanation of React Version Handling Doc: #89426
55+
- docs: fixes typo in manifest.mdx regarding Route Handler note: #90394
56+
- docs: improve form guide consistency and validation examples: #90361
57+
- docs: rework version staleness: #90192
58+
- docs: clarify that next upgrade is for 16.1.x+: #90435
59+
- Add not-found.js / notFound() links to Status Codes section: #88332
60+
- docs: update with more patterns and decision based: #90203
61+
62+
### Example Changes
63+
64+
- [feat] Added Docker examples for standalone output and export output following best practices: #87069
65+
- Migrate from react-markdown to Streamdown static in EdgeDB example: #86435
66+
67+
### Misc Changes
68+
69+
- Update Rspack development test manifest: #90074
70+
- Update Rspack production test manifest: #90073
71+
- test: extend production-browser-sourcemaps test: #89945
72+
- [create-next-app] Improve AGENTS.md prompt wording: #90118
73+
- Upgrade React from `6066c782-20260212` to `4842fbea-20260217`: #90144
74+
- [test] Current behavior of focus after `next/link` navigation: #89959
75+
- test: Don't run integration tests twice for Turbopack: #83335
76+
- Update Rspack production test manifest: #90120
77+
- Update Rspack development test manifest: #90121
78+
- Turbopack: Update rust toolchain to nightly-2026-02-18: #89974
79+
- Turbopack: Derive `Default` on `PartialProjectOptions`, remove silly `partial_project_options_with_debug_build_paths` helper: #90170
80+
- [refactor] Replace runtime prefetch sentinel transform stream: #90160
81+
- Turbopack: document ModuleSideEffects better: #90132
82+
- Automatically build and clear native build when running `pnpm build`: #89819
83+
- [ci]: pin styled-components version in tests: #90194
84+
- [turbopack] Add a simple tool to inspect serialized SST files and report on their contents: #89310
85+
- Upgrade React from `4842fbea-20260217` to `2ba30655-20260219`: #90211
86+
- Use cookie as sole protocol for instant navigation testing: #89871
87+
- [Instant] speed up test instant-validation suite: #90214
88+
- Turbopack: rename ServerPaths to AssetPaths: #90234
89+
- [test] Improve fetch timeout error stack for `act`: #90261
90+
- Upgrade React from `2ba30655-20260219` to `ab18f33d-20260220`: #90279
91+
- [sync-react] Allow syncing React with local build: #90277
92+
- segment cache: add test for passing unawaited promise to context provider: #89339
93+
- Add PR tarball install note to stats comment: #90316
94+
- Bump Turborepo to 2.8.9: #90079
95+
- Update wasm and next-custom-transforms crates to Rust edition 2024: #90350
96+
- refactor(app-render): extract stream-ops and debug-channel modules (5/8): #89858
97+
- [turbopack] Remove obsolete is_internal field: #90329
98+
- Turbopack: refactoring to prepare for name mangling: #89406
99+
- [ci] Stop linting auto-generated next-swc typings: #90390
100+
- [ci] Always upload Turborepo summary artifact: #90441
101+
- [ci] Fix input cache keys for tasks referencing `rust-toolchain`: #90442
102+
- tests: reenable escheck-output: #90423
103+
- Upgrade React from `ab18f33d-20260220` to `c0060cf2-20260224`: #90452
104+
- [test] Deflake `typed-routes-validator` using `tsc`: #90451
105+
- [ci] Stop using Turbopack tests in native binary build cache keys: #90449
106+
- test: Cleanup and refactoring: #90454
107+
- [test] Only auto-retry individual e2e tests in CI: #90464
108+
109+
### Credits
110+
111+
Huge thanks to @lukesandberg, @ztanner, @timneutkens, @mischnic, @gaojude, @eps1lon, @sokra, @gnoff, @bgw, @unstubbable, @feedthejim, @ijjk, @acdlite, @lubieowoce, @kristiyan-velkov, @styfle, @haydenbleasel, @devjiwonchoi, @abhishekmardiya, @mmastrac, @wbinnssmith, @rishishanbhag, @tdarthur, @lavanitha, @karlhorky, and @icyJoseph for helping!

0 commit comments

Comments
 (0)