minecraft-modding-b18d06 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited minecraft-modding-b18d06 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill guides Codex through developing open-source Minecraft mods. Target platforms:
| Platform | MC Version | Java | Build System |
|---|---|---|---|
| NeoForge | 1.21.x with 1.21.11 examples | Java 21 | Gradle + ModDevGradle |
| Fabric | 1.21.x with 1.21.11 examples | Java 21 | Gradle + Fabric Loom |
| Architectury (multiloader) | 1.21.x | Java 21 | Gradle + Architectury Loom |
Always confirm the platform and Minecraft version from gradle.properties or build.gradle before writing any mod-specific code.
Use when: the task is Java/Kotlin mod code, registry/event work, networking, datagen wiring, and loader APIs.Do not use when: the task is command-only vanilla logic (minecraft-commands-scripting) or pure datapacks (minecraft-datapack).Do not use when: the task targets Paper/Bukkit plugins (minecraft-plugin-dev).# NeoForge project signature
grep -r "net.neoforged" gradle.properties build.gradle settings.gradle 2>/dev/null | head -5
# Fabric project signature
grep -r "fabric" gradle.properties build.gradle settings.gradle 2>/dev/null | head -5
# Read mod ID and version
cat gradle.propertiesKey files per platform:
src/main/resources/META-INF/neoforge.mods.toml, annotated @Mod main classsrc/main/resources/fabric.mod.json, class implementing ModInitializercommon/, fabric/, neoforge/ subprojects# Build the mod jar
./gradlew build
# Run the Minecraft client to test
./gradlew runClient
# Run a dedicated server to test
./gradlew runServer
# Run game tests (NeoForge JUnit-style game tests)
./gradlew runGameTestServer
# Run data generation (generates JSON assets automatically)
./gradlew runData
# Clean build cache
./gradlew clean
# Check for dependency updates (optional)
./gradlew dependencyUpdatesAfter ./gradlew build, the mod jar is at: build/libs/<mod_id>-<version>.jar
src/
main/
java/<groupId>/<modid>/
MyMod.java ← @Mod entry point
block/
ModBlocks.java ← DeferredRegister<Block>
MyCustomBlock.java
item/
ModItems.java ← DeferredRegister<Item>
entity/
ModEntities.java ← DeferredRegister<EntityType<?>>
menu/ ← custom GUI containers
recipe/
worldgen/
datagen/
ModDataGen.java ← GatherDataEvent handler
providers/
resources/
META-INF/
neoforge.mods.toml ← mod metadata (renamed from mods.toml in NeoForge 1.20.5+)
assets/<modid>/
blockstates/ ← JSON blockstate definitions
models/
block/ ← block model JSON
item/ ← item model JSON
textures/
block/ ← 16×16 PNG textures
item/
lang/
en_us.json ← translation strings
data/<modid>/
recipes/ ← crafting recipe JSON
loot_table/
blocks/ ← per-block loot table JSON
tags/
blocks/
items/src/
main/
java/<groupId>/<modid>/
MyMod.java ← implements ModInitializer
client/
MyModClient.java ← implements ClientModInitializer
block/
item/
mixin/ ← Mixin classes
resources/
fabric.mod.json
assets/<modid>/ ← same as NeoForge
data/<modid>/ ← same as NeoForge
<modid>.mixins.json ← mixin configuration@OnlyIn(Dist.CLIENT) (NeoForge) or @Environment(EnvType.CLIENT) (Fabric)must NEVER run on the server.
Everything in Minecraft lives in a registry. Always register objects; never construct them at field initializer time outside a registry call. Use the mapping-appropriate registry constants for the loader you are editing:
| Type | NeoForge / Mojang mappings | Fabric / Yarn mappings |
|---|---|---|
| Blocks | BuiltInRegistries.BLOCK | Registries.BLOCK |
| Items | BuiltInRegistries.ITEM | Registries.ITEM |
| Entity types | BuiltInRegistries.ENTITY_TYPE | Registries.ENTITY_TYPE |
| Block entity types | BuiltInRegistries.BLOCK_ENTITY_TYPE | Registries.BLOCK_ENTITY_TYPE |
| Menu / screen-handler types | BuiltInRegistries.MENU | Registries.SCREEN_HANDLER |
| Sound events | BuiltInRegistries.SOUND_EVENT | Registries.SOUND_EVENT |
| Biomes | Registries.BIOME registry keys | RegistryKeys.BIOME registry keys |
Do not copy older Registry.BLOCK / Registry.ITEM constants into 1.21.x code; those names are stale for the examples in this skill.
Every registry entry needs a namespaced ID:
// NeoForge / vanilla Java
ResourceLocation id = ResourceLocation.fromNamespaceAndPath("mymod", "my_block");
// Fabric with Yarn mappings
Identifier id = Identifier.of("mymod", "my_block");See full patterns in references/neoforge-api.md.
// Main mod class
@Mod(MyMod.MOD_ID)
public class MyMod {
public static final String MOD_ID = "mymod";
public MyMod(IEventBus modEventBus) {
ModBlocks.BLOCKS.register(modEventBus);
ModItems.ITEMS.register(modEventBus);
modEventBus.addListener(this::commonSetup);
}
private void commonSetup(FMLCommonSetupEvent event) {
// runs after all mods are registered
}
}// Block registration
public class ModBlocks {
public static final DeferredRegister<Block> BLOCKS =
DeferredRegister.create(BuiltInRegistries.BLOCK, MyMod.MOD_ID);
public static final DeferredBlock<Block> MY_BLOCK =
BLOCKS.registerSimpleBlock("my_block",
BlockBehaviour.Properties.of()
.mapColor(MapColor.STONE)
.strength(1.5f, 6.0f)
.sound(SoundType.STONE)
.requiresCorrectToolForDrops());
}See full patterns in references/fabric-api.md.
// Main mod class
public class MyMod implements ModInitializer {
public static final String MOD_ID = "mymod";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
@Override
public void onInitialize() {
ModBlocks.register();
ModItems.register();
}
}// Block registration
public class ModBlocks {
public static final Block MY_BLOCK = new Block(
AbstractBlock.Settings.create()
.mapColor(MapColor.STONE)
.strength(1.5f, 6.0f)
.sounds(BlockSoundGroup.STONE)
.requiresTool()
);
public static void register() {
Registry.register(Registries.BLOCK,
Identifier.of(MyMod.MOD_ID, "my_block"), MY_BLOCK);
}
}Always provide matching JSON assets for every registered block/item. Codex should generate or update these files alongside Java code.
See references/common-patterns.md for full JSON templates for:
en_us.json) entriesPrefer data generation over hand-authored JSON for maintainability.
// NeoForge – register data gen providers in GatherDataEvent
@SubscribeEvent
public static void gatherData(GatherDataEvent event) {
DataGenerator gen = event.getGenerator();
PackOutput output = gen.getPackOutput();
ExistingFileHelper helper = event.getExistingFileHelper();
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();
gen.addProvider(event.includeClient(), new ModBlockStateProvider(output, helper));
gen.addProvider(event.includeClient(), new ModItemModelProvider(output, helper));
gen.addProvider(event.includeServer(), new ModRecipeProvider(output, lookupProvider));
gen.addProvider(event.includeServer(), new ModLootTableProvider(output, lookupProvider));
gen.addProvider(event.includeServer(), new ModBlockTagsProvider(output, lookupProvider, helper));
}Run data generation with ./gradlew runData, then commit the generated files.
When adding a new block:
Block subclass (or use vanilla Block with properties)ModBlocks.BLOCKS / Registries.BLOCKBlockItem in ModItems.ITEMS / Registries.ITEMassets/<modid>/blockstates/<name>.jsonassets/<modid>/models/block/<name>.jsonassets/<modid>/models/item/<name>.json (or inherits from block)assets/<modid>/textures/block/<name>.pngdata/<modid>/loot_table/blocks/<name>.jsonen_us.jsonWhen adding a new item:
Item subclass (or use new Item(properties))ModItems / Registries.ITEMBuildCreativeModeTabContentsEvent; Fabric: ItemGroupEvents)When adding a new entity:
Mob, Animal, TamableAnimal, etc.)EntityType registration@OnlyIn(Dist.CLIENT))@OnlyIn(Dist.CLIENT))EntityRenderersEvent.RegisterRenderers (NeoForge) orEntityModelLayerRegistry (Fabric)
LICENSE file and SPDX-License-Identifier header{mod_version}+{mc_version} (e.g., 2.0.0+1.21.11)CHANGELOG.md up to date with semver notesgradle-modrinth or curseforgegradle plugins for CurseForge / Modrinth./gradlew build and ./gradlew runGameTestServer./references/neoforge-api.md./references/fabric-api.md./references/common-patterns.md~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.