@adhisang/minecraft-modding-mcp 4.2.1 → 5.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 +33 -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/build-suggested-call.js +31 -10
- package/dist/cache-registry.d.ts +8 -0
- package/dist/cache-registry.js +15 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +4 -0
- package/dist/entry-tools/analyze-mod-service.d.ts +24 -24
- package/dist/entry-tools/analyze-symbol-service.d.ts +57 -22
- package/dist/entry-tools/analyze-symbol-service.js +124 -28
- 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/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 +2 -2
- 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 +0 -1
- 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 +1 -1
- package/dist/entry-tools/inspect-minecraft/internal.d.ts +90 -89
- package/dist/entry-tools/inspect-minecraft/internal.js +30 -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 +1 -1
- package/dist/entry-tools/response-contract.js +1 -0
- 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 +113 -22
- package/dist/error-mapping.d.ts +51 -0
- package/dist/error-mapping.js +157 -2
- package/dist/index.js +138 -71
- package/dist/mapping/internal-types.d.ts +7 -0
- package/dist/mapping/lookup.d.ts +1 -1
- package/dist/mapping/lookup.js +7 -1
- package/dist/mapping/types.d.ts +6 -0
- package/dist/mapping-service.d.ts +26 -2
- package/dist/mapping-service.js +178 -36
- 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 +53 -7
- package/dist/mixin/parsed-validator.js +2 -2
- package/dist/mixin-parser.js +48 -4
- package/dist/mod-decompile-service.js +2 -1
- package/dist/mod-remap-service.d.ts +20 -1
- package/dist/mod-remap-service.js +95 -40
- package/dist/nbt/java-nbt-codec.js +6 -0
- 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/registry-service.js +25 -1
- 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 +1 -1
- 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 +48 -4
- package/dist/source/class-source-helpers.js +67 -11
- package/dist/source/class-source.js +97 -20
- package/dist/source/indexer.js +5 -2
- package/dist/source/search.d.ts +1 -1
- package/dist/source/search.js +94 -22
- package/dist/source/validate-mixin.d.ts +2 -1
- package/dist/source/validate-mixin.js +45 -4
- package/dist/source/workspace-target.js +15 -9
- package/dist/source-jar-reader.d.ts +54 -1
- package/dist/source-jar-reader.js +121 -10
- package/dist/source-service.d.ts +28 -7
- package/dist/storage/files-repo.d.ts +12 -0
- package/dist/storage/files-repo.js +24 -0
- package/dist/storage/symbols-repo.d.ts +6 -0
- package/dist/storage/symbols-repo.js +6 -0
- 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 +4 -1
- package/dist/tool-guidance.js +37 -12
- package/dist/tool-schemas.d.ts +559 -494
- package/dist/tool-schemas.js +99 -63
- 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 +18 -0
- package/dist/warning-details.js +63 -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 = {
|
|
@@ -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-widener" | "access-transformer";
|
|
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-widener" | "access-transformer";
|
|
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-widener" | "access-transformer";
|
|
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-widener" | "access-transformer";
|
|
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">;
|
|
@@ -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,15 +257,15 @@ 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
270
|
matches = descriptorHits.map(buildMatch);
|
|
262
271
|
}
|
|
@@ -265,7 +274,7 @@ export class VerifyMixinTargetService {
|
|
|
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
|
}
|
|
@@ -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", [
|
package/dist/error-mapping.d.ts
CHANGED
|
@@ -13,6 +13,31 @@ export type ExampleCall = {
|
|
|
13
13
|
params: Record<string, unknown>;
|
|
14
14
|
reason: string;
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Whether retrying the same call can help, and why if not:
|
|
18
|
+
* - `transient`: a temporary failure (network, rate limit, timeout); retrying
|
|
19
|
+
* the same call later may succeed.
|
|
20
|
+
* - `permanent`: the requested thing does not exist or cannot be produced;
|
|
21
|
+
* retrying the same call will keep failing.
|
|
22
|
+
* - `server`: a non-recoverable internal server fault (programming bug, DB
|
|
23
|
+
* corruption); retrying the identical call cannot help. Distinct from
|
|
24
|
+
* `permanent`, which is about an absent/unproducible target rather than a
|
|
25
|
+
* server defect. Treat like `permanent` for retry posture (do not retry).
|
|
26
|
+
* - `environment`: the server lacks a capability (Java, decompiler, remapper);
|
|
27
|
+
* retrying will not help until the environment is fixed.
|
|
28
|
+
* - `input`: the caller's input is wrong; fix the input, then retry.
|
|
29
|
+
*/
|
|
30
|
+
export type RetryClass = "transient" | "permanent" | "server" | "environment" | "input";
|
|
31
|
+
/**
|
|
32
|
+
* Where the failure originates, so an agent knows whether to fix its own
|
|
33
|
+
* request or stop retrying this tool:
|
|
34
|
+
* - `code_issue`: the caller's input is wrong or names something that does not
|
|
35
|
+
* exist; fix the request.
|
|
36
|
+
* - `tool_issue`: the tool could not produce a result for valid input (mapping
|
|
37
|
+
* gap, upstream fetch, internal limit).
|
|
38
|
+
* - `environment`: a server capability is missing (Java, decompiler, remapper).
|
|
39
|
+
*/
|
|
40
|
+
export type IssueOrigin = "code_issue" | "tool_issue" | "environment";
|
|
16
41
|
export type ProblemDetails = {
|
|
17
42
|
type: string;
|
|
18
43
|
title: string;
|
|
@@ -20,13 +45,39 @@ export type ProblemDetails = {
|
|
|
20
45
|
status: number;
|
|
21
46
|
code: string;
|
|
22
47
|
instance: string;
|
|
48
|
+
retryClass: RetryClass;
|
|
49
|
+
issueOrigin: IssueOrigin;
|
|
23
50
|
fieldErrors?: ProblemFieldError[];
|
|
24
51
|
hints?: string[];
|
|
25
52
|
suggestedCall?: SuggestedCall;
|
|
26
53
|
exampleCalls?: ExampleCall[];
|
|
27
54
|
failedStage?: string;
|
|
55
|
+
context?: Record<string, string | number | boolean>;
|
|
28
56
|
};
|
|
29
57
|
export declare function statusForErrorCode(code: string): number;
|
|
58
|
+
/**
|
|
59
|
+
* Single source of truth mapping an error code to its {@link RetryClass}. Used
|
|
60
|
+
* by every public problem builder so callers can branch on recovery strategy
|
|
61
|
+
* without parsing prose. Non-recoverable server faults (`ERR_INTERNAL`,
|
|
62
|
+
* `ERR_DB_FAILURE`) classify as `server`. Codes not explicitly classified
|
|
63
|
+
* (genuinely-transient failures such as `ERR_REPO_FETCH_FAILED` and unknown
|
|
64
|
+
* codes) default to `transient`: a temporary failure where one retry is
|
|
65
|
+
* reasonable.
|
|
66
|
+
*/
|
|
67
|
+
export declare function retryClassForErrorCode(code: string): RetryClass;
|
|
68
|
+
/**
|
|
69
|
+
* Single source of truth mapping an error code to its {@link IssueOrigin}.
|
|
70
|
+
* Environment failures reuse the retry classifier; the input-family above is
|
|
71
|
+
* `code_issue`; everything else is a `tool_issue` (valid input the tool could
|
|
72
|
+
* not satisfy).
|
|
73
|
+
*/
|
|
74
|
+
export declare function issueOriginForErrorCode(code: string): IssueOrigin;
|
|
75
|
+
/**
|
|
76
|
+
* Pick the allowlisted, primitive-valued fields out of an AppError's `details`
|
|
77
|
+
* so the public envelope can carry structured repair context without leaking
|
|
78
|
+
* paths, parser internals, or other sensitive data.
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractAllowlistedContext(details: unknown): Record<string, string | number | boolean> | undefined;
|
|
30
81
|
/**
|
|
31
82
|
* Per-entry subset of `mapErrorToProblem` for batch tools. ZodErrors are not
|
|
32
83
|
* handled here (per-entry input has already cleared the batch tool's schema
|