@adhisang/minecraft-modding-mcp 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +88 -17
- package/dist/cli.js +1 -16
- package/dist/compat-stdio-transport.d.ts +27 -0
- package/dist/compat-stdio-transport.js +217 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/decompiler/vineflower.d.ts +1 -0
- package/dist/decompiler/vineflower.js +78 -29
- package/dist/index.js +169 -25
- package/dist/mapping-service.d.ts +22 -0
- package/dist/mapping-service.js +309 -30
- package/dist/mixin-parser.d.ts +1 -0
- package/dist/mixin-parser.js +134 -16
- package/dist/mixin-validator.d.ts +93 -2
- package/dist/mixin-validator.js +464 -41
- package/dist/mod-analyzer.d.ts +2 -0
- package/dist/mod-analyzer.js +7 -0
- package/dist/mod-decompile-service.d.ts +6 -0
- package/dist/mod-decompile-service.js +36 -4
- package/dist/mod-search-service.d.ts +1 -0
- package/dist/mod-search-service.js +96 -0
- package/dist/search-hit-accumulator.d.ts +1 -0
- package/dist/search-hit-accumulator.js +3 -0
- package/dist/source-resolver.js +0 -4
- package/dist/source-service.d.ts +91 -4
- package/dist/source-service.js +1211 -120
- package/dist/storage/files-repo.js +35 -8
- package/dist/types.d.ts +1 -0
- package/dist/version-service.js +30 -6
- package/dist/workspace-mapping-service.d.ts +1 -0
- package/dist/workspace-mapping-service.js +24 -0
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { createError, ERROR_CODES } from "../errors.js";
|
|
2
3
|
import { log } from "../logger.js";
|
|
3
4
|
function buildCursor(sortKey) {
|
|
4
5
|
return Buffer.from(JSON.stringify({ sortKey }), "utf8").toString("base64");
|
|
@@ -11,13 +12,26 @@ function parseCursor(cursor) {
|
|
|
11
12
|
const decoded = Buffer.from(cursor, "base64").toString("utf8");
|
|
12
13
|
const parsed = JSON.parse(decoded);
|
|
13
14
|
if (typeof parsed.sortKey !== "string") {
|
|
14
|
-
|
|
15
|
+
throw createError({
|
|
16
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
17
|
+
message: "Invalid pagination cursor.",
|
|
18
|
+
details: {
|
|
19
|
+
nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
|
|
20
|
+
}
|
|
21
|
+
});
|
|
15
22
|
}
|
|
16
23
|
return parsed;
|
|
17
24
|
}
|
|
18
|
-
catch {
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
catch (err) {
|
|
26
|
+
if (err instanceof Error && "code" in err)
|
|
27
|
+
throw err;
|
|
28
|
+
throw createError({
|
|
29
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
30
|
+
message: "Invalid pagination cursor.",
|
|
31
|
+
details: {
|
|
32
|
+
nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
|
|
33
|
+
}
|
|
34
|
+
});
|
|
21
35
|
}
|
|
22
36
|
}
|
|
23
37
|
function buildSearchCursor(score, filePath) {
|
|
@@ -31,13 +45,26 @@ function parseSearchCursor(cursor) {
|
|
|
31
45
|
const decoded = Buffer.from(cursor, "base64").toString("utf8");
|
|
32
46
|
const parsed = JSON.parse(decoded);
|
|
33
47
|
if (typeof parsed.score !== "number" || typeof parsed.filePath !== "string") {
|
|
34
|
-
|
|
48
|
+
throw createError({
|
|
49
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
50
|
+
message: "Invalid pagination cursor.",
|
|
51
|
+
details: {
|
|
52
|
+
nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
|
|
53
|
+
}
|
|
54
|
+
});
|
|
35
55
|
}
|
|
36
56
|
return parsed;
|
|
37
57
|
}
|
|
38
|
-
catch {
|
|
39
|
-
|
|
40
|
-
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err instanceof Error && "code" in err)
|
|
60
|
+
throw err;
|
|
61
|
+
throw createError({
|
|
62
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
63
|
+
message: "Invalid pagination cursor.",
|
|
64
|
+
details: {
|
|
65
|
+
nextAction: "Omit the cursor parameter to start from the first page, or use a cursor value from a previous response."
|
|
66
|
+
}
|
|
67
|
+
});
|
|
41
68
|
}
|
|
42
69
|
}
|
|
43
70
|
function nextCursorFromRows(rows) {
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export type SourceOrigin = "local-jar" | "local-m2" | "remote-repo" | "decompile
|
|
|
2
2
|
export type SourceMapping = "official" | "mojang" | "intermediary" | "yarn";
|
|
3
3
|
export type MappingSourcePriority = "loom-first" | "maven-first";
|
|
4
4
|
export type ArtifactTargetKind = "version" | "jar" | "coordinate";
|
|
5
|
+
export type ArtifactScope = "vanilla" | "merged" | "loader";
|
|
5
6
|
export interface SourceTargetInput {
|
|
6
7
|
kind: ArtifactTargetKind;
|
|
7
8
|
value: string;
|
package/dist/version-service.js
CHANGED
|
@@ -21,7 +21,11 @@ function ensureVersionDetail(value, version) {
|
|
|
21
21
|
throw createError({
|
|
22
22
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
23
23
|
message: `Version metadata for "${version}" is invalid.`,
|
|
24
|
-
details: {
|
|
24
|
+
details: {
|
|
25
|
+
version,
|
|
26
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
27
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
28
|
+
}
|
|
25
29
|
});
|
|
26
30
|
}
|
|
27
31
|
return value;
|
|
@@ -105,7 +109,11 @@ export class VersionService {
|
|
|
105
109
|
throw createError({
|
|
106
110
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
107
111
|
message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
|
|
108
|
-
details: {
|
|
112
|
+
details: {
|
|
113
|
+
version: normalizedVersion,
|
|
114
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
115
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
116
|
+
}
|
|
109
117
|
});
|
|
110
118
|
}
|
|
111
119
|
const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
|
|
@@ -133,7 +141,11 @@ export class VersionService {
|
|
|
133
141
|
throw createError({
|
|
134
142
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
135
143
|
message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
|
|
136
|
-
details: {
|
|
144
|
+
details: {
|
|
145
|
+
version: normalizedVersion,
|
|
146
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
147
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
148
|
+
}
|
|
137
149
|
});
|
|
138
150
|
}
|
|
139
151
|
const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
|
|
@@ -142,7 +154,11 @@ export class VersionService {
|
|
|
142
154
|
throw createError({
|
|
143
155
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
144
156
|
message: `Minecraft version "${normalizedVersion}" does not expose a server download URL.`,
|
|
145
|
-
details: {
|
|
157
|
+
details: {
|
|
158
|
+
version: normalizedVersion,
|
|
159
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
160
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
161
|
+
}
|
|
146
162
|
});
|
|
147
163
|
}
|
|
148
164
|
const destinationPath = defaultDownloadPath(this.config.cacheDir, serverJarUrl);
|
|
@@ -230,7 +246,11 @@ export class VersionService {
|
|
|
230
246
|
throw createError({
|
|
231
247
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
232
248
|
message: `Minecraft version "${normalizedVersion}" was not found in version manifest.`,
|
|
233
|
-
details: {
|
|
249
|
+
details: {
|
|
250
|
+
version: normalizedVersion,
|
|
251
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
252
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
253
|
+
}
|
|
234
254
|
});
|
|
235
255
|
}
|
|
236
256
|
const details = await this.fetchVersionDetails(versionEntry.url, normalizedVersion);
|
|
@@ -239,7 +259,11 @@ export class VersionService {
|
|
|
239
259
|
throw createError({
|
|
240
260
|
code: ERROR_CODES.VERSION_NOT_FOUND,
|
|
241
261
|
message: `Minecraft version "${normalizedVersion}" does not expose a client download URL.`,
|
|
242
|
-
details: {
|
|
262
|
+
details: {
|
|
263
|
+
version: normalizedVersion,
|
|
264
|
+
nextAction: "Use list-versions to see available Minecraft versions.",
|
|
265
|
+
suggestedCall: { tool: "list-versions", params: {} }
|
|
266
|
+
}
|
|
243
267
|
});
|
|
244
268
|
}
|
|
245
269
|
const destinationPath = defaultDownloadPath(this.config.cacheDir, clientJarUrl);
|
|
@@ -15,4 +15,5 @@ export type WorkspaceCompileMappingOutput = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare class WorkspaceMappingService {
|
|
17
17
|
detectCompileMapping(input: WorkspaceCompileMappingInput): Promise<WorkspaceCompileMappingOutput>;
|
|
18
|
+
detectProjectMinecraftVersion(projectPath: string): Promise<string | undefined>;
|
|
18
19
|
}
|
|
@@ -85,5 +85,29 @@ export class WorkspaceMappingService {
|
|
|
85
85
|
warnings: []
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
+
async detectProjectMinecraftVersion(projectPath) {
|
|
89
|
+
const root = resolve(projectPath);
|
|
90
|
+
const propsPath = resolve(root, "gradle.properties");
|
|
91
|
+
let content;
|
|
92
|
+
try {
|
|
93
|
+
content = await readFile(propsPath, "utf8");
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
// Search for common MC version property patterns
|
|
99
|
+
const patterns = [
|
|
100
|
+
/^minecraft_version\s*=\s*(.+)$/m,
|
|
101
|
+
/^mc_version\s*=\s*(.+)$/m,
|
|
102
|
+
/^minecraftVersion\s*=\s*(.+)$/m
|
|
103
|
+
];
|
|
104
|
+
for (const pattern of patterns) {
|
|
105
|
+
const match = content.match(pattern);
|
|
106
|
+
if (match?.[1]?.trim()) {
|
|
107
|
+
return match[1].trim();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
88
112
|
}
|
|
89
113
|
//# sourceMappingURL=workspace-mapping-service.js.map
|