Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions .skills/release-notes/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
name: release-notes
description: Generate release notes by finding the last release tag, reviewing every commit and diff after that tag, and turning the changes into a concise user-facing changelog.
---

# Release Notes

Use this skill when asked to draft release notes, changelog text, GitHub Release notes, npm release notes, or "what changed since the last release" for this repository.

## Goal

Generate accurate release notes from the git history since the previous release. Prefer user-facing impact over commit-by-commit narration.

## Workflow

1. Work from the repository root and check state first:

```bash
git status --short
git branch --show-current
git tag --sort=-creatordate | head -20
```

2. Refresh tags if the environment allows network access and the user did not ask for offline-only work:

```bash
git fetch --tags --prune
```

3. Choose the comparison base:

- If the user provided a tag, commit, or range, use that exactly.
- Otherwise use the newest reachable release tag matching `v*`:

```bash
BASE_TAG="$(git describe --tags --match 'v[0-9]*' --abbrev=0)"
```

- If `HEAD` itself is tagged and the user wants notes for that tagged release, compare against the previous release tag:

```bash
CURRENT_TAG="$(git describe --tags --exact-match HEAD 2>/dev/null || true)"
PREVIOUS_TAG="$(git describe --tags --match 'v[0-9]*' --abbrev=0 HEAD^)"
BASE_TAG="$PREVIOUS_TAG"
```

4. Gather the evidence before writing:

```bash
git log --reverse --date=short --pretty=format:'%h%x09%ad%x09%s' "$BASE_TAG..HEAD"
git diff --stat "$BASE_TAG..HEAD"
git diff --name-status "$BASE_TAG..HEAD"
git diff "$BASE_TAG..HEAD" -- package.json package-lock.json README.md docs src rust scripts .github
```

5. Inspect public API and behavior carefully. For this repo, prioritize changes in:

- `src/index.ts`, `src/node-wreq.ts`, `src/client/`, `src/http/`, `src/websocket/`, and `src/types/`
- `rust/src/transport/`, `rust/src/napi/`, and `rust/src/emulation/`
- `README.md`, `docs/`, package metadata, build scripts, and GitHub Actions
- tests that reveal intended behavior, especially under `src/test/`

6. Classify changes into the sections that apply:

- `Added`
- `Changed`
- `Fixed`
- `Performance`
- `Docs`
- `Tests`
- `Build & CI`
- `Dependencies`
- `Breaking Changes`

7. Write release notes in this shape unless the user requests another format:

```markdown
## <version or "Unreleased">

Compared with `<base tag>`.

### Added
- ...

### Fixed
- ...

### Build & CI
- ...
```

## Writing Rules

- Do not invent impact from commit messages alone. Verify with diffs when a commit is ambiguous.
- Omit empty sections.
- Put breaking changes near the top and call out migration steps when visible from the diff.
- Merge dependency-only Dependabot commits into one short bullet unless they materially affect runtime behavior.
- Mention internal-only test, lint, formatting, and CI work only under `Tests` or `Build & CI`.
- Keep bullets concrete and scoped: name the API, feature, platform, or workflow affected.
- Include the compared range and base tag in the final answer.
- If the range is empty, say no changes were found after the selected release tag.
- If tags are missing or ambiguous, stop and ask for the intended base release instead of guessing.
4 changes: 2 additions & 2 deletions rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ crate-type = ["cdylib"]
[dependencies]
# HTTP client with browser impersonation
wreq = { version = "6.0.0-rc.28", default-features = false, features = ["gzip", "brotli", "deflate", "zstd", "socks", "cookies", "json", "charset", "multipart", "hickory-dns", "system-proxy", "webpki-roots", "ws"] }
wreq-util = { version = "3.0.0-rc.10", features = ["emulation-rand", "emulation-serde"] }
wreq-util = { version = "3.0.0-rc.11", features = ["emulation-rand", "emulation-serde"] }
strum = "0.27.2"

# Neon for Node.js bindings
Expand Down
17 changes: 17 additions & 0 deletions src/config/generated/browser-profiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ export const BROWSER_PROFILES = [
'chrome_143',
'chrome_144',
'chrome_145',
'chrome_146',
'chrome_147',
'edge_101',
'edge_122',
'edge_127',
Expand All @@ -55,10 +57,23 @@ export const BROWSER_PROFILES = [
'edge_143',
'edge_144',
'edge_145',
'edge_146',
'edge_147',
'opera_116',
'opera_117',
'opera_118',
'opera_119',
'opera_120',
'opera_121',
'opera_122',
'opera_123',
'opera_124',
'opera_125',
'opera_126',
'opera_127',
'opera_128',
'opera_129',
'opera_130',
'firefox_109',
'firefox_117',
'firefox_128',
Expand All @@ -75,6 +90,8 @@ export const BROWSER_PROFILES = [
'firefox_145',
'firefox_146',
'firefox_147',
'firefox_148',
'firefox_149',
'safari_ios_17_2',
'safari_ios_17_4_1',
'safari_ios_16_5',
Expand Down
4 changes: 2 additions & 2 deletions src/test/hooks-retries.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,9 @@ describe('hooks and retries', () => {
retryAttempts.set('retry-timeout', 0);

const response = await fetch(
`${getBaseUrl()}/retry/timeout?key=retry-timeout&failCount=1&delayMs=100`,
`${getBaseUrl()}/retry/timeout?key=retry-timeout&failCount=1&delayMs=750`,
{
timeout: 25,
timeout: 250,
retry: {
limit: 1,
errorCodes: ['ERR_TIMEOUT'],
Expand Down
4 changes: 2 additions & 2 deletions src/test/transport-features.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,10 @@ describe('transport features', () => {

test('should apply readTimeout independently from total timeout', async () => {
const response = await fetch(
`${getBaseUrl()}/stream/slow?chunks=3&chunkBytes=1024&delayMs=40`,
`${getBaseUrl()}/stream/slow?chunks=3&chunkBytes=1024&delayMs=300`,
{
timeout: 0,
readTimeout: 15,
readTimeout: 100,
}
);

Expand Down
Loading