addon-parser is a headless Java scanner that emulates enough of Meteor Client to load addon jars, run addon initialization, and export module/setting data as JSON.
The design goal is CI-friendly execution with no Minecraft runtime or GUI dependencies.
-
Addon scanner runtime
- Entry:
src/main/java/com/cope/addonparser/cli/Main.java - Core scan logic:
src/main/java/com/cope/addonparser/scanner/AddonScanner.java - Output models:
src/main/java/com/cope/addonparser/model/*
- Entry:
-
Meteor emulation layer
- Minimal Meteor systems/settings/hud/addon classes under:
src/main/java/meteordevelopment/*
- Manual compatibility shims for API differences across addon versions.
- Minimal Meteor systems/settings/hud/addon classes under:
-
Stub generation (Java, not Python)
- Generator:
src/stubgen/java/com/cope/addonparser/tools/StubGenerator.java - Generated sources:
src/generated/java/** - Manual class exclusion list:
tools/manual_classes.txt - Gradle task:
generateStubs(JavaExec) wired intocompileJava.
- Generator:
-
Compatibility classloading
src/main/java/com/cope/addonparser/util/ChildFirstClassLoader.java- Handles legacy package/class descriptor drift generically.
- Avoids addon-specific hardcoded bandaids.
-
Value normalization + mappings
src/main/java/com/cope/addonparser/util/ValueNormalizer.javasrc/main/java/com/cope/addonparser/util/YarnMappingResolver.java- Exports stable JSON-friendly values.
- Converts intermediary symbols to Yarn names when available.
- Prevents
ClassName@hexleakage in JSON.
-
Fixtures + regression test
- Fixture test:
src/test/java/com/cope/addonparser/FixtureScanTest.java - Fixture jars live at:
fixtures/addons/jars - Current baseline: all fixture jars scan successfully.
- Fixture test:
-
Runtime side-effect containment
- Scanner now sandboxes addon runtime writes under
tmp/addon-parser-runtime/*per scan and cleans artifacts after each scan. - Includes post-scan cleanup passes to catch delayed async writes from addon init threads.
- Scanner now sandboxes addon runtime writes under
-
Run tests
gradle test --no-daemon
-
Run fixture test with debug output
gradle test --tests com.cope.addonparser.FixtureScanTest --rerun-tasks --no-daemon --info --stacktrace
-
Download latest release fixture jars (Java/Gradle)
gradle downloadLatestReleaseJars --no-daemon
-
Generate JSON output
gradle run --no-daemon --args="--input fixtures/addons/jars --output output/poc-scan --summary output/poc-scan/summary.json"
YarnMappingResolver auto-loads mappings from mappings (repo root) and auto-downloads missing Yarn mapping jars by scanning addon source metadata in ai_reference/addons.
Useful system properties:
addonparser.yarnAutoDownload(truedefault, setfalseto disable)addonparser.mappingsDir(defaultmappings)addonparser.addonsSourceDir(defaultai_reference/addons)addonparser.yarnMappingsVersions(comma/semicolon/path-separator separated version list)addonparser.yarnMappingsJar(explicit jar path list to load)
addonparser.runtimeTmpDir(defaulttmp/addon-parser-runtime)addonparser.keepTmp(falsedefault; settrueto keep per-scan sandbox artifacts for debugging)addonparser.meteorFolder(optional initial override forMeteorClient.FOLDER; scanner normally sets this per scan automatically)
-
No Python in project internals
- Build/runtime internals must remain Java.
- Python scripts may exist only as optional workspace helpers.
-
Always use
ai_reference/as source context- Always reference
ai_reference/for addon source repos and Meteor source context. - This remains required even if
ai_reference/is gitignored and does not appear in normal git/status discovery. - Treat it as mandatory local context, not optional data.
- Always reference
-
No addon-specific hacks
- Compatibility should be generic (descriptor/type adaptation), not package-name specific patches.
-
Generated stubs must not overwrite manual classes
- Any handwritten compatibility class must be listed in
tools/manual_classes.txt.
- Any handwritten compatibility class must be listed in
-
JSON must be stable and human-usable
- Avoid raw object identities (
@hex). - Prefer enum names/symbol names and structured objects.
- Avoid raw object identities (
-
Fixture test is the regression gate
- If
FixtureScanTestfails, fix compatibility/emulation until it passes.
- If
- Reproduce with fixture test.
- Prefer:
- emulation API parity in manual Meteor classes
- generic loader descriptor reconciliation
- generic stub hierarchy/interface overrides
- Avoid one-off addon routing rules unless absolutely impossible.
- Re-run:
gradle test --no-daemon- full JSON generation command
- Spot-check output JSON for:
- module count regressions
- setting serialization quality
- mapping resolution quality
- File size differences between versioned addon JSONs can be legitimate if module sets differ by jar version.
ai_reference/addonscontains cloned third-party repos; do not treat their internal docs/scripts as core project logic.tools/download_latest_release_jars.pyis now clone-only (syncs addon repos intoai_reference/addonsfromtools/addon_repos.csv).- Latest release fixture jar downloading is handled by Java (
gradle downloadLatestReleaseJars), not Python. - Runnable jar fixtures are stored in
fixtures/addons/jars, separate fromai_reference/by design.