@creeperhost/modlens-mcp 1.6.0 → 1.6.1

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.
Files changed (89) hide show
  1. package/README.md +950 -938
  2. package/dist/cli.js +267 -267
  3. package/dist/generated/sqlite/internal/class.d.ts.map +1 -1
  4. package/dist/generated/sqlite/internal/class.js +4 -3
  5. package/dist/generated/sqlite/internal/class.js.map +1 -1
  6. package/dist/launcher.js +4 -1
  7. package/dist/launcher.js.map +1 -1
  8. package/dist/repositories/embeddings-sqlite.js +21 -21
  9. package/dist/repositories/embeddings.js +28 -28
  10. package/dist/repositories/mod.js +2 -2
  11. package/dist/search-adapter.js +51 -51
  12. package/dist/tools/compat-check.js +9 -9
  13. package/dist/tools/embed-registry.js +9 -9
  14. package/dist/tools/graphify.js +14 -14
  15. package/dist/tools/mc-fts.js +2 -2
  16. package/dist/tools/mixin-scan.d.ts +1 -1
  17. package/dist/tools/mixin-scan.js +16 -16
  18. package/dist/tools/version-diff.js +3 -3
  19. package/package.json +70 -62
  20. package/prisma/backends/schema.sqlite.prisma +215 -215
  21. package/prisma/schema.prisma +303 -303
  22. package/scripts/backup.mjs +151 -151
  23. package/scripts/check-atm10.mjs +27 -27
  24. package/scripts/check-sync.mjs +13 -13
  25. package/scripts/create-fts-index.mjs +50 -50
  26. package/scripts/enable-pgvector.mjs +90 -90
  27. package/scripts/enable-sqlite-vec.mjs +158 -158
  28. package/scripts/migrate-backend.mjs +188 -188
  29. package/scripts/migrate-embed-provenance.mjs +80 -80
  30. package/scripts/migrate-metadata-source.mjs +62 -62
  31. package/scripts/migrate-mod-source-files.mjs +67 -67
  32. package/scripts/post-update.mjs +77 -77
  33. package/scripts/verify-atm10.mjs +63 -63
  34. package/dist/access-flags.test.d.ts +0 -2
  35. package/dist/access-flags.test.d.ts.map +0 -1
  36. package/dist/access-flags.test.js +0 -189
  37. package/dist/access-flags.test.js.map +0 -1
  38. package/dist/fetch-utils.test.d.ts +0 -2
  39. package/dist/fetch-utils.test.d.ts.map +0 -1
  40. package/dist/fetch-utils.test.js +0 -133
  41. package/dist/fetch-utils.test.js.map +0 -1
  42. package/dist/mappings.test.d.ts +0 -2
  43. package/dist/mappings.test.d.ts.map +0 -1
  44. package/dist/mappings.test.js +0 -161
  45. package/dist/mappings.test.js.map +0 -1
  46. package/dist/processor.test.d.ts +0 -2
  47. package/dist/processor.test.d.ts.map +0 -1
  48. package/dist/processor.test.js +0 -629
  49. package/dist/processor.test.js.map +0 -1
  50. package/dist/search.test.d.ts +0 -2
  51. package/dist/search.test.d.ts.map +0 -1
  52. package/dist/search.test.js +0 -71
  53. package/dist/search.test.js.map +0 -1
  54. package/dist/security.test.d.ts +0 -2
  55. package/dist/security.test.d.ts.map +0 -1
  56. package/dist/security.test.js +0 -687
  57. package/dist/security.test.js.map +0 -1
  58. package/dist/tools/compat-check.test.d.ts +0 -2
  59. package/dist/tools/compat-check.test.d.ts.map +0 -1
  60. package/dist/tools/compat-check.test.js +0 -179
  61. package/dist/tools/compat-check.test.js.map +0 -1
  62. package/dist/tools/diagnostics.test.d.ts +0 -2
  63. package/dist/tools/diagnostics.test.d.ts.map +0 -1
  64. package/dist/tools/diagnostics.test.js +0 -168
  65. package/dist/tools/diagnostics.test.js.map +0 -1
  66. package/dist/tools/graphify.test.d.ts +0 -2
  67. package/dist/tools/graphify.test.d.ts.map +0 -1
  68. package/dist/tools/graphify.test.js +0 -39
  69. package/dist/tools/graphify.test.js.map +0 -1
  70. package/dist/tools/ingest.test.d.ts +0 -2
  71. package/dist/tools/ingest.test.d.ts.map +0 -1
  72. package/dist/tools/ingest.test.js +0 -340
  73. package/dist/tools/ingest.test.js.map +0 -1
  74. package/dist/tools/mod-tags.test.d.ts +0 -2
  75. package/dist/tools/mod-tags.test.d.ts.map +0 -1
  76. package/dist/tools/mod-tags.test.js +0 -75
  77. package/dist/tools/mod-tags.test.js.map +0 -1
  78. package/dist/tools/packtools.test.d.ts +0 -2
  79. package/dist/tools/packtools.test.d.ts.map +0 -1
  80. package/dist/tools/packtools.test.js +0 -99
  81. package/dist/tools/packtools.test.js.map +0 -1
  82. package/dist/tools/version-diff.test.d.ts +0 -2
  83. package/dist/tools/version-diff.test.d.ts.map +0 -1
  84. package/dist/tools/version-diff.test.js +0 -102
  85. package/dist/tools/version-diff.test.js.map +0 -1
  86. package/dist/validate.test.d.ts +0 -2
  87. package/dist/validate.test.d.ts.map +0 -1
  88. package/dist/validate.test.js +0 -73
  89. package/dist/validate.test.js.map +0 -1
@@ -1,67 +1,67 @@
1
- /**
2
- * Creates the mod_source_files table and a pgvector column for semantic search.
3
- * Run via: node scripts/migrate-mod-source-files.mjs
4
- *
5
- * Safe to re-run — uses IF NOT EXISTS / DO $$ guards throughout.
6
- */
7
- import { PrismaClient } from "@prisma/client";
8
- import { readFileSync, existsSync } from "fs";
9
- import { join, dirname } from "path";
10
- import { fileURLToPath } from "url";
11
-
12
- const __dirname = dirname(fileURLToPath(import.meta.url));
13
- const envPath = join(__dirname, "..", ".env");
14
- if (existsSync(envPath)) {
15
- for (const line of readFileSync(envPath, "utf8").split("\n")) {
16
- const m = line.match(/^([^#=]+)=(.*)$/);
17
- if (m) process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
18
- }
19
- }
20
-
21
- const prisma = new PrismaClient();
22
-
23
- async function main() {
24
- // 1. Create table (no embedding column here — enable-pgvector.mjs owns that
25
- // so the correct OLLAMA_EMBED_DIM dimension is always used)
26
- await prisma.$executeRawUnsafe(`
27
- CREATE TABLE IF NOT EXISTS mod_source_files (
28
- id SERIAL PRIMARY KEY,
29
- mod_id INTEGER NOT NULL REFERENCES mods(id) ON DELETE CASCADE,
30
- class_name TEXT NOT NULL,
31
- content TEXT NOT NULL,
32
- UNIQUE (mod_id, class_name)
33
- )
34
- `);
35
- console.log("✓ mod_source_files table ready");
36
-
37
- // 2. B-tree index on mod_id
38
- await prisma.$executeRawUnsafe(`
39
- CREATE INDEX IF NOT EXISTS mod_source_files_mod_id_idx
40
- ON mod_source_files (mod_id)
41
- `);
42
- console.log("✓ mod_source_files_mod_id_idx ready");
43
-
44
- // 3. GIN index for FTS (same pattern as mc_source_files)
45
- const ftsExists = await prisma.$queryRaw`
46
- SELECT 1 FROM pg_indexes
47
- WHERE schemaname = 'public'
48
- AND tablename = 'mod_source_files'
49
- AND indexname = 'mod_source_files_tsv_idx'
50
- `;
51
- if (ftsExists.length === 0) {
52
- await prisma.$executeRawUnsafe(`
53
- CREATE INDEX CONCURRENTLY mod_source_files_tsv_idx
54
- ON mod_source_files
55
- USING GIN (to_tsvector('simple', content))
56
- `);
57
- console.log("✓ mod_source_files_tsv_idx (GIN FTS) created");
58
- } else {
59
- console.log(" mod_source_files_tsv_idx already exists, skipping");
60
- }
61
-
62
- console.log("\nDone. Run 'npm run db:vector' to add the embedding column with the correct dimension.");
63
- }
64
-
65
- main()
66
- .catch((e) => { console.error(e); process.exit(1); })
67
- .finally(() => prisma.$disconnect());
1
+ /**
2
+ * Creates the mod_source_files table and a pgvector column for semantic search.
3
+ * Run via: node scripts/migrate-mod-source-files.mjs
4
+ *
5
+ * Safe to re-run — uses IF NOT EXISTS / DO $$ guards throughout.
6
+ */
7
+ import { PrismaClient } from "@prisma/client";
8
+ import { readFileSync, existsSync } from "fs";
9
+ import { join, dirname } from "path";
10
+ import { fileURLToPath } from "url";
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const envPath = join(__dirname, "..", ".env");
14
+ if (existsSync(envPath)) {
15
+ for (const line of readFileSync(envPath, "utf8").split("\n")) {
16
+ const m = line.match(/^([^#=]+)=(.*)$/);
17
+ if (m) process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
18
+ }
19
+ }
20
+
21
+ const prisma = new PrismaClient();
22
+
23
+ async function main() {
24
+ // 1. Create table (no embedding column here — enable-pgvector.mjs owns that
25
+ // so the correct OLLAMA_EMBED_DIM dimension is always used)
26
+ await prisma.$executeRawUnsafe(`
27
+ CREATE TABLE IF NOT EXISTS mod_source_files (
28
+ id SERIAL PRIMARY KEY,
29
+ mod_id INTEGER NOT NULL REFERENCES mods(id) ON DELETE CASCADE,
30
+ class_name TEXT NOT NULL,
31
+ content TEXT NOT NULL,
32
+ UNIQUE (mod_id, class_name)
33
+ )
34
+ `);
35
+ console.log("✓ mod_source_files table ready");
36
+
37
+ // 2. B-tree index on mod_id
38
+ await prisma.$executeRawUnsafe(`
39
+ CREATE INDEX IF NOT EXISTS mod_source_files_mod_id_idx
40
+ ON mod_source_files (mod_id)
41
+ `);
42
+ console.log("✓ mod_source_files_mod_id_idx ready");
43
+
44
+ // 3. GIN index for FTS (same pattern as mc_source_files)
45
+ const ftsExists = await prisma.$queryRaw`
46
+ SELECT 1 FROM pg_indexes
47
+ WHERE schemaname = 'public'
48
+ AND tablename = 'mod_source_files'
49
+ AND indexname = 'mod_source_files_tsv_idx'
50
+ `;
51
+ if (ftsExists.length === 0) {
52
+ await prisma.$executeRawUnsafe(`
53
+ CREATE INDEX CONCURRENTLY mod_source_files_tsv_idx
54
+ ON mod_source_files
55
+ USING GIN (to_tsvector('simple', content))
56
+ `);
57
+ console.log("✓ mod_source_files_tsv_idx (GIN FTS) created");
58
+ } else {
59
+ console.log(" mod_source_files_tsv_idx already exists, skipping");
60
+ }
61
+
62
+ console.log("\nDone. Run 'npm run db:vector' to add the embedding column with the correct dimension.");
63
+ }
64
+
65
+ main()
66
+ .catch((e) => { console.error(e); process.exit(1); })
67
+ .finally(() => prisma.$disconnect());
@@ -1,77 +1,77 @@
1
- /**
2
- * Profile-aware post-update script.
3
- * Called by `npm run update` after git pull + npm install + build.
4
- * Reads DATABASE_URL / MODLENS_PROFILE from .env and runs the correct
5
- * schema migration + vector extension commands for the user's backend.
6
- *
7
- * Safe to re-run — all underlying scripts use IF NOT EXISTS guards.
8
- */
9
- import { execSync } from "child_process";
10
- import { readFileSync, existsSync } from "fs";
11
- import { join, dirname } from "path";
12
- import { fileURLToPath } from "url";
13
-
14
- const __dirname = dirname(fileURLToPath(import.meta.url));
15
- const ROOT = join(__dirname, "..");
16
- const envPath = join(ROOT, ".env");
17
-
18
- // ── Load .env ─────────────────────────────────────────────────────────────────
19
- if (existsSync(envPath)) {
20
- for (const line of readFileSync(envPath, "utf8").split("\n")) {
21
- const m = line.match(/^([^#=]+)=(.*)$/);
22
- if (m) process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
23
- }
24
- }
25
-
26
- const dbUrl = process.env.DATABASE_URL ?? "";
27
-
28
- function run(cmd) {
29
- console.log(`\n> ${cmd}`);
30
- execSync(cmd, { cwd: ROOT, stdio: "inherit" });
31
- }
32
-
33
- // ── Detect backend from DATABASE_URL prefix ───────────────────────────────────
34
- let backend;
35
- if (dbUrl.startsWith("postgresql://") || dbUrl.startsWith("postgres://")) {
36
- backend = "postgres";
37
- } else if (dbUrl.startsWith("pglite://") || dbUrl.startsWith("pglite:")) {
38
- backend = "pglite";
39
- } else if (dbUrl.startsWith("file:")) {
40
- backend = "sqlite";
41
- } else {
42
- console.warn(`⚠ Could not detect backend from DATABASE_URL="${dbUrl}". Defaulting to postgres.`);
43
- backend = "postgres";
44
- }
45
-
46
- console.log(`\nDetected backend: ${backend}`);
47
-
48
- // ── Apply schema ──────────────────────────────────────────────────────────────
49
- if (backend === "sqlite") {
50
- // SQLite uses a separate schema file — db push is safest (no migration files)
51
- run("npx prisma db push --schema prisma/backends/schema.sqlite.prisma --accept-data-loss");
52
- } else {
53
- // Postgres and PGlite both use the main schema
54
- // prisma migrate deploy applies any new migration files; db push is the fallback
55
- // for dev setups that use db push instead of migrate
56
- try {
57
- run("npx prisma migrate deploy");
58
- } catch {
59
- console.log(" migrate deploy failed (likely db-push setup) — falling back to db push");
60
- run("npx prisma db push");
61
- }
62
- // Extra post-migrate steps for Postgres (GIN FTS indexes, mod_source_files table)
63
- if (backend === "postgres") {
64
- run("node scripts/create-fts-index.mjs");
65
- run("node scripts/migrate-mod-source-files.mjs");
66
- }
67
- }
68
-
69
- // ── Vector extension ──────────────────────────────────────────────────────────
70
- if (backend === "sqlite") {
71
- run("node scripts/enable-sqlite-vec.mjs");
72
- } else {
73
- // Postgres and PGlite: adds/resizes embedding columns to match OLLAMA_EMBED_DIM
74
- run("node scripts/enable-pgvector.mjs");
75
- }
76
-
77
- console.log("\n✓ Update complete. Restart your MCP client to load the new server.");
1
+ /**
2
+ * Profile-aware post-update script.
3
+ * Called by `npm run update` after git pull + npm install + build.
4
+ * Reads DATABASE_URL / MODLENS_PROFILE from .env and runs the correct
5
+ * schema migration + vector extension commands for the user's backend.
6
+ *
7
+ * Safe to re-run — all underlying scripts use IF NOT EXISTS guards.
8
+ */
9
+ import { execSync } from "child_process";
10
+ import { readFileSync, existsSync } from "fs";
11
+ import { join, dirname } from "path";
12
+ import { fileURLToPath } from "url";
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const ROOT = join(__dirname, "..");
16
+ const envPath = join(ROOT, ".env");
17
+
18
+ // ── Load .env ─────────────────────────────────────────────────────────────────
19
+ if (existsSync(envPath)) {
20
+ for (const line of readFileSync(envPath, "utf8").split("\n")) {
21
+ const m = line.match(/^([^#=]+)=(.*)$/);
22
+ if (m) process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
23
+ }
24
+ }
25
+
26
+ const dbUrl = process.env.DATABASE_URL ?? "";
27
+
28
+ function run(cmd) {
29
+ console.log(`\n> ${cmd}`);
30
+ execSync(cmd, { cwd: ROOT, stdio: "inherit" });
31
+ }
32
+
33
+ // ── Detect backend from DATABASE_URL prefix ───────────────────────────────────
34
+ let backend;
35
+ if (dbUrl.startsWith("postgresql://") || dbUrl.startsWith("postgres://")) {
36
+ backend = "postgres";
37
+ } else if (dbUrl.startsWith("pglite://") || dbUrl.startsWith("pglite:")) {
38
+ backend = "pglite";
39
+ } else if (dbUrl.startsWith("file:")) {
40
+ backend = "sqlite";
41
+ } else {
42
+ console.warn(`⚠ Could not detect backend from DATABASE_URL="${dbUrl}". Defaulting to postgres.`);
43
+ backend = "postgres";
44
+ }
45
+
46
+ console.log(`\nDetected backend: ${backend}`);
47
+
48
+ // ── Apply schema ──────────────────────────────────────────────────────────────
49
+ if (backend === "sqlite") {
50
+ // SQLite uses a separate schema file — db push is safest (no migration files)
51
+ run("npx prisma db push --schema prisma/backends/schema.sqlite.prisma --accept-data-loss");
52
+ } else {
53
+ // Postgres and PGlite both use the main schema
54
+ // prisma migrate deploy applies any new migration files; db push is the fallback
55
+ // for dev setups that use db push instead of migrate
56
+ try {
57
+ run("npx prisma migrate deploy");
58
+ } catch {
59
+ console.log(" migrate deploy failed (likely db-push setup) — falling back to db push");
60
+ run("npx prisma db push");
61
+ }
62
+ // Extra post-migrate steps for Postgres (GIN FTS indexes, mod_source_files table)
63
+ if (backend === "postgres") {
64
+ run("node scripts/create-fts-index.mjs");
65
+ run("node scripts/migrate-mod-source-files.mjs");
66
+ }
67
+ }
68
+
69
+ // ── Vector extension ──────────────────────────────────────────────────────────
70
+ if (backend === "sqlite") {
71
+ run("node scripts/enable-sqlite-vec.mjs");
72
+ } else {
73
+ // Postgres and PGlite: adds/resizes embedding columns to match OLLAMA_EMBED_DIM
74
+ run("node scripts/enable-pgvector.mjs");
75
+ }
76
+
77
+ console.log("\n✓ Update complete. Restart your MCP client to load the new server.");
@@ -1,63 +1,63 @@
1
- /**
2
- * Cross-check ATM10 manifest CF project IDs against pack_files and mods in DB.
3
- * Reports: how many manifest mods have a cfProject match in the DB,
4
- * and lists any that are in pack_files but NOT linked to a mod row.
5
- */
6
- import { PrismaClient } from '@prisma/client';
7
- const db = new PrismaClient();
8
-
9
- // Get all pack_files for ATM10 (packVersionId=1) of type "mod"
10
- const packFiles = await db.packFile.findMany({
11
- where: { packVersionId: 1, fileType: 'mod' },
12
- select: { id: true, manifestFileId: true, fileName: true, cfProject: true, cfFile: true, status: true, modId: true },
13
- });
14
-
15
- console.log(`Total pack_files (mod type): ${packFiles.length}`);
16
-
17
- // Group by status
18
- const byStatus = {};
19
- for (const f of packFiles) {
20
- byStatus[f.status] = (byStatus[f.status] ?? 0) + 1;
21
- }
22
- console.log('By status:', JSON.stringify(byStatus));
23
-
24
- // For files that have a cfProject, check if there's a mod in DB with that curseforgeId
25
- const cfProjectIds = [...new Set(packFiles.filter(f => f.cfProject).map(f => f.cfProject))];
26
- console.log(`Unique CF project IDs in manifest: ${cfProjectIds.length}`);
27
-
28
- const modsWithCf = await db.mod.findMany({
29
- where: { curseforgeId: { in: cfProjectIds } },
30
- select: { id: true, modId: true, displayName: true, curseforgeId: true, version: true },
31
- });
32
- console.log(`Mods in DB matching by curseforgeId: ${modsWithCf.length}`);
33
-
34
- // Files that have modId set (linked during sync via jar hash)
35
- const linked = packFiles.filter(f => f.modId !== null);
36
- const notLinked = packFiles.filter(f => f.modId === null);
37
- console.log(`\nLinked to a mod row (modId set): ${linked.length}`);
38
- console.log(`NOT linked (no modId): ${notLinked.length}`);
39
-
40
- // For not-linked, check if their cfProject appears in the mods table
41
- const cfMap = new Map(modsWithCf.map(m => [m.curseforgeId, m]));
42
- const notLinkedButCfMatch = notLinked.filter(f => f.cfProject && cfMap.has(f.cfProject));
43
- const notLinkedNoCfMatch = notLinked.filter(f => !f.cfProject || !cfMap.has(f.cfProject));
44
-
45
- console.log(`Not-linked but CF project IS in DB: ${notLinkedButCfMatch.length}`);
46
- console.log(`Not-linked and CF project NOT in DB: ${notLinkedNoCfMatch.length}`);
47
-
48
- if (notLinkedNoCfMatch.length > 0) {
49
- console.log('\nSample of mods missing from DB entirely:');
50
- for (const f of notLinkedNoCfMatch.slice(0, 10)) {
51
- console.log(` cfProject=${f.cfProject} cfFile=${f.cfFile} name=${f.fileName} status=${f.status}`);
52
- }
53
- }
54
-
55
- // Spot-check: verify a few linked modIds actually exist
56
- console.log('\nSpot-check 5 linked entries:');
57
- const sample = linked.slice(0, 5);
58
- for (const f of sample) {
59
- const mod = await db.mod.findUnique({ where: { id: f.modId }, select: { id: true, modId: true, displayName: true, curseforgeId: true } });
60
- console.log(` packFile.fileName="${f.fileName}" → mod.id=${mod?.id} mod.modId="${mod?.modId}" mod.displayName="${mod?.displayName}" mod.curseforgeId=${mod?.curseforgeId}`);
61
- }
62
-
63
- await db.$disconnect();
1
+ /**
2
+ * Cross-check ATM10 manifest CF project IDs against pack_files and mods in DB.
3
+ * Reports: how many manifest mods have a cfProject match in the DB,
4
+ * and lists any that are in pack_files but NOT linked to a mod row.
5
+ */
6
+ import { PrismaClient } from '@prisma/client';
7
+ const db = new PrismaClient();
8
+
9
+ // Get all pack_files for ATM10 (packVersionId=1) of type "mod"
10
+ const packFiles = await db.packFile.findMany({
11
+ where: { packVersionId: 1, fileType: 'mod' },
12
+ select: { id: true, manifestFileId: true, fileName: true, cfProject: true, cfFile: true, status: true, modId: true },
13
+ });
14
+
15
+ console.log(`Total pack_files (mod type): ${packFiles.length}`);
16
+
17
+ // Group by status
18
+ const byStatus = {};
19
+ for (const f of packFiles) {
20
+ byStatus[f.status] = (byStatus[f.status] ?? 0) + 1;
21
+ }
22
+ console.log('By status:', JSON.stringify(byStatus));
23
+
24
+ // For files that have a cfProject, check if there's a mod in DB with that curseforgeId
25
+ const cfProjectIds = [...new Set(packFiles.filter(f => f.cfProject).map(f => f.cfProject))];
26
+ console.log(`Unique CF project IDs in manifest: ${cfProjectIds.length}`);
27
+
28
+ const modsWithCf = await db.mod.findMany({
29
+ where: { curseforgeId: { in: cfProjectIds } },
30
+ select: { id: true, modId: true, displayName: true, curseforgeId: true, version: true },
31
+ });
32
+ console.log(`Mods in DB matching by curseforgeId: ${modsWithCf.length}`);
33
+
34
+ // Files that have modId set (linked during sync via jar hash)
35
+ const linked = packFiles.filter(f => f.modId !== null);
36
+ const notLinked = packFiles.filter(f => f.modId === null);
37
+ console.log(`\nLinked to a mod row (modId set): ${linked.length}`);
38
+ console.log(`NOT linked (no modId): ${notLinked.length}`);
39
+
40
+ // For not-linked, check if their cfProject appears in the mods table
41
+ const cfMap = new Map(modsWithCf.map(m => [m.curseforgeId, m]));
42
+ const notLinkedButCfMatch = notLinked.filter(f => f.cfProject && cfMap.has(f.cfProject));
43
+ const notLinkedNoCfMatch = notLinked.filter(f => !f.cfProject || !cfMap.has(f.cfProject));
44
+
45
+ console.log(`Not-linked but CF project IS in DB: ${notLinkedButCfMatch.length}`);
46
+ console.log(`Not-linked and CF project NOT in DB: ${notLinkedNoCfMatch.length}`);
47
+
48
+ if (notLinkedNoCfMatch.length > 0) {
49
+ console.log('\nSample of mods missing from DB entirely:');
50
+ for (const f of notLinkedNoCfMatch.slice(0, 10)) {
51
+ console.log(` cfProject=${f.cfProject} cfFile=${f.cfFile} name=${f.fileName} status=${f.status}`);
52
+ }
53
+ }
54
+
55
+ // Spot-check: verify a few linked modIds actually exist
56
+ console.log('\nSpot-check 5 linked entries:');
57
+ const sample = linked.slice(0, 5);
58
+ for (const f of sample) {
59
+ const mod = await db.mod.findUnique({ where: { id: f.modId }, select: { id: true, modId: true, displayName: true, curseforgeId: true } });
60
+ console.log(` packFile.fileName="${f.fileName}" → mod.id=${mod?.id} mod.modId="${mod?.modId}" mod.displayName="${mod?.displayName}" mod.curseforgeId=${mod?.curseforgeId}`);
61
+ }
62
+
63
+ await db.$disconnect();
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=access-flags.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-flags.test.d.ts","sourceRoot":"","sources":["../src/access-flags.test.ts"],"names":[],"mappings":""}
@@ -1,189 +0,0 @@
1
- import { describe, it, expect, beforeAll } from "vitest";
2
- import { accessStr, descriptorToSimpleType, formatClassMembers, Opcodes } from "./access-flags.js";
3
- describe("accessStr", () => {
4
- it("returns public for ACC_PUBLIC", () => {
5
- expect(accessStr(Opcodes.ACC_PUBLIC)).toBe("public");
6
- });
7
- it("returns protected for ACC_PROTECTED", () => {
8
- expect(accessStr(Opcodes.ACC_PROTECTED)).toBe("protected");
9
- });
10
- it("returns private for ACC_PRIVATE", () => {
11
- expect(accessStr(Opcodes.ACC_PRIVATE)).toBe("private");
12
- });
13
- it("returns package-private when no visibility flag is set", () => {
14
- expect(accessStr(0)).toBe("package-private");
15
- });
16
- it("returns package-private for ACC_STATIC alone", () => {
17
- expect(accessStr(Opcodes.ACC_STATIC)).toBe("package-private");
18
- });
19
- it("public takes precedence even when combined with static", () => {
20
- expect(accessStr(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)).toBe("public");
21
- });
22
- it("returns private when private+final combined", () => {
23
- expect(accessStr(Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL)).toBe("private");
24
- });
25
- });
26
- describe("descriptorToSimpleType", () => {
27
- it("converts primitive descriptors", () => {
28
- expect(descriptorToSimpleType("Z")).toBe("boolean");
29
- expect(descriptorToSimpleType("B")).toBe("byte");
30
- expect(descriptorToSimpleType("C")).toBe("char");
31
- expect(descriptorToSimpleType("S")).toBe("short");
32
- expect(descriptorToSimpleType("I")).toBe("int");
33
- expect(descriptorToSimpleType("J")).toBe("long");
34
- expect(descriptorToSimpleType("F")).toBe("float");
35
- expect(descriptorToSimpleType("D")).toBe("double");
36
- expect(descriptorToSimpleType("V")).toBe("void");
37
- });
38
- it("converts object descriptor to simple class name", () => {
39
- expect(descriptorToSimpleType("Ljava/lang/String;")).toBe("String");
40
- expect(descriptorToSimpleType("Lnet/minecraft/world/entity/LivingEntity;")).toBe("LivingEntity");
41
- });
42
- it("converts single-dimension array descriptors", () => {
43
- expect(descriptorToSimpleType("[I")).toBe("int[]");
44
- expect(descriptorToSimpleType("[B")).toBe("byte[]");
45
- expect(descriptorToSimpleType("[Ljava/lang/String;")).toBe("String[]");
46
- });
47
- it("converts multi-dimension array descriptors", () => {
48
- expect(descriptorToSimpleType("[[I")).toBe("int[][]");
49
- expect(descriptorToSimpleType("[[Ljava/lang/String;")).toBe("String[][]");
50
- });
51
- it("returns the descriptor unchanged for unknown single chars", () => {
52
- expect(descriptorToSimpleType("X")).toBe("X");
53
- });
54
- });
55
- // ── Shared fixture ─────────────────────────────────────────────────────────
56
- const FIXTURE = {
57
- name: "net/minecraft/world/World",
58
- superName: "net/minecraft/world/level/Level",
59
- interfaces: ["net/minecraft/world/IWorld"],
60
- methods: [
61
- { name: "tick", descriptor: "(Ljava/util/function/BooleanSupplier;)V", access: Opcodes.ACC_PUBLIC },
62
- { name: "method_1234", descriptor: "()V", access: Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT },
63
- { name: "privateHelper", descriptor: "(I)Z", access: Opcodes.ACC_PRIVATE },
64
- { name: "staticFactory", descriptor: "()Lnet/minecraft/world/World;", access: Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC },
65
- ],
66
- fields: [
67
- { name: "random", descriptor: "Ljava/util/Random;", access: Opcodes.ACC_PUBLIC },
68
- { name: "CONSTANT", descriptor: "I", access: Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL },
69
- { name: "dimension", descriptor: "Lnet/minecraft/world/dimension/DimensionType;", access: Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL },
70
- ],
71
- };
72
- describe("formatClassMembers — class-level output", () => {
73
- it("echoes className and superClass", () => {
74
- const out = formatClassMembers(FIXTURE);
75
- expect(out.className).toBe("net/minecraft/world/World");
76
- expect(out.superClass).toBe("net/minecraft/world/level/Level");
77
- });
78
- it("echoes interfaces array", () => {
79
- const out = formatClassMembers(FIXTURE);
80
- expect(out.interfaces).toEqual(["net/minecraft/world/IWorld"]);
81
- });
82
- it("produces correct AT strings for class access/extendability", () => {
83
- const out = formatClassMembers(FIXTURE);
84
- expect(out.atStrings.accessible).toBe("accessible class net/minecraft/world/World");
85
- expect(out.atStrings.extendable).toBe("extendable class net/minecraft/world/World");
86
- });
87
- });
88
- describe("formatClassMembers — methods", () => {
89
- let methods;
90
- beforeAll(() => { methods = formatClassMembers(FIXTURE).methods; });
91
- it("returns one entry per method", () => {
92
- expect(methods).toHaveLength(4);
93
- });
94
- it("echoes name and descriptor", () => {
95
- expect(methods[0].name).toBe("tick");
96
- expect(methods[0].descriptor).toBe("(Ljava/util/function/BooleanSupplier;)V");
97
- });
98
- it("resolves access string via accessStr", () => {
99
- expect(methods[0].access).toBe("public");
100
- expect(methods[2].access).toBe("private");
101
- });
102
- it("detects isStatic correctly", () => {
103
- expect(methods[0].isStatic).toBe(false); // tick
104
- expect(methods[3].isStatic).toBe(true); // staticFactory
105
- });
106
- it("detects isFinal correctly", () => {
107
- expect(methods[0].isFinal).toBe(false);
108
- expect(methods.every((m) => !m.isFinal)).toBe(true);
109
- });
110
- it("detects isAbstract correctly", () => {
111
- expect(methods[1].isAbstract).toBe(true); // method_1234
112
- expect(methods[0].isAbstract).toBe(false); // tick
113
- });
114
- it("produces mixinTarget as name+descriptor", () => {
115
- expect(methods[0].mixinTarget).toBe("tick(Ljava/util/function/BooleanSupplier;)V");
116
- });
117
- it("produces AT string in correct format", () => {
118
- expect(methods[0].atString).toBe("accessible method net/minecraft/world/World tick (Ljava/util/function/BooleanSupplier;)V");
119
- });
120
- });
121
- describe("formatClassMembers — fields", () => {
122
- let fields;
123
- beforeAll(() => { fields = formatClassMembers(FIXTURE).fields; });
124
- it("returns one entry per field", () => {
125
- expect(fields).toHaveLength(3);
126
- });
127
- it("echoes name and descriptor", () => {
128
- expect(fields[0].name).toBe("random");
129
- expect(fields[0].descriptor).toBe("Ljava/util/Random;");
130
- });
131
- it("resolves access string", () => {
132
- expect(fields[0].access).toBe("public");
133
- expect(fields[2].access).toBe("private");
134
- });
135
- it("detects isStatic — CONSTANT is static, others are not", () => {
136
- expect(fields[0].isStatic).toBe(false); // random
137
- expect(fields[1].isStatic).toBe(true); // CONSTANT
138
- expect(fields[2].isStatic).toBe(false); // dimension
139
- });
140
- it("detects isFinal — CONSTANT and dimension are final", () => {
141
- expect(fields[0].isFinal).toBe(false); // random
142
- expect(fields[1].isFinal).toBe(true); // CONSTANT
143
- expect(fields[2].isFinal).toBe(true); // dimension
144
- });
145
- it("shadowAnnotation uses accessStr + static keyword when static", () => {
146
- expect(fields[1].shadowAnnotation).toBe("@Shadow public static int CONSTANT;");
147
- });
148
- it("shadowAnnotation omits 'static' for instance fields", () => {
149
- expect(fields[0].shadowAnnotation).toBe("@Shadow public Random random;");
150
- });
151
- it("uses 'mutable' AT prefix for final fields", () => {
152
- expect(fields[1].atString).toBe("mutable field net/minecraft/world/World CONSTANT I");
153
- expect(fields[2].atString).toContain("mutable field net/minecraft/world/World dimension");
154
- });
155
- it("uses 'accessible' AT prefix for non-final fields", () => {
156
- expect(fields[0].atString).toBe("accessible field net/minecraft/world/World random Ljava/util/Random;");
157
- });
158
- });
159
- describe("formatClassMembers — edge cases", () => {
160
- it("handles ClassInfo with no methods or fields", () => {
161
- const empty = {
162
- name: "net/minecraft/A",
163
- superName: "java/lang/Object",
164
- interfaces: [],
165
- methods: [],
166
- fields: [],
167
- };
168
- const out = formatClassMembers(empty);
169
- expect(out.methods).toEqual([]);
170
- expect(out.fields).toEqual([]);
171
- expect(out.atStrings.accessible).toBe("accessible class net/minecraft/A");
172
- });
173
- it("handles ClassInfo with empty interfaces array", () => {
174
- const info = {
175
- name: "net/minecraft/A",
176
- superName: "java/lang/Object",
177
- interfaces: [],
178
- methods: [],
179
- fields: [],
180
- };
181
- expect(formatClassMembers(info).interfaces).toEqual([]);
182
- });
183
- it("is deterministic — same input always returns equal output", () => {
184
- const a = formatClassMembers(FIXTURE);
185
- const b = formatClassMembers(FIXTURE);
186
- expect(a).toEqual(b);
187
- });
188
- });
189
- //# sourceMappingURL=access-flags.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-flags.test.js","sourceRoot":"","sources":["../src/access-flags.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fetch-utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-utils.test.d.ts","sourceRoot":"","sources":["../src/fetch-utils.test.ts"],"names":[],"mappings":""}