From f92f14288f00feda726b0f30c7645200c8115401 Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 07:44:57 -0400 Subject: [PATCH 1/7] feat: generate real changelog content for GitHub Releases Wire @release-it/conventional-changelog into all 3 packages so release notes surface actual feat/fix commits instead of being empty. No CHANGELOG.md file is written, matching the existing GitHub-Releases-as-source-of-truth convention. Also sets gitRawCommitsOpts/commitsOpts.to=HEAD, working around a library bug where an unset commit range silently produces zero commits when no previous tag exists yet. Co-Authored-By: Claude Sonnet 5 --- package.json | 1 + packages/node-edgedriver/.release-it.json | 7 + packages/node-geckodriver/.release-it.json | 7 + packages/node-safaridriver/.release-it.json | 7 + pnpm-lock.yaml | 210 ++++++++++++++++++++ 5 files changed, 232 insertions(+) diff --git a/package.json b/package.json index 11687da..47c50b5 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "checks:all": "pnpm run test:lint && pnpm run test:unit && pnpm run test:e2e" }, "devDependencies": { + "@release-it/conventional-changelog": "^12.0.2", "@stylistic/eslint-plugin": "^5.10.0", "@types/node": "^25.0.3", "@types/which": "^3.0.4", diff --git a/packages/node-edgedriver/.release-it.json b/packages/node-edgedriver/.release-it.json index 21cb734..af7d6db 100644 --- a/packages/node-edgedriver/.release-it.json +++ b/packages/node-edgedriver/.release-it.json @@ -1,5 +1,12 @@ { "git": { "tagName": "edgedriver@${version}" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { "name": "conventionalcommits" }, + "gitRawCommitsOpts": { "to": "HEAD" }, + "commitsOpts": { "to": "HEAD" } + } } } diff --git a/packages/node-geckodriver/.release-it.json b/packages/node-geckodriver/.release-it.json index e814963..2c06993 100644 --- a/packages/node-geckodriver/.release-it.json +++ b/packages/node-geckodriver/.release-it.json @@ -1,5 +1,12 @@ { "git": { "tagName": "geckodriver@${version}" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { "name": "conventionalcommits" }, + "gitRawCommitsOpts": { "to": "HEAD" }, + "commitsOpts": { "to": "HEAD" } + } } } diff --git a/packages/node-safaridriver/.release-it.json b/packages/node-safaridriver/.release-it.json index e6344e5..8860c4b 100644 --- a/packages/node-safaridriver/.release-it.json +++ b/packages/node-safaridriver/.release-it.json @@ -1,5 +1,12 @@ { "git": { "tagName": "safaridriver@${version}" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { "name": "conventionalcommits" }, + "gitRawCommitsOpts": { "to": "HEAD" }, + "commitsOpts": { "to": "HEAD" } + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a0b3bf..4f7cf87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,6 +166,9 @@ importers: .: devDependencies: + '@release-it/conventional-changelog': + specifier: ^12.0.2 + version: 12.0.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(release-it@21.1.0(@types/node@25.9.8)(magicast@0.5.5)(supports-color@7.2.0)) '@stylistic/eslint-plugin': specifier: ^5.10.0 version: 5.10.0(eslint@10.11.0(jiti@2.7.0)(supports-color@7.2.0)) @@ -294,6 +297,22 @@ packages: '@cacheable/utils@2.5.0': resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@conventional-changelog/git-client@3.1.2': + resolution: {integrity: sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==} + engines: {node: '>=22'} + peerDependencies: + conventional-commits-filter: ^6.0.1 + conventional-commits-parser: ^7.1.2 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} + engines: {node: '>=22'} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -856,6 +875,12 @@ packages: engines: {node: '>=18'} hasBin: true + '@release-it/conventional-changelog@12.0.2': + resolution: {integrity: sha512-mJsfycScVqud9O+GzVLT1wQBsIR2WO3kEe6Xm7ucf9yP9KyKRTY9yqoFe/kjLCNSu0lP0PzpuOooUYyzHm1oFw==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + peerDependencies: + release-it: ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + '@rolldown/binding-android-arm-eabi@1.2.9': resolution: {integrity: sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -955,6 +980,22 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@simple-libs/child-process-utils@2.0.0': + resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} + engines: {node: '>=22'} + + '@simple-libs/hosted-git-info@2.0.0': + resolution: {integrity: sha512-55XwK/GYgV58PuN8lZFhI1qRxdKoMLJocXl/yM1EPqazFDmM4QWY7q6BxPCPDNKTNunj794DSD4h0H7SrqUdMg==} + engines: {node: '>=22'} + + '@simple-libs/normalize-package-data@1.0.0': + resolution: {integrity: sha512-/EOmFBekV9tGee8gac/k+5Ox3twkypNqh5TfxA9vTkmcJkjm6f1xqrlstDNOrEhTvnYyVtU6Du2ZhY/IV1+9GA==} + engines: {node: '>=22'} + + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1125,6 +1166,10 @@ packages: resolution: {integrity: sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==} engines: {node: '>=18'} + argue-cli@3.2.0: + resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} + engines: {node: '>=22'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1225,6 +1270,9 @@ packages: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1304,6 +1352,10 @@ packages: resolution: {integrity: sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==} engines: {node: '>=18'} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -1314,6 +1366,42 @@ packages: resolution: {integrity: sha512-GW4qUsfFo59d0HbUibDlWv5wPz+vAAcaTWbKIuKCf0JkC7wWkSyf8f13IpXn5JkeMlB2P8iTSSIjwXljorg2vA==} engines: {node: '>=22'} + conventional-changelog-angular@9.4.0: + resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} + engines: {node: '>=22'} + + conventional-changelog-conventionalcommits@10.4.0: + resolution: {integrity: sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==} + engines: {node: '>=22'} + + conventional-changelog-preset-loader@6.0.1: + resolution: {integrity: sha512-GZ8E3RQzXQb3JFy0pKl8oeSf7ENIhvAMvJr+PlWkavZOesLHHdhkfNJ4SvW35eo1Fu2+EyVxWQ1tVvtzAG2iWg==} + engines: {node: '>=22'} + + conventional-changelog-writer@9.2.1: + resolution: {integrity: sha512-StlYSmW3wLedRaqohJMpP3YuWiAqtgD0/cpsai9frdDkXv7rxj0hRbpJrubPYvJxJsjplONsOobEQnPuS9UgCg==} + engines: {node: '>=22'} + hasBin: true + + conventional-changelog@8.1.3: + resolution: {integrity: sha512-fOMwLCxm46znJKPB08jLxl1FD8SOZOQHktlzCVhvhhVUfq0KgQSryoYXsRRHs1aRlZPR1/QK5wztnY8sBNC2AA==} + engines: {node: '>=22'} + hasBin: true + + conventional-commits-filter@6.0.1: + resolution: {integrity: sha512-cs+LadpH7Kpw0M3k8wurk+sOVVDAENA0iK4OBOrkL94j5lEVYRJ4j3zd2bhY9qgzyrPqthdcYT3axzRN7AliMg==} + engines: {node: '>=22'} + + conventional-commits-parser@7.1.2: + resolution: {integrity: sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==} + engines: {node: '>=22'} + hasBin: true + + conventional-recommended-bump@12.1.0: + resolution: {integrity: sha512-HTNG3kEZXOOfKwrEx54ljURU9bG4nVPQzXMyCSeUcA/PE8EpNpQNujSrbXNBI8QZyN35zM+pVw+FuQk4KqHSHg==} + engines: {node: '>=22'} + hasBin: true + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1589,6 +1677,9 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -2300,6 +2391,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2526,6 +2621,9 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -2662,6 +2760,10 @@ packages: engines: {node: '>=10'} hasBin: true + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + webdriver@9.32.0: resolution: {integrity: sha512-1Z7mydyw3v3UfzQ6UtrRvu3ij1eHuSoitxBMWlnKi2e3Zpvc1EBPp6FhsXBYhdFg0F4900j6sUTkoF//CkpbpQ==} engines: {node: '>=18.20.0'} @@ -2798,6 +2900,17 @@ snapshots: hashery: 1.5.1 keyv: 5.6.0 + '@conventional-changelog/git-client@3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)': + dependencies: + '@simple-libs/child-process-utils': 2.0.0 + '@simple-libs/stream-utils': 2.0.0 + semver: 7.8.5 + optionalDependencies: + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 + + '@conventional-changelog/template@1.4.0': {} + '@esbuild/aix-ppc64@0.28.2': optional: true @@ -3219,6 +3332,20 @@ snapshots: - react-native-b4a - supports-color + '@release-it/conventional-changelog@12.0.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(release-it@21.1.0(@types/node@25.9.8)(magicast@0.5.5)(supports-color@7.2.0))': + dependencies: + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + concat-stream: 2.0.0 + conventional-changelog: 8.1.3 + conventional-changelog-angular: 9.4.0 + conventional-changelog-conventionalcommits: 10.4.0 + conventional-recommended-bump: 12.1.0 + release-it: 21.1.0(@types/node@25.9.8)(magicast@0.5.5)(supports-color@7.2.0) + semver: 7.8.5 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + '@rolldown/binding-android-arm-eabi@1.2.9': optional: true @@ -3266,6 +3393,19 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@simple-libs/child-process-utils@2.0.0': + dependencies: + '@simple-libs/stream-utils': 2.0.0 + + '@simple-libs/hosted-git-info@2.0.0': {} + + '@simple-libs/normalize-package-data@1.0.0': + dependencies: + '@simple-libs/hosted-git-info': 2.0.0 + semver: 7.8.5 + + '@simple-libs/stream-utils@2.0.0': {} + '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@5.10.0(eslint@10.11.0(jiti@2.7.0)(supports-color@7.2.0))': @@ -3483,6 +3623,8 @@ snapshots: - bare-buffer - react-native-b4a + argue-cli@3.2.0: {} + aria-query@5.3.2: {} assertion-error@2.0.1: {} @@ -3558,6 +3700,8 @@ snapshots: buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -3662,12 +3806,64 @@ snapshots: normalize-path: 3.0.0 readable-stream: 4.7.0 + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.2.4: {} confbox@0.3.1: {} content-type@3.1.1: {} + conventional-changelog-angular@9.4.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-changelog-conventionalcommits@10.4.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-changelog-preset-loader@6.0.1: {} + + conventional-changelog-writer@9.2.1: + dependencies: + '@conventional-changelog/template': 1.4.0 + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.2.0 + conventional-commits-filter: 6.0.1 + semver: 7.8.5 + + conventional-changelog@8.1.3: + dependencies: + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + '@simple-libs/hosted-git-info': 2.0.0 + '@simple-libs/normalize-package-data': 1.0.0 + argue-cli: 3.2.0 + conventional-changelog-preset-loader: 6.0.1 + conventional-changelog-writer: 9.2.1 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 + fd-package-json: 2.0.0 + + conventional-commits-filter@6.0.1: {} + + conventional-commits-parser@7.1.2: + dependencies: + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.2.0 + + conventional-recommended-bump@12.1.0: + dependencies: + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + argue-cli: 3.2.0 + conventional-changelog-preset-loader: 6.0.1 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 + convert-source-map@2.0.0: {} core-util-is@1.0.3: {} @@ -3971,6 +4167,10 @@ snapshots: dependencies: fast-string-width: 3.0.2 + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -4676,6 +4876,12 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 @@ -4947,6 +5153,8 @@ snapshots: type-fest@4.41.0: {} + typedarray@0.0.6: {} + typescript@6.0.3: {} undici-types@6.21.0: {} @@ -5025,6 +5233,8 @@ snapshots: transitivePeerDependencies: - supports-color + walk-up-path@4.0.0: {} + webdriver@9.32.0(supports-color@7.2.0): dependencies: '@types/node': 20.19.43 From 9051638348900dca008e37dbd58be66dbf8e5422 Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 07:45:02 -0400 Subject: [PATCH 2/7] docs: flag that squash-merge makes PR titles the permanent history Now that changelogs are generated from commit types, a PR titled chore/ci when it actually contains a fix means that fix silently never shows up anywhere. Co-Authored-By: Claude Sonnet 5 --- .agents/skills/concise-writing/SKILL.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.agents/skills/concise-writing/SKILL.md b/.agents/skills/concise-writing/SKILL.md index 22b49f5..cd12cd1 100644 --- a/.agents/skills/concise-writing/SKILL.md +++ b/.agents/skills/concise-writing/SKILL.md @@ -41,7 +41,8 @@ Never amend an existing commit unless explicitly asked — a fresh commit is the ## PR titles and descriptions -- Title under ~70 characters, same "why, not what" rule as commit summaries. +- Title under ~70 characters, same "why, not what" rule as commit summaries — and same `type: summary` convention (Conventional Commits) as the individual commits, e.g. `fix: ...`, `feat: ...`, `chore: ...`. +- **This matters more than it looks like it would**: PRs in this repo are squash-merged, so the PR title *becomes* the one commit message that survives on `main` — the individual commits inside the PR are gone forever. Each package's release now generates its GitHub Release notes from these types (`@release-it/conventional-changelog`, surfacing `feat`/`fix` commits). A PR titled `chore: ...` when it actually contains a fix means that fix silently never appears in any changelog. Get the type right on the title, not just on the commits inside it. - Body: a short `## Summary` (1-3 bullets, what changed and why it was needed — not a file-by-file listing the diff already shows) plus a `## Test plan` checklist of what was actually run. Skip sections that would just restate the diff. - Don't repeat the same information across every commit in the PR *and* the PR description *and* a summary comment — pick the level (usually the PR description) and let the rest stay terse. - When reviewing someone else's PR description for terseness, flag sentences that only restate a line from the diff without adding reasoning, and padding like "This PR also includes minor cleanup" with nothing concrete after it. From a07da27ce1c3eef98ea95ec4b2cf6a6bdc497743 Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 07:57:43 -0400 Subject: [PATCH 3/7] fix: scope each package's changelog to its own directory Without gitRawCommitsOpts/commitsOpts.path, every package's release notes included feat/fix commits from the other two packages too. Verified with a throwaway single-package commit before/after. Co-Authored-By: Claude Sonnet 5 --- packages/node-edgedriver/.release-it.json | 4 ++-- packages/node-geckodriver/.release-it.json | 4 ++-- packages/node-safaridriver/.release-it.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/node-edgedriver/.release-it.json b/packages/node-edgedriver/.release-it.json index af7d6db..f7d8a0f 100644 --- a/packages/node-edgedriver/.release-it.json +++ b/packages/node-edgedriver/.release-it.json @@ -5,8 +5,8 @@ "plugins": { "@release-it/conventional-changelog": { "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD" }, - "commitsOpts": { "to": "HEAD" } + "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, + "commitsOpts": { "to": "HEAD", "path": "." } } } } diff --git a/packages/node-geckodriver/.release-it.json b/packages/node-geckodriver/.release-it.json index 2c06993..aeb5abe 100644 --- a/packages/node-geckodriver/.release-it.json +++ b/packages/node-geckodriver/.release-it.json @@ -5,8 +5,8 @@ "plugins": { "@release-it/conventional-changelog": { "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD" }, - "commitsOpts": { "to": "HEAD" } + "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, + "commitsOpts": { "to": "HEAD", "path": "." } } } } diff --git a/packages/node-safaridriver/.release-it.json b/packages/node-safaridriver/.release-it.json index 8860c4b..6a1ae50 100644 --- a/packages/node-safaridriver/.release-it.json +++ b/packages/node-safaridriver/.release-it.json @@ -5,8 +5,8 @@ "plugins": { "@release-it/conventional-changelog": { "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD" }, - "commitsOpts": { "to": "HEAD" } + "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, + "commitsOpts": { "to": "HEAD", "path": "." } } } } From ec2f0805025397c19aaaee932574e3f6cc49c69b Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 07:58:54 -0400 Subject: [PATCH 4/7] chore: centralize shared release-it config at repo root Each package's .release-it.json now only holds its own tagName and extends the root config for the conventional-changelog plugin setup, instead of duplicating the same plugin block 3 times. Verified all 3 packages still produce identical, correctly-scoped changelogs. Co-Authored-By: Claude Sonnet 5 --- .release-it.json | 9 +++++++++ packages/node-edgedriver/.release-it.json | 8 +------- packages/node-geckodriver/.release-it.json | 8 +------- packages/node-safaridriver/.release-it.json | 8 +------- 4 files changed, 12 insertions(+), 21 deletions(-) create mode 100644 .release-it.json diff --git a/.release-it.json b/.release-it.json new file mode 100644 index 0000000..34b7a83 --- /dev/null +++ b/.release-it.json @@ -0,0 +1,9 @@ +{ + "plugins": { + "@release-it/conventional-changelog": { + "preset": { "name": "conventionalcommits" }, + "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, + "commitsOpts": { "to": "HEAD", "path": "." } + } + } +} diff --git a/packages/node-edgedriver/.release-it.json b/packages/node-edgedriver/.release-it.json index f7d8a0f..52f5acc 100644 --- a/packages/node-edgedriver/.release-it.json +++ b/packages/node-edgedriver/.release-it.json @@ -1,12 +1,6 @@ { + "extends": "../../.release-it.json", "git": { "tagName": "edgedriver@${version}" - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, - "commitsOpts": { "to": "HEAD", "path": "." } - } } } diff --git a/packages/node-geckodriver/.release-it.json b/packages/node-geckodriver/.release-it.json index aeb5abe..d0810b8 100644 --- a/packages/node-geckodriver/.release-it.json +++ b/packages/node-geckodriver/.release-it.json @@ -1,12 +1,6 @@ { + "extends": "../../.release-it.json", "git": { "tagName": "geckodriver@${version}" - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, - "commitsOpts": { "to": "HEAD", "path": "." } - } } } diff --git a/packages/node-safaridriver/.release-it.json b/packages/node-safaridriver/.release-it.json index 6a1ae50..2ee07e6 100644 --- a/packages/node-safaridriver/.release-it.json +++ b/packages/node-safaridriver/.release-it.json @@ -1,12 +1,6 @@ { + "extends": "../../.release-it.json", "git": { "tagName": "safaridriver@${version}" - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": { "name": "conventionalcommits" }, - "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, - "commitsOpts": { "to": "HEAD", "path": "." } - } } } From eed35a874f494a4494755d66ed335318dd355efd Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 08:02:14 -0400 Subject: [PATCH 5/7] feat: surface chore and docs commits in changelogs Both were hidden by the conventionalcommits preset's defaults. They still don't influence the recommended version bump (feat/fix/perf still drive that) - just visible now under their own sections. Co-Authored-By: Claude Sonnet 5 --- .release-it.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.release-it.json b/.release-it.json index 34b7a83..f80c3f8 100644 --- a/.release-it.json +++ b/.release-it.json @@ -1,7 +1,23 @@ { "plugins": { "@release-it/conventional-changelog": { - "preset": { "name": "conventionalcommits" }, + "preset": { + "name": "conventionalcommits", + "types": [ + { "type": "feat", "section": "Features", "effect": "bump" }, + { "type": "feature", "section": "Features", "effect": "bump" }, + { "type": "fix", "section": "Bug Fixes", "effect": "bump" }, + { "type": "perf", "section": "Performance Improvements", "effect": "bump" }, + { "type": "revert", "section": "Reverts", "effect": "bump" }, + { "type": "docs", "section": "Documentation", "effect": "changelog" }, + { "type": "chore", "section": "Miscellaneous Chores", "effect": "changelog" }, + { "type": "style", "section": "Styles", "effect": "hidden" }, + { "type": "refactor", "section": "Code Refactoring", "effect": "hidden" }, + { "type": "test", "section": "Tests", "effect": "hidden" }, + { "type": "build", "section": "Build System", "effect": "hidden" }, + { "type": "ci", "section": "Continuous Integration", "effect": "hidden" } + ] + }, "gitRawCommitsOpts": { "to": "HEAD", "path": "." }, "commitsOpts": { "to": "HEAD", "path": "." } } From 4894f42eea24c985908cf7921387833156915563 Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 08:06:15 -0400 Subject: [PATCH 6/7] docs: link to the Conventional Commits spec in concise-writing Co-Authored-By: Claude Sonnet 5 --- .agents/skills/concise-writing/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.agents/skills/concise-writing/SKILL.md b/.agents/skills/concise-writing/SKILL.md index cd12cd1..85f617c 100644 --- a/.agents/skills/concise-writing/SKILL.md +++ b/.agents/skills/concise-writing/SKILL.md @@ -41,7 +41,7 @@ Never amend an existing commit unless explicitly asked — a fresh commit is the ## PR titles and descriptions -- Title under ~70 characters, same "why, not what" rule as commit summaries — and same `type: summary` convention (Conventional Commits) as the individual commits, e.g. `fix: ...`, `feat: ...`, `chore: ...`. +- Title under ~70 characters, same "why, not what" rule as commit summaries — and same `type: summary` convention ([Conventional Commits](https://www.conventionalcommits.org/)) as the individual commits, e.g. `fix: ...`, `feat: ...`, `chore: ...`. - **This matters more than it looks like it would**: PRs in this repo are squash-merged, so the PR title *becomes* the one commit message that survives on `main` — the individual commits inside the PR are gone forever. Each package's release now generates its GitHub Release notes from these types (`@release-it/conventional-changelog`, surfacing `feat`/`fix` commits). A PR titled `chore: ...` when it actually contains a fix means that fix silently never appears in any changelog. Get the type right on the title, not just on the commits inside it. - Body: a short `## Summary` (1-3 bullets, what changed and why it was needed — not a file-by-file listing the diff already shows) plus a `## Test plan` checklist of what was actually run. Skip sections that would just restate the diff. - Don't repeat the same information across every commit in the PR *and* the PR description *and* a summary comment — pick the level (usually the PR description) and let the rest stay terse. From 3704c5d380cfd569fa0bc46ea50cca968c58af3a Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 08:09:48 -0400 Subject: [PATCH 7/7] docs: trim the squash-merge note in concise-writing Co-Authored-By: Claude Sonnet 5 --- .agents/skills/concise-writing/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.agents/skills/concise-writing/SKILL.md b/.agents/skills/concise-writing/SKILL.md index 85f617c..08ef959 100644 --- a/.agents/skills/concise-writing/SKILL.md +++ b/.agents/skills/concise-writing/SKILL.md @@ -42,7 +42,7 @@ Never amend an existing commit unless explicitly asked — a fresh commit is the ## PR titles and descriptions - Title under ~70 characters, same "why, not what" rule as commit summaries — and same `type: summary` convention ([Conventional Commits](https://www.conventionalcommits.org/)) as the individual commits, e.g. `fix: ...`, `feat: ...`, `chore: ...`. -- **This matters more than it looks like it would**: PRs in this repo are squash-merged, so the PR title *becomes* the one commit message that survives on `main` — the individual commits inside the PR are gone forever. Each package's release now generates its GitHub Release notes from these types (`@release-it/conventional-changelog`, surfacing `feat`/`fix` commits). A PR titled `chore: ...` when it actually contains a fix means that fix silently never appears in any changelog. Get the type right on the title, not just on the commits inside it. +- PRs are squash-merged — the PR title is the only commit message that survives on `main`, and it drives the changelog. A `chore:` title on a PR that actually fixes something means that fix never appears anywhere. - Body: a short `## Summary` (1-3 bullets, what changed and why it was needed — not a file-by-file listing the diff already shows) plus a `## Test plan` checklist of what was actually run. Skip sections that would just restate the diff. - Don't repeat the same information across every commit in the PR *and* the PR description *and* a summary comment — pick the level (usually the PR description) and let the rest stay terse. - When reviewing someone else's PR description for terseness, flag sentences that only restate a line from the diff without adding reasoning, and padding like "This PR also includes minor cleanup" with nothing concrete after it.