@adhisang/minecraft-modding-mcp 4.2.1 → 6.0.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 +69 -0
- package/README.md +5 -4
- package/dist/access-transformer-parser.d.ts +2 -1
- package/dist/access-transformer-parser.js +10 -1
- package/dist/access-widener-parser.d.ts +1 -0
- package/dist/access-widener-parser.js +6 -3
- package/dist/build-suggested-call.js +31 -10
- package/dist/cache-registry.d.ts +8 -0
- package/dist/cache-registry.js +50 -32
- package/dist/config.d.ts +1 -0
- package/dist/config.js +4 -0
- package/dist/decompiler/vineflower.js +8 -2
- package/dist/entry-tools/analyze-mod-service.d.ts +24 -24
- package/dist/entry-tools/analyze-mod-service.js +2 -1
- package/dist/entry-tools/analyze-symbol-service.d.ts +57 -22
- package/dist/entry-tools/analyze-symbol-service.js +139 -34
- package/dist/entry-tools/batch-class-members-service.d.ts +3 -1
- package/dist/entry-tools/batch-class-members-service.js +6 -6
- package/dist/entry-tools/batch-class-source-service.d.ts +3 -1
- package/dist/entry-tools/batch-class-source-service.js +5 -6
- package/dist/entry-tools/batch-mappings-service.d.ts +3 -1
- package/dist/entry-tools/batch-mappings-service.js +4 -5
- package/dist/entry-tools/batch-symbol-exists-service.d.ts +3 -1
- package/dist/entry-tools/batch-symbol-exists-service.js +4 -5
- package/dist/entry-tools/compare-minecraft-service.d.ts +10 -10
- package/dist/entry-tools/compare-minecraft-service.js +1 -1
- package/dist/entry-tools/entry-tool-schema.d.ts +1 -1
- package/dist/entry-tools/inspect-minecraft/handlers/artifact.js +1 -3
- package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +4 -3
- package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +0 -5
- package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +0 -1
- package/dist/entry-tools/inspect-minecraft/handlers/file.js +26 -2
- package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +0 -1
- package/dist/entry-tools/inspect-minecraft/handlers/search.d.ts +8 -0
- package/dist/entry-tools/inspect-minecraft/handlers/search.js +13 -2
- package/dist/entry-tools/inspect-minecraft/handlers/versions.d.ts +1 -1
- package/dist/entry-tools/inspect-minecraft/handlers/versions.js +3 -2
- package/dist/entry-tools/inspect-minecraft/internal.d.ts +90 -89
- package/dist/entry-tools/inspect-minecraft/internal.js +32 -14
- package/dist/entry-tools/inspect-minecraft-service.d.ts +218 -218
- package/dist/entry-tools/inspect-minecraft-service.js +1 -1
- package/dist/entry-tools/manage-cache-service.d.ts +4 -4
- package/dist/entry-tools/response-contract.d.ts +3 -1
- package/dist/entry-tools/response-contract.js +3 -2
- package/dist/entry-tools/validate-project/cases/mixin.js +2 -1
- package/dist/entry-tools/validate-project/cases/project-summary.js +5 -3
- package/dist/entry-tools/validate-project-service.d.ts +42 -36
- package/dist/entry-tools/validate-project-service.js +3 -1
- package/dist/entry-tools/verify-mixin-target-service.d.ts +30 -0
- package/dist/entry-tools/verify-mixin-target-service.js +120 -29
- package/dist/error-mapping.d.ts +51 -0
- package/dist/error-mapping.js +157 -2
- package/dist/index.js +147 -76
- package/dist/java-process.js +1 -1
- package/dist/json-rpc-framing.d.ts +4 -0
- package/dist/json-rpc-framing.js +23 -1
- package/dist/mapping/internal-types.d.ts +24 -0
- package/dist/mapping/loaders/tiny-maven.js +46 -20
- package/dist/mapping/lookup.d.ts +13 -2
- package/dist/mapping/lookup.js +60 -2
- package/dist/mapping/types.d.ts +6 -0
- package/dist/mapping-service.d.ts +26 -2
- package/dist/mapping-service.js +212 -55
- package/dist/mcp-helpers.d.ts +1 -0
- package/dist/mcp-helpers.js +25 -3
- package/dist/minecraft-explorer-service.js +24 -11
- package/dist/mixin/access-validators.js +33 -1
- package/dist/mixin/annotation-validators.js +73 -9
- package/dist/mixin/parsed-validator.js +3 -2
- package/dist/mixin-parser.js +119 -7
- package/dist/mod-decompile-service.d.ts +2 -0
- package/dist/mod-decompile-service.js +21 -3
- package/dist/mod-remap-service.d.ts +20 -1
- package/dist/mod-remap-service.js +101 -45
- package/dist/mojang-tiny-mapping-service.js +5 -2
- package/dist/nbt/java-nbt-codec.js +46 -16
- package/dist/nbt/json-patch.js +51 -12
- package/dist/nbt/typed-json.d.ts +1 -0
- package/dist/nbt/typed-json.js +12 -2
- package/dist/nbt/types.d.ts +2 -2
- package/dist/observability.d.ts +6 -0
- package/dist/observability.js +10 -0
- package/dist/page-cursor.d.ts +17 -0
- package/dist/page-cursor.js +0 -0
- package/dist/path-converter.js +10 -3
- package/dist/registry-service.d.ts +2 -0
- package/dist/registry-service.js +41 -2
- package/dist/repo-downloader.js +4 -3
- package/dist/resources.js +45 -9
- package/dist/response-utils.d.ts +29 -4
- package/dist/response-utils.js +95 -5
- package/dist/source/access-validate.js +12 -2
- package/dist/source/artifact-resolver.js +2 -2
- package/dist/source/class-source/members-builder.d.ts +44 -1
- package/dist/source/class-source/members-builder.js +51 -4
- package/dist/source/class-source/snippet-builder.d.ts +13 -0
- package/dist/source/class-source/snippet-builder.js +54 -4
- package/dist/source/class-source-helpers.d.ts +4 -4
- package/dist/source/class-source-helpers.js +77 -20
- package/dist/source/class-source.d.ts +19 -0
- package/dist/source/class-source.js +144 -40
- package/dist/source/file-access.js +3 -2
- package/dist/source/indexer.js +29 -9
- package/dist/source/lifecycle/mapping-helpers.js +28 -3
- package/dist/source/lifecycle/runtime-check.js +20 -6
- package/dist/source/search.d.ts +1 -1
- package/dist/source/search.js +117 -30
- package/dist/source/validate-mixin/pipeline/resolve.js +23 -3
- package/dist/source/validate-mixin.d.ts +2 -1
- package/dist/source/validate-mixin.js +45 -4
- package/dist/source/workspace-target.js +17 -10
- package/dist/source-jar-reader.d.ts +54 -1
- package/dist/source-jar-reader.js +121 -10
- package/dist/source-resolver.js +2 -2
- package/dist/source-service.d.ts +28 -7
- package/dist/source-service.js +9 -1
- package/dist/stdio-supervisor.d.ts +2 -2
- package/dist/stdio-supervisor.js +29 -9
- package/dist/storage/db.js +24 -1
- package/dist/storage/files-repo.d.ts +15 -0
- package/dist/storage/files-repo.js +67 -37
- package/dist/storage/symbols-repo.d.ts +15 -0
- package/dist/storage/symbols-repo.js +53 -19
- package/dist/symbols/symbol-extractor.js +35 -6
- package/dist/text-truncate.d.ts +7 -0
- package/dist/text-truncate.js +21 -0
- package/dist/tiny-remapper-resolver.js +10 -0
- package/dist/tool-contract-manifest.js +2 -2
- package/dist/tool-execution-gate.js +12 -1
- package/dist/tool-guidance.d.ts +6 -2
- package/dist/tool-guidance.js +63 -13
- package/dist/tool-schemas.d.ts +561 -496
- package/dist/tool-schemas.js +175 -139
- package/dist/types.d.ts +1 -0
- package/dist/version-diff-service.js +5 -0
- package/dist/version-service.d.ts +3 -0
- package/dist/version-service.js +18 -2
- package/dist/warning-details.d.ts +30 -0
- package/dist/warning-details.js +80 -0
- package/dist/workspace-mapping-service.js +9 -0
- package/docs/README-ja.md +2 -2
- package/docs/examples.md +26 -2
- package/docs/tool-reference.md +22 -17
- package/package.json +1 -1
|
@@ -11,7 +11,7 @@ import { handleClassMembers } from "./inspect-minecraft/handlers/class-members.j
|
|
|
11
11
|
import { handleSearch } from "./inspect-minecraft/handlers/search.js";
|
|
12
12
|
import { handleFile } from "./inspect-minecraft/handlers/file.js";
|
|
13
13
|
import { handleListFiles } from "./inspect-minecraft/handlers/list-files.js";
|
|
14
|
-
const INCLUDE_GROUPS = ["warnings", "provenance", "candidates", "members", "source", "files", "samples", "artifact", "timings"];
|
|
14
|
+
const INCLUDE_GROUPS = ["warnings", "provenance", "candidates", "members", "descriptors", "source", "files", "samples", "artifact", "timings"];
|
|
15
15
|
const nonEmptyString = z.string().trim().min(1);
|
|
16
16
|
export const inspectMinecraftShape = {
|
|
17
17
|
task: z.enum(TASKS).optional(),
|
|
@@ -82,9 +82,9 @@ export declare const manageCacheSchema: z.ZodObject<{
|
|
|
82
82
|
}, "strip", z.ZodTypeAny, {
|
|
83
83
|
limit: number;
|
|
84
84
|
executionMode: "preview" | "apply";
|
|
85
|
-
action: "
|
|
85
|
+
action: "summary" | "list" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
|
|
86
86
|
cursor?: string | undefined;
|
|
87
|
-
detail?: "
|
|
87
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
88
88
|
include?: string[] | undefined;
|
|
89
89
|
cacheKinds?: ("workspace" | "artifact-index" | "downloads" | "mapping" | "registry" | "decompiled-source" | "mod-remap" | "binary-remap")[] | undefined;
|
|
90
90
|
selector?: {
|
|
@@ -99,10 +99,10 @@ export declare const manageCacheSchema: z.ZodObject<{
|
|
|
99
99
|
olderThan?: string | undefined;
|
|
100
100
|
} | undefined;
|
|
101
101
|
}, {
|
|
102
|
-
action: "
|
|
102
|
+
action: "summary" | "list" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
|
|
103
103
|
limit?: number | undefined;
|
|
104
104
|
cursor?: string | undefined;
|
|
105
|
-
detail?: "
|
|
105
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
106
106
|
include?: string[] | undefined;
|
|
107
107
|
executionMode?: "preview" | "apply" | undefined;
|
|
108
108
|
cacheKinds?: ("workspace" | "artifact-index" | "downloads" | "mapping" | "registry" | "decompiled-source" | "mod-remap" | "binary-remap")[] | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const DETAIL_LEVELS: readonly ["summary", "standard", "full"];
|
|
2
2
|
export type DetailLevel = (typeof DETAIL_LEVELS)[number];
|
|
3
|
-
export declare const CANONICAL_INCLUDE_GROUPS: readonly ["warnings", "provenance", "candidates", "members", "source", "files", "samples", "diff", "issues", "timeline", "matrix", "entries", "workspace", "health", "recovery", "paths", "owners", "preview", "cacheEntries", "timings", "artifact", "classes", "registry"];
|
|
3
|
+
export declare const CANONICAL_INCLUDE_GROUPS: readonly ["warnings", "provenance", "candidates", "members", "descriptors", "source", "files", "samples", "diff", "issues", "timeline", "matrix", "entries", "workspace", "health", "recovery", "paths", "owners", "preview", "cacheEntries", "timings", "artifact", "classes", "registry"];
|
|
4
4
|
export type IncludeGroup = (typeof CANONICAL_INCLUDE_GROUPS)[number];
|
|
5
5
|
export type SummaryStatus = "ok" | "partial" | "ambiguous" | "not_found" | "invalid" | "blocked" | "changed" | "unchanged";
|
|
6
6
|
export type NextAction = {
|
|
@@ -30,6 +30,8 @@ export declare function createTruncationMeta(input: {
|
|
|
30
30
|
}): TruncationMeta;
|
|
31
31
|
export declare function buildEntryToolMeta(input: {
|
|
32
32
|
detail: DetailLevel;
|
|
33
|
+
/** When set and equal to `detail`, detailApplied is omitted (the default needs no echo). */
|
|
34
|
+
defaultDetail?: DetailLevel;
|
|
33
35
|
include?: readonly string[];
|
|
34
36
|
warnings?: readonly string[];
|
|
35
37
|
truncated?: TruncationMeta;
|
|
@@ -4,6 +4,7 @@ export const CANONICAL_INCLUDE_GROUPS = [
|
|
|
4
4
|
"provenance",
|
|
5
5
|
"candidates",
|
|
6
6
|
"members",
|
|
7
|
+
"descriptors",
|
|
7
8
|
"source",
|
|
8
9
|
"files",
|
|
9
10
|
"samples",
|
|
@@ -70,8 +71,8 @@ export function createTruncationMeta(input) {
|
|
|
70
71
|
}
|
|
71
72
|
export function buildEntryToolMeta(input) {
|
|
72
73
|
return {
|
|
73
|
-
warnings: [...
|
|
74
|
-
detailApplied: input.detail,
|
|
74
|
+
...(input.warnings && input.warnings.length > 0 ? { warnings: [...input.warnings] } : {}),
|
|
75
|
+
...(input.detail === input.defaultDetail ? {} : { detailApplied: input.detail }),
|
|
75
76
|
...(input.include && input.include.length > 0
|
|
76
77
|
? { includeApplied: normalizeIncludeGroups(input.include) }
|
|
77
78
|
: {}),
|
|
@@ -48,7 +48,8 @@ export async function handleMixin(deps, input, detail, include) {
|
|
|
48
48
|
warningMode: input.warningMode,
|
|
49
49
|
warningCategoryFilter: input.warningCategoryFilter,
|
|
50
50
|
treatInfoAsWarning: input.treatInfoAsWarning,
|
|
51
|
-
includeIssues: input.includeIssues
|
|
51
|
+
includeIssues: input.includeIssues,
|
|
52
|
+
reportMode: input.reportMode
|
|
52
53
|
});
|
|
53
54
|
const summary = output.summary;
|
|
54
55
|
const invalidCount = summary?.invalid ?? 0;
|
|
@@ -45,12 +45,13 @@ export async function handleProjectSummary(deps, input, detail, include, options
|
|
|
45
45
|
tool: "validate-project",
|
|
46
46
|
params: {
|
|
47
47
|
task: "project-summary",
|
|
48
|
-
subject: input.subject
|
|
48
|
+
subject: input.subject,
|
|
49
|
+
preferProjectVersion: true
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
],
|
|
52
53
|
notes: [
|
|
53
|
-
"Pass version explicitly, or retry with preferProjectVersion=true when gradle.properties declares the Minecraft version."
|
|
54
|
+
"Pass version explicitly, or retry with preferProjectVersion=true when gradle.properties declares the Minecraft version. The suggested retry sets preferProjectVersion=true for you."
|
|
54
55
|
]
|
|
55
56
|
},
|
|
56
57
|
blocks: {
|
|
@@ -225,7 +226,8 @@ export async function handleProjectSummary(deps, input, detail, include, options
|
|
|
225
226
|
warningMode: input.warningMode,
|
|
226
227
|
warningCategoryFilter: input.warningCategoryFilter,
|
|
227
228
|
treatInfoAsWarning: input.treatInfoAsWarning,
|
|
228
|
-
includeIssues: input.includeIssues
|
|
229
|
+
includeIssues: input.includeIssues,
|
|
230
|
+
reportMode: input.reportMode
|
|
229
231
|
}, {
|
|
230
232
|
stageEmitter: wrappedEmitter
|
|
231
233
|
});
|
|
@@ -57,13 +57,13 @@ export declare const validateProjectShape: {
|
|
|
57
57
|
}, "strip", z.ZodTypeAny, {
|
|
58
58
|
kind: "workspace";
|
|
59
59
|
projectPath: string;
|
|
60
|
-
gradleUserHome?: string | undefined;
|
|
61
60
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
61
|
+
gradleUserHome?: string | undefined;
|
|
62
62
|
}, {
|
|
63
63
|
kind: "workspace";
|
|
64
64
|
projectPath: string;
|
|
65
|
-
gradleUserHome?: string | undefined;
|
|
66
65
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
66
|
+
gradleUserHome?: string | undefined;
|
|
67
67
|
}>, z.ZodObject<{
|
|
68
68
|
kind: z.ZodLiteral<"mixin">;
|
|
69
69
|
input: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
|
|
@@ -245,6 +245,7 @@ export declare const validateProjectShape: {
|
|
|
245
245
|
warningCategoryFilter: z.ZodOptional<z.ZodArray<z.ZodEnum<["mapping", "configuration", "validation", "resolution", "parse"]>, "many">>;
|
|
246
246
|
treatInfoAsWarning: z.ZodDefault<z.ZodBoolean>;
|
|
247
247
|
includeIssues: z.ZodDefault<z.ZodBoolean>;
|
|
248
|
+
reportMode: z.ZodDefault<z.ZodEnum<["compact", "full", "summary-first"]>>;
|
|
248
249
|
};
|
|
249
250
|
export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
250
251
|
task: z.ZodEnum<["project-summary", "mixin", "access-widener", "access-transformer"]>;
|
|
@@ -256,13 +257,13 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
256
257
|
}, "strip", z.ZodTypeAny, {
|
|
257
258
|
kind: "workspace";
|
|
258
259
|
projectPath: string;
|
|
259
|
-
gradleUserHome?: string | undefined;
|
|
260
260
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
261
|
+
gradleUserHome?: string | undefined;
|
|
261
262
|
}, {
|
|
262
263
|
kind: "workspace";
|
|
263
264
|
projectPath: string;
|
|
264
|
-
gradleUserHome?: string | undefined;
|
|
265
265
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
266
|
+
gradleUserHome?: string | undefined;
|
|
266
267
|
}>, z.ZodObject<{
|
|
267
268
|
kind: z.ZodLiteral<"mixin">;
|
|
268
269
|
input: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
|
|
@@ -444,19 +445,21 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
444
445
|
warningCategoryFilter: z.ZodOptional<z.ZodArray<z.ZodEnum<["mapping", "configuration", "validation", "resolution", "parse"]>, "many">>;
|
|
445
446
|
treatInfoAsWarning: z.ZodDefault<z.ZodBoolean>;
|
|
446
447
|
includeIssues: z.ZodDefault<z.ZodBoolean>;
|
|
448
|
+
reportMode: z.ZodDefault<z.ZodEnum<["compact", "full", "summary-first"]>>;
|
|
447
449
|
}, "strip", z.ZodTypeAny, {
|
|
448
|
-
minSeverity: "all" | "error" | "warning";
|
|
449
450
|
hideUncertain: boolean;
|
|
450
451
|
explain: boolean;
|
|
451
452
|
preferProjectMapping: boolean;
|
|
453
|
+
minSeverity: "all" | "error" | "warning";
|
|
454
|
+
reportMode: "full" | "summary-first" | "compact";
|
|
452
455
|
treatInfoAsWarning: boolean;
|
|
453
456
|
includeIssues: boolean;
|
|
454
|
-
task: "
|
|
457
|
+
task: "project-summary" | "mixin" | "access-transformer" | "access-widener";
|
|
455
458
|
subject: {
|
|
456
459
|
kind: "workspace";
|
|
457
460
|
projectPath: string;
|
|
458
|
-
gradleUserHome?: string | undefined;
|
|
459
461
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
462
|
+
gradleUserHome?: string | undefined;
|
|
460
463
|
} | {
|
|
461
464
|
kind: "mixin";
|
|
462
465
|
input: {
|
|
@@ -497,22 +500,22 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
497
500
|
version?: string | undefined;
|
|
498
501
|
mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
|
|
499
502
|
scope?: "vanilla" | "merged" | "loader" | undefined;
|
|
500
|
-
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
501
|
-
sourceRoots?: string[] | undefined;
|
|
502
503
|
preferProjectVersion?: boolean | undefined;
|
|
504
|
+
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
503
505
|
warningMode?: "full" | "aggregated" | undefined;
|
|
506
|
+
sourceRoots?: string[] | undefined;
|
|
504
507
|
warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
|
|
505
508
|
configPaths?: string[] | undefined;
|
|
506
|
-
|
|
507
|
-
detail?: "full" | "summary" | "standard" | undefined;
|
|
509
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
508
510
|
include?: string[] | undefined;
|
|
511
|
+
atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
|
|
509
512
|
}, {
|
|
510
|
-
task: "
|
|
513
|
+
task: "project-summary" | "mixin" | "access-transformer" | "access-widener";
|
|
511
514
|
subject: {
|
|
512
515
|
kind: "workspace";
|
|
513
516
|
projectPath: string;
|
|
514
|
-
gradleUserHome?: string | undefined;
|
|
515
517
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
518
|
+
gradleUserHome?: string | undefined;
|
|
516
519
|
} | {
|
|
517
520
|
kind: "mixin";
|
|
518
521
|
input: {
|
|
@@ -553,34 +556,36 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
553
556
|
version?: string | undefined;
|
|
554
557
|
mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
|
|
555
558
|
scope?: "vanilla" | "merged" | "loader" | undefined;
|
|
556
|
-
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
557
|
-
sourceRoots?: string[] | undefined;
|
|
558
559
|
preferProjectVersion?: boolean | undefined;
|
|
559
|
-
minSeverity?: "all" | "error" | "warning" | undefined;
|
|
560
560
|
hideUncertain?: boolean | undefined;
|
|
561
561
|
explain?: boolean | undefined;
|
|
562
|
-
warningMode?: "full" | "aggregated" | undefined;
|
|
563
562
|
preferProjectMapping?: boolean | undefined;
|
|
564
|
-
|
|
563
|
+
minSeverity?: "all" | "error" | "warning" | undefined;
|
|
564
|
+
reportMode?: "full" | "summary-first" | "compact" | undefined;
|
|
565
565
|
treatInfoAsWarning?: boolean | undefined;
|
|
566
566
|
includeIssues?: boolean | undefined;
|
|
567
|
+
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
568
|
+
warningMode?: "full" | "aggregated" | undefined;
|
|
569
|
+
sourceRoots?: string[] | undefined;
|
|
570
|
+
warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
|
|
567
571
|
configPaths?: string[] | undefined;
|
|
568
|
-
|
|
569
|
-
detail?: "full" | "summary" | "standard" | undefined;
|
|
572
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
570
573
|
include?: string[] | undefined;
|
|
574
|
+
atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
|
|
571
575
|
}>, {
|
|
572
|
-
minSeverity: "all" | "error" | "warning";
|
|
573
576
|
hideUncertain: boolean;
|
|
574
577
|
explain: boolean;
|
|
575
578
|
preferProjectMapping: boolean;
|
|
579
|
+
minSeverity: "all" | "error" | "warning";
|
|
580
|
+
reportMode: "full" | "summary-first" | "compact";
|
|
576
581
|
treatInfoAsWarning: boolean;
|
|
577
582
|
includeIssues: boolean;
|
|
578
|
-
task: "
|
|
583
|
+
task: "project-summary" | "mixin" | "access-transformer" | "access-widener";
|
|
579
584
|
subject: {
|
|
580
585
|
kind: "workspace";
|
|
581
586
|
projectPath: string;
|
|
582
|
-
gradleUserHome?: string | undefined;
|
|
583
587
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
588
|
+
gradleUserHome?: string | undefined;
|
|
584
589
|
} | {
|
|
585
590
|
kind: "mixin";
|
|
586
591
|
input: {
|
|
@@ -621,22 +626,22 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
621
626
|
version?: string | undefined;
|
|
622
627
|
mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
|
|
623
628
|
scope?: "vanilla" | "merged" | "loader" | undefined;
|
|
624
|
-
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
625
|
-
sourceRoots?: string[] | undefined;
|
|
626
629
|
preferProjectVersion?: boolean | undefined;
|
|
630
|
+
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
627
631
|
warningMode?: "full" | "aggregated" | undefined;
|
|
632
|
+
sourceRoots?: string[] | undefined;
|
|
628
633
|
warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
|
|
629
634
|
configPaths?: string[] | undefined;
|
|
630
|
-
|
|
631
|
-
detail?: "full" | "summary" | "standard" | undefined;
|
|
635
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
632
636
|
include?: string[] | undefined;
|
|
637
|
+
atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
|
|
633
638
|
}, {
|
|
634
|
-
task: "
|
|
639
|
+
task: "project-summary" | "mixin" | "access-transformer" | "access-widener";
|
|
635
640
|
subject: {
|
|
636
641
|
kind: "workspace";
|
|
637
642
|
projectPath: string;
|
|
638
|
-
gradleUserHome?: string | undefined;
|
|
639
643
|
discover?: ("mixins" | "access-wideners" | "access-transformers")[] | undefined;
|
|
644
|
+
gradleUserHome?: string | undefined;
|
|
640
645
|
} | {
|
|
641
646
|
kind: "mixin";
|
|
642
647
|
input: {
|
|
@@ -677,21 +682,22 @@ export declare const validateProjectSchema: z.ZodEffects<z.ZodObject<{
|
|
|
677
682
|
version?: string | undefined;
|
|
678
683
|
mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
|
|
679
684
|
scope?: "vanilla" | "merged" | "loader" | undefined;
|
|
680
|
-
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
681
|
-
sourceRoots?: string[] | undefined;
|
|
682
685
|
preferProjectVersion?: boolean | undefined;
|
|
683
|
-
minSeverity?: "all" | "error" | "warning" | undefined;
|
|
684
686
|
hideUncertain?: boolean | undefined;
|
|
685
687
|
explain?: boolean | undefined;
|
|
686
|
-
warningMode?: "full" | "aggregated" | undefined;
|
|
687
688
|
preferProjectMapping?: boolean | undefined;
|
|
688
|
-
|
|
689
|
+
minSeverity?: "all" | "error" | "warning" | undefined;
|
|
690
|
+
reportMode?: "full" | "summary-first" | "compact" | undefined;
|
|
689
691
|
treatInfoAsWarning?: boolean | undefined;
|
|
690
692
|
includeIssues?: boolean | undefined;
|
|
693
|
+
sourcePriority?: "loom-first" | "maven-first" | undefined;
|
|
694
|
+
warningMode?: "full" | "aggregated" | undefined;
|
|
695
|
+
sourceRoots?: string[] | undefined;
|
|
696
|
+
warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
|
|
691
697
|
configPaths?: string[] | undefined;
|
|
692
|
-
|
|
693
|
-
detail?: "full" | "summary" | "standard" | undefined;
|
|
698
|
+
detail?: "summary" | "standard" | "full" | undefined;
|
|
694
699
|
include?: string[] | undefined;
|
|
700
|
+
atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
|
|
695
701
|
}>;
|
|
696
702
|
export type ValidateProjectInput = z.infer<typeof validateProjectSchema>;
|
|
697
703
|
export type ValidateProjectExecuteOptions = {
|
|
@@ -67,7 +67,9 @@ export const validateProjectShape = {
|
|
|
67
67
|
warningMode: z.enum(["full", "aggregated"]).optional(),
|
|
68
68
|
warningCategoryFilter: z.array(z.enum(["mapping", "configuration", "validation", "resolution", "parse"])).optional(),
|
|
69
69
|
treatInfoAsWarning: z.boolean().default(true),
|
|
70
|
-
includeIssues: z.boolean().default(true)
|
|
70
|
+
includeIssues: z.boolean().default(true),
|
|
71
|
+
reportMode: z.enum(["compact", "full", "summary-first"]).default("summary-first")
|
|
72
|
+
.describe("Mixin report shape forwarded to validate-mixin. Default 'summary-first'; pass 'full' (or explain=true) for per-result resolvedMembers/toolHealth/resolutionTrace.")
|
|
71
73
|
};
|
|
72
74
|
export const validateProjectSchema = z.object(validateProjectShape).superRefine((value, ctx) => {
|
|
73
75
|
if (value.task === "project-summary" && value.subject.kind !== "workspace") {
|
|
@@ -14,6 +14,7 @@ export type VerifyMixinTargetInput = {
|
|
|
14
14
|
};
|
|
15
15
|
mixinMemberName?: string;
|
|
16
16
|
mapping?: SourceMapping;
|
|
17
|
+
autoRemap?: boolean;
|
|
17
18
|
sourcePriority?: MappingSourcePriority;
|
|
18
19
|
projectPath?: string;
|
|
19
20
|
gradleUserHome?: string;
|
|
@@ -91,6 +92,7 @@ export type VerifyMixinTargetDeps = {
|
|
|
91
92
|
artifactId: string;
|
|
92
93
|
mappingApplied: SourceMapping;
|
|
93
94
|
binaryJarPath?: string;
|
|
95
|
+
version?: string;
|
|
94
96
|
provenance?: ArtifactProvenance;
|
|
95
97
|
warnings?: string[];
|
|
96
98
|
}>;
|
|
@@ -101,11 +103,39 @@ export type VerifyMixinTargetDeps = {
|
|
|
101
103
|
includeSynthetic: boolean;
|
|
102
104
|
includeInherited: boolean;
|
|
103
105
|
}) => Promise<ExplorerSignatureOutput>;
|
|
106
|
+
/**
|
|
107
|
+
* Optional mapping translator used by autoRemap to convert owner/member names
|
|
108
|
+
* from the request namespace into the artifact namespace. When absent,
|
|
109
|
+
* autoRemap is unavailable and a namespace mismatch surfaces as an error.
|
|
110
|
+
*/
|
|
111
|
+
findMapping?: (input: {
|
|
112
|
+
version: string;
|
|
113
|
+
kind: "class" | "field" | "method";
|
|
114
|
+
name: string;
|
|
115
|
+
owner?: string;
|
|
116
|
+
descriptor?: string;
|
|
117
|
+
sourceMapping: SourceMapping;
|
|
118
|
+
targetMapping: SourceMapping;
|
|
119
|
+
}) => Promise<{
|
|
120
|
+
resolved: boolean;
|
|
121
|
+
resolvedSymbol?: {
|
|
122
|
+
name: string;
|
|
123
|
+
owner?: string;
|
|
124
|
+
descriptor?: string;
|
|
125
|
+
};
|
|
126
|
+
}>;
|
|
104
127
|
};
|
|
105
128
|
export declare class VerifyMixinTargetService {
|
|
106
129
|
private readonly deps;
|
|
107
130
|
constructor(deps: VerifyMixinTargetDeps);
|
|
108
131
|
execute(input: VerifyMixinTargetInput): Promise<VerifyMixinTargetOutput>;
|
|
132
|
+
/**
|
|
133
|
+
* Translate owner + member from the request namespace into the artifact
|
|
134
|
+
* namespace via find-mapping, so a caller looking at yarn/intermediary
|
|
135
|
+
* sources can verify against an obfuscated artifact in one call. Throws a
|
|
136
|
+
* namespace-mismatch (or invalid-input) error when translation is impossible.
|
|
137
|
+
*/
|
|
138
|
+
private applyAutoRemap;
|
|
109
139
|
}
|
|
110
140
|
export declare const verifyMixinTargetMemberSchemaExport: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
|
|
111
141
|
kind: z.ZodLiteral<"method">;
|
|
@@ -5,7 +5,7 @@ import { suggestSimilar } from "../mixin-validator.js";
|
|
|
5
5
|
export const VERIFY_MIXIN_TARGET_OFF = process.env.VERIFY_MIXIN_TARGET_OFF === "1";
|
|
6
6
|
const ACCESSOR_NAME_RE = /^(get|set|is)([A-Z]\w*)$/;
|
|
7
7
|
const INVOKER_NAME_RE = /^(invoke|call)([A-Z]\w*)$/;
|
|
8
|
-
function decodeAccessFlags(flags) {
|
|
8
|
+
function decodeAccessFlags(flags, kind) {
|
|
9
9
|
const labels = [];
|
|
10
10
|
if (flags == null) {
|
|
11
11
|
return labels;
|
|
@@ -23,9 +23,9 @@ function decodeAccessFlags(flags) {
|
|
|
23
23
|
if ((flags & 0x0020) !== 0)
|
|
24
24
|
labels.push("synchronized");
|
|
25
25
|
if ((flags & 0x0040) !== 0)
|
|
26
|
-
labels.push("volatile");
|
|
26
|
+
labels.push(kind === "method" ? "bridge" : "volatile");
|
|
27
27
|
if ((flags & 0x0080) !== 0)
|
|
28
|
-
labels.push("transient");
|
|
28
|
+
labels.push(kind === "method" ? "varargs" : "transient");
|
|
29
29
|
if ((flags & 0x0100) !== 0)
|
|
30
30
|
labels.push("native");
|
|
31
31
|
if ((flags & 0x0400) !== 0)
|
|
@@ -137,11 +137,11 @@ function deriveVisibility(accessFlags) {
|
|
|
137
137
|
return "private";
|
|
138
138
|
return "package-private";
|
|
139
139
|
}
|
|
140
|
-
function buildMatch(member) {
|
|
140
|
+
function buildMatch(member, kind) {
|
|
141
141
|
return {
|
|
142
142
|
name: member.name,
|
|
143
143
|
descriptor: member.jvmDescriptor,
|
|
144
|
-
accessFlags: decodeAccessFlags(member.accessFlags),
|
|
144
|
+
accessFlags: decodeAccessFlags(member.accessFlags, kind),
|
|
145
145
|
javaSignature: member.javaSignature,
|
|
146
146
|
...(member.sourceLine ? { sourceLine: member.sourceLine } : {})
|
|
147
147
|
};
|
|
@@ -166,14 +166,15 @@ export class VerifyMixinTargetService {
|
|
|
166
166
|
details: { fieldErrors: [{ path: "target", message: "target is required" }] }
|
|
167
167
|
});
|
|
168
168
|
}
|
|
169
|
-
|
|
169
|
+
let owner = input.owner.trim();
|
|
170
170
|
if (!owner) {
|
|
171
171
|
throw createError({
|
|
172
172
|
code: ERROR_CODES.INVALID_INPUT,
|
|
173
173
|
message: "owner must be non-empty."
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
-
|
|
176
|
+
let member = input.member;
|
|
177
|
+
let memberName = member.name.trim();
|
|
177
178
|
if (!memberName) {
|
|
178
179
|
throw createError({
|
|
179
180
|
code: ERROR_CODES.INVALID_INPUT,
|
|
@@ -192,21 +193,29 @@ export class VerifyMixinTargetService {
|
|
|
192
193
|
});
|
|
193
194
|
const warnings = [...(resolved.warnings ?? [])];
|
|
194
195
|
if (input.mapping && input.mapping !== resolved.mappingApplied) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
+ `or
|
|
208
|
-
|
|
209
|
-
|
|
196
|
+
if (input.autoRemap) {
|
|
197
|
+
const remapped = await this.applyAutoRemap(input, resolved, owner, member, warnings);
|
|
198
|
+
owner = remapped.owner;
|
|
199
|
+
member = remapped.member;
|
|
200
|
+
memberName = member.name;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
throw createError({
|
|
204
|
+
code: ERROR_CODES.NAMESPACE_MISMATCH,
|
|
205
|
+
message: `verify-mixin-target requires owner and member.name to be in the artifact's namespace `
|
|
206
|
+
+ `("${resolved.mappingApplied}"), but the request supplied mapping="${input.mapping}". `
|
|
207
|
+
+ `Set autoRemap=true to translate names automatically, supply owner+member in the artifact namespace, `
|
|
208
|
+
+ `or omit the mapping argument so the resolver picks the namespace automatically.`,
|
|
209
|
+
details: {
|
|
210
|
+
owner,
|
|
211
|
+
requestedMapping: input.mapping,
|
|
212
|
+
mappingApplied: resolved.mappingApplied,
|
|
213
|
+
artifactId: resolved.artifactId,
|
|
214
|
+
nextAction: `Retry with autoRemap=true, or with mapping="${resolved.mappingApplied}" and owner/member already in that namespace, `
|
|
215
|
+
+ `or use find-mapping to translate before calling verify-mixin-target.`
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
210
219
|
}
|
|
211
220
|
if (!resolved.binaryJarPath) {
|
|
212
221
|
throw createError({
|
|
@@ -248,29 +257,29 @@ export class VerifyMixinTargetService {
|
|
|
248
257
|
throw error;
|
|
249
258
|
}
|
|
250
259
|
warnings.push(...(signature.warnings ?? []));
|
|
251
|
-
const memberPool =
|
|
260
|
+
const memberPool = member.kind === "method"
|
|
252
261
|
? [...signature.constructors, ...signature.methods]
|
|
253
262
|
: [...signature.fields];
|
|
254
263
|
const allMemberNames = memberPool.map((m) => m.name);
|
|
255
264
|
const exactNameHits = memberPool.filter((m) => m.name === memberName);
|
|
256
265
|
let matches;
|
|
257
266
|
let candidates = [];
|
|
258
|
-
if (
|
|
259
|
-
const descriptorHits = exactNameHits.filter((m) => m.jvmDescriptor ===
|
|
267
|
+
if (member.descriptor) {
|
|
268
|
+
const descriptorHits = exactNameHits.filter((m) => m.jvmDescriptor === member.descriptor);
|
|
260
269
|
if (descriptorHits.length > 0) {
|
|
261
|
-
matches = descriptorHits.map(buildMatch);
|
|
270
|
+
matches = descriptorHits.map((m) => buildMatch(m, member.kind));
|
|
262
271
|
}
|
|
263
272
|
else {
|
|
264
273
|
matches = [];
|
|
265
274
|
candidates = exactNameHits.map((m) => ({
|
|
266
275
|
name: m.name,
|
|
267
276
|
descriptor: m.jvmDescriptor,
|
|
268
|
-
reason: `name match, descriptor ${m.jvmDescriptor} differs from requested ${
|
|
277
|
+
reason: `name match, descriptor ${m.jvmDescriptor} differs from requested ${member.descriptor}`
|
|
269
278
|
}));
|
|
270
279
|
}
|
|
271
280
|
}
|
|
272
281
|
else {
|
|
273
|
-
matches = exactNameHits.map(buildMatch);
|
|
282
|
+
matches = exactNameHits.map((m) => buildMatch(m, member.kind));
|
|
274
283
|
}
|
|
275
284
|
if (matches.length === 0 && candidates.length === 0) {
|
|
276
285
|
const suggestions = suggestSimilar(memberName, allMemberNames);
|
|
@@ -285,7 +294,7 @@ export class VerifyMixinTargetService {
|
|
|
285
294
|
const exists = matches.length > 0;
|
|
286
295
|
let accessorAdvice;
|
|
287
296
|
if (matches.length === 1) {
|
|
288
|
-
accessorAdvice = inferAnnotation(
|
|
297
|
+
accessorAdvice = inferAnnotation(member, matches[0], input.mixinMemberName);
|
|
289
298
|
}
|
|
290
299
|
return {
|
|
291
300
|
exists,
|
|
@@ -306,6 +315,88 @@ export class VerifyMixinTargetService {
|
|
|
306
315
|
}
|
|
307
316
|
};
|
|
308
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Translate owner + member from the request namespace into the artifact
|
|
320
|
+
* namespace via find-mapping, so a caller looking at yarn/intermediary
|
|
321
|
+
* sources can verify against an obfuscated artifact in one call. Throws a
|
|
322
|
+
* namespace-mismatch (or invalid-input) error when translation is impossible.
|
|
323
|
+
*/
|
|
324
|
+
async applyAutoRemap(input, resolved, owner, member, warnings) {
|
|
325
|
+
const sourceMapping = input.mapping;
|
|
326
|
+
const targetMapping = resolved.mappingApplied;
|
|
327
|
+
const mismatchDetails = {
|
|
328
|
+
owner,
|
|
329
|
+
member: member.name,
|
|
330
|
+
requestedMapping: sourceMapping,
|
|
331
|
+
mappingApplied: targetMapping,
|
|
332
|
+
artifactId: resolved.artifactId
|
|
333
|
+
};
|
|
334
|
+
if (!this.deps.findMapping) {
|
|
335
|
+
throw createError({
|
|
336
|
+
code: ERROR_CODES.NAMESPACE_MISMATCH,
|
|
337
|
+
message: `autoRemap is unavailable (no mapping translator configured); supply owner/member in the artifact namespace ("${targetMapping}").`,
|
|
338
|
+
details: mismatchDetails
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const version = resolved.version ?? (input.target?.kind === "version" ? input.target.value : undefined);
|
|
342
|
+
if (!version) {
|
|
343
|
+
throw createError({
|
|
344
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
345
|
+
message: `autoRemap needs a Minecraft version to translate names; use target.kind="version" or a workspace that resolves one.`,
|
|
346
|
+
details: mismatchDetails
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
const classResult = await this.deps.findMapping({
|
|
350
|
+
version,
|
|
351
|
+
kind: "class",
|
|
352
|
+
name: owner,
|
|
353
|
+
sourceMapping,
|
|
354
|
+
targetMapping
|
|
355
|
+
});
|
|
356
|
+
if (!classResult.resolved || !classResult.resolvedSymbol) {
|
|
357
|
+
throw createError({
|
|
358
|
+
code: ERROR_CODES.NAMESPACE_MISMATCH,
|
|
359
|
+
message: `autoRemap could not translate owner "${owner}" from ${sourceMapping} to ${targetMapping}.`,
|
|
360
|
+
details: {
|
|
361
|
+
...mismatchDetails,
|
|
362
|
+
nextAction: `Confirm "${owner}" exists in ${sourceMapping} for ${version}, or supply owner/member already in ${targetMapping}.`
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const translatedOwner = classResult.resolvedSymbol.name;
|
|
367
|
+
// Look the member up by its source-namespace owner so find-mapping can
|
|
368
|
+
// locate it, then take the translated name/descriptor.
|
|
369
|
+
const memberResult = await this.deps.findMapping({
|
|
370
|
+
version,
|
|
371
|
+
kind: member.kind,
|
|
372
|
+
name: member.name,
|
|
373
|
+
owner,
|
|
374
|
+
descriptor: member.descriptor,
|
|
375
|
+
sourceMapping,
|
|
376
|
+
targetMapping
|
|
377
|
+
});
|
|
378
|
+
if (!memberResult.resolved || !memberResult.resolvedSymbol) {
|
|
379
|
+
throw createError({
|
|
380
|
+
code: ERROR_CODES.NAMESPACE_MISMATCH,
|
|
381
|
+
message: `autoRemap could not translate ${member.kind} "${member.name}" of "${owner}" from ${sourceMapping} to ${targetMapping}.`,
|
|
382
|
+
details: mismatchDetails
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// Use the translated (target-namespace) descriptor only. Never fall back to
|
|
386
|
+
// the request descriptor: it is still in the source namespace and would
|
|
387
|
+
// never match the artifact's jvmDescriptor, turning a real member into a
|
|
388
|
+
// false exists=false. When no descriptor could be translated, match by name.
|
|
389
|
+
const translatedDescriptor = memberResult.resolvedSymbol.descriptor;
|
|
390
|
+
if (member.descriptor && !translatedDescriptor) {
|
|
391
|
+
warnings.push(`autoRemap could not translate the descriptor for ${member.kind} "${member.name}" into ${targetMapping}; matching by name only.`);
|
|
392
|
+
}
|
|
393
|
+
const translatedMember = (member.kind === "method"
|
|
394
|
+
? { kind: "method", name: memberResult.resolvedSymbol.name, ...(translatedDescriptor ? { descriptor: translatedDescriptor } : {}) }
|
|
395
|
+
: { kind: "field", name: memberResult.resolvedSymbol.name, ...(translatedDescriptor ? { descriptor: translatedDescriptor } : {}) });
|
|
396
|
+
warnings.push(`autoRemap translated the target from ${sourceMapping} to ${targetMapping} (artifact namespace): `
|
|
397
|
+
+ `${owner}#${member.name} -> ${translatedOwner}#${translatedMember.name}.`);
|
|
398
|
+
return { owner: translatedOwner, member: translatedMember };
|
|
399
|
+
}
|
|
309
400
|
}
|
|
310
401
|
const memberDescriptorSchema = z.string().trim().min(1).optional();
|
|
311
402
|
const verifyMixinTargetMemberSchema = z.discriminatedUnion("kind", [
|