Skip to content

Commit 85d31a8

Browse files
jherrclaude
andauthored
chore(renovate): fix lockfile-regen OOM blocking grouped dep PRs (#869) (#872)
The single `group:allNonMajor` group updated every dependency in one PR, so Renovate's `renovate/artifacts` step regenerated the entire ~1.1MB lockfile across all workspace manifests in a single pnpm pass — with `pnpmDedupe` on top — and OOM'd on the heap limit (e.g. #719). The lockfile then never updated and every `--frozen-lockfile` check went red. - Drop `group:allNonMajor` in favor of smaller per-ecosystem groups (markdown/unified, ai provider sdks, build & test tooling, lint & format, framework ecosystems, @types, tailwind). A catch-all keeps the remainder bundled so we don't regress to one-PR-per-dep. Each PR now touches far fewer manifests, shrinking each lockfile pass. - Drop `pnpmDedupe` from postUpdateOptions — the full-lockfile dedupe pass was the main memory driver. - Add `minimumReleaseAge: "1 day"` to match pnpm's `minimumReleaseAge: 1440` (minutes) in pnpm-workspace.yaml, so Renovate doesn't propose versions pnpm will refuse to install. Note: raising the runner heap (NODE_OPTIONS=--max-old-space-size=8192) must be set in the Mend hosted env — it can't live in renovate.json. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 00505fe commit 85d31a8

1 file changed

Lines changed: 143 additions & 2 deletions

File tree

.github/renovate.json

Lines changed: 143 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"configMigration": true,
44
"extends": [
55
"config:recommended",
6-
"group:allNonMajor",
76
"schedule:weekly",
87
":approveMajorUpdates",
98
":automergeMinor",
@@ -15,7 +14,7 @@
1514
"ignorePresets": [":ignoreModulesAndTests"],
1615
"labels": ["dependencies"],
1716
"rangeStrategy": "bump",
18-
"postUpdateOptions": ["pnpmDedupe"],
17+
"minimumReleaseAge": "1 day",
1918
"ignoreDeps": [
2019
"@types/node",
2120
"@types/react",
@@ -25,5 +24,147 @@
2524
"react-dom",
2625
"typescript",
2726
"vue"
27+
],
28+
"packageRules": [
29+
{
30+
"description": "Fallback: bundle any remaining non-major updates so we don't get one PR per dependency. Ecosystem rules below override this for their packages.",
31+
"matchUpdateTypes": ["minor", "patch", "pin", "digest"],
32+
"groupName": "all non-major dependencies",
33+
"groupSlug": "all-minor-patch"
34+
},
35+
{
36+
"description": "Lint & formatting toolchain",
37+
"matchUpdateTypes": ["minor", "patch"],
38+
"matchPackageNames": [
39+
"eslint",
40+
"eslint-**",
41+
"@eslint/**",
42+
"@eslint-community/**",
43+
"@typescript-eslint/**",
44+
"@tanstack/eslint-config",
45+
"prettier",
46+
"prettier-**",
47+
"knip",
48+
"sherif",
49+
"publint"
50+
],
51+
"groupName": "lint & format",
52+
"groupSlug": "lint-format"
53+
},
54+
{
55+
"description": "Build & test toolchain (Vite/Vitest/Nx)",
56+
"matchUpdateTypes": ["minor", "patch"],
57+
"matchPackageNames": [
58+
"vite",
59+
"vite-**",
60+
"@vitejs/**",
61+
"vitest",
62+
"@vitest/**",
63+
"@tanstack/vite-config",
64+
"@tanstack/typedoc-config",
65+
"typedoc",
66+
"typedoc-**",
67+
"nx",
68+
"@nx/**",
69+
"tsx",
70+
"happy-dom",
71+
"jsdom",
72+
"@testing-library/**",
73+
"tinyglobby",
74+
"premove"
75+
],
76+
"groupName": "build & test tooling",
77+
"groupSlug": "build-test-tooling"
78+
},
79+
{
80+
"description": "Unified / markdown ecosystem (the largest transitive cluster in the lockfile)",
81+
"matchUpdateTypes": ["minor", "patch"],
82+
"matchPackageNames": [
83+
"unified",
84+
"remark**",
85+
"rehype**",
86+
"mdast**",
87+
"@mdx-js/**",
88+
"hast**",
89+
"micromark**",
90+
"unist**",
91+
"vfile**",
92+
"marked",
93+
"marked-**",
94+
"highlight.js",
95+
"html-**",
96+
"markdown-**"
97+
],
98+
"groupName": "markdown/unified",
99+
"groupSlug": "markdown-unified"
100+
},
101+
{
102+
"description": "Provider / AI SDKs",
103+
"matchUpdateTypes": ["minor", "patch"],
104+
"matchPackageNames": [
105+
"openai",
106+
"@anthropic-ai/**",
107+
"@google/**",
108+
"@google-cloud/**",
109+
"@aws-sdk/**",
110+
"@openrouter/**",
111+
"@mistralai/**",
112+
"@ai-sdk/**",
113+
"groq-sdk",
114+
"ollama",
115+
"@opentelemetry/**"
116+
],
117+
"groupName": "ai provider sdks",
118+
"groupSlug": "ai-provider-sdks"
119+
},
120+
{
121+
"description": "React ecosystem",
122+
"matchUpdateTypes": ["minor", "patch"],
123+
"matchPackageNames": ["react-**", "@react-native/**", "react-native", "react-native-**"],
124+
"groupName": "react ecosystem",
125+
"groupSlug": "react-ecosystem"
126+
},
127+
{
128+
"description": "Vue ecosystem",
129+
"matchUpdateTypes": ["minor", "patch"],
130+
"matchPackageNames": ["@vue/**", "vue-**"],
131+
"groupName": "vue ecosystem",
132+
"groupSlug": "vue-ecosystem"
133+
},
134+
{
135+
"description": "Angular ecosystem",
136+
"matchUpdateTypes": ["minor", "patch"],
137+
"matchPackageNames": ["@angular/**", "@angular-**", "angular-**"],
138+
"groupName": "angular ecosystem",
139+
"groupSlug": "angular-ecosystem"
140+
},
141+
{
142+
"description": "Solid ecosystem",
143+
"matchUpdateTypes": ["minor", "patch"],
144+
"matchPackageNames": ["solid-**", "@solidjs/**", "seroval", "seroval-**"],
145+
"groupName": "solid ecosystem",
146+
"groupSlug": "solid-ecosystem"
147+
},
148+
{
149+
"description": "Svelte ecosystem",
150+
"matchUpdateTypes": ["minor", "patch"],
151+
"matchPackageNames": ["svelte", "svelte-**", "@sveltejs/**", "prettier-plugin-svelte"],
152+
"groupName": "svelte ecosystem",
153+
"groupSlug": "svelte-ecosystem"
154+
},
155+
{
156+
"description": "Tailwind & icon tooling",
157+
"matchUpdateTypes": ["minor", "patch"],
158+
"matchPackageNames": ["tailwindcss", "@tailwindcss/**", "lucide", "lucide-**", "@lucide/**"],
159+
"groupName": "tailwind & icons",
160+
"groupSlug": "tailwind-icons"
161+
},
162+
{
163+
"description": "@types packages",
164+
"matchUpdateTypes": ["minor", "patch"],
165+
"matchPackageNames": ["@types/**"],
166+
"groupName": "type definitions",
167+
"groupSlug": "type-definitions"
168+
}
28169
]
29170
}

0 commit comments

Comments
 (0)