@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.
Files changed (144) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +5 -4
  3. package/dist/access-transformer-parser.d.ts +2 -1
  4. package/dist/access-transformer-parser.js +10 -1
  5. package/dist/access-widener-parser.d.ts +1 -0
  6. package/dist/access-widener-parser.js +6 -3
  7. package/dist/build-suggested-call.js +31 -10
  8. package/dist/cache-registry.d.ts +8 -0
  9. package/dist/cache-registry.js +50 -32
  10. package/dist/config.d.ts +1 -0
  11. package/dist/config.js +4 -0
  12. package/dist/decompiler/vineflower.js +8 -2
  13. package/dist/entry-tools/analyze-mod-service.d.ts +24 -24
  14. package/dist/entry-tools/analyze-mod-service.js +2 -1
  15. package/dist/entry-tools/analyze-symbol-service.d.ts +57 -22
  16. package/dist/entry-tools/analyze-symbol-service.js +139 -34
  17. package/dist/entry-tools/batch-class-members-service.d.ts +3 -1
  18. package/dist/entry-tools/batch-class-members-service.js +6 -6
  19. package/dist/entry-tools/batch-class-source-service.d.ts +3 -1
  20. package/dist/entry-tools/batch-class-source-service.js +5 -6
  21. package/dist/entry-tools/batch-mappings-service.d.ts +3 -1
  22. package/dist/entry-tools/batch-mappings-service.js +4 -5
  23. package/dist/entry-tools/batch-symbol-exists-service.d.ts +3 -1
  24. package/dist/entry-tools/batch-symbol-exists-service.js +4 -5
  25. package/dist/entry-tools/compare-minecraft-service.d.ts +10 -10
  26. package/dist/entry-tools/compare-minecraft-service.js +1 -1
  27. package/dist/entry-tools/entry-tool-schema.d.ts +1 -1
  28. package/dist/entry-tools/inspect-minecraft/handlers/artifact.js +1 -3
  29. package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +4 -3
  30. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +0 -5
  31. package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +0 -1
  32. package/dist/entry-tools/inspect-minecraft/handlers/file.js +26 -2
  33. package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +0 -1
  34. package/dist/entry-tools/inspect-minecraft/handlers/search.d.ts +8 -0
  35. package/dist/entry-tools/inspect-minecraft/handlers/search.js +13 -2
  36. package/dist/entry-tools/inspect-minecraft/handlers/versions.d.ts +1 -1
  37. package/dist/entry-tools/inspect-minecraft/handlers/versions.js +3 -2
  38. package/dist/entry-tools/inspect-minecraft/internal.d.ts +90 -89
  39. package/dist/entry-tools/inspect-minecraft/internal.js +32 -14
  40. package/dist/entry-tools/inspect-minecraft-service.d.ts +218 -218
  41. package/dist/entry-tools/inspect-minecraft-service.js +1 -1
  42. package/dist/entry-tools/manage-cache-service.d.ts +4 -4
  43. package/dist/entry-tools/response-contract.d.ts +3 -1
  44. package/dist/entry-tools/response-contract.js +3 -2
  45. package/dist/entry-tools/validate-project/cases/mixin.js +2 -1
  46. package/dist/entry-tools/validate-project/cases/project-summary.js +5 -3
  47. package/dist/entry-tools/validate-project-service.d.ts +42 -36
  48. package/dist/entry-tools/validate-project-service.js +3 -1
  49. package/dist/entry-tools/verify-mixin-target-service.d.ts +30 -0
  50. package/dist/entry-tools/verify-mixin-target-service.js +120 -29
  51. package/dist/error-mapping.d.ts +51 -0
  52. package/dist/error-mapping.js +157 -2
  53. package/dist/index.js +147 -76
  54. package/dist/java-process.js +1 -1
  55. package/dist/json-rpc-framing.d.ts +4 -0
  56. package/dist/json-rpc-framing.js +23 -1
  57. package/dist/mapping/internal-types.d.ts +24 -0
  58. package/dist/mapping/loaders/tiny-maven.js +46 -20
  59. package/dist/mapping/lookup.d.ts +13 -2
  60. package/dist/mapping/lookup.js +60 -2
  61. package/dist/mapping/types.d.ts +6 -0
  62. package/dist/mapping-service.d.ts +26 -2
  63. package/dist/mapping-service.js +212 -55
  64. package/dist/mcp-helpers.d.ts +1 -0
  65. package/dist/mcp-helpers.js +25 -3
  66. package/dist/minecraft-explorer-service.js +24 -11
  67. package/dist/mixin/access-validators.js +33 -1
  68. package/dist/mixin/annotation-validators.js +73 -9
  69. package/dist/mixin/parsed-validator.js +3 -2
  70. package/dist/mixin-parser.js +119 -7
  71. package/dist/mod-decompile-service.d.ts +2 -0
  72. package/dist/mod-decompile-service.js +21 -3
  73. package/dist/mod-remap-service.d.ts +20 -1
  74. package/dist/mod-remap-service.js +101 -45
  75. package/dist/mojang-tiny-mapping-service.js +5 -2
  76. package/dist/nbt/java-nbt-codec.js +46 -16
  77. package/dist/nbt/json-patch.js +51 -12
  78. package/dist/nbt/typed-json.d.ts +1 -0
  79. package/dist/nbt/typed-json.js +12 -2
  80. package/dist/nbt/types.d.ts +2 -2
  81. package/dist/observability.d.ts +6 -0
  82. package/dist/observability.js +10 -0
  83. package/dist/page-cursor.d.ts +17 -0
  84. package/dist/page-cursor.js +0 -0
  85. package/dist/path-converter.js +10 -3
  86. package/dist/registry-service.d.ts +2 -0
  87. package/dist/registry-service.js +41 -2
  88. package/dist/repo-downloader.js +4 -3
  89. package/dist/resources.js +45 -9
  90. package/dist/response-utils.d.ts +29 -4
  91. package/dist/response-utils.js +95 -5
  92. package/dist/source/access-validate.js +12 -2
  93. package/dist/source/artifact-resolver.js +2 -2
  94. package/dist/source/class-source/members-builder.d.ts +44 -1
  95. package/dist/source/class-source/members-builder.js +51 -4
  96. package/dist/source/class-source/snippet-builder.d.ts +13 -0
  97. package/dist/source/class-source/snippet-builder.js +54 -4
  98. package/dist/source/class-source-helpers.d.ts +4 -4
  99. package/dist/source/class-source-helpers.js +77 -20
  100. package/dist/source/class-source.d.ts +19 -0
  101. package/dist/source/class-source.js +144 -40
  102. package/dist/source/file-access.js +3 -2
  103. package/dist/source/indexer.js +29 -9
  104. package/dist/source/lifecycle/mapping-helpers.js +28 -3
  105. package/dist/source/lifecycle/runtime-check.js +20 -6
  106. package/dist/source/search.d.ts +1 -1
  107. package/dist/source/search.js +117 -30
  108. package/dist/source/validate-mixin/pipeline/resolve.js +23 -3
  109. package/dist/source/validate-mixin.d.ts +2 -1
  110. package/dist/source/validate-mixin.js +45 -4
  111. package/dist/source/workspace-target.js +17 -10
  112. package/dist/source-jar-reader.d.ts +54 -1
  113. package/dist/source-jar-reader.js +121 -10
  114. package/dist/source-resolver.js +2 -2
  115. package/dist/source-service.d.ts +28 -7
  116. package/dist/source-service.js +9 -1
  117. package/dist/stdio-supervisor.d.ts +2 -2
  118. package/dist/stdio-supervisor.js +29 -9
  119. package/dist/storage/db.js +24 -1
  120. package/dist/storage/files-repo.d.ts +15 -0
  121. package/dist/storage/files-repo.js +67 -37
  122. package/dist/storage/symbols-repo.d.ts +15 -0
  123. package/dist/storage/symbols-repo.js +53 -19
  124. package/dist/symbols/symbol-extractor.js +35 -6
  125. package/dist/text-truncate.d.ts +7 -0
  126. package/dist/text-truncate.js +21 -0
  127. package/dist/tiny-remapper-resolver.js +10 -0
  128. package/dist/tool-contract-manifest.js +2 -2
  129. package/dist/tool-execution-gate.js +12 -1
  130. package/dist/tool-guidance.d.ts +6 -2
  131. package/dist/tool-guidance.js +63 -13
  132. package/dist/tool-schemas.d.ts +561 -496
  133. package/dist/tool-schemas.js +175 -139
  134. package/dist/types.d.ts +1 -0
  135. package/dist/version-diff-service.js +5 -0
  136. package/dist/version-service.d.ts +3 -0
  137. package/dist/version-service.js +18 -2
  138. package/dist/warning-details.d.ts +30 -0
  139. package/dist/warning-details.js +80 -0
  140. package/dist/workspace-mapping-service.js +9 -0
  141. package/docs/README-ja.md +2 -2
  142. package/docs/examples.md +26 -2
  143. package/docs/tool-reference.md +22 -17
  144. 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: "list" | "summary" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
85
+ action: "summary" | "list" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
86
86
  cursor?: string | undefined;
87
- detail?: "full" | "summary" | "standard" | undefined;
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: "list" | "summary" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
102
+ action: "summary" | "list" | "inspect" | "verify" | "delete" | "prune" | "rebuild";
103
103
  limit?: number | undefined;
104
104
  cursor?: string | undefined;
105
- detail?: "full" | "summary" | "standard" | undefined;
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: [...(input.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: "mixin" | "project-summary" | "access-widener" | "access-transformer";
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
- atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
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: "mixin" | "project-summary" | "access-widener" | "access-transformer";
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
- warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
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
- atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
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: "mixin" | "project-summary" | "access-widener" | "access-transformer";
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
- atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
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: "mixin" | "project-summary" | "access-widener" | "access-transformer";
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
- warningCategoryFilter?: ("mapping" | "parse" | "validation" | "configuration" | "resolution")[] | undefined;
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
- atNamespace?: "obfuscated" | "mojang" | "srg" | undefined;
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
- const owner = input.owner.trim();
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
- const memberName = input.member.name.trim();
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
- throw createError({
196
- code: ERROR_CODES.NAMESPACE_MISMATCH,
197
- message: `verify-mixin-target requires owner and member.name to be in the artifact's namespace `
198
- + `("${resolved.mappingApplied}"), but the request supplied mapping="${input.mapping}". `
199
- + `Automatic name/descriptor translation is not yet supported; supply owner+member in the artifact namespace, `
200
- + `or omit the mapping argument so the resolver picks the namespace automatically.`,
201
- details: {
202
- owner,
203
- requestedMapping: input.mapping,
204
- mappingApplied: resolved.mappingApplied,
205
- artifactId: resolved.artifactId,
206
- nextAction: `Retry with mapping="${resolved.mappingApplied}" and owner/member translated to that namespace, `
207
- + `or use find-mapping to translate before calling verify-mixin-target.`
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 = input.member.kind === "method"
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 (input.member.descriptor) {
259
- const descriptorHits = exactNameHits.filter((m) => m.jvmDescriptor === input.member.descriptor);
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 ${input.member.descriptor}`
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(input.member, matches[0], input.mixinMemberName);
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", [