Repository navigation
Completes the access transformer work tracked in #12. Version 1.2.5 was bumped in the repository but never tagged or published; its changes ship here.
This release also adds a CHANGELOG.md covering the full history back to 1.0.0.
New Features
-
Inherited-member detection for access transformers (#17). An AT only transforms the class it names, so a directive aimed at a member declared on a parent is silently inert — the build passes, the game loads, the member stays inaccessible.
validate_access_transformernow resolves the full ancestor closure (transitivesuperName+ interfaces, ancestors outside the JAR skipped) and reports the declaring class along with a paste-ready corrected directive. Constructors are excluded, since they are never inherited. -
Inherited-member detection for access wideners (#17). Fabric AWs have identical semantics:
AccessWidenerClassVisitorresolvesEntryTriple(className, name, descriptor)through a plainHashMap.getOrDefaultwith no hierarchy walk, so an AW naming a subclass for an inherited member widens nothing. Both validators share the same walk, so they can't drift on a rule they both have. -
Cross-file AT conflict detection (#17) via a new optional
extraFilesparameter onvalidate_access_transformer. Every AT a mod ships is applied together at build time, so a conflict spanning two files fails the Forge build exactly like one inside a single file. Duplicates and conflicts name both files and both lines; findings are restricted to those involving the file under validation, and unresolvable paths come back asextraFilesNotFoundrather than being silently dropped. -
Comma-separated and repeated array flags in the CLI. Both
--extraFiles a.cfg,b.cfgand--extraFiles a.cfg --extraFiles b.cfgnow work; JSON still parses. Non-array flags keep last-wins semantics.
Fixes
-
Record members no longer reported as missing (#16). Access transformers and access wideners now validate against the remapped JAR's bytecode rather than decompiled
.java. Decompiled source omits compiler-generated record members (canonical constructors, component accessors), which made the validators flag them as absent. Bytecode carries every member with its true access flags and erased descriptors. -
Record canonical-constructor widening is informational, not an error. Widening the constructor is only required if you instantiate the record; reading its components is fine without it. The note is suppressed entirely when a sibling AT passed via
extraFileswidens the constructor. -
Access widener class names stay in slash notation. The parser normalized to dots, so suggestions came out as
a.b.C— which Fabric's reader rejects outright ("Class-names must be specified as a/b/C, not a.b.C"), meaning a pasted suggestion would break the build. -
AT/AW validation works on patched Forge/NeoForge version keys. The patched flow does no remapping, so a compiled input JAR is now registered as that key's remapped JAR, letting every bytecode consumer resolve a patched key exactly like a vanilla one. Patched sources JARs (NFRT / ForgeGradle
-sources.jar) contain no bytecode and can't be validated; the tool now says so instead of telling you to decompile again. -
Hardened the bytecode index cache against concurrent access.
Improvements
- Compact, verdict-first output for
validate_access_transformer. - The inheritance check runs before the descriptor-mismatch branch, so a class declaring
tick(I)Vwhen the AT asks fortick()Vis reported as an inheritance problem rather than a bad descriptor.
Internal
- CI builds the committed
bytecode-dumperJAR and re-runs tests when it changes, so the bytecode-gated suites actually execute instead of skipping. - Lint enforced in CI; LF line endings enforced via
.gitattributes.
Install / Upgrade
npm install -g @mcdxai/minecraft-dev-mcp@1.3.0
Full Changelog: v1.2.4...v1.3.0