@creeperhost/modlens-mcp 1.6.0 → 1.6.4
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.
- package/README.md +950 -938
- package/dist/cli.js +267 -267
- package/dist/db-backend.d.ts +14 -1
- package/dist/db-backend.d.ts.map +1 -1
- package/dist/db-backend.js +13 -0
- package/dist/db-backend.js.map +1 -1
- package/dist/generated/sqlite/internal/class.d.ts.map +1 -1
- package/dist/generated/sqlite/internal/class.js +5 -4
- package/dist/generated/sqlite/internal/class.js.map +1 -1
- package/dist/launcher.js +4 -1
- package/dist/launcher.js.map +1 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +6 -2
- package/dist/platform.js.map +1 -1
- package/dist/repositories/embeddings-sqlite.js +21 -21
- package/dist/repositories/embeddings.js +28 -28
- package/dist/repositories/mod.d.ts +7 -0
- package/dist/repositories/mod.d.ts.map +1 -1
- package/dist/repositories/mod.js +56 -15
- package/dist/repositories/mod.js.map +1 -1
- package/dist/search-adapter.js +51 -51
- package/dist/security.d.ts +9 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +19 -0
- package/dist/security.js.map +1 -1
- package/dist/server.js +1248 -1217
- package/dist/server.js.map +1 -1
- package/dist/tools/compat-check.js +9 -9
- package/dist/tools/docs.d.ts.map +1 -1
- package/dist/tools/docs.js +4 -3
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/embed-registry.js +9 -9
- package/dist/tools/graphify.js +14 -14
- package/dist/tools/ingest.d.ts.map +1 -1
- package/dist/tools/ingest.js +4 -3
- package/dist/tools/ingest.js.map +1 -1
- package/dist/tools/kubejs.d.ts.map +1 -1
- package/dist/tools/kubejs.js +2 -0
- package/dist/tools/kubejs.js.map +1 -1
- package/dist/tools/mappings.d.ts.map +1 -1
- package/dist/tools/mappings.js +2 -1
- package/dist/tools/mappings.js.map +1 -1
- package/dist/tools/mc-fts.js +2 -2
- package/dist/tools/mcmeta.js +2 -2
- package/dist/tools/mcmeta.js.map +1 -1
- package/dist/tools/mixin-scan.d.ts +1 -1
- package/dist/tools/mixin-scan.d.ts.map +1 -1
- package/dist/tools/mixin-scan.js +29 -35
- package/dist/tools/mixin-scan.js.map +1 -1
- package/dist/tools/mod-data.js +2 -2
- package/dist/tools/mod-data.js.map +1 -1
- package/dist/tools/modpacks-ch.js +2 -2
- package/dist/tools/modpacks-ch.js.map +1 -1
- package/dist/tools/packtools.js +4 -4
- package/dist/tools/packtools.js.map +1 -1
- package/dist/tools/primers.d.ts.map +1 -1
- package/dist/tools/primers.js +4 -3
- package/dist/tools/primers.js.map +1 -1
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +8 -4
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/vanilla-data.js +2 -2
- package/dist/tools/vanilla-data.js.map +1 -1
- package/dist/tools/version-diff.js +3 -3
- package/package.json +70 -62
- package/prisma/backends/schema.sqlite.prisma +215 -215
- package/prisma/schema.prisma +303 -303
- package/scripts/backup.mjs +151 -151
- package/scripts/check-atm10.mjs +27 -27
- package/scripts/check-sync.mjs +13 -13
- package/scripts/create-fts-index.mjs +50 -50
- package/scripts/enable-pgvector.mjs +90 -90
- package/scripts/enable-sqlite-vec.mjs +158 -158
- package/scripts/migrate-backend.mjs +188 -188
- package/scripts/migrate-embed-provenance.mjs +80 -80
- package/scripts/migrate-metadata-source.mjs +62 -62
- package/scripts/migrate-mod-source-files.mjs +67 -67
- package/scripts/post-update.mjs +77 -77
- package/scripts/verify-atm10.mjs +63 -63
- package/dist/access-flags.test.d.ts +0 -2
- package/dist/access-flags.test.d.ts.map +0 -1
- package/dist/access-flags.test.js +0 -189
- package/dist/access-flags.test.js.map +0 -1
- package/dist/fetch-utils.test.d.ts +0 -2
- package/dist/fetch-utils.test.d.ts.map +0 -1
- package/dist/fetch-utils.test.js +0 -133
- package/dist/fetch-utils.test.js.map +0 -1
- package/dist/mappings.test.d.ts +0 -2
- package/dist/mappings.test.d.ts.map +0 -1
- package/dist/mappings.test.js +0 -161
- package/dist/mappings.test.js.map +0 -1
- package/dist/processor.test.d.ts +0 -2
- package/dist/processor.test.d.ts.map +0 -1
- package/dist/processor.test.js +0 -629
- package/dist/processor.test.js.map +0 -1
- package/dist/search.test.d.ts +0 -2
- package/dist/search.test.d.ts.map +0 -1
- package/dist/search.test.js +0 -71
- package/dist/search.test.js.map +0 -1
- package/dist/security.test.d.ts +0 -2
- package/dist/security.test.d.ts.map +0 -1
- package/dist/security.test.js +0 -687
- package/dist/security.test.js.map +0 -1
- package/dist/tools/compat-check.test.d.ts +0 -2
- package/dist/tools/compat-check.test.d.ts.map +0 -1
- package/dist/tools/compat-check.test.js +0 -179
- package/dist/tools/compat-check.test.js.map +0 -1
- package/dist/tools/diagnostics.test.d.ts +0 -2
- package/dist/tools/diagnostics.test.d.ts.map +0 -1
- package/dist/tools/diagnostics.test.js +0 -168
- package/dist/tools/diagnostics.test.js.map +0 -1
- package/dist/tools/graphify.test.d.ts +0 -2
- package/dist/tools/graphify.test.d.ts.map +0 -1
- package/dist/tools/graphify.test.js +0 -39
- package/dist/tools/graphify.test.js.map +0 -1
- package/dist/tools/ingest.test.d.ts +0 -2
- package/dist/tools/ingest.test.d.ts.map +0 -1
- package/dist/tools/ingest.test.js +0 -340
- package/dist/tools/ingest.test.js.map +0 -1
- package/dist/tools/mod-tags.test.d.ts +0 -2
- package/dist/tools/mod-tags.test.d.ts.map +0 -1
- package/dist/tools/mod-tags.test.js +0 -75
- package/dist/tools/mod-tags.test.js.map +0 -1
- package/dist/tools/packtools.test.d.ts +0 -2
- package/dist/tools/packtools.test.d.ts.map +0 -1
- package/dist/tools/packtools.test.js +0 -99
- package/dist/tools/packtools.test.js.map +0 -1
- package/dist/tools/version-diff.test.d.ts +0 -2
- package/dist/tools/version-diff.test.d.ts.map +0 -1
- package/dist/tools/version-diff.test.js +0 -102
- package/dist/tools/version-diff.test.js.map +0 -1
- package/dist/validate.test.d.ts +0 -2
- package/dist/validate.test.d.ts.map +0 -1
- package/dist/validate.test.js +0 -73
- 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());
|
package/scripts/post-update.mjs
CHANGED
|
@@ -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.");
|
package/scripts/verify-atm10.mjs
CHANGED
|
@@ -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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-utils.test.d.ts","sourceRoot":"","sources":["../src/fetch-utils.test.ts"],"names":[],"mappings":""}
|