mcmodding-mcp 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,542 @@
1
+ import { MappingsService } from '../services/mappings-service.js';
2
+ export const MAPPINGS_TOOLS = [
3
+ {
4
+ name: 'search_mappings',
5
+ description: 'Search Minecraft class, method, and field mappings from Parchment data. Returns deobfuscated names, parameter names, and Javadoc documentation. Use this when you need to understand Minecraft internals or find the correct class/method names for modding.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ query: {
10
+ type: 'string',
11
+ description: 'Search query - class name, method name, or field name (e.g., "Block", "getBlockState", "player", "ServerLevel")',
12
+ },
13
+ type: {
14
+ type: 'string',
15
+ enum: ['class', 'method', 'field', 'all'],
16
+ description: 'Filter by mapping type. Default: all',
17
+ default: 'all',
18
+ },
19
+ minecraft_version: {
20
+ type: 'string',
21
+ description: 'Target Minecraft version (e.g., "1.21.4", "1.20.1"). Uses latest if not specified.',
22
+ },
23
+ package_filter: {
24
+ type: 'string',
25
+ description: 'Filter by package name (e.g., "net.minecraft.world", "net.minecraft.server")',
26
+ },
27
+ include_javadoc: {
28
+ type: 'boolean',
29
+ description: 'Include Javadoc documentation in results. Default: true',
30
+ default: true,
31
+ },
32
+ limit: {
33
+ type: 'number',
34
+ description: 'Maximum results to return (1-50). Default: 15',
35
+ minimum: 1,
36
+ maximum: 50,
37
+ default: 15,
38
+ },
39
+ },
40
+ required: ['query'],
41
+ },
42
+ },
43
+ {
44
+ name: 'get_class_details',
45
+ description: 'Get detailed information about a specific Minecraft class including all its methods and fields with their parameter names and Javadocs.',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ class_name: {
50
+ type: 'string',
51
+ description: 'Full class name (e.g., "net.minecraft.world.level.block.Block" or just "Block")',
52
+ },
53
+ minecraft_version: {
54
+ type: 'string',
55
+ description: 'Target Minecraft version. Uses latest if not specified.',
56
+ },
57
+ include_methods: {
58
+ type: 'boolean',
59
+ description: 'Include method details. Default: true',
60
+ default: true,
61
+ },
62
+ include_fields: {
63
+ type: 'boolean',
64
+ description: 'Include field details. Default: true',
65
+ default: true,
66
+ },
67
+ },
68
+ required: ['class_name'],
69
+ },
70
+ },
71
+ {
72
+ name: 'lookup_obfuscated',
73
+ description: 'Look up the deobfuscated name for an obfuscated Minecraft class, method, or field name. Useful when encountering obfuscated names in crash logs or decompiled code.',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {
77
+ obfuscated_name: {
78
+ type: 'string',
79
+ description: 'The obfuscated name to look up (e.g., "m_46859_", "f_46443_", "C_12345_")',
80
+ },
81
+ minecraft_version: {
82
+ type: 'string',
83
+ description: 'Target Minecraft version. Uses latest if not specified.',
84
+ },
85
+ },
86
+ required: ['obfuscated_name'],
87
+ },
88
+ },
89
+ {
90
+ name: 'get_method_signature',
91
+ description: 'Get the full signature of a specific method including parameter names, types, and Javadoc. Useful when you need to understand how to call or override a Minecraft method.',
92
+ inputSchema: {
93
+ type: 'object',
94
+ properties: {
95
+ class_name: {
96
+ type: 'string',
97
+ description: 'The class containing the method',
98
+ },
99
+ method_name: {
100
+ type: 'string',
101
+ description: 'The method name to look up',
102
+ },
103
+ minecraft_version: {
104
+ type: 'string',
105
+ description: 'Target Minecraft version. Uses latest if not specified.',
106
+ },
107
+ },
108
+ required: ['class_name', 'method_name'],
109
+ },
110
+ },
111
+ {
112
+ name: 'list_mapping_versions',
113
+ description: 'List all Minecraft versions available in the mappings database with statistics.',
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ include_stats: {
118
+ type: 'boolean',
119
+ description: 'Include detailed statistics. Default: false',
120
+ default: false,
121
+ },
122
+ },
123
+ },
124
+ },
125
+ {
126
+ name: 'browse_package',
127
+ description: 'Browse classes in a specific Minecraft package. Useful for discovering available classes in a package.',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ package_name: {
132
+ type: 'string',
133
+ description: 'Package name to browse (e.g., "net.minecraft.world.level.block", "net.minecraft.server.level")',
134
+ },
135
+ minecraft_version: {
136
+ type: 'string',
137
+ description: 'Target Minecraft version. Uses latest if not specified.',
138
+ },
139
+ },
140
+ required: ['package_name'],
141
+ },
142
+ },
143
+ ];
144
+ const NOT_AVAILABLE_MESSAGE = 'Parchment mappings database is not available. This is an optional feature that provides Minecraft class/method/field mappings with parameter names and Javadocs.\n\n' +
145
+ 'To install it, run: `npx mcmodding-mcp manage`\n\n' +
146
+ 'The standard documentation tools (search_fabric_docs, get_example) are still available for modding guidance.';
147
+ export function handleSearchMappings(params) {
148
+ try {
149
+ if (!MappingsService.isAvailable()) {
150
+ return {
151
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
152
+ };
153
+ }
154
+ const service = new MappingsService();
155
+ try {
156
+ const results = service.search({
157
+ query: params.query,
158
+ type: params.type || 'all',
159
+ minecraftVersion: params.minecraft_version,
160
+ packageFilter: params.package_filter,
161
+ includeJavadoc: params.include_javadoc !== false,
162
+ limit: Math.min(Math.max(params.limit || 15, 1), 50),
163
+ });
164
+ if (results.length === 0) {
165
+ const version = params.minecraft_version || service.getLatestVersion() || 'unknown';
166
+ let output = `No mappings found for "${params.query}" in Minecraft ${version}.\n\n`;
167
+ output += '**Suggestions:**\n';
168
+ output += '- Try a broader search term\n';
169
+ output += '- Check the spelling of the class/method name\n';
170
+ output += '- Try without the package filter\n';
171
+ output += '- Use `list_mapping_versions` to see available versions\n';
172
+ return { content: [{ type: 'text', text: output }] };
173
+ }
174
+ let output = `Found ${results.length} mapping${results.length > 1 ? 's' : ''} for "${params.query}":\n\n`;
175
+ for (const result of results) {
176
+ output += `### ${result.type.charAt(0).toUpperCase() + result.type.slice(1)}: \`${result.fullName}\`\n`;
177
+ if (result.obfuscatedName) {
178
+ output += `**Obfuscated:** \`${result.obfuscatedName}\`\n`;
179
+ }
180
+ if (result.descriptor) {
181
+ output += `**Descriptor:** \`${result.descriptor}\`\n`;
182
+ }
183
+ if (result.type === 'method' && result.parameters && result.parameters.length > 0) {
184
+ output += `**Parameters:**\n`;
185
+ for (const param of result.parameters) {
186
+ output += ` - \`${param.name}\``;
187
+ if (param.javadoc) {
188
+ output += ` — ${param.javadoc}`;
189
+ }
190
+ output += '\n';
191
+ }
192
+ }
193
+ if (result.javadoc) {
194
+ output += `**Javadoc:** ${result.javadoc}\n`;
195
+ }
196
+ output += `**Version:** ${result.minecraftVersion}\n`;
197
+ output += '\n---\n\n';
198
+ }
199
+ return { content: [{ type: 'text', text: output.trim() }] };
200
+ }
201
+ finally {
202
+ service.close();
203
+ }
204
+ }
205
+ catch (error) {
206
+ const message = error instanceof Error ? error.message : String(error);
207
+ return {
208
+ content: [{ type: 'text', text: `Error searching mappings: ${message}` }],
209
+ isError: true,
210
+ };
211
+ }
212
+ }
213
+ export function handleGetClassDetails(params) {
214
+ try {
215
+ if (!MappingsService.isAvailable()) {
216
+ return {
217
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
218
+ };
219
+ }
220
+ const service = new MappingsService();
221
+ try {
222
+ const cls = service.getClass(params.class_name, params.minecraft_version);
223
+ if (!cls) {
224
+ const version = params.minecraft_version || service.getLatestVersion() || 'unknown';
225
+ return {
226
+ content: [
227
+ {
228
+ type: 'text',
229
+ text: `Class "${params.class_name}" not found in Minecraft ${version} mappings.\n\nTry using \`search_mappings\` to find the correct class name.`,
230
+ },
231
+ ],
232
+ };
233
+ }
234
+ let output = `# Class: \`${cls.packageName}.${cls.name}\`\n\n`;
235
+ if (cls.obfuscatedName) {
236
+ output += `**Obfuscated:** \`${cls.obfuscatedName}\`\n`;
237
+ }
238
+ output += `**Package:** \`${cls.packageName}\`\n`;
239
+ output += `**Version:** ${cls.minecraftVersion}\n`;
240
+ if (cls.javadoc) {
241
+ output += `\n**Javadoc:**\n${cls.javadoc}\n`;
242
+ }
243
+ if (params.include_methods !== false) {
244
+ const methods = service.getClassMethods(cls.id);
245
+ output += `\n## Methods (${methods.length})\n\n`;
246
+ if (methods.length === 0) {
247
+ output += '_No methods with mappings found._\n';
248
+ }
249
+ else {
250
+ for (const method of methods.slice(0, 30)) {
251
+ output += `### \`${method.name}\`\n`;
252
+ output += `**Descriptor:** \`${method.descriptor}\`\n`;
253
+ if (method.obfuscatedName) {
254
+ output += `**Obfuscated:** \`${method.obfuscatedName}\`\n`;
255
+ }
256
+ if (method.parameters.length > 0) {
257
+ output += `**Parameters:**\n`;
258
+ for (const param of method.parameters) {
259
+ output += ` - \`${param.name}\``;
260
+ if (param.javadoc) {
261
+ output += ` — ${param.javadoc}`;
262
+ }
263
+ output += '\n';
264
+ }
265
+ }
266
+ if (method.javadoc) {
267
+ output += `**Javadoc:** ${method.javadoc}\n`;
268
+ }
269
+ output += '\n';
270
+ }
271
+ if (methods.length > 30) {
272
+ output += `\n_...and ${methods.length - 30} more methods. Use \`search_mappings\` with the class name to find specific methods._\n`;
273
+ }
274
+ }
275
+ }
276
+ if (params.include_fields !== false) {
277
+ const fields = service.getClassFields(cls.id);
278
+ output += `\n## Fields (${fields.length})\n\n`;
279
+ if (fields.length === 0) {
280
+ output += '_No fields with mappings found._\n';
281
+ }
282
+ else {
283
+ for (const field of fields) {
284
+ output += `- **\`${field.name}\`** (\`${field.descriptor}\`)`;
285
+ if (field.obfuscatedName) {
286
+ output += ` — obf: \`${field.obfuscatedName}\``;
287
+ }
288
+ if (field.javadoc) {
289
+ output += `\n ${field.javadoc}`;
290
+ }
291
+ output += '\n';
292
+ }
293
+ }
294
+ }
295
+ return { content: [{ type: 'text', text: output.trim() }] };
296
+ }
297
+ finally {
298
+ service.close();
299
+ }
300
+ }
301
+ catch (error) {
302
+ const message = error instanceof Error ? error.message : String(error);
303
+ return {
304
+ content: [{ type: 'text', text: `Error getting class details: ${message}` }],
305
+ isError: true,
306
+ };
307
+ }
308
+ }
309
+ export function handleLookupObfuscated(params) {
310
+ try {
311
+ if (!MappingsService.isAvailable()) {
312
+ return {
313
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
314
+ };
315
+ }
316
+ const service = new MappingsService();
317
+ try {
318
+ const result = service.lookupObfuscated(params.obfuscated_name, params.minecraft_version);
319
+ if (!result) {
320
+ const version = params.minecraft_version || service.getLatestVersion() || 'unknown';
321
+ return {
322
+ content: [
323
+ {
324
+ type: 'text',
325
+ text: `Obfuscated name "${params.obfuscated_name}" not found in Minecraft ${version} mappings.\n\nNote: Parchment mappings are based on Mojang mappings. The obfuscated name format may differ between mapping systems.`,
326
+ },
327
+ ],
328
+ };
329
+ }
330
+ let output = `# Deobfuscation Result\n\n`;
331
+ output += `**Obfuscated:** \`${result.obfuscatedName}\`\n`;
332
+ output += `**Deobfuscated:** \`${result.fullName}\`\n`;
333
+ output += `**Type:** ${result.type}\n`;
334
+ output += `**Version:** ${result.minecraftVersion}\n`;
335
+ if (result.descriptor) {
336
+ output += `**Descriptor:** \`${result.descriptor}\`\n`;
337
+ }
338
+ if (result.type === 'method' && result.parameters && result.parameters.length > 0) {
339
+ output += `\n**Parameters:**\n`;
340
+ for (const param of result.parameters) {
341
+ output += ` - \`${param.name}\``;
342
+ if (param.javadoc) {
343
+ output += ` — ${param.javadoc}`;
344
+ }
345
+ output += '\n';
346
+ }
347
+ }
348
+ if (result.javadoc) {
349
+ output += `\n**Javadoc:**\n${result.javadoc}\n`;
350
+ }
351
+ return { content: [{ type: 'text', text: output.trim() }] };
352
+ }
353
+ finally {
354
+ service.close();
355
+ }
356
+ }
357
+ catch (error) {
358
+ const message = error instanceof Error ? error.message : String(error);
359
+ return {
360
+ content: [{ type: 'text', text: `Error looking up obfuscated name: ${message}` }],
361
+ isError: true,
362
+ };
363
+ }
364
+ }
365
+ export function handleGetMethodSignature(params) {
366
+ try {
367
+ if (!MappingsService.isAvailable()) {
368
+ return {
369
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
370
+ };
371
+ }
372
+ const service = new MappingsService();
373
+ try {
374
+ const method = service.getMethod(params.class_name, params.method_name, params.minecraft_version);
375
+ if (!method) {
376
+ const version = params.minecraft_version || service.getLatestVersion() || 'unknown';
377
+ return {
378
+ content: [
379
+ {
380
+ type: 'text',
381
+ text: `Method "${params.method_name}" not found in class "${params.class_name}" for Minecraft ${version}.\n\nTry using \`search_mappings\` to find the correct method name.`,
382
+ },
383
+ ],
384
+ };
385
+ }
386
+ let output = `# Method: \`${method.className}.${method.name}\`\n\n`;
387
+ output += `**Descriptor:** \`${method.descriptor}\`\n`;
388
+ if (method.obfuscatedName) {
389
+ output += `**Obfuscated:** \`${method.obfuscatedName}\`\n`;
390
+ }
391
+ output += `**Version:** ${method.minecraftVersion}\n`;
392
+ if (method.parameters.length > 0) {
393
+ output += `\n## Parameters\n\n`;
394
+ for (const param of method.parameters) {
395
+ output += `- **\`${param.name}\`** (index ${param.index})`;
396
+ if (param.javadoc) {
397
+ output += `\n ${param.javadoc}`;
398
+ }
399
+ output += '\n';
400
+ }
401
+ }
402
+ else {
403
+ output += '\n_No parameter names available for this method._\n';
404
+ }
405
+ if (method.javadoc) {
406
+ output += `\n## Javadoc\n\n${method.javadoc}\n`;
407
+ }
408
+ return { content: [{ type: 'text', text: output.trim() }] };
409
+ }
410
+ finally {
411
+ service.close();
412
+ }
413
+ }
414
+ catch (error) {
415
+ const message = error instanceof Error ? error.message : String(error);
416
+ return {
417
+ content: [{ type: 'text', text: `Error getting method signature: ${message}` }],
418
+ isError: true,
419
+ };
420
+ }
421
+ }
422
+ export function handleListMappingVersions(params) {
423
+ try {
424
+ if (!MappingsService.isAvailable()) {
425
+ return {
426
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
427
+ };
428
+ }
429
+ const service = new MappingsService();
430
+ try {
431
+ const versions = service.getMinecraftVersions();
432
+ if (versions.length === 0) {
433
+ return {
434
+ content: [
435
+ { type: 'text', text: 'No Minecraft versions found in the mappings database.' },
436
+ ],
437
+ };
438
+ }
439
+ let output = `# Available Minecraft Versions\n\n`;
440
+ output += `Found ${versions.length} version${versions.length > 1 ? 's' : ''} with Parchment mappings:\n\n`;
441
+ for (const version of versions) {
442
+ output += `- **${version}**`;
443
+ if (version === versions[0]) {
444
+ output += ' _(latest)_';
445
+ }
446
+ output += '\n';
447
+ }
448
+ if (params.include_stats) {
449
+ const stats = service.getStats();
450
+ output += `\n## Database Statistics\n\n`;
451
+ output += `- **Total Classes:** ${stats.totalClasses.toLocaleString()}\n`;
452
+ output += `- **Total Methods:** ${stats.totalMethods.toLocaleString()}\n`;
453
+ output += `- **Total Fields:** ${stats.totalFields.toLocaleString()}\n`;
454
+ output += `- **Total Parameters:** ${stats.totalParameters.toLocaleString()}\n`;
455
+ output += `- **Documented Methods:** ${stats.documentedMethods.toLocaleString()}\n`;
456
+ output += `- **Documented Fields:** ${stats.documentedFields.toLocaleString()}\n`;
457
+ if (stats.topPackages.length > 0) {
458
+ output += `\n### Top Packages\n\n`;
459
+ for (const pkg of stats.topPackages) {
460
+ output += `- \`${pkg.packageName}\` (${pkg.count} classes)\n`;
461
+ }
462
+ }
463
+ }
464
+ return { content: [{ type: 'text', text: output.trim() }] };
465
+ }
466
+ finally {
467
+ service.close();
468
+ }
469
+ }
470
+ catch (error) {
471
+ const message = error instanceof Error ? error.message : String(error);
472
+ return {
473
+ content: [{ type: 'text', text: `Error listing mapping versions: ${message}` }],
474
+ isError: true,
475
+ };
476
+ }
477
+ }
478
+ export function handleBrowsePackage(params) {
479
+ try {
480
+ if (!MappingsService.isAvailable()) {
481
+ return {
482
+ content: [{ type: 'text', text: NOT_AVAILABLE_MESSAGE }],
483
+ };
484
+ }
485
+ const service = new MappingsService();
486
+ try {
487
+ const classes = service.getClassesInPackage(params.package_name, params.minecraft_version);
488
+ const version = params.minecraft_version || service.getLatestVersion() || 'unknown';
489
+ if (classes.length === 0) {
490
+ return {
491
+ content: [
492
+ {
493
+ type: 'text',
494
+ text: `No classes found in package "${params.package_name}" for Minecraft ${version}.\n\nTry a broader package name or check the spelling.`,
495
+ },
496
+ ],
497
+ };
498
+ }
499
+ let output = `# Package: \`${params.package_name}\`\n\n`;
500
+ output += `Found ${classes.length} class${classes.length > 1 ? 'es' : ''} in Minecraft ${version}:\n\n`;
501
+ const bySubPackage = new Map();
502
+ for (const cls of classes) {
503
+ const subPkg = cls.packageName;
504
+ if (!bySubPackage.has(subPkg)) {
505
+ bySubPackage.set(subPkg, []);
506
+ }
507
+ bySubPackage.get(subPkg).push(cls);
508
+ }
509
+ for (const [pkg, pkgClasses] of Array.from(bySubPackage.entries()).sort()) {
510
+ if (bySubPackage.size > 1) {
511
+ output += `## \`${pkg}\`\n\n`;
512
+ }
513
+ for (const cls of pkgClasses.slice(0, 50)) {
514
+ output += `- **\`${cls.name}\`**`;
515
+ output += ` — ${cls.methodCount} methods, ${cls.fieldCount} fields`;
516
+ if (cls.javadoc) {
517
+ const shortDoc = cls.javadoc.length > 100 ? cls.javadoc.substring(0, 100) + '...' : cls.javadoc;
518
+ output += `\n _${shortDoc}_`;
519
+ }
520
+ output += '\n';
521
+ }
522
+ if (pkgClasses.length > 50) {
523
+ output += `\n_...and ${pkgClasses.length - 50} more classes._\n`;
524
+ }
525
+ output += '\n';
526
+ }
527
+ output += `\nUse \`get_class_details\` to see the full details of a specific class.`;
528
+ return { content: [{ type: 'text', text: output.trim() }] };
529
+ }
530
+ finally {
531
+ service.close();
532
+ }
533
+ }
534
+ catch (error) {
535
+ const message = error instanceof Error ? error.message : String(error);
536
+ return {
537
+ content: [{ type: 'text', text: `Error browsing package: ${message}` }],
538
+ isError: true,
539
+ };
540
+ }
541
+ }
542
+ //# sourceMappingURL=mappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.js","sourceRoot":"","sources":["../../src/tools/mappings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcmodding-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server providing AI assistants with up-to-date Minecraft modding documentation for Fabric and NeoForge",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,7 +38,13 @@
38
38
  "release": "npm run build:prod && npm version",
39
39
  "validate": "npm run typecheck && npm run lint && npm run test",
40
40
  "db:manifest": "npx tsx scripts/generate-db-manifest.ts",
41
- "db:install-optional": "npx tsx src/index.ts install"
41
+ "db:install-optional": "npx tsx src/index.ts install",
42
+ "index-mappings": "npx tsx scripts/index-mappings.ts",
43
+ "index-mappings:force": "npx tsx scripts/index-mappings.ts --force",
44
+ "mappings:manifest": "npx tsx scripts/generate-mappings-manifest.ts",
45
+ "mappings:analyze": "npx tsx scripts/analyze-mappings.ts",
46
+ "index-mod-examples": "npx tsx scripts/index-mod-examples.ts",
47
+ "mod-examples:manifest": "npx tsx scripts/generate-mod-examples-manifest.ts"
42
48
  },
43
49
  "keywords": [
44
50
  "minecraft",
@@ -73,10 +79,12 @@
73
79
  "@types/better-sqlite3": "^7.6.12",
74
80
  "@types/jquery": "^3.5.33",
75
81
  "@types/node": "^22.10.1",
82
+ "@types/adm-zip": "^0.5.6",
76
83
  "@typescript-eslint/eslint-plugin": "^8.15.0",
77
84
  "@typescript-eslint/parser": "^8.15.0",
78
85
  "@vitest/coverage-v8": "^4.0.15",
79
86
  "@vitest/ui": "^4.0.15",
87
+ "adm-zip": "^0.5.16",
80
88
  "conventional-changelog-conventionalcommits": "^9.1.0",
81
89
  "eslint": "^9.15.0",
82
90
  "eslint-config-prettier": "^9.1.0",
@@ -21,7 +21,7 @@ const __dirname = path.dirname(__filename);
21
21
  // ═══════════════════════════════════════════════════════════════════════════════
22
22
 
23
23
  const CONFIG = {
24
- repoUrl: 'https://api.github.com/repos/OGMatrix/mcmodding-mcp/releases/latest',
24
+ repoUrl: 'https://api.github.com/repos/OGMatrix/mcmodding-mcp/releases',
25
25
  dataDir: path.join(__dirname, '..', 'data'),
26
26
  dbFileName: 'mcmodding-docs.db',
27
27
  manifestFileName: 'db-manifest.json',
@@ -653,7 +653,19 @@ async function downloadWithProgress(url, destPath, onProgress) {
653
653
 
654
654
  async function fetchReleaseInfo() {
655
655
  const response = await httpsGet(CONFIG.repoUrl);
656
- return JSON.parse(response);
656
+ const releases = JSON.parse(response);
657
+
658
+ // Find the first release that has the required assets
659
+ for (const release of releases) {
660
+ const hasManifest = release.assets.some((a) => a.name === 'db-manifest.json');
661
+ const hasDb = release.assets.some((a) => a.name === 'mcmodding-docs.db');
662
+
663
+ if (hasManifest && hasDb) {
664
+ return release;
665
+ }
666
+ }
667
+
668
+ throw new Error('No suitable release found with database artifacts');
657
669
  }
658
670
 
659
671
  async function fetchManifest(manifestUrl) {