From 134ec0ab0434df528742e1e0d768591f8bc76e66 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 02:38:41 +0000 Subject: [PATCH 1/7] chore(deps): update vulnerable transitive dependencies within declared ranges Refresh brace-expansion 5.x, undici, joi and postcss-selector-parser to their patched releases. Each parent already allows these versions, so no override is needed; the lockfile had simply kept the first resolved ones. Resolves 15 Dependabot alerts. ESLint output, unit tests and the build output (excluding version stamps) are identical before and after. Co-Authored-By: Claude Opus 5.5 --- pnpm-lock.yaml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67a6adf80..50abed5ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1730,8 +1730,8 @@ packages: brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@5.0.8: - resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} c12@3.1.0: @@ -2147,8 +2147,8 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - joi@17.13.8: - resolution: {integrity: sha512-iPKOGmiRw1jxf/JOPwxmCcUQAOdF359mdzYiP2DJ+TMX0YK2zjK3D+zYOaGjpumWxOFF/l2xVWjRVK5bGSLdEw==} + joi@17.13.9: + resolution: {integrity: sha512-llFCT2rVtfwgBCaIqxtjim+iHqrgss4ONiGSYiiGH9jnjWq90ppSRffqmqKvwpa8W+YfILyQV6XyGcegXX2T4g==} js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -2574,8 +2574,8 @@ packages: peerDependencies: postcss: 8.5.32 - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.7: + resolution: {integrity: sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==} engines: {node: '>=4'} postcss@8.5.31: @@ -2875,8 +2875,8 @@ packages: undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@8.12.1: - resolution: {integrity: sha512-usz3OVQBeh1LxNn0DzU0voLXMgn5CU/WUdpBsY6Ti5afNao+vTkmn4H/NxoXolc10cOqe2+YIG0Hspq2rsl64w==} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} engines: {node: '>=22.19.0'} universalify@2.0.1: @@ -4253,7 +4253,7 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.8: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 @@ -4708,7 +4708,7 @@ snapshots: jiti@2.7.0: {} - joi@17.13.8: + joi@17.13.9: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -4739,7 +4739,7 @@ snapshots: parse5: 8.0.1 saxes: 6.0.0 tough-cookie: 6.0.2 - undici: 8.12.1 + undici: 8.12.3 w3c-xmlserializer: 6.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -4912,7 +4912,7 @@ snapshots: minimatch@10.2.6: dependencies: - brace-expansion: 5.0.8 + brace-expansion: 5.0.12 minimatch@3.1.5: dependencies: @@ -5110,7 +5110,7 @@ snapshots: dependencies: postcss: 8.5.32 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.7: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -5274,7 +5274,7 @@ snapshots: espree: 10.4.0 postcss: 8.5.32 postcss-scss: 4.0.9(postcss@8.5.32) - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.7 semver: 7.8.5 optionalDependencies: svelte: 5.57.3(@typescript-eslint/types@8.72.1) @@ -5321,7 +5321,7 @@ snapshots: arktype: 2.2.8 class-validator: 0.14.4 effect: 3.22.4 - joi: 17.13.8 + joi: 17.13.9 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 typebox: 1.4.2 @@ -5429,7 +5429,7 @@ snapshots: undici-types@8.9.0: {} - undici@8.12.1: {} + undici@8.12.3: {} universalify@2.0.1: {} From 7293ad962d799707f99a373c23b9853904dc6546 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 02:39:44 +0000 Subject: [PATCH 2/7] chore(deps): remove unused @eslint/eslintrc The project uses ESLint flat config without FlatCompat, and no other package depends on @eslint/eslintrc. Removing it drops minimatch 3.x and brace-expansion 1.x from the tree, so the brace-expansion 1.x override becomes dead and is removed as well. Resolves 3 Dependabot alerts. ESLint output, unit tests and the build output (excluding version stamps) are identical before and after. Co-Authored-By: Claude Opus 5.5 --- package.json | 1 - pnpm-lock.yaml | 101 -------------------------------------------- pnpm-workspace.yaml | 1 - 3 files changed, 103 deletions(-) diff --git a/package.json b/package.json index 30189fb57..d9255a955 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "devDependencies": { "@dnd-kit/abstract": "0.5.3", "@dnd-kit/dom": "0.5.3", - "@eslint/eslintrc": "3.3.7", "@playwright/test": "1.64.1", "@quramy/prisma-fabbrica": "2.3.3", "@sveltejs/adapter-vercel": "7.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50abed5ae..5c6bd8dae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,7 +167,6 @@ overrides: minimatch@>=10.0.0 <10.2.3: 10.2.6 effect@>=3.0.0 <3.20.0: 3.22.4 defu@<6.1.5: 6.1.7 - brace-expansion@>=1.0.0 <1.1.13: 1.1.18 postcss@>=8.0.0 <8.5.10: 8.5.32 importers: @@ -205,9 +204,6 @@ importers: '@dnd-kit/dom': specifier: 0.5.3 version: 0.5.3 - '@eslint/eslintrc': - specifier: 3.3.7 - version: 3.3.7(supports-color@7.2.0) '@playwright/test': specifier: 1.64.1 version: 1.64.1 @@ -628,10 +624,6 @@ packages: resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.7': - resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.5': resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -1687,9 +1679,6 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.1: resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} engines: {node: '>= 0.4'} @@ -1714,9 +1703,6 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -1727,9 +1713,6 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - brace-expansion@1.1.18: - resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@5.0.12: resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} @@ -1745,10 +1728,6 @@ packages: cacheable@2.5.0: resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - camelcase@9.0.0: resolution: {integrity: sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==} engines: {node: '>=20'} @@ -1778,9 +1757,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} @@ -2059,10 +2035,6 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globals@16.5.0: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} @@ -2108,10 +2080,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2153,10 +2121,6 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} - hasBin: true - jsdom@30.1.3: resolution: {integrity: sha512-hQMUPvRgN7KxsfIytDQji7bimuJeRQa6Qo5+iuiZQk5CafeRxLIA10/cG5YCBFNpD9RO3oqIiN4CO1Y44kxqXg==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -2370,9 +2334,6 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -2493,10 +2454,6 @@ packages: resolution: {integrity: sha512-P2wrCri3bhGLPo3kX7qYVXbo/5GvaVATU0DpO24CbeT53Y4z35t8JUWku04ERpXHUYB5rPMi3TkWE3fmJgx5rA==} engines: {node: '>=22'} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} @@ -2631,10 +2588,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2698,10 +2651,6 @@ packages: std-env@4.3.0: resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - super-sitemap@1.0.12: resolution: {integrity: sha512-C3gfAS1RZxL5bbZGtgnIOitMhfqAt8RmhW8AWTia6c8n9RW3Zx7f/SxVeFWZD0I1nUAx2pkxuWazVtev0Nmb5w==} peerDependencies: @@ -3307,20 +3256,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.7(supports-color@7.2.0)': - dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@7.2.0) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.3.2 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/object-schema@3.0.5': {} '@eslint/plugin-kit@0.7.3': @@ -4208,8 +4143,6 @@ snapshots: arg@5.0.2: {} - argparse@2.0.1: {} - aria-query@5.3.1: {} arkregex@0.0.13: @@ -4236,8 +4169,6 @@ snapshots: axobject-query@4.1.0: {} - balanced-match@1.0.2: {} - balanced-match@4.0.4: {} bidi-js@1.1.0: @@ -4248,11 +4179,6 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - brace-expansion@1.1.18: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 @@ -4280,8 +4206,6 @@ snapshots: keyv: 5.6.0 qified: 0.10.1 - callsites@3.1.0: {} - camelcase@9.0.0: optional: true @@ -4308,8 +4232,6 @@ snapshots: commander@2.20.3: {} - concat-map@0.0.1: {} - confbox@0.2.2: {} consola@3.4.2: {} @@ -4637,8 +4559,6 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 - globals@14.0.0: {} - globals@16.5.0: {} globals@17.14.0: {} @@ -4677,11 +4597,6 @@ snapshots: ignore@7.0.5: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - imurmurhash@0.1.4: {} is-core-module@2.16.1: @@ -4719,10 +4634,6 @@ snapshots: js-tokens@10.0.0: {} - js-yaml@4.3.2: - dependencies: - argparse: 2.0.1 - jsdom@30.1.3: dependencies: '@asamuzakjp/css-color': 7.1.3 @@ -4914,10 +4825,6 @@ snapshots: dependencies: brace-expansion: 5.0.12 - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.18 - minipass@7.1.3: {} minizlib@3.1.0: @@ -5037,10 +4944,6 @@ snapshots: p-queue@10.0.0: {} - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse5@8.0.1: dependencies: entities: 8.0.0 @@ -5166,8 +5069,6 @@ snapshots: require-from-string@2.0.2: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve@1.22.11: @@ -5238,8 +5139,6 @@ snapshots: std-env@4.3.0: {} - strip-json-comments@3.1.1: {} - super-sitemap@1.0.12(svelte@5.57.3(@typescript-eslint/types@8.72.1)): dependencies: svelte: 5.57.3(@typescript-eslint/types@8.72.1) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f66a124fe..d50280978 100755 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -48,5 +48,4 @@ overrides: 'effect@>=3.0.0 <3.20.0': '3.22.4' 'defu@<6.1.5': '6.1.7' # moderate - 'brace-expansion@>=1.0.0 <1.1.13': '1.1.18' 'postcss@>=8.0.0 <8.5.10': '8.5.32' From 6c2c263cf5d53c3da7af839ee07536dad8fcf58b Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 02:40:49 +0000 Subject: [PATCH 3/7] chore(deps): override deepmerge-ts to 8.0.2 under prisma-fabbrica @quramy/prisma-fabbrica pulls @prisma/config 6.19, which pins deepmerge-ts 7.1.5 exactly. The 8.0 breaking changes cover deepmergeInto, type names and Map merging; @prisma/config only calls deepmerge() as the c12 merger, and @prisma/config 7.x uses 8.0.2 the same way. Remove the override together with prisma-fabbrica. Resolves the last high Dependabot alert. prisma generate output, ESLint output, unit tests and the build output (excluding version stamps) are identical before and after, and loading a prisma.config.ts through @prisma/config works with 8.0.2. Co-Authored-By: Claude Opus 5.5 --- pnpm-lock.yaml | 11 ++++++----- pnpm-workspace.yaml | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c6bd8dae..741125504 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,6 +167,7 @@ overrides: minimatch@>=10.0.0 <10.2.3: 10.2.6 effect@>=3.0.0 <3.20.0: 3.22.4 defu@<6.1.5: 6.1.7 + deepmerge-ts@<8.0.0: 8.0.2 postcss@>=8.0.0 <8.5.10: 8.5.32 importers: @@ -1812,9 +1813,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge-ts@7.1.5: - resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} - engines: {node: '>=16.0.0'} + deepmerge-ts@8.0.2: + resolution: {integrity: sha512-uqbvqLUMrc6p0MO+WBRtTxY55hmyh94WRwI5a++PZe54X+bfVh59FSN7uWCBCW1CCVjzjnrwzfI8zidE2obMMw==} + engines: {node: '>=16.9.0'} deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -3547,7 +3548,7 @@ snapshots: '@prisma/config@6.19.0': dependencies: c12: 3.1.0 - deepmerge-ts: 7.1.5 + deepmerge-ts: 8.0.2 effect: 3.22.4 empathic: 2.0.0 transitivePeerDependencies: @@ -4277,7 +4278,7 @@ snapshots: deep-is@0.1.4: {} - deepmerge-ts@7.1.5: {} + deepmerge-ts@8.0.2: {} deepmerge@4.3.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d50280978..839ab0936 100755 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -47,5 +47,7 @@ overrides: 'minimatch@>=10.0.0 <10.2.3': '10.2.6' 'effect@>=3.0.0 <3.20.0': '3.22.4' 'defu@<6.1.5': '6.1.7' + # Crosses a major on purpose: @prisma/config 6.x pins 7.1.5; remove with @quramy/prisma-fabbrica + 'deepmerge-ts@<8.0.0': '8.0.2' # moderate 'postcss@>=8.0.0 <8.5.10': '8.5.32' From 04c652a6f694c5ce617f449b87dbd5d7a05ee988 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 02:47:24 +0000 Subject: [PATCH 4/7] docs: record Dependabot alert audit and remediation results Summarize why the alerts reappeared, how 19 of 23 were resolved, how each change was verified against pre-change outputs, and the remaining decisions for minimatch and glob. Co-Authored-By: Claude Opus 5.5 --- .../dependabot-overrides-audit/report.md | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md diff --git a/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md b/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md new file mode 100644 index 000000000..3b8426aa2 --- /dev/null +++ b/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md @@ -0,0 +1,106 @@ +# Dependabot アラート調査: 依存元・解消手段・代替案 + +初回 2026-08-07 / 更新 2026-11-04。対処はブランチ `chore/fix-dependabot-alerts`(`staging` `f09421b7` から分岐)。 + +## 結果 + +open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツール経由の推移的依存で、本番の実行時コードには載らない。前回の大半を占めた vercel CLI 由来は、`@vercel/vc-native` への置換(2026-10-31)で解消済みだった。今回は 3 つの commit で 19 件を解消し、high は 0 件になった(`pnpm audit` で確認。Dependabot 側は `staging` へのマージ後に閉じる)。 + +| commit | 内容 | 解消 | +| ---------- | --------------------------------------------------------------------- | ------------------- | +| `134ec0ab` | `pnpm update brace-expansion undici joi postcss-selector-parser` | 15 件 | +| `7293ad96` | 未使用の `@eslint/eslintrc` と brace-expansion 1 系の override を削除 | 3 件 | +| `6c2c263c` | override `'deepmerge-ts@<8.0.0': '8.0.2'` を追加 | 1 件(最後の high) | + +残る 4 件のうち、uuid と deepmerge は dismiss する。minimatch と glob は、dismiss するか override 4 行で解消するかの判断待ち(後述)。 + +## アラート一覧 + +| アラート | 深刻度 | パッケージ(旧 → 修正版) | 依存元(宣言レンジ) | 状態 | +| ------------------------ | ------------------- | ------------------------------------- | ----------------------------------------------------- | ------------------ | +| #225、#239〜#244 の 3 件 | high 3 / moderate 1 | brace-expansion 5.0.8 → 5.0.12 | `minimatch@10.2.6`(`^5.0.8`) | 解消(`134ec0ab`) | +| #246〜#248、#250〜#254 | high 4 / moderate 4 | undici 8.12.1 → 8.12.3 | `jsdom@30.1.3`(`^8.12.1`) | 解消(`134ec0ab`) | +| #258 | high | joi 17.13.8 → 17.13.9 | `sveltekit-superforms@3.1.0`(`^17.13.8`) | 解消(`134ec0ab`) | +| #249、#235 | moderate / low | postcss-selector-parser 7.1.1 → 7.1.7 | `svelte-eslint-parser@1.10.0`(`^7.0.0`) | 解消(`134ec0ab`) | +| #239〜#244 の 3 件 | high 2 / moderate 1 | brace-expansion 1.1.18 → 1.1.21 | `@eslint/eslintrc` → `minimatch@3.1.5` | 解消(`7293ad96`) | +| #234 | high | deepmerge-ts 7.1.5 → 8.0.2 | fabbrica → `@prisma/config@6.19.0`(完全固定) | 解消(`6c2c263c`) | +| #200 | moderate | uuid 9.0.1 → 11.1.1 | fabbrica → `short-uuid@5.2.0`(完全固定) | dismiss 予定 | +| #257 | moderate | minimatch 10.2.6 → 11.0.1 以降 | eslint 系 3 経路、nft → glob | 判断待ち | +| #256 | moderate | glob 13.0.6 → 14.0.2 以降 | adapter-vercel → `@vercel/nft@1.10.2`(`^13.0.0`) | 判断待ち | +| #255 | low | deepmerge 4.3.1 → なし | `@sveltejs/vite-plugin-svelte`・`flowbite-datepicker` | dismiss 予定 | + +#239〜#244 は同じ GHSA の 1 系・5 系の組で、どちらが 1 系かは画面から判別できない。 + +## 再発の原因 + +- `lockFileMaintenance` が無効なので、Renovate は推移的依存を更新しない。15 件は、依存元のレンジ内に修正版があるのに lockfile が古いままだった +- override `'brace-expansion@>=1.0.0 <1.1.13': '1.1.18'` のピン先が、また脆弱になった(教訓 3) +- #200・#225 は前回からある番号で、脆弱な版はずっと lockfile に残っていた。閉じた理由は修正ではない。23 件が同時刻に開いた原因は未確認 + +## 決定と根拠 + +**lockfile 更新(15 件)。** 依存元の宣言は `^` レンジなので、lockfile を作り直せば誰の環境でも修正版になる。`npm diff` で見た差分は、brace-expansion が上限の追加、undici がセキュリティ修正(jsdom 経由でテスト時のみ使用)、joi が約 20 行(実行されない)。postcss-selector-parser 7.1.7 は `:not( )` の AST などの挙動も変えるが、ESLint の出力は変わらなかった。override で上げる案は、設定に残骸が残るので採らなかった。 + +**`@eslint/eslintrc` の削除(3 件)。** Flat Config(`FlatCompat` 不使用)からも、`eslint@10` を含む他のパッケージからも使われていなかった。brace-expansion の override のピンを 1.1.21 に直す案は、未使用の依存を残すだけなので採らなかった。 + +**deepmerge-ts の override(1 件)。** `@prisma/config@6.19` が 7.1.5 に完全固定しており、fabbrica は Prisma 7 に対応していない。8.0 の破壊的変更(`deepmergeInto`・型名・Map)は、`@prisma/config` が使う `deepmerge()` に関係せず、`@prisma/config@7.10.1` も 8.0.2 を同じ呼び方で使う。呼ばれるのは `prisma.config.ts` の読み込み時だけなので dismiss も可能だったが、high なのでメジャーを跨ぐ override を選び、外す条件をコメントに書いた。根本解消は fabbrica の廃止([prisma-upgrade/plan.md](../../2026-07-20/prisma-upgrade/plan.md) Phase 3)で、そのとき uuid と override の `effect`・`defu` も消える。 + +**uuid は dismiss。** `short-uuid` は `uuidV4()` を引数なしで呼ぶだけで、脆弱な `buf` の経路を通らない。`short-uuid` 6 系への override は、デフォルトエクスポートが消えて fabbrica が壊れるので採らない。 + +**deepmerge は dismiss。** 修正版が存在しない。vite-plugin-svelte はビルド時に自前の設定をマージするだけで、外部入力は渡らない。 + +## minimatch と glob(判断待ち) + +公式 advisory によると、minimatch(#257)が発火するには、`optimizationLevel >= 2` であることと、攻撃者が glob パターンを指定できることの両方が必要。 + +- lint 系(`eslint`・`@eslint/config-array`・`@typescript-eslint/typescript-estree`)は既定の level 1 で呼んでおり、条件を満たさない +- nft 経由の glob は level 2 を設定するが、パターンを攻撃者は指定できない。本プロジェクトのビルドで nft が glob を呼ぶのは 2 回だけで、どちらも Prisma のクエリエンジンを探す定数パターン(`<@prisma/client>/.prisma/**/*.so?(.*)`)だった。ほかの呼び出し元も、トレース対象のソースコードを静的に評価してパターンを作る +- glob(#256)は、AbortSignal で中断した後も探索が続く問題で、nft は `signal` を渡していない + +修正の手段も、隔離した worktree で検証済み。次の override を足し、不要になる `'minimatch@>=10.0.0 <10.2.3': '10.2.6'` を消すと、minimatch 10 系と glob 13 が lockfile から消え、残りは uuid と deepmerge だけになった。 + +```yaml +'@vercel/nft>glob': '14.0.3' +'eslint>minimatch': '11.0.4' +'@eslint/config-array>minimatch': '11.0.4' +'@typescript-eslint/typescript-estree>minimatch': '11.0.4' +``` + +この構成で、ESLint の対象ファイルの選び方(波括弧・`**`・括弧つきの ignore を含む 4 パターン)、ESLint の出力、ユニットテスト、ビルド成果物、nft の glob 呼び出しごとの結果が、変更前と全て一致した。 + +- **案 1(推奨): #257 と #256 を dismiss。** 発火条件を満たす経路がない。設定に何も残らず、eslint と nft が新しい版に追従すれば lockfile の更新だけで消える +- **案 2: 上記の override 4 行で解消。** 出力の一致は確かめたが、依存元の宣言レンジ(eslint の `^10.2.6`、nft の `glob@^13`)を越えて版を固定し続ける。上流の更新に追従できず、上流が追いついたら手で外す必要がある。glob 14 は Vercel 上で Prisma のエンジンを見つける処理に効くので、採るなら preview デプロイでの確認が要る +- PR #4295 は、override の版を v11 に変えるだけで 10.2.6 が残るので、どちらの案でもクローズする +- 採らない案: glob 13 に minimatch 11 を強制する(例外を出さずにワイルドカードの検出結果が空になる)、全 minimatch を一律に v11 にする、glob 13 の同梱コピーごと `pnpm patch` で直す(保守が重い) + +## 検証の方法と結果 + +- 変更前に基準を取った: ESLint の JSON 出力(対象ファイルと指摘)、ユニットテスト(104 ファイル・3027 件)、`.vercel/output` のファイル一覧と sha256(616 ファイル)、`prisma/.fabbrica` と `ERD.md` の sha256。変更なしで 2 回ビルドすると、バージョンを含む 3 ファイル(`instance.js`・`internal.js`・`_app/version.json`)だけが変わるので、比較から除いた +- 3 つの commit とも、各段階で上記が全て一致し、`pnpm lint`・`pnpm check`・`git diff --check` も通った。`pnpm audit` は 23 件 → 8 件 → 5 件 → 4 件 +- deepmerge-ts 8.0.2 で、一時ディレクトリの `prisma.config.ts` を `@prisma/config` の `loadConfigFromFile` で読み、deepmerge を通る経路がエラーなく動くことを確かめた。`db:seed` は実行していない。seed の実行時に読まれるのは `@quramy/prisma-fabbrica/lib/internal` だけで、`@prisma/internals` を読むのは generator(`prisma generate`)だけだからである +- minimatch と glob の実験は、`git worktree` で本体と分けて行い、終了後に削除した。nft の glob 呼び出しは `Module._load` のフックで記録し、glob 13 と 14 で比べた +- クロスレビューは、AGENTS.md の条件(30 ファイル以上、認証、DB、公開インターフェース)に当たらないので行っていない + +## 教訓(次回の調査で最初に読むこと) + +1. `pnpm audit` は候補出しに使い、結論は lockfile の `snapshots:` で出す(初回は 23 件中 17 件が誤検知だった) +2. override の前に、依存元のレンジ内に修正版があるかを見る。あれば `pnpm update` で済み、設定に残骸が残らない +3. override のレンジ上限とピン先を一致させる(`'pkg@<1.1.21': '1.1.21'`)。ずれていると、ピン先が後で脆弱になってもレンジに再マッチしない +4. override は依存元のレンジを無視して強制されるので、最小の修正版を選ぶ。意図してメジャーを跨ぐなら、依存元が使う API と、上流の後継版がその版を採用しているかを確認する +5. 更新の前に、削除できるか(使われているか)と dismiss できるか(advisory の発火条件を満たす経路があるか)を判定する。ある advisory の判断を、別の advisory に流用しない +6. override は、依存元が同梱したコードには届かない。ファイル探索に関わる変更は、終了コードではなく検出結果と成果物で確認する +7. 出力を比較する前に、変更なしでのノイズを測り、比較したい処理が実際に動いたかを確かめる(例: nft の glob 呼び出しを記録する)。そうしないと「一致した」が空振りになる + +## 残タスクと未検証 + +- [ ] push と PR の作成(人間が実施) +- [ ] uuid(#200)と deepmerge(#255)の dismiss +- [ ] minimatch(#257)と glob(#256)の案の選択。案 1 なら dismiss、案 2 なら override を入れて preview で Prisma の動作を確認 +- [ ] PR #4295 のクローズ +- [ ] 任意: `lockFileMaintenance` の採否(差分の大きさと `minimumReleaseAge` などとの相互作用は未検証) +- [ ] fabbrica の廃止時に、deepmerge-ts・effect・defu の override を外す +- 未検証: preview・production での動作、Windows でのローカルビルド(CI と Vercel は Linux)、flowbite-datepicker 経路の deepmerge が実行時に読まれるか、アラートが一斉に開いた原因 + +## 調査方法 + +`gh` が未認証なので、アラート一覧は画面から共有してもらい、`pnpm audit` の 23 件と 1 対 1 で照合した。各パッケージは lockfile の `snapshots:`(解決済みの版と依存元)、`pnpm view`(修正版とレンジ)、`npm pack` / `npm diff`(CHANGELOG と dist)、`node_modules` の呼び出し箇所(到達性)の順に確認した。minimatch と glob は、公式 advisory、PR #4295(head `fa8b8ae0`)の差分と CI 結果、glob の changelog とタグ差分もあわせて照合した。 From a29374af23fa477512207e88bf490439a309bcec Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 03:06:57 +0000 Subject: [PATCH 5/7] docs: record the decision to dismiss the minimatch and glob alerts Neither advisory has a reachable trigger: ESLint calls minimatch at optimizationLevel 1, and nft only globs constant or source-derived patterns without an AbortSignal. Keep the verified override set as a rejected alternative, and note that PR #4295 was closed. Co-Authored-By: Claude Opus 5.5 --- .../dependabot-overrides-audit/report.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md b/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md index 3b8426aa2..109463486 100644 --- a/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md +++ b/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md @@ -12,7 +12,7 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー | `7293ad96` | 未使用の `@eslint/eslintrc` と brace-expansion 1 系の override を削除 | 3 件 | | `6c2c263c` | override `'deepmerge-ts@<8.0.0': '8.0.2'` を追加 | 1 件(最後の high) | -残る 4 件のうち、uuid と deepmerge は dismiss する。minimatch と glob は、dismiss するか override 4 行で解消するかの判断待ち(後述)。 +残る 4 件は、どれも発火する経路がないか修正版がないので、全て dismiss する(後述)。 ## アラート一覧 @@ -25,8 +25,8 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー | #239〜#244 の 3 件 | high 2 / moderate 1 | brace-expansion 1.1.18 → 1.1.21 | `@eslint/eslintrc` → `minimatch@3.1.5` | 解消(`7293ad96`) | | #234 | high | deepmerge-ts 7.1.5 → 8.0.2 | fabbrica → `@prisma/config@6.19.0`(完全固定) | 解消(`6c2c263c`) | | #200 | moderate | uuid 9.0.1 → 11.1.1 | fabbrica → `short-uuid@5.2.0`(完全固定) | dismiss 予定 | -| #257 | moderate | minimatch 10.2.6 → 11.0.1 以降 | eslint 系 3 経路、nft → glob | 判断待ち | -| #256 | moderate | glob 13.0.6 → 14.0.2 以降 | adapter-vercel → `@vercel/nft@1.10.2`(`^13.0.0`) | 判断待ち | +| #257 | moderate | minimatch 10.2.6 → 11.0.1 以降 | eslint 系 3 経路、nft → glob | dismiss 予定 | +| #256 | moderate | glob 13.0.6 → 14.0.2 以降 | adapter-vercel → `@vercel/nft@1.10.2`(`^13.0.0`) | dismiss 予定 | | #255 | low | deepmerge 4.3.1 → なし | `@sveltejs/vite-plugin-svelte`・`flowbite-datepicker` | dismiss 予定 | #239〜#244 は同じ GHSA の 1 系・5 系の組で、どちらが 1 系かは画面から判別できない。 @@ -49,7 +49,7 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー **deepmerge は dismiss。** 修正版が存在しない。vite-plugin-svelte はビルド時に自前の設定をマージするだけで、外部入力は渡らない。 -## minimatch と glob(判断待ち) +## minimatch と glob: dismiss に決定 公式 advisory によると、minimatch(#257)が発火するには、`optimizationLevel >= 2` であることと、攻撃者が glob パターンを指定できることの両方が必要。 @@ -57,7 +57,9 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー - nft 経由の glob は level 2 を設定するが、パターンを攻撃者は指定できない。本プロジェクトのビルドで nft が glob を呼ぶのは 2 回だけで、どちらも Prisma のクエリエンジンを探す定数パターン(`<@prisma/client>/.prisma/**/*.so?(.*)`)だった。ほかの呼び出し元も、トレース対象のソースコードを静的に評価してパターンを作る - glob(#256)は、AbortSignal で中断した後も探索が続く問題で、nft は `signal` を渡していない -修正の手段も、隔離した worktree で検証済み。次の override を足し、不要になる `'minimatch@>=10.0.0 <10.2.3': '10.2.6'` を消すと、minimatch 10 系と glob 13 が lockfile から消え、残りは uuid と deepmerge だけになった。 +発火する経路がないので、#257 と #256 は dismiss する。設定に何も残らず、eslint と nft が新しい版に追従すれば、lockfile の更新だけで消える。 + +**採らなかった案: override 4 行で解消する。** 隔離した worktree で動くことは検証した。次の override を足し、不要になる `'minimatch@>=10.0.0 <10.2.3': '10.2.6'` を消すと、minimatch 10 系と glob 13 が lockfile から消え、残りは uuid と deepmerge だけになった。 ```yaml '@vercel/nft>glob': '14.0.3' @@ -66,12 +68,9 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー '@typescript-eslint/typescript-estree>minimatch': '11.0.4' ``` -この構成で、ESLint の対象ファイルの選び方(波括弧・`**`・括弧つきの ignore を含む 4 パターン)、ESLint の出力、ユニットテスト、ビルド成果物、nft の glob 呼び出しごとの結果が、変更前と全て一致した。 +この構成で、ESLint の対象ファイルの選び方(波括弧・`**`・括弧つきの ignore を含む 4 パターン)、ESLint の出力、ユニットテスト、ビルド成果物、nft の glob 呼び出しごとの結果が、変更前と全て一致した。それでも採らなかったのは、依存元の宣言レンジ(eslint の `^10.2.6`、nft の `glob@^13`)を越えて版を固定し続けることになるためである。上流の更新に追従できず、上流が追いついたら手で外す必要がある。また glob 14 は Vercel 上で Prisma のエンジンを見つける処理に効くので、採るなら preview デプロイでの確認も要る。上記の override は、将来アラートを再評価するときにそのまま使える。 -- **案 1(推奨): #257 と #256 を dismiss。** 発火条件を満たす経路がない。設定に何も残らず、eslint と nft が新しい版に追従すれば lockfile の更新だけで消える -- **案 2: 上記の override 4 行で解消。** 出力の一致は確かめたが、依存元の宣言レンジ(eslint の `^10.2.6`、nft の `glob@^13`)を越えて版を固定し続ける。上流の更新に追従できず、上流が追いついたら手で外す必要がある。glob 14 は Vercel 上で Prisma のエンジンを見つける処理に効くので、採るなら preview デプロイでの確認が要る -- PR #4295 は、override の版を v11 に変えるだけで 10.2.6 が残るので、どちらの案でもクローズする -- 採らない案: glob 13 に minimatch 11 を強制する(例外を出さずにワイルドカードの検出結果が空になる)、全 minimatch を一律に v11 にする、glob 13 の同梱コピーごと `pnpm patch` で直す(保守が重い) +ほかに採らなかった案: glob 13 に minimatch 11 を強制する(例外を出さずにワイルドカードの検出結果が空になる)、全 minimatch を一律に v11 にする、glob 13 の同梱コピーごと `pnpm patch` で直す(保守が重い)。override の版を v11 に変えるだけの PR #4295 は、10.2.6 が残って解消にならないのでクローズした。 ## 検証の方法と結果 @@ -94,9 +93,7 @@ open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツー ## 残タスクと未検証 - [ ] push と PR の作成(人間が実施) -- [ ] uuid(#200)と deepmerge(#255)の dismiss -- [ ] minimatch(#257)と glob(#256)の案の選択。案 1 なら dismiss、案 2 なら override を入れて preview で Prisma の動作を確認 -- [ ] PR #4295 のクローズ +- [ ] GitHub 上での dismiss(人間が実施)。理由は、#200 uuid と #256 glob が Vulnerable code is not actually used、#257 minimatch と #255 deepmerge が Risk is tolerable to this project(minimatch は nft の経路で脆弱なコード自体は実行されるため、not used ではなく tolerable にする) - [ ] 任意: `lockFileMaintenance` の採否(差分の大きさと `minimumReleaseAge` などとの相互作用は未検証) - [ ] fabbrica の廃止時に、deepmerge-ts・effect・defu の override を外す - 未検証: preview・production での動作、Windows でのローカルビルド(CI と Vercel は Linux)、flowbite-datepicker 経路の deepmerge が実行時に読まれるか、アラートが一斉に開いた原因 From e57911341b5f139e61100fb823a63b3d1aa25b0b Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 03:09:48 +0000 Subject: [PATCH 6/7] docs: remove the Dependabot overrides audit report Co-Authored-By: Claude Sonnet 5.5 --- .../dependabot-overrides-audit/report.md | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md diff --git a/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md b/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md deleted file mode 100644 index 109463486..000000000 --- a/docs/dev-notes/2026-08-07/dependabot-overrides-audit/report.md +++ /dev/null @@ -1,103 +0,0 @@ -# Dependabot アラート調査: 依存元・解消手段・代替案 - -初回 2026-08-07 / 更新 2026-11-04。対処はブランチ `chore/fix-dependabot-alerts`(`staging` `f09421b7` から分岐)。 - -## 結果 - -open だった 23 件(high 11 / moderate 10 / low 2)は全て開発用ツール経由の推移的依存で、本番の実行時コードには載らない。前回の大半を占めた vercel CLI 由来は、`@vercel/vc-native` への置換(2026-10-31)で解消済みだった。今回は 3 つの commit で 19 件を解消し、high は 0 件になった(`pnpm audit` で確認。Dependabot 側は `staging` へのマージ後に閉じる)。 - -| commit | 内容 | 解消 | -| ---------- | --------------------------------------------------------------------- | ------------------- | -| `134ec0ab` | `pnpm update brace-expansion undici joi postcss-selector-parser` | 15 件 | -| `7293ad96` | 未使用の `@eslint/eslintrc` と brace-expansion 1 系の override を削除 | 3 件 | -| `6c2c263c` | override `'deepmerge-ts@<8.0.0': '8.0.2'` を追加 | 1 件(最後の high) | - -残る 4 件は、どれも発火する経路がないか修正版がないので、全て dismiss する(後述)。 - -## アラート一覧 - -| アラート | 深刻度 | パッケージ(旧 → 修正版) | 依存元(宣言レンジ) | 状態 | -| ------------------------ | ------------------- | ------------------------------------- | ----------------------------------------------------- | ------------------ | -| #225、#239〜#244 の 3 件 | high 3 / moderate 1 | brace-expansion 5.0.8 → 5.0.12 | `minimatch@10.2.6`(`^5.0.8`) | 解消(`134ec0ab`) | -| #246〜#248、#250〜#254 | high 4 / moderate 4 | undici 8.12.1 → 8.12.3 | `jsdom@30.1.3`(`^8.12.1`) | 解消(`134ec0ab`) | -| #258 | high | joi 17.13.8 → 17.13.9 | `sveltekit-superforms@3.1.0`(`^17.13.8`) | 解消(`134ec0ab`) | -| #249、#235 | moderate / low | postcss-selector-parser 7.1.1 → 7.1.7 | `svelte-eslint-parser@1.10.0`(`^7.0.0`) | 解消(`134ec0ab`) | -| #239〜#244 の 3 件 | high 2 / moderate 1 | brace-expansion 1.1.18 → 1.1.21 | `@eslint/eslintrc` → `minimatch@3.1.5` | 解消(`7293ad96`) | -| #234 | high | deepmerge-ts 7.1.5 → 8.0.2 | fabbrica → `@prisma/config@6.19.0`(完全固定) | 解消(`6c2c263c`) | -| #200 | moderate | uuid 9.0.1 → 11.1.1 | fabbrica → `short-uuid@5.2.0`(完全固定) | dismiss 予定 | -| #257 | moderate | minimatch 10.2.6 → 11.0.1 以降 | eslint 系 3 経路、nft → glob | dismiss 予定 | -| #256 | moderate | glob 13.0.6 → 14.0.2 以降 | adapter-vercel → `@vercel/nft@1.10.2`(`^13.0.0`) | dismiss 予定 | -| #255 | low | deepmerge 4.3.1 → なし | `@sveltejs/vite-plugin-svelte`・`flowbite-datepicker` | dismiss 予定 | - -#239〜#244 は同じ GHSA の 1 系・5 系の組で、どちらが 1 系かは画面から判別できない。 - -## 再発の原因 - -- `lockFileMaintenance` が無効なので、Renovate は推移的依存を更新しない。15 件は、依存元のレンジ内に修正版があるのに lockfile が古いままだった -- override `'brace-expansion@>=1.0.0 <1.1.13': '1.1.18'` のピン先が、また脆弱になった(教訓 3) -- #200・#225 は前回からある番号で、脆弱な版はずっと lockfile に残っていた。閉じた理由は修正ではない。23 件が同時刻に開いた原因は未確認 - -## 決定と根拠 - -**lockfile 更新(15 件)。** 依存元の宣言は `^` レンジなので、lockfile を作り直せば誰の環境でも修正版になる。`npm diff` で見た差分は、brace-expansion が上限の追加、undici がセキュリティ修正(jsdom 経由でテスト時のみ使用)、joi が約 20 行(実行されない)。postcss-selector-parser 7.1.7 は `:not( )` の AST などの挙動も変えるが、ESLint の出力は変わらなかった。override で上げる案は、設定に残骸が残るので採らなかった。 - -**`@eslint/eslintrc` の削除(3 件)。** Flat Config(`FlatCompat` 不使用)からも、`eslint@10` を含む他のパッケージからも使われていなかった。brace-expansion の override のピンを 1.1.21 に直す案は、未使用の依存を残すだけなので採らなかった。 - -**deepmerge-ts の override(1 件)。** `@prisma/config@6.19` が 7.1.5 に完全固定しており、fabbrica は Prisma 7 に対応していない。8.0 の破壊的変更(`deepmergeInto`・型名・Map)は、`@prisma/config` が使う `deepmerge()` に関係せず、`@prisma/config@7.10.1` も 8.0.2 を同じ呼び方で使う。呼ばれるのは `prisma.config.ts` の読み込み時だけなので dismiss も可能だったが、high なのでメジャーを跨ぐ override を選び、外す条件をコメントに書いた。根本解消は fabbrica の廃止([prisma-upgrade/plan.md](../../2026-07-20/prisma-upgrade/plan.md) Phase 3)で、そのとき uuid と override の `effect`・`defu` も消える。 - -**uuid は dismiss。** `short-uuid` は `uuidV4()` を引数なしで呼ぶだけで、脆弱な `buf` の経路を通らない。`short-uuid` 6 系への override は、デフォルトエクスポートが消えて fabbrica が壊れるので採らない。 - -**deepmerge は dismiss。** 修正版が存在しない。vite-plugin-svelte はビルド時に自前の設定をマージするだけで、外部入力は渡らない。 - -## minimatch と glob: dismiss に決定 - -公式 advisory によると、minimatch(#257)が発火するには、`optimizationLevel >= 2` であることと、攻撃者が glob パターンを指定できることの両方が必要。 - -- lint 系(`eslint`・`@eslint/config-array`・`@typescript-eslint/typescript-estree`)は既定の level 1 で呼んでおり、条件を満たさない -- nft 経由の glob は level 2 を設定するが、パターンを攻撃者は指定できない。本プロジェクトのビルドで nft が glob を呼ぶのは 2 回だけで、どちらも Prisma のクエリエンジンを探す定数パターン(`<@prisma/client>/.prisma/**/*.so?(.*)`)だった。ほかの呼び出し元も、トレース対象のソースコードを静的に評価してパターンを作る -- glob(#256)は、AbortSignal で中断した後も探索が続く問題で、nft は `signal` を渡していない - -発火する経路がないので、#257 と #256 は dismiss する。設定に何も残らず、eslint と nft が新しい版に追従すれば、lockfile の更新だけで消える。 - -**採らなかった案: override 4 行で解消する。** 隔離した worktree で動くことは検証した。次の override を足し、不要になる `'minimatch@>=10.0.0 <10.2.3': '10.2.6'` を消すと、minimatch 10 系と glob 13 が lockfile から消え、残りは uuid と deepmerge だけになった。 - -```yaml -'@vercel/nft>glob': '14.0.3' -'eslint>minimatch': '11.0.4' -'@eslint/config-array>minimatch': '11.0.4' -'@typescript-eslint/typescript-estree>minimatch': '11.0.4' -``` - -この構成で、ESLint の対象ファイルの選び方(波括弧・`**`・括弧つきの ignore を含む 4 パターン)、ESLint の出力、ユニットテスト、ビルド成果物、nft の glob 呼び出しごとの結果が、変更前と全て一致した。それでも採らなかったのは、依存元の宣言レンジ(eslint の `^10.2.6`、nft の `glob@^13`)を越えて版を固定し続けることになるためである。上流の更新に追従できず、上流が追いついたら手で外す必要がある。また glob 14 は Vercel 上で Prisma のエンジンを見つける処理に効くので、採るなら preview デプロイでの確認も要る。上記の override は、将来アラートを再評価するときにそのまま使える。 - -ほかに採らなかった案: glob 13 に minimatch 11 を強制する(例外を出さずにワイルドカードの検出結果が空になる)、全 minimatch を一律に v11 にする、glob 13 の同梱コピーごと `pnpm patch` で直す(保守が重い)。override の版を v11 に変えるだけの PR #4295 は、10.2.6 が残って解消にならないのでクローズした。 - -## 検証の方法と結果 - -- 変更前に基準を取った: ESLint の JSON 出力(対象ファイルと指摘)、ユニットテスト(104 ファイル・3027 件)、`.vercel/output` のファイル一覧と sha256(616 ファイル)、`prisma/.fabbrica` と `ERD.md` の sha256。変更なしで 2 回ビルドすると、バージョンを含む 3 ファイル(`instance.js`・`internal.js`・`_app/version.json`)だけが変わるので、比較から除いた -- 3 つの commit とも、各段階で上記が全て一致し、`pnpm lint`・`pnpm check`・`git diff --check` も通った。`pnpm audit` は 23 件 → 8 件 → 5 件 → 4 件 -- deepmerge-ts 8.0.2 で、一時ディレクトリの `prisma.config.ts` を `@prisma/config` の `loadConfigFromFile` で読み、deepmerge を通る経路がエラーなく動くことを確かめた。`db:seed` は実行していない。seed の実行時に読まれるのは `@quramy/prisma-fabbrica/lib/internal` だけで、`@prisma/internals` を読むのは generator(`prisma generate`)だけだからである -- minimatch と glob の実験は、`git worktree` で本体と分けて行い、終了後に削除した。nft の glob 呼び出しは `Module._load` のフックで記録し、glob 13 と 14 で比べた -- クロスレビューは、AGENTS.md の条件(30 ファイル以上、認証、DB、公開インターフェース)に当たらないので行っていない - -## 教訓(次回の調査で最初に読むこと) - -1. `pnpm audit` は候補出しに使い、結論は lockfile の `snapshots:` で出す(初回は 23 件中 17 件が誤検知だった) -2. override の前に、依存元のレンジ内に修正版があるかを見る。あれば `pnpm update` で済み、設定に残骸が残らない -3. override のレンジ上限とピン先を一致させる(`'pkg@<1.1.21': '1.1.21'`)。ずれていると、ピン先が後で脆弱になってもレンジに再マッチしない -4. override は依存元のレンジを無視して強制されるので、最小の修正版を選ぶ。意図してメジャーを跨ぐなら、依存元が使う API と、上流の後継版がその版を採用しているかを確認する -5. 更新の前に、削除できるか(使われているか)と dismiss できるか(advisory の発火条件を満たす経路があるか)を判定する。ある advisory の判断を、別の advisory に流用しない -6. override は、依存元が同梱したコードには届かない。ファイル探索に関わる変更は、終了コードではなく検出結果と成果物で確認する -7. 出力を比較する前に、変更なしでのノイズを測り、比較したい処理が実際に動いたかを確かめる(例: nft の glob 呼び出しを記録する)。そうしないと「一致した」が空振りになる - -## 残タスクと未検証 - -- [ ] push と PR の作成(人間が実施) -- [ ] GitHub 上での dismiss(人間が実施)。理由は、#200 uuid と #256 glob が Vulnerable code is not actually used、#257 minimatch と #255 deepmerge が Risk is tolerable to this project(minimatch は nft の経路で脆弱なコード自体は実行されるため、not used ではなく tolerable にする) -- [ ] 任意: `lockFileMaintenance` の採否(差分の大きさと `minimumReleaseAge` などとの相互作用は未検証) -- [ ] fabbrica の廃止時に、deepmerge-ts・effect・defu の override を外す -- 未検証: preview・production での動作、Windows でのローカルビルド(CI と Vercel は Linux)、flowbite-datepicker 経路の deepmerge が実行時に読まれるか、アラートが一斉に開いた原因 - -## 調査方法 - -`gh` が未認証なので、アラート一覧は画面から共有してもらい、`pnpm audit` の 23 件と 1 対 1 で照合した。各パッケージは lockfile の `snapshots:`(解決済みの版と依存元)、`pnpm view`(修正版とレンジ)、`npm pack` / `npm diff`(CHANGELOG と dist)、`node_modules` の呼び出し箇所(到達性)の順に確認した。minimatch と glob は、公式 advisory、PR #4295(head `fa8b8ae0`)の差分と CI 結果、glob の changelog とタグ差分もあわせて照合した。 From 38f2be89350fe684f030df57fbfd0a7ed17d356c Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Wed, 4 Nov 2026 03:12:35 +0000 Subject: [PATCH 7/7] docs: add dependency rules and output comparison to dep-upgrade Add a path rule for package.json, pnpm-workspace.yaml and renovate.json: fix vulnerable transitive dependencies by removal, then pnpm update, then an override, and keep each override's upper bound equal to its pin. Teach dep-upgrade to compare outputs against a baseline, measure no-change noise, and confirm the compared code actually ran. Co-Authored-By: Claude Opus 5.5 --- .agents/skills/dep-upgrade/instructions.md | 6 +++++ .claude/rules/dependencies.md | 1 + AGENTS.md | 23 ++++++++++--------- docs/guides/agent-rules/dependencies.md | 26 ++++++++++++++++++++++ 4 files changed, 45 insertions(+), 11 deletions(-) create mode 120000 .claude/rules/dependencies.md create mode 100644 docs/guides/agent-rules/dependencies.md diff --git a/.agents/skills/dep-upgrade/instructions.md b/.agents/skills/dep-upgrade/instructions.md index b5e59ea39..c4ae5bc00 100644 --- a/.agents/skills/dep-upgrade/instructions.md +++ b/.agents/skills/dep-upgrade/instructions.md @@ -66,4 +66,10 @@ pnpm test:unit > **`pnpm check` tip:** If type errors appear and you have uncommitted changes, run `git stash && pnpm check 2>&1 | tail -5` to confirm whether errors are pre-existing. Restore with `git stash pop`. If there is nothing to stash, skip this check — without a baseline to compare against, it gives no useful signal. +**Compare outputs, not only exit codes.** Passing commands do not prove that nothing changed. Before the change, save the outputs: ESLint JSON, the list and hashes of build files, and generated files. After the change, compare them. + +- First build twice with no change. Some files always differ (e.g. version stamps); leave them out of the comparison. +- Check that the code you care about actually ran, for example by logging calls to the updated package during the build. If it never ran, "identical output" proves nothing. +- A new version in the lockfile does not prove that the running code changed. Some packages bundle their own copy of a dependency, so check the entry point that is actually loaded. + When done, rewrite plan.md as `AGENTS.md` Implementation Workflow step 6 describes, recording the verification results among the facts. diff --git a/.claude/rules/dependencies.md b/.claude/rules/dependencies.md new file mode 120000 index 000000000..42df84ecd --- /dev/null +++ b/.claude/rules/dependencies.md @@ -0,0 +1 @@ +../../docs/guides/agent-rules/dependencies.md \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 04649a06d..62e74b691 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,17 +41,18 @@ See `docs/guides/architecture.md` for detailed placement rules. Before planning or changing a matching path, read the corresponding document under `docs/guides/agent-rules/`. -| Path | Rules | -| ------------------------------------ | ------------------------------------------------------------- | -| All source and plans | `coding-style.md` | -| `prisma/**`, server and service code | `prisma-db.md` | -| `**/*.test.ts`, `src/test/**` | `testing.md` | -| `**/*.spec.ts`, `e2e/**` | `testing-e2e.md` | -| Svelte components and stores | `svelte-components.md`, `svelte-runes.md`, `accessibility.md` | -| SvelteKit routes | `sveltekit.md` | -| Authentication and admin paths | `auth.md` | -| Server cache modules | `server-cache.md` | -| `.github/workflows/**` | `github-actions.md` | +| Path | Rules | +| ------------------------------------------------------ | ------------------------------------------------------------- | +| All source and plans | `coding-style.md` | +| `prisma/**`, server and service code | `prisma-db.md` | +| `**/*.test.ts`, `src/test/**` | `testing.md` | +| `**/*.spec.ts`, `e2e/**` | `testing-e2e.md` | +| Svelte components and stores | `svelte-components.md`, `svelte-runes.md`, `accessibility.md` | +| SvelteKit routes | `sveltekit.md` | +| Authentication and admin paths | `auth.md` | +| Server cache modules | `server-cache.md` | +| `.github/workflows/**` | `github-actions.md` | +| `package.json`, `pnpm-workspace.yaml`, `renovate.json` | `dependencies.md` | Use project-specific workflows from `.agents/skills/` when a task matches a skill description. Each `.agents/skills//instructions.md` is a plain Markdown checklist — read it directly when doing that task by hand, not only when an agent loads it automatically. diff --git a/docs/guides/agent-rules/dependencies.md b/docs/guides/agent-rules/dependencies.md new file mode 100644 index 000000000..c2db04a23 --- /dev/null +++ b/docs/guides/agent-rules/dependencies.md @@ -0,0 +1,26 @@ +--- +description: Dependency update and security override rules +paths: + - 'package.json' + - 'pnpm-workspace.yaml' + - 'renovate.json' +--- + +# Dependencies + +## Fixing a Vulnerable Transitive Dependency + +Try these in order: + +1. **Remove it.** Check that the direct dependency that pulls it in is still used. If it is not, delete it. +2. **Update the lockfile.** If the parent's declared range already allows the fixed version (e.g. `^8.12.1` and the fix is `8.12.3`), run `pnpm update `. No override is needed. +3. **Add an override.** Use it only when the fix is outside the parent's range. + +Before you choose 2 or 3, read the advisory's trigger conditions and check whether this project can reach them. If it cannot, dismissing the alert is a valid choice. Judge each advisory on its own: do not reuse the reasoning for one advisory to dismiss another advisory of the same package. + +## Writing Overrides + +- Make the upper bound equal to the pin: `'pkg@>=1.0.0 <1.1.21': '1.1.21'`. If they differ (`<1.1.13': '1.1.18'`), the pin can become vulnerable later, and the selector will never match it again. +- Overrides ignore the parent's declared range. Pick the lowest fixed version that the parent accepts, not the latest one. +- When you cross a major on purpose, check the API the parent actually uses, and add a comment that says when to remove the override. +- When you review alerts, also check that each existing override still matches a package and that its pin is not vulnerable.