@adhisang/minecraft-modding-mcp 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +21 -2
  2. package/README.md +9 -2
  3. package/dist/entry-tools/analyze-symbol-service.d.ts +12 -0
  4. package/dist/entry-tools/analyze-symbol-service.js +7 -0
  5. package/dist/entry-tools/batch-class-members-service.d.ts +1 -0
  6. package/dist/entry-tools/batch-class-members-service.js +2 -0
  7. package/dist/entry-tools/batch-class-source-service.d.ts +1 -0
  8. package/dist/entry-tools/batch-class-source-service.js +2 -0
  9. package/dist/entry-tools/batch-mappings-service.d.ts +1 -0
  10. package/dist/entry-tools/batch-mappings-service.js +1 -0
  11. package/dist/entry-tools/batch-symbol-exists-service.d.ts +1 -0
  12. package/dist/entry-tools/batch-symbol-exists-service.js +2 -0
  13. package/dist/entry-tools/compare-minecraft-service.d.ts +9 -0
  14. package/dist/entry-tools/compare-minecraft-service.js +3 -1
  15. package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +1 -0
  16. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +3 -1
  17. package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +1 -0
  18. package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +1 -0
  19. package/dist/entry-tools/inspect-minecraft/handlers/search.js +2 -1
  20. package/dist/entry-tools/inspect-minecraft/internal.d.ts +17 -0
  21. package/dist/entry-tools/inspect-minecraft/internal.js +10 -0
  22. package/dist/entry-tools/inspect-minecraft-service.d.ts +40 -0
  23. package/dist/entry-tools/validate-project/cases/project-summary.d.ts +6 -1
  24. package/dist/entry-tools/validate-project/cases/project-summary.js +83 -9
  25. package/dist/entry-tools/validate-project/internal.d.ts +29 -18
  26. package/dist/entry-tools/validate-project/internal.js +37 -19
  27. package/dist/entry-tools/validate-project-service.d.ts +15 -1
  28. package/dist/entry-tools/validate-project-service.js +3 -2
  29. package/dist/entry-tools/verify-mixin-target-service.d.ts +2 -0
  30. package/dist/entry-tools/verify-mixin-target-service.js +1 -0
  31. package/dist/gradle-paths.d.ts +8 -3
  32. package/dist/gradle-paths.js +34 -5
  33. package/dist/index.js +29 -9
  34. package/dist/mapping/loaders/tiny-loom.d.ts +1 -1
  35. package/dist/mapping/loaders/tiny-loom.js +5 -2
  36. package/dist/mapping/types.d.ts +5 -0
  37. package/dist/mapping-service.d.ts +6 -1
  38. package/dist/mapping-service.js +26 -18
  39. package/dist/mixin-validator.d.ts +1 -1
  40. package/dist/mixin-validator.js +1 -1
  41. package/dist/source/access-validate.js +12 -8
  42. package/dist/source/artifact-resolver.d.ts +7 -1
  43. package/dist/source/artifact-resolver.js +120 -7
  44. package/dist/source/class-source/members-builder.d.ts +1 -0
  45. package/dist/source/class-source/members-builder.js +1 -1
  46. package/dist/source/class-source.d.ts +1 -0
  47. package/dist/source/class-source.js +9 -1
  48. package/dist/source/indexer.js +17 -0
  49. package/dist/source/lifecycle/diff.js +6 -6
  50. package/dist/source/lifecycle/mapping-helpers.d.ts +3 -3
  51. package/dist/source/lifecycle/mapping-helpers.js +17 -9
  52. package/dist/source/lifecycle/trace.js +2 -2
  53. package/dist/source/search.js +1 -0
  54. package/dist/source/state.d.ts +5 -0
  55. package/dist/source/state.js +5 -0
  56. package/dist/source/symbol-resolver.js +4 -1
  57. package/dist/source/validate-mixin/pipeline/mapping-health.js +2 -1
  58. package/dist/source/validate-mixin/pipeline/resolve.js +1 -0
  59. package/dist/source/validate-mixin/pipeline/target-lookup.js +12 -7
  60. package/dist/source-resolver.d.ts +1 -0
  61. package/dist/source-resolver.js +1 -1
  62. package/dist/source-service.d.ts +35 -1
  63. package/dist/source-service.js +5 -2
  64. package/dist/tool-contract-manifest.d.ts +1 -1
  65. package/dist/tool-contract-manifest.js +2 -2
  66. package/dist/tool-schemas.d.ts +91 -0
  67. package/dist/tool-schemas.js +20 -0
  68. package/docs/README-ja.md +4 -2
  69. package/docs/tool-reference.md +13 -7
  70. package/package.json +15 -3
package/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project aims to follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.2.0] - 2026-05-17
9
+
10
+ ### Added
11
+ - Cache-backed source, mapping, validation, batch, and workflow tools now accept `gradleUserHome` so callers can use Loom caches from a non-default Gradle User Home instead of the MCP process default.
12
+
13
+ ## [4.1.1] - 2026-05-10
14
+
15
+ ### Documentation
16
+ - `package.json` `description` and `keywords` now mirror the GitHub repository's `description` and topics. `description` summarizes the actual feature surface (source inspection, Mojang/Yarn/Intermediary mappings, version diffs, Fabric/Forge/NeoForge mod JAR analysis, Mixin/Access Widener/Access Transformer validation); `keywords` expands from three entries to the published 15-topic set.
17
+
18
+ ### Fixed
19
+ - Concurrent class source/member lookups in the same MCP server process now share one in-flight source indexing/decompile rebuild for the same binary fallback artifact.
20
+ - `validate-project task="project-summary"` no longer performs heavyweight source indexing for its `minecraft.artifact.resolved` task probe. The probe now uses lightweight artifact metadata while preserving the public `tasks` response shape.
21
+ - `validate-mixin` mapping-health checks no longer load the full Tiny mapping graph for `obfuscated` or `mojang` requests, preventing `validate-project task="project-summary"` worker restarts on large Mojang-mapped workspaces.
22
+ - `validate-project task="project-summary"` task report no longer marks executed validators as `skipped` when the lightweight `minecraft.artifact.resolved` probe fails. Mixin / access-widener / access-transformer entries now reflect their real outcome (`ok` with `counts`, or `error`).
23
+ - `validate-mixin` `toolHealth.tinyMappingsAvailable` now means "Tiny is sufficient for the request": `true` when Tiny is not required (`obfuscated` / `mojang`) or is loaded, `false` only when `intermediary` / `yarn` was requested and Tiny is unavailable. `confidenceScore` is no longer penalized when Tiny is intentionally skipped, including on graph-load failure.
24
+ - `validate-project task="project-summary"` lightweight artifact probe defaults omitted `scope` to `"vanilla"` to match `validate-mixin`'s resolve stage, skipping workspace-wide source-jar discovery unless the caller explicitly requests `scope="merged"` or `scope="loader"`.
25
+ - `validate-project task="project-summary"` stage notifications are now best-effort. Telemetry/transport failures no longer abort the summary, count as validation errors, hide nested `validate-mixin` work behind zero-count summaries, or surface as `ERR_ARTIFACT_PROBE_FAILED` in `tasks["minecraft.artifact.resolved"]`.
26
+
8
27
  ## [4.1.0] - 2026-05-09
9
28
 
10
29
  ### Documentation
@@ -146,8 +165,8 @@ and this project aims to follow [Semantic Versioning](https://semver.org/spec/v2
146
165
  ## [3.0.0] - 2026-03-09
147
166
 
148
167
  ### Added
149
- - v3 entry tools: `inspect-minecraft`, `analyze-symbol`, `compare-minecraft`, `analyze-mod`, `validate-project`, and `manage-cache` now provide summary-first starting points for the main Minecraft, symbol, mod, validation, and cache workflows while keeping expert tools available for follow-up work.
150
- - The new v3 entry tools share `detail` / `include` response shaping and always return `result.summary` inside the standard `{ result?, error?, meta }` envelope, reducing default payload size and making next actions explicit.
168
+ - Top-level workflow tools: `inspect-minecraft`, `analyze-symbol`, `compare-minecraft`, `analyze-mod`, `validate-project`, and `manage-cache` now provide summary-first starting points for the main Minecraft, symbol, mod, validation, and cache workflows while keeping expert tools available for follow-up work.
169
+ - The new top-level workflow tools share `detail` / `include` response shaping and always return `result.summary` inside the standard `{ result?, error?, meta }` envelope, reducing default payload size and making next actions explicit.
151
170
  - `analyze-mod` now exposes `executionMode="preview" | "apply"` for safe remap planning and execution, and `manage-cache` now exposes the same preview/apply model for cache deletion, pruning, and rebuild workflows.
152
171
 
153
172
  ### Fixed
package/README.md CHANGED
@@ -134,6 +134,8 @@ Pass environment variables to override defaults:
134
134
  }
135
135
  ```
136
136
 
137
+ When a build used a non-default Gradle User Home, pass `gradleUserHome` on cache-backed source, mapping, validation, and workflow calls. The server treats it as a per-call Gradle User Home and searches `<gradleUserHome>/loom-cache` and `<gradleUserHome>/caches/fabric-loom` before the MCP process default. It does not accept arbitrary Loom cache directories.
138
+
137
139
  ## Start Here
138
140
 
139
141
  These six top-level workflow tools cover the common paths and return summary-first results. They are the best default starting points for agents and MCP clients.
@@ -159,6 +161,9 @@ These notes cover high-frequency decisions during onboarding. For the full pitfa
159
161
  - For unobfuscated releases such as `26.1+`, `check-symbol-exists` and `analyze-symbol task="exists"` validate `mojang` lookups against runtime bytecode when no mapping graph exists, and return `mapping_unavailable` when the runtime JAR itself is unreachable.
160
162
  - `analyze-mod` and `validate-project` require structured `subject` objects and canonical `include` groups; stale string-subject or domain-include payloads return `ERR_INVALID_INPUT` with a retryable `suggestedCall`.
161
163
  - `validate-project task="project-summary"` propagates `preferProjectVersion=true` across discovered Mixin, Access Widener, and Access Transformer checks. If no version can be resolved from the request or `gradle.properties`, the summary returns recovery guidance instead of guessing.
164
+ - `validate-mixin` and `validate-project` keep `mapping-health` lightweight for `obfuscated` and `mojang` validation, avoiding full Tiny mapping graph loads unless `intermediary` or `yarn` namespaces are requested.
165
+ - `validate-project task="project-summary"` uses a lightweight artifact probe for `tasks["minecraft.artifact.resolved"]`; it does not decompile Minecraft or rebuild the source index just to report per-probe status. Set `VALIDATE_PROJECT_TASKS_OFF=1` to omit the additive `tasks` field.
166
+ - If a workspace was built with `GRADLE_USER_HOME=/tmp/...` or another isolated Gradle home, pass that path as `gradleUserHome` so source, mapping, runtime, and project validation lookups use the same Loom cache instead of stale caches under the MCP process home.
162
167
 
163
168
  ### Inspect Minecraft source from a version
164
169
 
@@ -249,7 +254,7 @@ Start with these top-level workflow tools unless you already know the exact spec
249
254
 
250
255
  ### Top-Level Workflow Tools
251
256
 
252
- <!-- BEGIN GENERATED TOOL TABLE: v3-entry-tools -->
257
+ <!-- BEGIN GENERATED TOOL TABLE: top-level-workflow-tools -->
253
258
  | Tool | Purpose |
254
259
  | --- | --- |
255
260
  | `inspect-minecraft` | Inspect versions, artifacts, classes, files, source text, and workspace-aware lookup flows |
@@ -258,7 +263,7 @@ Start with these top-level workflow tools unless you already know the exact spec
258
263
  | `analyze-mod` | Summarize mod metadata, decompile and search mod code, inspect class source, and preview or apply remaps |
259
264
  | `validate-project` | Summarize workspaces and run direct Mixin, Access Widener, or Access Transformer validation |
260
265
  | `manage-cache` | List, verify, and preview or apply cache cleanup and rebuild operations |
261
- <!-- END GENERATED TOOL TABLE: v3-entry-tools -->
266
+ <!-- END GENERATED TOOL TABLE: top-level-workflow-tools -->
262
267
 
263
268
  ### Source Exploration
264
269
 
@@ -362,6 +367,8 @@ Tools for querying generated registry data and inspecting server runtime state.
362
367
 
363
368
  Tools that share one resolved artifact or Minecraft version across a fixed shortlist. Results include one status per item plus an aggregate `summary`. See [Batch lookup contract](docs/tool-reference.md#batch-lookup-contract) for failure handling and retry mapping.
364
369
 
370
+ Within one MCP server process, batch class lookups that need the same binary fallback share one in-flight source indexing/decompile rebuild for that artifact.
371
+
365
372
  <!-- BEGIN GENERATED TOOL TABLE: batch-lookup -->
366
373
  | Tool | Purpose |
367
374
  | --- | --- |
@@ -23,6 +23,7 @@ export declare const analyzeSymbolShape: {
23
23
  targetMapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
24
24
  classNameMapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
25
25
  projectPath: z.ZodOptional<z.ZodString>;
26
+ gradleUserHome: z.ZodOptional<z.ZodString>;
26
27
  signatureMode: z.ZodDefault<z.ZodEnum<["exact", "name-only"]>>;
27
28
  nameMode: z.ZodDefault<z.ZodEnum<["fqcn", "auto"]>>;
28
29
  includeKinds: z.ZodOptional<z.ZodArray<z.ZodEnum<["class", "field", "method"]>, "many">>;
@@ -54,6 +55,7 @@ export declare const analyzeSymbolSchema: z.ZodEffects<z.ZodObject<{
54
55
  targetMapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
55
56
  classNameMapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
56
57
  projectPath: z.ZodOptional<z.ZodString>;
58
+ gradleUserHome: z.ZodOptional<z.ZodString>;
57
59
  signatureMode: z.ZodDefault<z.ZodEnum<["exact", "name-only"]>>;
58
60
  nameMode: z.ZodDefault<z.ZodEnum<["fqcn", "auto"]>>;
59
61
  includeKinds: z.ZodOptional<z.ZodArray<z.ZodEnum<["class", "field", "method"]>, "many">>;
@@ -77,6 +79,7 @@ export declare const analyzeSymbolSchema: z.ZodEffects<z.ZodObject<{
77
79
  sourceMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
78
80
  targetMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
79
81
  classNameMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
82
+ gradleUserHome?: string | undefined;
80
83
  detail?: "full" | "summary" | "standard" | undefined;
81
84
  include?: string[] | undefined;
82
85
  includeKinds?: ("class" | "field" | "method")[] | undefined;
@@ -94,6 +97,7 @@ export declare const analyzeSymbolSchema: z.ZodEffects<z.ZodObject<{
94
97
  sourceMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
95
98
  targetMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
96
99
  classNameMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
100
+ gradleUserHome?: string | undefined;
97
101
  nameMode?: "auto" | "fqcn" | undefined;
98
102
  detail?: "full" | "summary" | "standard" | undefined;
99
103
  include?: string[] | undefined;
@@ -117,6 +121,7 @@ export declare const analyzeSymbolSchema: z.ZodEffects<z.ZodObject<{
117
121
  sourceMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
118
122
  targetMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
119
123
  classNameMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
124
+ gradleUserHome?: string | undefined;
120
125
  detail?: "full" | "summary" | "standard" | undefined;
121
126
  include?: string[] | undefined;
122
127
  includeKinds?: ("class" | "field" | "method")[] | undefined;
@@ -134,6 +139,7 @@ export declare const analyzeSymbolSchema: z.ZodEffects<z.ZodObject<{
134
139
  sourceMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
135
140
  targetMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
136
141
  classNameMapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
142
+ gradleUserHome?: string | undefined;
137
143
  nameMode?: "auto" | "fqcn" | undefined;
138
144
  detail?: "full" | "summary" | "standard" | undefined;
139
145
  include?: string[] | undefined;
@@ -152,6 +158,7 @@ type AnalyzeSymbolDeps = {
152
158
  descriptor?: string;
153
159
  sourceMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
154
160
  sourcePriority?: "loom-first" | "maven-first";
161
+ gradleUserHome?: string;
155
162
  nameMode?: "fqcn" | "auto";
156
163
  signatureMode?: "exact" | "name-only";
157
164
  maxCandidates?: number;
@@ -164,6 +171,7 @@ type AnalyzeSymbolDeps = {
164
171
  descriptor?: string;
165
172
  sourceMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
166
173
  targetMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
174
+ gradleUserHome?: string;
167
175
  signatureMode?: "exact" | "name-only";
168
176
  maxCandidates?: number;
169
177
  }) => Promise<FindMappingOutput>;
@@ -174,12 +182,14 @@ type AnalyzeSymbolDeps = {
174
182
  descriptor: string;
175
183
  sourceMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
176
184
  targetMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
185
+ gradleUserHome?: string;
177
186
  maxCandidates?: number;
178
187
  }) => Promise<ResolveMethodMappingExactOutput>;
179
188
  traceSymbolLifecycle: (input: {
180
189
  symbol: string;
181
190
  descriptor?: string;
182
191
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
192
+ gradleUserHome?: string;
183
193
  toVersion?: string;
184
194
  maxVersions?: number;
185
195
  }) => Promise<TraceSymbolLifecycleOutput>;
@@ -191,6 +201,7 @@ type AnalyzeSymbolDeps = {
191
201
  owner?: string;
192
202
  descriptor?: string;
193
203
  sourceMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
204
+ gradleUserHome?: string;
194
205
  maxCandidates?: number;
195
206
  }) => Promise<ResolveWorkspaceSymbolOutput>;
196
207
  getClassApiMatrix: (input: {
@@ -198,6 +209,7 @@ type AnalyzeSymbolDeps = {
198
209
  className: string;
199
210
  classNameMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
200
211
  includeKinds?: ("class" | "field" | "method")[];
212
+ gradleUserHome?: string;
201
213
  maxRows?: number;
202
214
  }) => Promise<GetClassApiMatrixOutput>;
203
215
  };
@@ -30,6 +30,7 @@ export const analyzeSymbolShape = {
30
30
  targetMapping: z.enum(["obfuscated", "mojang", "intermediary", "yarn"]).optional(),
31
31
  classNameMapping: z.enum(["obfuscated", "mojang", "intermediary", "yarn"]).optional(),
32
32
  projectPath: nonEmptyString.optional(),
33
+ gradleUserHome: nonEmptyString.optional(),
33
34
  signatureMode: z.enum(["exact", "name-only"]).default("exact"),
34
35
  nameMode: z.enum(["fqcn", "auto"]).default("fqcn"),
35
36
  includeKinds: z.array(z.enum(["class", "field", "method"])).optional(),
@@ -107,6 +108,7 @@ export class AnalyzeSymbolService {
107
108
  owner: input.subject.owner,
108
109
  descriptor: input.subject.descriptor,
109
110
  sourceMapping: input.sourceMapping ?? "obfuscated",
111
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
110
112
  nameMode: input.nameMode,
111
113
  signatureMode: input.signatureMode,
112
114
  maxCandidates: input.maxCandidates
@@ -152,6 +154,7 @@ export class AnalyzeSymbolService {
152
154
  descriptor: input.subject.descriptor,
153
155
  sourceMapping: input.sourceMapping ?? "obfuscated",
154
156
  targetMapping: input.targetMapping ?? "mojang",
157
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
155
158
  signatureMode: input.signatureMode,
156
159
  maxCandidates: input.maxCandidates
157
160
  });
@@ -202,6 +205,7 @@ export class AnalyzeSymbolService {
202
205
  descriptor: input.subject.descriptor,
203
206
  sourceMapping: input.sourceMapping ?? "obfuscated",
204
207
  targetMapping: input.targetMapping ?? "mojang",
208
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
205
209
  maxCandidates: input.maxCandidates
206
210
  });
207
211
  return {
@@ -243,6 +247,7 @@ export class AnalyzeSymbolService {
243
247
  : input.subject.name,
244
248
  descriptor: input.subject.descriptor,
245
249
  mapping: input.sourceMapping,
250
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
246
251
  toVersion: input.version,
247
252
  maxVersions: 5
248
253
  });
@@ -286,6 +291,7 @@ export class AnalyzeSymbolService {
286
291
  owner: input.subject.owner,
287
292
  descriptor: input.subject.descriptor,
288
293
  sourceMapping: input.sourceMapping ?? "obfuscated",
294
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
289
295
  maxCandidates: input.maxCandidates
290
296
  });
291
297
  return {
@@ -328,6 +334,7 @@ export class AnalyzeSymbolService {
328
334
  className: input.subject.name,
329
335
  classNameMapping,
330
336
  includeKinds: input.includeKinds,
337
+ ...(input.gradleUserHome !== undefined ? { gradleUserHome: input.gradleUserHome } : {}),
331
338
  maxRows: input.maxRows
332
339
  });
333
340
  return {
@@ -19,6 +19,7 @@ export type BatchClassMembersInput = {
19
19
  sourcePriority?: MappingSourcePriority;
20
20
  allowDecompile?: boolean;
21
21
  projectPath?: string;
22
+ gradleUserHome?: string;
22
23
  scope?: ArtifactScope;
23
24
  preferProjectVersion?: boolean;
24
25
  strictVersion?: boolean;
@@ -21,6 +21,7 @@ export class BatchClassMembersService {
21
21
  sourcePriority: input.sourcePriority,
22
22
  allowDecompile: input.allowDecompile,
23
23
  projectPath: input.projectPath,
24
+ gradleUserHome: input.gradleUserHome,
24
25
  scope: input.scope,
25
26
  preferProjectVersion: input.preferProjectVersion,
26
27
  strictVersion: input.strictVersion
@@ -56,6 +57,7 @@ export class BatchClassMembersService {
56
57
  sourcePriority: input.sourcePriority,
57
58
  allowDecompile: input.allowDecompile,
58
59
  projectPath: input.projectPath,
60
+ gradleUserHome: input.gradleUserHome,
59
61
  scope: input.scope,
60
62
  preferProjectVersion: input.preferProjectVersion,
61
63
  strictVersion: input.strictVersion
@@ -17,6 +17,7 @@ export type BatchClassSourceInput = {
17
17
  sourcePriority?: MappingSourcePriority;
18
18
  allowDecompile?: boolean;
19
19
  projectPath?: string;
20
+ gradleUserHome?: string;
20
21
  scope?: ArtifactScope;
21
22
  preferProjectVersion?: boolean;
22
23
  strictVersion?: boolean;
@@ -21,6 +21,7 @@ export class BatchClassSourceService {
21
21
  sourcePriority: input.sourcePriority,
22
22
  allowDecompile: input.allowDecompile,
23
23
  projectPath: input.projectPath,
24
+ gradleUserHome: input.gradleUserHome,
24
25
  scope: input.scope,
25
26
  preferProjectVersion: input.preferProjectVersion,
26
27
  strictVersion: input.strictVersion
@@ -57,6 +58,7 @@ export class BatchClassSourceService {
57
58
  sourcePriority: input.sourcePriority,
58
59
  allowDecompile: input.allowDecompile,
59
60
  projectPath: input.projectPath,
61
+ gradleUserHome: input.gradleUserHome,
60
62
  scope: input.scope,
61
63
  preferProjectVersion: input.preferProjectVersion,
62
64
  strictVersion: input.strictVersion
@@ -23,6 +23,7 @@ export type BatchMappingsInput = {
23
23
  version: string;
24
24
  sourcePriority?: MappingSourcePriority;
25
25
  projectPath?: string;
26
+ gradleUserHome?: string;
26
27
  concurrency?: number;
27
28
  failFast?: boolean;
28
29
  compact?: boolean;
@@ -26,6 +26,7 @@ export class BatchMappingsService {
26
26
  targetMapping: entry.targetMapping,
27
27
  sourcePriority: input.sourcePriority,
28
28
  projectPath: input.projectPath,
29
+ gradleUserHome: input.gradleUserHome,
29
30
  signatureMode: entry.signatureMode,
30
31
  disambiguation: entry.disambiguation,
31
32
  maxCandidates: entry.maxCandidates
@@ -30,6 +30,7 @@ export type BatchSymbolExistsInput = {
30
30
  sourcePriority?: MappingSourcePriority;
31
31
  allowDecompile?: boolean;
32
32
  projectPath?: string;
33
+ gradleUserHome?: string;
33
34
  scope?: ArtifactScope;
34
35
  preferProjectVersion?: boolean;
35
36
  strictVersion?: boolean;
@@ -35,6 +35,7 @@ export class BatchSymbolExistsService {
35
35
  sourcePriority: input.sourcePriority,
36
36
  allowDecompile: input.allowDecompile,
37
37
  projectPath: input.projectPath,
38
+ gradleUserHome: input.gradleUserHome,
38
39
  scope: input.scope,
39
40
  preferProjectVersion: input.preferProjectVersion,
40
41
  strictVersion: input.strictVersion
@@ -71,6 +72,7 @@ export class BatchSymbolExistsService {
71
72
  descriptor: entry.descriptor,
72
73
  sourceMapping: sharedArtifact.sourceMapping,
73
74
  sourcePriority: input.sourcePriority,
75
+ gradleUserHome: input.gradleUserHome,
74
76
  nameMode: entry.nameMode,
75
77
  signatureMode: entry.signatureMode,
76
78
  maxCandidates: entry.maxCandidates,
@@ -26,12 +26,14 @@ export declare const compareMinecraftShape: {
26
26
  toVersion: z.ZodString;
27
27
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
28
28
  sourcePriority: z.ZodOptional<z.ZodEnum<["loom-first", "maven-first"]>>;
29
+ gradleUserHome: z.ZodOptional<z.ZodString>;
29
30
  }, "strip", z.ZodTypeAny, {
30
31
  kind: "class";
31
32
  className: string;
32
33
  fromVersion: string;
33
34
  toVersion: string;
34
35
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
36
+ gradleUserHome?: string | undefined;
35
37
  sourcePriority?: "loom-first" | "maven-first" | undefined;
36
38
  }, {
37
39
  kind: "class";
@@ -39,6 +41,7 @@ export declare const compareMinecraftShape: {
39
41
  fromVersion: string;
40
42
  toVersion: string;
41
43
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
44
+ gradleUserHome?: string | undefined;
42
45
  sourcePriority?: "loom-first" | "maven-first" | undefined;
43
46
  }>, z.ZodObject<{
44
47
  kind: z.ZodLiteral<"registry">;
@@ -87,12 +90,14 @@ export declare const compareMinecraftSchema: z.ZodObject<{
87
90
  toVersion: z.ZodString;
88
91
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
89
92
  sourcePriority: z.ZodOptional<z.ZodEnum<["loom-first", "maven-first"]>>;
93
+ gradleUserHome: z.ZodOptional<z.ZodString>;
90
94
  }, "strip", z.ZodTypeAny, {
91
95
  kind: "class";
92
96
  className: string;
93
97
  fromVersion: string;
94
98
  toVersion: string;
95
99
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
100
+ gradleUserHome?: string | undefined;
96
101
  sourcePriority?: "loom-first" | "maven-first" | undefined;
97
102
  }, {
98
103
  kind: "class";
@@ -100,6 +105,7 @@ export declare const compareMinecraftSchema: z.ZodObject<{
100
105
  fromVersion: string;
101
106
  toVersion: string;
102
107
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
108
+ gradleUserHome?: string | undefined;
103
109
  sourcePriority?: "loom-first" | "maven-first" | undefined;
104
110
  }>, z.ZodObject<{
105
111
  kind: z.ZodLiteral<"registry">;
@@ -136,6 +142,7 @@ export declare const compareMinecraftSchema: z.ZodObject<{
136
142
  fromVersion: string;
137
143
  toVersion: string;
138
144
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
145
+ gradleUserHome?: string | undefined;
139
146
  sourcePriority?: "loom-first" | "maven-first" | undefined;
140
147
  } | {
141
148
  kind: "registry";
@@ -161,6 +168,7 @@ export declare const compareMinecraftSchema: z.ZodObject<{
161
168
  fromVersion: string;
162
169
  toVersion: string;
163
170
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
171
+ gradleUserHome?: string | undefined;
164
172
  sourcePriority?: "loom-first" | "maven-first" | undefined;
165
173
  } | {
166
174
  kind: "registry";
@@ -191,6 +199,7 @@ type CompareMinecraftDeps = {
191
199
  toVersion: string;
192
200
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
193
201
  sourcePriority?: "loom-first" | "maven-first";
202
+ gradleUserHome?: string;
194
203
  includeFullDiff?: boolean;
195
204
  }) => Promise<DiffClassSignaturesOutput>;
196
205
  getRegistryData: (input: {
@@ -18,7 +18,8 @@ const subjectSchema = z.discriminatedUnion("kind", [
18
18
  fromVersion: nonEmptyString,
19
19
  toVersion: nonEmptyString,
20
20
  mapping: z.enum(["obfuscated", "mojang", "intermediary", "yarn"]).optional(),
21
- sourcePriority: z.enum(["loom-first", "maven-first"]).optional()
21
+ sourcePriority: z.enum(["loom-first", "maven-first"]).optional(),
22
+ gradleUserHome: nonEmptyString.optional()
22
23
  }),
23
24
  z.object({
24
25
  kind: z.literal("registry"),
@@ -175,6 +176,7 @@ export class CompareMinecraftService {
175
176
  toVersion: input.subject.toVersion,
176
177
  mapping: input.subject.mapping,
177
178
  sourcePriority: input.subject.sourcePriority,
179
+ ...(input.subject.gradleUserHome !== undefined ? { gradleUserHome: input.subject.gradleUserHome } : {}),
178
180
  includeFullDiff: input.includeFullDiff
179
181
  });
180
182
  const changedCount = output.summary.total.added +
@@ -12,6 +12,7 @@ export async function handleClassMembers(deps, subject, detail, include, limit)
12
12
  mapping: classSubject.mapping,
13
13
  scope: classSubject.scope,
14
14
  projectPath: classSubject.projectPath,
15
+ gradleUserHome: classSubject.gradleUserHome,
15
16
  preferProjectVersion: classSubject.preferProjectVersion,
16
17
  strictVersion: classSubject.strictVersion,
17
18
  maxMembers: limit
@@ -43,7 +43,8 @@ export async function handleClassOverview(deps, subject, detail, include) {
43
43
  const partialSourceFallback = subject.kind === "workspace" && hasPartialVanillaCoverage(artifact.artifact)
44
44
  ? await resolveBinaryBackedClass(deps, className, {
45
45
  version: artifact.version,
46
- mapping: classSubject.mapping
46
+ mapping: classSubject.mapping,
47
+ gradleUserHome: classSubject.gradleUserHome
47
48
  })
48
49
  : undefined;
49
50
  if (partialSourceFallback) {
@@ -53,6 +54,7 @@ export async function handleClassOverview(deps, subject, detail, include) {
53
54
  mapping: classSubject.mapping,
54
55
  scope: classSubject.scope,
55
56
  projectPath: classSubject.projectPath,
57
+ gradleUserHome: classSubject.gradleUserHome,
56
58
  preferProjectVersion: classSubject.preferProjectVersion,
57
59
  strictVersion: classSubject.strictVersion,
58
60
  mode: "metadata"
@@ -13,6 +13,7 @@ export async function handleClassSource(deps, subject, detail, include) {
13
13
  mapping: classSubject.mapping,
14
14
  scope: classSubject.scope,
15
15
  projectPath: classSubject.projectPath,
16
+ gradleUserHome: classSubject.gradleUserHome,
16
17
  preferProjectVersion: classSubject.preferProjectVersion,
17
18
  strictVersion: classSubject.strictVersion,
18
19
  mode: include.includes("source") || detail === "full" ? "snippet" : "metadata"
@@ -35,6 +35,7 @@ export async function handleListFiles(deps, subject, detail, include, limit, cur
35
35
  projectPath: subject.projectPath,
36
36
  mapping: subject.mapping,
37
37
  scope: subject.scope,
38
+ gradleUserHome: subject.gradleUserHome,
38
39
  preferProjectVersion: subject.preferProjectVersion,
39
40
  strictVersion: subject.strictVersion,
40
41
  focus: {
@@ -34,7 +34,8 @@ export async function handleSearch(deps, subject, detail, include, limit, cursor
34
34
  const binaryBackedClassHit = needsBinaryBackedClassHit
35
35
  ? await resolveBinaryBackedClass(deps, searchSubject.query, {
36
36
  version: artifact.version,
37
- mapping: subject.mapping
37
+ mapping: subject.mapping,
38
+ gradleUserHome: subject.gradleUserHome
38
39
  })
39
40
  : undefined;
40
41
  const binaryBackedHitRecord = binaryBackedClassHit == null
@@ -251,6 +251,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
251
251
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
252
252
  scope: z.ZodOptional<z.ZodEnum<["vanilla", "merged", "loader"]>>;
253
253
  projectPath: z.ZodOptional<z.ZodString>;
254
+ gradleUserHome: z.ZodOptional<z.ZodString>;
254
255
  preferProjectVersion: z.ZodOptional<z.ZodBoolean>;
255
256
  strictVersion: z.ZodOptional<z.ZodBoolean>;
256
257
  }, "strip", z.ZodTypeAny, {
@@ -259,6 +260,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
259
260
  projectPath?: string | undefined;
260
261
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
261
262
  scope?: "vanilla" | "merged" | "loader" | undefined;
263
+ gradleUserHome?: string | undefined;
262
264
  preferProjectVersion?: boolean | undefined;
263
265
  strictVersion?: boolean | undefined;
264
266
  }, {
@@ -267,6 +269,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
267
269
  projectPath?: string | undefined;
268
270
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
269
271
  scope?: "vanilla" | "merged" | "loader" | undefined;
272
+ gradleUserHome?: string | undefined;
270
273
  preferProjectVersion?: boolean | undefined;
271
274
  strictVersion?: boolean | undefined;
272
275
  }>, z.ZodObject<{
@@ -308,6 +311,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
308
311
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
309
312
  scope: z.ZodOptional<z.ZodEnum<["vanilla", "merged", "loader"]>>;
310
313
  projectPath: z.ZodOptional<z.ZodString>;
314
+ gradleUserHome: z.ZodOptional<z.ZodString>;
311
315
  preferProjectVersion: z.ZodOptional<z.ZodBoolean>;
312
316
  strictVersion: z.ZodOptional<z.ZodBoolean>;
313
317
  }, "strip", z.ZodTypeAny, {
@@ -325,6 +329,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
325
329
  projectPath?: string | undefined;
326
330
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
327
331
  scope?: "vanilla" | "merged" | "loader" | undefined;
332
+ gradleUserHome?: string | undefined;
328
333
  preferProjectVersion?: boolean | undefined;
329
334
  strictVersion?: boolean | undefined;
330
335
  }, {
@@ -342,6 +347,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
342
347
  projectPath?: string | undefined;
343
348
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
344
349
  scope?: "vanilla" | "merged" | "loader" | undefined;
350
+ gradleUserHome?: string | undefined;
345
351
  preferProjectVersion?: boolean | undefined;
346
352
  strictVersion?: boolean | undefined;
347
353
  }>, z.ZodObject<{
@@ -384,6 +390,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
384
390
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
385
391
  scope: z.ZodOptional<z.ZodEnum<["vanilla", "merged", "loader"]>>;
386
392
  projectPath: z.ZodOptional<z.ZodString>;
393
+ gradleUserHome: z.ZodOptional<z.ZodString>;
387
394
  preferProjectVersion: z.ZodOptional<z.ZodBoolean>;
388
395
  strictVersion: z.ZodOptional<z.ZodBoolean>;
389
396
  }, "strip", z.ZodTypeAny, {
@@ -392,6 +399,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
392
399
  projectPath?: string | undefined;
393
400
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
394
401
  scope?: "vanilla" | "merged" | "loader" | undefined;
402
+ gradleUserHome?: string | undefined;
395
403
  preferProjectVersion?: boolean | undefined;
396
404
  strictVersion?: boolean | undefined;
397
405
  artifact?: {
@@ -410,6 +418,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
410
418
  projectPath?: string | undefined;
411
419
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
412
420
  scope?: "vanilla" | "merged" | "loader" | undefined;
421
+ gradleUserHome?: string | undefined;
413
422
  preferProjectVersion?: boolean | undefined;
414
423
  strictVersion?: boolean | undefined;
415
424
  artifact?: {
@@ -571,6 +580,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
571
580
  projectPath: z.ZodString;
572
581
  mapping: z.ZodOptional<z.ZodEnum<["obfuscated", "mojang", "intermediary", "yarn"]>>;
573
582
  scope: z.ZodOptional<z.ZodEnum<["vanilla", "merged", "loader"]>>;
583
+ gradleUserHome: z.ZodOptional<z.ZodString>;
574
584
  preferProjectVersion: z.ZodOptional<z.ZodBoolean>;
575
585
  strictVersion: z.ZodOptional<z.ZodBoolean>;
576
586
  focus: z.ZodOptional<z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
@@ -786,6 +796,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
786
796
  projectPath: string;
787
797
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
788
798
  scope?: "vanilla" | "merged" | "loader" | undefined;
799
+ gradleUserHome?: string | undefined;
789
800
  preferProjectVersion?: boolean | undefined;
790
801
  strictVersion?: boolean | undefined;
791
802
  focus?: {
@@ -839,6 +850,7 @@ export declare const subjectSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject
839
850
  projectPath: string;
840
851
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn" | undefined;
841
852
  scope?: "vanilla" | "merged" | "loader" | undefined;
853
+ gradleUserHome?: string | undefined;
842
854
  preferProjectVersion?: boolean | undefined;
843
855
  strictVersion?: boolean | undefined;
844
856
  focus?: {
@@ -922,6 +934,7 @@ export type InspectMinecraftDeps = {
922
934
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
923
935
  scope?: "vanilla" | "merged" | "loader";
924
936
  projectPath?: string;
937
+ gradleUserHome?: string;
925
938
  preferProjectVersion?: boolean;
926
939
  strictVersion?: boolean;
927
940
  }) => Promise<ResolveArtifactOutput>;
@@ -938,6 +951,7 @@ export type InspectMinecraftDeps = {
938
951
  descriptor?: string;
939
952
  sourceMapping: "obfuscated" | "mojang" | "intermediary" | "yarn";
940
953
  sourcePriority?: "loom-first" | "maven-first";
954
+ gradleUserHome?: string;
941
955
  nameMode?: "fqcn" | "auto";
942
956
  signatureMode?: "exact" | "name-only";
943
957
  maxCandidates?: number;
@@ -952,6 +966,7 @@ export type InspectMinecraftDeps = {
952
966
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
953
967
  scope?: "vanilla" | "merged" | "loader";
954
968
  projectPath?: string;
969
+ gradleUserHome?: string;
955
970
  preferProjectVersion?: boolean;
956
971
  strictVersion?: boolean;
957
972
  mode?: "metadata" | "snippet" | "full";
@@ -968,6 +983,7 @@ export type InspectMinecraftDeps = {
968
983
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
969
984
  scope?: "vanilla" | "merged" | "loader";
970
985
  projectPath?: string;
986
+ gradleUserHome?: string;
971
987
  preferProjectVersion?: boolean;
972
988
  strictVersion?: boolean;
973
989
  maxMembers?: number;
@@ -1030,6 +1046,7 @@ export declare function invalidTaskSubjectError(task: ConcreteInspectMinecraftTa
1030
1046
  export declare function resolveBinaryBackedClass(deps: InspectMinecraftDeps, className: string, input: {
1031
1047
  version?: string;
1032
1048
  mapping?: "obfuscated" | "mojang" | "intermediary" | "yarn";
1049
+ gradleUserHome?: string;
1033
1050
  }): Promise<{
1034
1051
  className: string;
1035
1052
  warnings: string[];