@creeperhost/modlens-mcp 1.6.18 → 1.6.20
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 +112 -15
- package/TESTING.md +69 -0
- package/dist/cli.js +49 -13
- package/dist/cli.js.map +1 -1
- package/dist/curseforge.d.ts +9 -7
- package/dist/curseforge.d.ts.map +1 -1
- package/dist/curseforge.js +48 -55
- package/dist/curseforge.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +31 -1
- package/dist/db.js.map +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +1 -0
- package/dist/embeddings.js.map +1 -1
- package/dist/feed-the-beast.d.ts +5 -5
- package/dist/feed-the-beast.d.ts.map +1 -1
- package/dist/feed-the-beast.js +5 -21
- package/dist/feed-the-beast.js.map +1 -1
- package/dist/java-tools.d.ts +1 -0
- package/dist/java-tools.d.ts.map +1 -1
- package/dist/java-tools.js +31 -7
- package/dist/java-tools.js.map +1 -1
- package/dist/launcher.js +15 -0
- package/dist/launcher.js.map +1 -1
- package/dist/mappings.d.ts +4 -1
- package/dist/mappings.d.ts.map +1 -1
- package/dist/mappings.js +120 -52
- package/dist/mappings.js.map +1 -1
- package/dist/minecraft.d.ts +0 -4
- package/dist/minecraft.d.ts.map +1 -1
- package/dist/minecraft.js +7 -23
- package/dist/minecraft.js.map +1 -1
- package/dist/mod-artifacts.d.ts +4 -0
- package/dist/mod-artifacts.d.ts.map +1 -0
- package/dist/mod-artifacts.js +58 -0
- package/dist/mod-artifacts.js.map +1 -0
- package/dist/modpacks-ch.d.ts +72 -46
- package/dist/modpacks-ch.d.ts.map +1 -1
- package/dist/modpacks-ch.js +134 -20
- package/dist/modpacks-ch.js.map +1 -1
- package/dist/modrinth.d.ts +14 -6
- package/dist/modrinth.d.ts.map +1 -1
- package/dist/modrinth.js +70 -55
- package/dist/modrinth.js.map +1 -1
- package/dist/platform-adapter.d.ts +1 -0
- package/dist/platform-adapter.d.ts.map +1 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +20 -44
- package/dist/platform.js.map +1 -1
- package/dist/primer-catalog.d.ts +15 -0
- package/dist/primer-catalog.d.ts.map +1 -0
- package/dist/primer-catalog.js +43 -0
- package/dist/primer-catalog.js.map +1 -0
- package/dist/primer-content.d.ts +7 -0
- package/dist/primer-content.d.ts.map +1 -0
- package/dist/primer-content.js +185 -0
- package/dist/primer-content.js.map +1 -0
- package/dist/processor.d.ts +5 -0
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +166 -46
- package/dist/processor.js.map +1 -1
- package/dist/registry-submission.d.ts +34 -0
- package/dist/registry-submission.d.ts.map +1 -0
- package/dist/registry-submission.js +128 -0
- package/dist/registry-submission.js.map +1 -0
- package/dist/repositories/array-fields.d.ts +3 -0
- package/dist/repositories/array-fields.d.ts.map +1 -0
- package/dist/repositories/array-fields.js +8 -0
- package/dist/repositories/array-fields.js.map +1 -0
- package/dist/repositories/embeddings-sqlite.d.ts +1 -0
- package/dist/repositories/embeddings-sqlite.d.ts.map +1 -1
- package/dist/repositories/embeddings-sqlite.js +26 -58
- package/dist/repositories/embeddings-sqlite.js.map +1 -1
- package/dist/repositories/embeddings.d.ts.map +1 -1
- package/dist/repositories/embeddings.js +26 -3
- package/dist/repositories/embeddings.js.map +1 -1
- package/dist/repositories/index.d.ts +1 -1
- package/dist/repositories/index.d.ts.map +1 -1
- package/dist/repositories/mod.d.ts +8 -5
- package/dist/repositories/mod.d.ts.map +1 -1
- package/dist/repositories/mod.js +25 -11
- package/dist/repositories/mod.js.map +1 -1
- package/dist/repositories/packs.d.ts.map +1 -1
- package/dist/repositories/packs.js +10 -2
- package/dist/repositories/packs.js.map +1 -1
- package/dist/search-adapter.d.ts +2 -0
- package/dist/search-adapter.d.ts.map +1 -1
- package/dist/search-adapter.js +21 -9
- package/dist/search-adapter.js.map +1 -1
- package/dist/security.d.ts +2 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +5 -1
- package/dist/security.js.map +1 -1
- package/dist/server.js +80 -35
- package/dist/server.js.map +1 -1
- package/dist/setup.js +9 -4
- package/dist/setup.js.map +1 -1
- package/dist/sqlite-json.d.ts +3 -0
- package/dist/sqlite-json.d.ts.map +1 -0
- package/dist/sqlite-json.js +78 -0
- package/dist/sqlite-json.js.map +1 -0
- package/dist/sqlite-parameters.d.ts +3 -0
- package/dist/sqlite-parameters.d.ts.map +1 -0
- package/dist/sqlite-parameters.js +19 -0
- package/dist/sqlite-parameters.js.map +1 -0
- package/dist/sqlite-schema.d.ts +4 -0
- package/dist/sqlite-schema.d.ts.map +1 -0
- package/dist/sqlite-schema.js +76 -0
- package/dist/sqlite-schema.js.map +1 -0
- package/dist/tools/catalog.d.ts +1 -6
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +10 -14
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/compat-check.d.ts.map +1 -1
- package/dist/tools/compat-check.js +18 -30
- package/dist/tools/compat-check.js.map +1 -1
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/docs.d.ts.map +1 -1
- package/dist/tools/docs.js +8 -3
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/embed-registry.d.ts +20 -4
- package/dist/tools/embed-registry.d.ts.map +1 -1
- package/dist/tools/embed-registry.js +30 -19
- package/dist/tools/embed-registry.js.map +1 -1
- package/dist/tools/graphify.d.ts +19 -4
- package/dist/tools/graphify.d.ts.map +1 -1
- package/dist/tools/graphify.js +61 -13
- package/dist/tools/graphify.js.map +1 -1
- package/dist/tools/ingest.d.ts.map +1 -1
- package/dist/tools/ingest.js +4 -4
- package/dist/tools/ingest.js.map +1 -1
- package/dist/tools/kubejs.js +1 -1
- package/dist/tools/kubejs.js.map +1 -1
- package/dist/tools/mc-fts.d.ts.map +1 -1
- package/dist/tools/mc-fts.js +9 -4
- package/dist/tools/mc-fts.js.map +1 -1
- package/dist/tools/mcmeta.d.ts +10 -1
- package/dist/tools/mcmeta.d.ts.map +1 -1
- package/dist/tools/mcmeta.js +43 -29
- package/dist/tools/mcmeta.js.map +1 -1
- package/dist/tools/mixin-scan.d.ts +12 -6
- package/dist/tools/mixin-scan.d.ts.map +1 -1
- package/dist/tools/mixin-scan.js +12 -7
- package/dist/tools/mixin-scan.js.map +1 -1
- package/dist/tools/mod-data.d.ts.map +1 -1
- package/dist/tools/mod-data.js +40 -27
- package/dist/tools/mod-data.js.map +1 -1
- package/dist/tools/modpacks-ch.d.ts +9 -5
- package/dist/tools/modpacks-ch.d.ts.map +1 -1
- package/dist/tools/modpacks-ch.js +54 -33
- package/dist/tools/modpacks-ch.js.map +1 -1
- package/dist/tools/packtools.js +3 -3
- package/dist/tools/packtools.js.map +1 -1
- package/dist/tools/platform.d.ts +2 -2
- package/dist/tools/platform.d.ts.map +1 -1
- package/dist/tools/platform.js +33 -23
- package/dist/tools/platform.js.map +1 -1
- package/dist/tools/primers.d.ts +133 -22
- package/dist/tools/primers.d.ts.map +1 -1
- package/dist/tools/primers.js +391 -386
- package/dist/tools/primers.js.map +1 -1
- package/dist/tools/project.d.ts +342 -0
- package/dist/tools/project.d.ts.map +1 -0
- package/dist/tools/project.js +519 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +5 -3
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/vanilla-data.d.ts.map +1 -1
- package/dist/tools/vanilla-data.js +3 -33
- package/dist/tools/vanilla-data.js.map +1 -1
- package/dist/tools/vanilla.d.ts +3 -1
- package/dist/tools/vanilla.d.ts.map +1 -1
- package/dist/tools/vanilla.js +26 -12
- package/dist/tools/vanilla.js.map +1 -1
- package/dist/tools/version-diff.d.ts.map +1 -1
- package/dist/tools/version-diff.js +4 -24
- package/dist/tools/version-diff.js.map +1 -1
- package/dist/version-ranges.d.ts +5 -0
- package/dist/version-ranges.d.ts.map +1 -0
- package/dist/version-ranges.js +93 -0
- package/dist/version-ranges.js.map +1 -0
- package/package.json +9 -1
- package/prisma/backends/template.db +0 -0
- package/scripts/build-template-db.mjs +3 -1
- package/scripts/enable-sqlite-vec.mjs +2 -106
- package/scripts/gradle/modlens.init.gradle +154 -0
- package/scripts/project-upload.mjs +74 -0
- package/scripts/test-minecraft-eras.mjs +202 -0
- package/scripts/test-package.mjs +105 -5
- package/scripts/test-primers-live.mjs +93 -0
- package/scripts/test-project-gradle.mjs +76 -0
- package/scripts/test-project-http.mjs +98 -0
- package/scripts/test-setup.mjs +18 -0
package/dist/platform.js
CHANGED
|
@@ -2,36 +2,27 @@ import { createWriteStream } from "fs";
|
|
|
2
2
|
import { pipeline } from "stream/promises";
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
import { CACHE_ROOT, ensureDir, exists } from "./cache.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
const NEOFORGE_MAVEN = "https://maven.
|
|
8
|
-
const NEOFORGE_META =
|
|
9
|
-
const FORGE_MAVEN = "https://maven.
|
|
5
|
+
import { fetchMcVersionList } from "./minecraft.js";
|
|
6
|
+
import { loaderVersions, providerVersions } from "./modpacks-ch.js";
|
|
7
|
+
const NEOFORGE_MAVEN = "https://maven.creeperhost.net/net/neoforged/neoforge";
|
|
8
|
+
const NEOFORGE_META = `${NEOFORGE_MAVEN}/maven-metadata.xml`;
|
|
9
|
+
const FORGE_MAVEN = "https://maven.creeperhost.net/net/minecraftforge/forge";
|
|
10
10
|
const FORGE_PROMOS = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json";
|
|
11
|
-
let mcCache = null;
|
|
12
11
|
let neoforgeCache = null;
|
|
13
12
|
let forgeCache = null;
|
|
14
13
|
export async function listMcVersions(type) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (!res.ok)
|
|
18
|
-
throw new Error(`Failed to fetch MC versions: ${res.status}`);
|
|
19
|
-
const data = await res.json();
|
|
20
|
-
mcCache = data.versions.filter((v) => v.type !== "old_beta" && v.type !== "old_alpha" &&
|
|
21
|
-
(new Date(v.releaseTime) >= new Date("2019-04-23") || LEGACY_SRG_VERSIONS.has(v.id) || LEGACY_RETROMCP_VERSIONS.has(v.id)));
|
|
22
|
-
}
|
|
23
|
-
if (!type || type === "all")
|
|
24
|
-
return mcCache;
|
|
25
|
-
if (type === "release")
|
|
26
|
-
return mcCache.filter((v) => v.type === "release");
|
|
27
|
-
return mcCache.filter((v) => v.type === "snapshot");
|
|
14
|
+
const versions = (await fetchMcVersionList(true)).map(({ id, type, releaseTime }) => ({ id, type, releaseTime }));
|
|
15
|
+
return !type || type === "all" ? versions : versions.filter(version => version.type === type);
|
|
28
16
|
}
|
|
29
17
|
export async function listNeoForgeVersions(mcVersion, limit = 20) {
|
|
18
|
+
if (mcVersion)
|
|
19
|
+
return (await loaderVersions(mcVersion, "neoforge")).slice(0, limit)
|
|
20
|
+
.map(v => ({ version: v.version, mcVersion: v.gameVersion ?? mcVersion }));
|
|
30
21
|
if (!neoforgeCache) {
|
|
31
22
|
const res = await fetch(NEOFORGE_META);
|
|
32
23
|
if (!res.ok)
|
|
33
24
|
throw new Error(`Failed to fetch NeoForge versions: ${res.status}`);
|
|
34
|
-
const data = await res.
|
|
25
|
+
const data = { versions: [...(await res.text()).matchAll(/<version>([^<]+)<\/version>/g)].map(m => m[1]) };
|
|
35
26
|
// NeoForge versions look like "21.1.0", "21.1.1", etc. — leading number = MC major
|
|
36
27
|
neoforgeCache = data.versions
|
|
37
28
|
.filter((v) => /^\d+\.\d+\.\d+/.test(v))
|
|
@@ -50,21 +41,17 @@ export async function listNeoForgeVersions(mcVersion, limit = 20) {
|
|
|
50
41
|
return filtered.slice(0, limit);
|
|
51
42
|
}
|
|
52
43
|
export async function listFabricApiVersions(mcVersion, limit = 20) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
:
|
|
57
|
-
|
|
58
|
-
if (!res.ok)
|
|
59
|
-
throw new Error(`Failed to fetch Fabric API versions: ${res.status}`);
|
|
60
|
-
const versions = await res.json();
|
|
61
|
-
return versions.slice(0, limit).map((v) => ({
|
|
62
|
-
version: v.version_number,
|
|
63
|
-
mcVersion: v.game_versions[0] ?? "unknown",
|
|
64
|
-
datePublished: v.date_published,
|
|
44
|
+
const versions = await providerVersions("mod", "P7dR8mSH", { mcVersion, loader: "fabric", limit });
|
|
45
|
+
return versions.map((v) => ({
|
|
46
|
+
version: v.version,
|
|
47
|
+
mcVersion: (v.targets ?? []).find(t => t.type === "game")?.version ?? "unknown",
|
|
48
|
+
datePublished: new Date((v.updated ?? 0) * 1000).toISOString(),
|
|
65
49
|
}));
|
|
66
50
|
}
|
|
67
51
|
export async function listForgeVersions(mcVersion, limit = 20) {
|
|
52
|
+
if (mcVersion)
|
|
53
|
+
return (await loaderVersions(mcVersion, "forge")).slice(0, limit)
|
|
54
|
+
.map(v => ({ version: v.version, fullVersion: `${mcVersion}-${v.version}`, mcVersion: v.gameVersion ?? mcVersion }));
|
|
68
55
|
if (!forgeCache) {
|
|
69
56
|
// Fetch promotions to know which versions are recommended
|
|
70
57
|
const promoRes = await fetch(FORGE_PROMOS, { headers: { "User-Agent": "modlens-mcp/1.0" } });
|
|
@@ -178,17 +165,6 @@ export async function downloadFabricApi(version) {
|
|
|
178
165
|
const destPath = join(CACHE_ROOT, "loaders", "fabric-api", `fabric-api-${version}.jar`);
|
|
179
166
|
if (await exists(destPath))
|
|
180
167
|
return destPath;
|
|
181
|
-
|
|
182
|
-
const res = await fetch(`https://api.modrinth.com/v2/project/P7dR8mSH/version?loaders=%5B%22fabric%22%5D`, { headers: { "User-Agent": "modlens-mcp/1.0" } });
|
|
183
|
-
if (!res.ok)
|
|
184
|
-
throw new Error(`Modrinth lookup failed: ${res.status}`);
|
|
185
|
-
const versions = await res.json();
|
|
186
|
-
const match = versions.find((v) => v.version_number === version);
|
|
187
|
-
if (!match)
|
|
188
|
-
throw new Error(`Fabric API version "${version}" not found on Modrinth`);
|
|
189
|
-
const file = match.files.find((f) => f.primary) ?? match.files[0];
|
|
190
|
-
if (!file)
|
|
191
|
-
throw new Error(`No download file found for Fabric API ${version}`);
|
|
192
|
-
return downloadJar(file.url, destPath);
|
|
168
|
+
return downloadJar(`https://maven.creeperhost.net/net/fabricmc/fabric-api/fabric-api/${encodeURIComponent(version)}/fabric-api-${encodeURIComponent(version)}.jar`, destPath);
|
|
193
169
|
}
|
|
194
170
|
//# sourceMappingURL=platform.js.map
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Verified against https://docs.neoforged.net/primer/docs/ (2026-09-13). */
|
|
2
|
+
export interface PrimerSeed {
|
|
3
|
+
fromVersion: string;
|
|
4
|
+
toVersion: string;
|
|
5
|
+
modloader: string;
|
|
6
|
+
title: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
url: string;
|
|
9
|
+
tags: string[];
|
|
10
|
+
source: "seed";
|
|
11
|
+
}
|
|
12
|
+
export declare const SEED_PRIMERS: PrimerSeed[];
|
|
13
|
+
/** Only exact known seed URLs are eligible for repair. Null means a catalogue placeholder, not a guide. */
|
|
14
|
+
export declare const LEGACY_PRIMER_URLS: Record<string, string | null>;
|
|
15
|
+
//# sourceMappingURL=primer-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer-catalog.d.ts","sourceRoot":"","sources":["../src/primer-catalog.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAgBD,eAAO,MAAM,YAAY,EAAE,UAAU,EAenC,CAAC;AAEH,2GAA2G;AAC3G,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAU5D,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const ROOT = "https://docs.neoforged.net/primer/docs/";
|
|
2
|
+
// The early guides combine vanilla and Forge; later loader changes have their own pages.
|
|
3
|
+
const STEPS = [
|
|
4
|
+
["1.12", "1.14", "combined-forge"], ["1.14", "1.15", "combined-forge"],
|
|
5
|
+
["1.15.2", "1.16.5", "combined-forge"], ["1.16.5", "1.17", "combined-forge"],
|
|
6
|
+
["1.19.2", "1.19.3", "forge"], ["1.19.3", "1.19.4", "forge"], ["1.19.4", "1.20", "forge"],
|
|
7
|
+
["1.20.4", "1.20.5", "neoforge"], ["1.20.5", "1.20.6"], ["1.20.6", "1.21", "neoforge"],
|
|
8
|
+
["1.21", "1.21.1"], ["1.21.1", "1.21.2", "neoforge"], ["1.21.2", "1.21.4", "neoforge"],
|
|
9
|
+
["1.21.4", "1.21.5", "neoforge"], ["1.21.5", "1.21.6", "neoforge"],
|
|
10
|
+
["1.21.6", "1.21.7"], ["1.21.7", "1.21.8"], ["1.21.8", "1.21.9", "neoforge"],
|
|
11
|
+
["1.21.9", "1.21.10"], ["1.21.10", "1.21.11", "neoforge"],
|
|
12
|
+
["1.21.11", "26.1", "neoforge"], ["26.1", "26.2"],
|
|
13
|
+
];
|
|
14
|
+
export const SEED_PRIMERS = STEPS.flatMap(([fromVersion, toVersion, loader]) => {
|
|
15
|
+
const label = `${fromVersion} → ${toVersion}`;
|
|
16
|
+
const base = {
|
|
17
|
+
fromVersion, toVersion, modloader: loader === "combined-forge" ? "forge" : "vanilla",
|
|
18
|
+
title: `Minecraft${loader === "combined-forge" ? " / Forge" : ""} migration primer — ${label}`,
|
|
19
|
+
summary: `Migration notes for ${label}, covering ${loader === "combined-forge" ? "vanilla and Forge" : "vanilla"} API changes.`,
|
|
20
|
+
url: `${ROOT}${toVersion}/`, tags: ["migration", fromVersion, toVersion], source: "seed",
|
|
21
|
+
};
|
|
22
|
+
if (!loader || loader === "combined-forge")
|
|
23
|
+
return [base];
|
|
24
|
+
return [base, { ...base, modloader: loader,
|
|
25
|
+
title: `${loader === "forge" ? "Forge" : "NeoForge"} changes — ${label}`,
|
|
26
|
+
summary: `Loader-specific migration notes for ${label}; read alongside the vanilla primer.`,
|
|
27
|
+
url: `${ROOT}${toVersion}/${loader === "forge" ? "forge" : "neo"}/`,
|
|
28
|
+
tags: [...base.tags, loader],
|
|
29
|
+
}];
|
|
30
|
+
});
|
|
31
|
+
/** Only exact known seed URLs are eligible for repair. Null means a catalogue placeholder, not a guide. */
|
|
32
|
+
export const LEGACY_PRIMER_URLS = {
|
|
33
|
+
"https://docs.neoforged.net/docs/1.21.x/migrationguide/": `${ROOT}1.20.5/`,
|
|
34
|
+
"https://docs.neoforged.net/docs/1.20.4/migrationguide/": null,
|
|
35
|
+
"https://docs.neoforged.net/docs/1.21.5/migrationguide/": `${ROOT}1.21.5/`,
|
|
36
|
+
"https://docs.neoforged.net/docs/current/migrationguide/": `${ROOT}1.21.6/`,
|
|
37
|
+
"https://docs.neoforged.net/docs/gettingstarted/": null,
|
|
38
|
+
"https://github.com/MinecraftForge/MinecraftForge/blob/1.20.1/Changelog.md": `${ROOT}1.20/forge/`,
|
|
39
|
+
"https://github.com/MinecraftForge/MinecraftForge/blob/1.19.4/Changelog.md": `${ROOT}1.19.4/forge/`,
|
|
40
|
+
"https://fabricmc.net/wiki/tutorial:migration": `${ROOT}1.21.1/`,
|
|
41
|
+
"https://github.com/neoforged/NeoForge/blob/main/CHANGELOG.md": null,
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=primer-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer-catalog.js","sourceRoot":"","sources":["../src/primer-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DEFAULT_PRIMER_HOSTS: string[];
|
|
2
|
+
export declare const MAX_PRIMER_CONTENT: number;
|
|
3
|
+
export declare function validatePrimerUrl(value: string): URL;
|
|
4
|
+
export declare function primerHtmlToMarkdown(html: string, url: string): string;
|
|
5
|
+
/** Fetch content with bounded redirects, body size and a single timeout for the whole operation. */
|
|
6
|
+
export declare function fetchPrimerContent(value: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=primer-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer-content.d.ts","sourceRoot":"","sources":["../src/primer-content.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AACF,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAGlD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAapD;AAiDD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgCtE;AAED,oGAAoG;AACpG,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CvE"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import TurndownService from "turndown";
|
|
2
|
+
import { gfm } from "turndown-plugin-gfm";
|
|
3
|
+
export const DEFAULT_PRIMER_HOSTS = [
|
|
4
|
+
"github.com", "raw.githubusercontent.com", "neoforged.net", "docs.neoforged.net",
|
|
5
|
+
"fabricmc.net", "wiki.fabricmc.net", "modrinth.com", "curseforge.com", "minecraft.wiki",
|
|
6
|
+
"docs.minecraftforge.net", "minecraftforge.net", "quiltmc.org", "wiki.quiltmc.org",
|
|
7
|
+
"linuxcafe.net", "gist.github.com", "gitlab.com", "codeberg.org",
|
|
8
|
+
];
|
|
9
|
+
export const MAX_PRIMER_CONTENT = 2 * 1024 * 1024;
|
|
10
|
+
const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
11
|
+
export function validatePrimerUrl(value) {
|
|
12
|
+
let url;
|
|
13
|
+
try {
|
|
14
|
+
url = new URL(value);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error("Invalid primer URL");
|
|
18
|
+
}
|
|
19
|
+
if (url.protocol !== "https:")
|
|
20
|
+
throw new Error("Primer URL must use HTTPS");
|
|
21
|
+
if (url.username || url.password)
|
|
22
|
+
throw new Error("Primer URLs must not contain credentials");
|
|
23
|
+
if (url.port && url.port !== "443")
|
|
24
|
+
throw new Error("Primer URLs must use the HTTPS port");
|
|
25
|
+
if (process.env.MODLENS_PRIMER_ALLOW_ANY_HTTPS !== "1") {
|
|
26
|
+
const extra = (process.env.MODLENS_PRIMER_ALLOWED_HOSTS ?? "").split(",").map(h => h.trim().toLowerCase()).filter(Boolean);
|
|
27
|
+
if (![...DEFAULT_PRIMER_HOSTS, ...extra].some(h => url.hostname === h || url.hostname.endsWith(`.${h}`))) {
|
|
28
|
+
throw new Error(`Primer URL hostname "${url.hostname}" not in allowed list. Add it via MODLENS_PRIMER_ALLOWED_HOSTS.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
/** GitHub's blob UI contains navigation and scripts; the raw endpoint is the document. */
|
|
34
|
+
function fetchUrl(value) {
|
|
35
|
+
const url = validatePrimerUrl(value);
|
|
36
|
+
const match = /^\/([^/]+)\/([^/]+)\/blob\/(.+)$/.exec(url.pathname);
|
|
37
|
+
if (url.hostname === "github.com" && match)
|
|
38
|
+
return `https://raw.githubusercontent.com/${match[1]}/${match[2]}/${match[3]}`;
|
|
39
|
+
url.hash = "";
|
|
40
|
+
return url.href;
|
|
41
|
+
}
|
|
42
|
+
async function readResponse(response) {
|
|
43
|
+
if (Number(response.headers.get("content-length")) > MAX_RESPONSE_BYTES) {
|
|
44
|
+
await response.body?.cancel();
|
|
45
|
+
throw new Error("Primer response exceeds 8 MiB");
|
|
46
|
+
}
|
|
47
|
+
if (!response.body)
|
|
48
|
+
throw new Error("Empty primer response");
|
|
49
|
+
const reader = response.body.getReader();
|
|
50
|
+
const chunks = [];
|
|
51
|
+
let size = 0;
|
|
52
|
+
try {
|
|
53
|
+
while (true) {
|
|
54
|
+
const next = await reader.read();
|
|
55
|
+
if (next.done)
|
|
56
|
+
break;
|
|
57
|
+
size += next.value.byteLength;
|
|
58
|
+
if (size > MAX_RESPONSE_BYTES)
|
|
59
|
+
throw new Error("Primer response exceeds 8 MiB");
|
|
60
|
+
chunks.push(next.value);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await reader.cancel().catch(() => { });
|
|
65
|
+
reader.releaseLock();
|
|
66
|
+
}
|
|
67
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
68
|
+
}
|
|
69
|
+
function articleHtml(html) {
|
|
70
|
+
return /<article\b[^>]*>([\s\S]*?)<\/article>/i.exec(html)?.[1]
|
|
71
|
+
?? /<main\b[^>]*>([\s\S]*?)<\/main>/i.exec(html)?.[1]
|
|
72
|
+
?? /<body\b[^>]*>([\s\S]*?)<\/body>/i.exec(html)?.[1] ?? html;
|
|
73
|
+
}
|
|
74
|
+
/** Highlighted Docusaurus code uses token-line elements and <br>, which textContent drops. */
|
|
75
|
+
function codeText(node) {
|
|
76
|
+
if (node.nodeType === 3)
|
|
77
|
+
return node.nodeValue ?? "";
|
|
78
|
+
if (node.nodeType !== 1)
|
|
79
|
+
return "";
|
|
80
|
+
const element = node;
|
|
81
|
+
if (element.nodeName === "BR")
|
|
82
|
+
return "\n";
|
|
83
|
+
if (element.getAttribute("aria-hidden") === "true")
|
|
84
|
+
return "";
|
|
85
|
+
const text = Array.from(node.childNodes).map(codeText).join("");
|
|
86
|
+
return /(?:^|\s)token-line(?:\s|$)/.test(element.className ?? "") && !text.endsWith("\n") ? text + "\n" : text;
|
|
87
|
+
}
|
|
88
|
+
export function primerHtmlToMarkdown(html, url) {
|
|
89
|
+
const converter = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced", bulletListMarker: "-", preformattedCode: true });
|
|
90
|
+
converter.use(gfm);
|
|
91
|
+
converter.addRule("highlighted-code-lines", {
|
|
92
|
+
filter: "pre",
|
|
93
|
+
replacement: (_content, node) => {
|
|
94
|
+
const code = node.querySelector("code") ?? node;
|
|
95
|
+
const language = /(?:^|\s)language-([\w-]+)/.exec(code.className + " " + node.className)?.[1] ?? "";
|
|
96
|
+
const text = codeText(code).replace(/\n$/, "");
|
|
97
|
+
const fence = "`".repeat(Math.max(3, ...Array.from(text.matchAll(/^`{3,}/gm), match => match[0].length + 1)));
|
|
98
|
+
return `\n\n${fence}${language}\n${text}\n${fence}\n\n`;
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
converter.addRule("page-chrome", {
|
|
102
|
+
filter: node => ["SCRIPT", "STYLE", "NOSCRIPT", "NAV", "FOOTER", "ASIDE", "BUTTON", "FORM", "SVG", "IFRAME"].includes(node.nodeName) ||
|
|
103
|
+
node.getAttribute("aria-hidden") === "true" || /(?:^|\s)(?:hash-link|breadcrumbs|theme-edit-this-page)(?:\s|$)/.test(node.className ?? ""),
|
|
104
|
+
replacement: () => "",
|
|
105
|
+
});
|
|
106
|
+
converter.addRule("absolute-links", {
|
|
107
|
+
filter: node => node.nodeName === "A" && node.getAttribute("aria-hidden") !== "true" &&
|
|
108
|
+
!/(?:^|\s)(?:hash-link|theme-edit-this-page)(?:\s|$)/.test(node.className ?? ""),
|
|
109
|
+
replacement: (content, node) => {
|
|
110
|
+
const href = node.getAttribute("href");
|
|
111
|
+
if (!href || !content.trim())
|
|
112
|
+
return content;
|
|
113
|
+
try {
|
|
114
|
+
const resolved = new URL(href, url);
|
|
115
|
+
if (!["http:", "https:"].includes(resolved.protocol))
|
|
116
|
+
return content;
|
|
117
|
+
return `[${content}](${resolved.href})`;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return content;
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
return converter.turndown(articleHtml(html)).trim();
|
|
125
|
+
}
|
|
126
|
+
/** Fetch content with bounded redirects, body size and a single timeout for the whole operation. */
|
|
127
|
+
export async function fetchPrimerContent(value) {
|
|
128
|
+
const signal = AbortSignal.timeout(30_000);
|
|
129
|
+
const visited = new Set();
|
|
130
|
+
const load = async (input, depth = 0) => {
|
|
131
|
+
if (depth > 5)
|
|
132
|
+
throw new Error("Too many primer redirects or embedded pages");
|
|
133
|
+
const url = fetchUrl(input);
|
|
134
|
+
validatePrimerUrl(url); // including rewritten GitHub URLs and every redirect/iframe target
|
|
135
|
+
if (visited.has(url))
|
|
136
|
+
throw new Error("Primer redirect/iframe loop");
|
|
137
|
+
visited.add(url);
|
|
138
|
+
const response = await fetch(url, { redirect: "manual", signal });
|
|
139
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
140
|
+
const location = response.headers.get("location");
|
|
141
|
+
await response.body?.cancel();
|
|
142
|
+
if (!location)
|
|
143
|
+
throw new Error(`HTTP ${response.status} without a redirect location`);
|
|
144
|
+
return load(new URL(location, url).href, depth + 1);
|
|
145
|
+
}
|
|
146
|
+
if (!response.ok) {
|
|
147
|
+
await response.body?.cancel();
|
|
148
|
+
throw new Error(`HTTP ${response.status} fetching ${url}`);
|
|
149
|
+
}
|
|
150
|
+
const type = (response.headers.get("content-type") ?? "").toLowerCase();
|
|
151
|
+
if (type && !/text\/|application\/(?:xhtml\+xml|octet-stream)/.test(type)) {
|
|
152
|
+
await response.body?.cancel();
|
|
153
|
+
throw new Error(`Unsupported primer content type: ${type}`);
|
|
154
|
+
}
|
|
155
|
+
const raw = await readResponse(response);
|
|
156
|
+
const html = /html/.test(type) || /^\s*(?:<!doctype html|<html|<article|<main|<body)\b/i.test(raw);
|
|
157
|
+
let content;
|
|
158
|
+
if (html) {
|
|
159
|
+
const body = articleHtml(raw);
|
|
160
|
+
// The official loader-specific pages embed their release post instead of containing the guide.
|
|
161
|
+
const embedded = /^https:\/\/docs\.neoforged\.net\/primer\//.test(url)
|
|
162
|
+
? /<iframe\b[^>]*\bsrc=["']([^"']+)["']/i.exec(body) : null;
|
|
163
|
+
if (embedded) {
|
|
164
|
+
const source = new URL(embedded[1].replace(/&/g, "&"), url).href;
|
|
165
|
+
content = `${await load(source, depth + 1)}\n\nEmbedded source: ${source}`;
|
|
166
|
+
}
|
|
167
|
+
else
|
|
168
|
+
content = primerHtmlToMarkdown(raw, url);
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
content = raw.replace(/^\uFEFF/, "").trim();
|
|
172
|
+
if (!content || content.length < 80 || /^(?:#\s*)?(?:404|page not found|not found)(?:\s|$)/i.test(content))
|
|
173
|
+
throw new Error(`No readable primer content at ${url}`);
|
|
174
|
+
if (Buffer.byteLength(content, "utf8") > MAX_PRIMER_CONTENT)
|
|
175
|
+
throw new Error("Primer content exceeds 2 MiB; it was not truncated or cached");
|
|
176
|
+
return content;
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
return await load(value);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
throw new Error(`Primer content fetch failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=primer-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer-content.js","sourceRoot":"","sources":["../src/primer-content.ts"],"names":[],"mappings":"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"}
|
package/dist/processor.d.ts
CHANGED
|
@@ -24,11 +24,15 @@ export interface ParsedManifest {
|
|
|
24
24
|
mixinTargets: string[];
|
|
25
25
|
metadataSource: MetadataSource;
|
|
26
26
|
}
|
|
27
|
+
/** Read every declared loader, including JARs that ship metadata for multiple loaders. */
|
|
28
|
+
export declare function inspectJarLoaders(jarPath: string): Promise<Array<Exclude<ParsedManifest["loader"], "unknown">>>;
|
|
27
29
|
export declare function parseJar(jarPath: string): Promise<ParsedManifest>;
|
|
28
30
|
interface ForgeModAnnotationResult {
|
|
29
31
|
modId: string;
|
|
30
32
|
name: string;
|
|
31
33
|
version: string;
|
|
34
|
+
mcVersion: string;
|
|
35
|
+
dependencies: string;
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
38
|
* Scan class entries in a JAR for the Forge @Mod annotation.
|
|
@@ -41,6 +45,7 @@ export declare function parseClassForModAnnotation(buf: Buffer): ForgeModAnnotat
|
|
|
41
45
|
export declare function parseAtEntries(content: string): string[];
|
|
42
46
|
export declare function parseAwEntries(content: string): string[];
|
|
43
47
|
export declare function computeHashes(jarPath: string): Promise<{
|
|
48
|
+
sha1: string;
|
|
44
49
|
sha256: string;
|
|
45
50
|
sha512: string;
|
|
46
51
|
murmur2: string;
|
package/dist/processor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAO7B,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEhI,qGAAqG;AACrG,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAO3D,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;KAAE,CAAC,CAAC;IACzE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;CAClC;AAED,0FAA0F;AAC1F,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAgCrH;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4HvE;AA4PD,UAAU,wBAAwB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAqBtF;AAED,sEAAsE;AACtE,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAwEvF;AA8ID,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD;AAeD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE,CAAC,CAMhI;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBnD"}
|