diff --git a/.skills/release-notes/SKILL.md b/.skills/release-notes/SKILL.md new file mode 100644 index 0000000..97d4b25 --- /dev/null +++ b/.skills/release-notes/SKILL.md @@ -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 + ## + + Compared with ``. + + ### 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. diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 8bbc49b..df0382e 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -2293,9 +2293,9 @@ dependencies = [ [[package]] name = "wreq-util" -version = "3.0.0-rc.10" +version = "3.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6bbe24d28beb9ceb58b514bd6a613c759d3b706f768b9d2950d5d35b543c04" +checksum = "b51558351cf26c9a5daeabf5df5bfab13f1666fa783ad7ddb9a573e04d7fae0a" dependencies = [ "serde", "strum", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 0ec6ca9..51cf7a9 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -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 diff --git a/src/config/generated/browser-profiles.ts b/src/config/generated/browser-profiles.ts index 0cecf9a..dcd5011 100644 --- a/src/config/generated/browser-profiles.ts +++ b/src/config/generated/browser-profiles.ts @@ -39,6 +39,8 @@ export const BROWSER_PROFILES = [ 'chrome_143', 'chrome_144', 'chrome_145', + 'chrome_146', + 'chrome_147', 'edge_101', 'edge_122', 'edge_127', @@ -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', @@ -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', diff --git a/src/test/hooks-retries.spec.ts b/src/test/hooks-retries.spec.ts index 50eb5fa..effc5ac 100644 --- a/src/test/hooks-retries.spec.ts +++ b/src/test/hooks-retries.spec.ts @@ -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'], diff --git a/src/test/transport-features.spec.ts b/src/test/transport-features.spec.ts index 808f4d8..deec9eb 100644 --- a/src/test/transport-features.spec.ts +++ b/src/test/transport-features.spec.ts @@ -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, } );