[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EBZBNZV3ZFAA66T20W63MN":3,"skill-same:01M6EBZBNZV3ZFAA66T20W63MN":99},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6EBZBNZV3ZFAA66T20W63MN","minecraft-multiloader",null,"Build Minecraft mods targeting both NeoForge and Fabric simultaneously using the Architectury framework for Minecraft 1.21.x. Covers Architectury project structure (common\u002Fneoforge\u002Ffabric subprojects), ExpectPlatform annotation for platform-specific implementations, shared registry via Architectury's registration API, platform-specific entrypoints, architectury-loom Gradle plugin configuration, gradle.properties for both loaders, multi-jar publishing to Modrinth and CurseForge, and avoiding common pitfalls when sharing code. Use this skill when building a mod that must run on both NeoForge and Fabric with a single shared codebase.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FJahrome907\u002Fminecraft-codex-skills\u002Fminecraft-multiloader\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"minecraft multiloader","minecraft","publishing","multi","annotation","platform","gradle","project","shared","structure","registration","project structure","use","common","api","framework","registry","code","run","plugin","2026-11-10 10:12:30",false,"---\nname: minecraft-multiloader\ndescription: >\n  Build Minecraft mods targeting both NeoForge and Fabric simultaneously using the\n  Architectury framework for Minecraft 1.21.x. Covers Architectury project structure\n  (common\u002Fneoforge\u002Ffabric subprojects), ExpectPlatform annotation for platform-specific\n  implementations, shared registry via Architectury's registration API, platform-specific\n  entrypoints, architectury-loom Gradle plugin configuration, gradle.properties for both\n  loaders, multi-jar publishing to Modrinth and CurseForge, and avoiding common pitfalls\n  when sharing code. Use this skill when building a mod that must run on both NeoForge\n  and Fabric with a single shared codebase.\n---\n\n# Minecraft Multiloader Skill (Architectury)\n\n## What Is Architectury?\n\n[Architectury](https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-api) is a framework that\nlets you write one mod codebase that compiles to both **NeoForge** and **Fabric** JARs.\nThe common subproject has a shared API; platform subprojects implement\nplatform-specific behavior behind the `@ExpectPlatform` abstraction.\n\n### Routing Boundaries\n- `Use when`: one shared codebase must build and ship both NeoForge and Fabric artifacts.\n- `Do not use when`: the project is single-loader only (`minecraft-modding` for NeoForge\u002FFabric, not both).\n- `Do not use when`: the task is Paper\u002FBukkit plugin development (`minecraft-plugin-dev`).\n\n| Component | Purpose |\n|-----------|---------|\n| `architectury-loom` | Gradle plugin — extends Fabric Loom for multiloader support |\n| `architectury-api` | Runtime library — abstractions over both platforms |\n| `@ExpectPlatform` | Annotation marking methods with platform-specific implementations |\n| `common\u002F` | Shared code (no loader-specific APIs) |\n| `fabric\u002F` | Fabric-specific code + entrypoint |\n| `neoforge\u002F` | NeoForge-specific code + entrypoint |\n\n---\n\n## Versions (1.21.x)\n\n```properties\n# gradle.properties (root)\nminecraft_version=1.21.1\nenabled_platforms=fabric,neoforge\n\narchitectury_version=13.0.8\nfabric_loader_version=0.16.9\nfabric_api_version=0.114.0+1.21.1\nneoforge_version=21.1.172\n\nloom_version=1.9-SNAPSHOT\n```\n\n---\n\n## Root Project Layout\n\n```\nmy-mod\u002F\n├── build.gradle           ← root build (shared config)\n├── settings.gradle\n├── gradle.properties\n├── common\u002F\n│   ├── build.gradle\n│   └── src\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fmymod\u002F\n│       ├── MyMod.java               ← shared init\n│       ├── registry\u002F\n│       │   └── ModItems.java        ← shared registry declarations\n│       └── platform\u002F\n│           └── PlatformHelper.java  ← @ExpectPlatform methods\n├── fabric\u002F\n│   ├── build.gradle\n│   └── src\u002Fmain\u002F\n│       ├── java\u002Fcom\u002Fexample\u002Fmymod\u002Ffabric\u002F\n│       │   ├── MyModFabric.java          ← Fabric entrypoint\n│       │   └── platform\u002F\n│       │       └── PlatformHelperImpl.java  ← Fabric implementation\n│       └── resources\u002F\n│           ├── fabric.mod.json\n│           └── assets\u002F...\n└── neoforge\u002F\n    ├── build.gradle\n    └── src\u002Fmain\u002F\n        ├── java\u002Fcom\u002Fexample\u002Fmymod\u002Fneoforge\u002F\n        │   ├── MyModNeoForge.java        ← NeoForge @Mod entry\n        │   └── platform\u002F\n        │       └── PlatformHelperImpl.java  ← NeoForge implementation\n        └── resources\u002F\n            ├── META-INF\u002Fneoforge.mods.toml\n            └── assets\u002F...\n```\n\n---\n\n## Root `settings.gradle`\n\n```groovy\npluginManagement {\n    repositories {\n        maven { url \"https:\u002F\u002Fmaven.architectury.dev\u002F\" }\n        maven { url \"https:\u002F\u002Fmaven.fabricmc.net\u002F\" }\n        maven { url \"https:\u002F\u002Fmaven.neoforged.net\u002Freleases\" }\n        gradlePluginPortal()\n    }\n}\n\ninclude \"common\"\ninclude \"fabric\"\ninclude \"neoforge\"\n```\n\n---\n\n## Root `build.gradle`\n\n```groovy\nplugins {\n    id \"architectury-plugin\" version \"3.4-SNAPSHOT\" apply false\n    id \"dev.architectury.loom\" version \"${loom_version}\" apply false\n    id \"com.github.johnrengelman.shadow\" version \"8.1.1\" apply false\n}\n\narchitectury {\n    minecraft = rootProject.minecraft_version\n}\n\nsubprojects {\n    apply plugin: \"java\"\n    apply plugin: \"architectury-plugin\"\n\n    group = \"com.example.mymod\"\n    version = \"${mod_version}+${minecraft_version}\"\n    archivesBaseName = \"my-mod-${project.name}\"\n\n    repositories {\n        maven { url \"https:\u002F\u002Fmaven.architectury.dev\u002F\" }\n        maven { url \"https:\u002F\u002Fmod-buildtools.pkg.github.com\u002FTerraformersMC\u002F\" }\n    }\n\n    java {\n        withSourcesJar()\n        sourceCompatibility = JavaVersion.VERSION_21\n        targetCompatibility = JavaVersion.VERSION_21\n    }\n}\n```\n\n---\n\n## `common\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    common(rootProject.enabled_platforms.split(\",\"))\n}\n\nloom {\n    \u002F\u002F common project uses mappings only\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    modImplementation \"dev.architectury:architectury-api:${rootProject.architectury_version}\"\n}\n```\n\n---\n\n## `fabric\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"com.github.johnrengelman.shadow\"\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    platformSetupLoomIde()\n    fabric()\n}\n\nloom {\n    accessWidenerPath = project(\":common\").loom.accessWidenerPath\n}\n\nconfigurations {\n    common\n    shadowCommon\n    compileClasspath.extendsFrom common\n    runtimeClasspath.extendsFrom common\n    developmentFabric.extendsFrom common\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    modImplementation \"net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}\"\n    modApi \"net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}\"\n    modApi \"dev.architectury:architectury-api:${rootProject.architectury_version}:fabric\"\n\n    common(project(path: \":common\", configuration: \"namedElements\")) { transitive false }\n    shadowCommon(project(path: \":common\", configuration: \"transformProductionFabric\")) { transitive false }\n}\n\nshadowJar {\n    exclude \"architectury.common.json\"\n    configurations = [project.configurations.shadowCommon]\n    archiveClassifier = \"dev-shadow\"\n}\n\nremapJar {\n    injectAccessWidener = true\n    input.fileValue shadowJar.archiveFile.get().asFile\n    dependsOn shadowJar\n    archiveClassifier = \"\"\n}\n\njar { archiveClassifier = \"dev\" }\nsourcesJar { archiveClassifier = \"dev-sources\" }\ncomponents.java.withVariantsFromConfiguration(configurations.shadowRuntimeElements) { skip() }\n```\n\n---\n\n## `neoforge\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"com.github.johnrengelman.shadow\"\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    platformSetupLoomIde()\n    neoForge()\n}\n\nloom {\n    accessWidenerPath = project(\":common\").loom.accessWidenerPath\n}\n\nconfigurations {\n    common\n    shadowCommon\n    compileClasspath.extendsFrom common\n    runtimeClasspath.extendsFrom common\n    developmentNeoForge.extendsFrom common\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    neoForge \"net.neoforged:neoforge:${rootProject.neoforge_version}\"\n    modApi \"dev.architectury:architectury-api:${rootProject.architectury_version}:neoforge\"\n\n    common(project(path: \":common\", configuration: \"namedElements\")) { transitive false }\n    shadowCommon(project(path: \":common\", configuration: \"transformProductionNeoForge\")) { transitive false }\n}\n\nshadowJar {\n    exclude \"architectury.common.json\"\n    configurations = [project.configurations.shadowCommon]\n    archiveClassifier = \"dev-shadow\"\n}\n\nremapJar {\n    input.fileValue shadowJar.archiveFile.get().asFile\n    dependsOn shadowJar\n    archiveClassifier = \"\"\n}\n\njar { archiveClassifier = \"dev\" }\n```\n\n---\n\n## Shared Common Code\n\n### `common\u002F...\u002FMyMod.java`\n```java\npackage com.example.mymod;\n\nimport dev.architectury.registry.registries.DeferredRegister;\nimport dev.architectury.registry.registries.RegistrySupplier;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.resources.ResourceLocation;\nimport net.minecraft.world.item.Item;\n\npublic class MyMod {\n    public static final String MOD_ID = \"mymod\";\n\n    \u002F\u002F Architectury's DeferredRegister — works on both platforms\n    public static final DeferredRegister\u003CItem> ITEMS =\n        DeferredRegister.create(MOD_ID, BuiltInRegistries.ITEM);\n\n    public static final RegistrySupplier\u003CItem> MY_ITEM =\n        ITEMS.register(\"my_item\", () -> new Item(new Item.Properties()));\n\n    public static void init() {\n        ITEMS.register(); \u002F\u002F registers with both platforms\n    }\n}\n```\n\n### `@ExpectPlatform` — platform-specific methods\n\nDefine the contract in `common\u002F`:\n```java\npackage com.example.mymod.platform;\n\nimport dev.architectury.injectables.annotations.ExpectPlatform;\nimport net.minecraft.world.level.material.Fluid;\n\npublic class PlatformHelper {\n\n    @ExpectPlatform\n    public static boolean isModLoaded(String modId) {\n        \u002F\u002F This body is replaced at compile time by the platform implementation\n        throw new AssertionError(\"ExpectPlatform implementation not found\");\n    }\n\n    @ExpectPlatform\n    public static boolean isClient() {\n        throw new AssertionError();\n    }\n}\n```\n\nImplement in `fabric\u002F...\u002Fplatform\u002FPlatformHelperImpl.java`:\n```java\npackage com.example.mymod.platform;\n\nimport net.fabricmc.loader.api.FabricLoader;\n\n\u002F\u002F Class name must match: \u003Ccommon class name>Impl\npublic class PlatformHelperImpl {\n\n    public static boolean isModLoaded(String modId) {\n        return FabricLoader.getInstance().isModLoaded(modId);\n    }\n\n    public static boolean isClient() {\n        return FabricLoader.getInstance().getEnvironmentType() ==\n            net.fabricmc.api.EnvType.CLIENT;\n    }\n}\n```\n\nImplement in `neoforge\u002F...\u002Fplatform\u002FPlatformHelperImpl.java`:\n```java\npackage com.example.mymod.platform;\n\nimport net.neoforged.fml.ModList;\nimport net.neoforged.fml.loading.FMLEnvironment;\n\npublic class PlatformHelperImpl {\n\n    public static boolean isModLoaded(String modId) {\n        return ModList.get().isLoaded(modId);\n    }\n\n    public static boolean isClient() {\n        return FMLEnvironment.dist.isClient();\n    }\n}\n```\n\n---\n\n## Fabric Entrypoint\n\n### `fabric\u002F...\u002FMyModFabric.java`\n```java\npackage com.example.mymod.fabric;\n\nimport com.example.mymod.MyMod;\nimport net.fabricmc.api.ModInitializer;\n\npublic class MyModFabric implements ModInitializer {\n    @Override\n    public void onInitialize() {\n        MyMod.init();\n    }\n}\n```\n\n### `fabric\u002F...\u002Fresources\u002Ffabric.mod.json`\n```json\n{\n  \"schemaVersion\": 1,\n  \"id\": \"mymod\",\n  \"version\": \"${version}\",\n  \"name\": \"My Mod\",\n  \"description\": \"A multiloader example mod\",\n  \"license\": \"MIT\",\n  \"environment\": \"*\",\n  \"entrypoints\": {\n    \"main\": [\"com.example.mymod.fabric.MyModFabric\"]\n  },\n  \"depends\": {\n    \"fabricloader\": \">=0.16.0\",\n    \"fabric-api\": \"*\",\n    \"architectury\": \">=13.0.0\",\n    \"minecraft\": \"~1.21\"\n  }\n}\n```\n\n---\n\n## NeoForge Entrypoint\n\n### `neoforge\u002F...\u002FMyModNeoForge.java`\n```java\npackage com.example.mymod.neoforge;\n\nimport com.example.mymod.MyMod;\nimport net.neoforged.bus.api.IEventBus;\nimport net.neoforged.fml.common.Mod;\n\n@Mod(MyMod.MOD_ID)\npublic class MyModNeoForge {\n    public MyModNeoForge(IEventBus modEventBus) {\n        MyMod.init();\n    }\n}\n```\n\n### `neoforge\u002F...\u002Fresources\u002FMETA-INF\u002Fneoforge.mods.toml`\n```toml\nmodLoader = \"javafml\"\nloaderVersion = \"[4,)\"\nlicense = \"MIT\"\n\n[[mods]]\nmodId = \"mymod\"\nversion = \"${file.jarVersion}\"\ndisplayName = \"My Mod\"\ndescription = \"A multiloader example mod\"\n\n[[dependencies.mymod]]\nmodId = \"neoforge\"\ntype = \"required\"\nversionRange = \"[21.1,)\"\nordering = \"NONE\"\nside = \"BOTH\"\n\n[[dependencies.mymod]]\nmodId = \"minecraft\"\ntype = \"required\"\nversionRange = \"[1.21.1,)\"\nordering = \"NONE\"\nside = \"BOTH\"\n```\n\n---\n\n## Build Commands\n\n```bash\n# Build both JARs simultaneously\n.\u002Fgradlew build\n\n# Outputs:\n#   fabric\u002Fbuild\u002Flibs\u002Fmy-mod-fabric-1.0.0+1.21.1.jar\n#   neoforge\u002Fbuild\u002Flibs\u002Fmy-mod-neoforge-1.0.0+1.21.1.jar\n\n# Run in dev environment\n.\u002Fgradlew :fabric:runClient\n.\u002Fgradlew :neoforge:runClient\n.\u002Fgradlew :neoforge:runServer\n\n# Datagen (if applicable)\n.\u002Fgradlew :neoforge:runData\n```\n\n---\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Using `net.neoforged.*` \u002F `net.fabricmc.*` in `common\u002F` | Only use vanilla MC and Architectury APIs in common |\n| Direct field access on `DeferredRegister` (NeoForge style) in common | Use Architectury's `DeferredRegister` |\n| Forgetting `@ExpectPlatform` throws `AssertionError` at runtime | Both `fabric\u002F` and `neoforge\u002F` must have matching `*Impl` classes |\n| Assets duplicated in fabric\u002F and neoforge\u002F | Keep assets in `common\u002Fsrc\u002Fmain\u002Fresources\u002Fassets\u002F` |\n| Mixins in common — not supported on NeoForge | Put Mixins in the platform subprojects only |\n| Accessing world\u002Fregistry on mod init thread | Use `mod bus` events for setup; never access world on init |\n\n---\n\n## References\n\n- Architectury API GitHub: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-api\n- Architectury Loom: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-loom\n- Architectury templates: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-templates\n- Architectury docs: https:\u002F\u002Fdocs.architectury.dev\u002F\n\n","# Minecraft Multiloader Skill (Architectury)\n\n## What Is Architectury?\n\n[Architectury](https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-api) is a framework that\nlets you write one mod codebase that compiles to both **NeoForge** and **Fabric** JARs.\nThe common subproject has a shared API; platform subprojects implement\nplatform-specific behavior behind the `@ExpectPlatform` abstraction.\n\n### Routing Boundaries\n- `Use when`: one shared codebase must build and ship both NeoForge and Fabric artifacts.\n- `Do not use when`: the project is single-loader only (`minecraft-modding` for NeoForge\u002FFabric, not both).\n- `Do not use when`: the task is Paper\u002FBukkit plugin development (`minecraft-plugin-dev`).\n\n| Component | Purpose |\n|-----------|---------|\n| `architectury-loom` | Gradle plugin — extends Fabric Loom for multiloader support |\n| `architectury-api` | Runtime library — abstractions over both platforms |\n| `@ExpectPlatform` | Annotation marking methods with platform-specific implementations |\n| `common\u002F` | Shared code (no loader-specific APIs) |\n| `fabric\u002F` | Fabric-specific code + entrypoint |\n| `neoforge\u002F` | NeoForge-specific code + entrypoint |\n\n---\n\n## Versions (1.21.x)\n\n```properties\n# gradle.properties (root)\nminecraft_version=1.21.1\nenabled_platforms=fabric,neoforge\n\narchitectury_version=13.0.8\nfabric_loader_version=0.16.9\nfabric_api_version=0.114.0+1.21.1\nneoforge_version=21.1.172\n\nloom_version=1.9-SNAPSHOT\n```\n\n---\n\n## Root Project Layout\n\n```\nmy-mod\u002F\n├── build.gradle           ← root build (shared config)\n├── settings.gradle\n├── gradle.properties\n├── common\u002F\n│   ├── build.gradle\n│   └── src\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fmymod\u002F\n│       ├── MyMod.java               ← shared init\n│       ├── registry\u002F\n│       │   └── ModItems.java        ← shared registry declarations\n│       └── platform\u002F\n│           └── PlatformHelper.java  ← @ExpectPlatform methods\n├── fabric\u002F\n│   ├── build.gradle\n│   └── src\u002Fmain\u002F\n│       ├── java\u002Fcom\u002Fexample\u002Fmymod\u002Ffabric\u002F\n│       │   ├── MyModFabric.java          ← Fabric entrypoint\n│       │   └── platform\u002F\n│       │       └── PlatformHelperImpl.java  ← Fabric implementation\n│       └── resources\u002F\n│           ├── fabric.mod.json\n│           └── assets\u002F...\n└── neoforge\u002F\n    ├── build.gradle\n    └── src\u002Fmain\u002F\n        ├── java\u002Fcom\u002Fexample\u002Fmymod\u002Fneoforge\u002F\n        │   ├── MyModNeoForge.java        ← NeoForge @Mod entry\n        │   └── platform\u002F\n        │       └── PlatformHelperImpl.java  ← NeoForge implementation\n        └── resources\u002F\n            ├── META-INF\u002Fneoforge.mods.toml\n            └── assets\u002F...\n```\n\n---\n\n## Root `settings.gradle`\n\n```groovy\npluginManagement {\n    repositories {\n        maven { url \"https:\u002F\u002Fmaven.architectury.dev\u002F\" }\n        maven { url \"https:\u002F\u002Fmaven.fabricmc.net\u002F\" }\n        maven { url \"https:\u002F\u002Fmaven.neoforged.net\u002Freleases\" }\n        gradlePluginPortal()\n    }\n}\n\ninclude \"common\"\ninclude \"fabric\"\ninclude \"neoforge\"\n```\n\n---\n\n## Root `build.gradle`\n\n```groovy\nplugins {\n    id \"architectury-plugin\" version \"3.4-SNAPSHOT\" apply false\n    id \"dev.architectury.loom\" version \"${loom_version}\" apply false\n    id \"com.github.johnrengelman.shadow\" version \"8.1.1\" apply false\n}\n\narchitectury {\n    minecraft = rootProject.minecraft_version\n}\n\nsubprojects {\n    apply plugin: \"java\"\n    apply plugin: \"architectury-plugin\"\n\n    group = \"com.example.mymod\"\n    version = \"${mod_version}+${minecraft_version}\"\n    archivesBaseName = \"my-mod-${project.name}\"\n\n    repositories {\n        maven { url \"https:\u002F\u002Fmaven.architectury.dev\u002F\" }\n        maven { url \"https:\u002F\u002Fmod-buildtools.pkg.github.com\u002FTerraformersMC\u002F\" }\n    }\n\n    java {\n        withSourcesJar()\n        sourceCompatibility = JavaVersion.VERSION_21\n        targetCompatibility = JavaVersion.VERSION_21\n    }\n}\n```\n\n---\n\n## `common\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    common(rootProject.enabled_platforms.split(\",\"))\n}\n\nloom {\n    \u002F\u002F common project uses mappings only\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    modImplementation \"dev.architectury:architectury-api:${rootProject.architectury_version}\"\n}\n```\n\n---\n\n## `fabric\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"com.github.johnrengelman.shadow\"\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    platformSetupLoomIde()\n    fabric()\n}\n\nloom {\n    accessWidenerPath = project(\":common\").loom.accessWidenerPath\n}\n\nconfigurations {\n    common\n    shadowCommon\n    compileClasspath.extendsFrom common\n    runtimeClasspath.extendsFrom common\n    developmentFabric.extendsFrom common\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    modImplementation \"net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}\"\n    modApi \"net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}\"\n    modApi \"dev.architectury:architectury-api:${rootProject.architectury_version}:fabric\"\n\n    common(project(path: \":common\", configuration: \"namedElements\")) { transitive false }\n    shadowCommon(project(path: \":common\", configuration: \"transformProductionFabric\")) { transitive false }\n}\n\nshadowJar {\n    exclude \"architectury.common.json\"\n    configurations = [project.configurations.shadowCommon]\n    archiveClassifier = \"dev-shadow\"\n}\n\nremapJar {\n    injectAccessWidener = true\n    input.fileValue shadowJar.archiveFile.get().asFile\n    dependsOn shadowJar\n    archiveClassifier = \"\"\n}\n\njar { archiveClassifier = \"dev\" }\nsourcesJar { archiveClassifier = \"dev-sources\" }\ncomponents.java.withVariantsFromConfiguration(configurations.shadowRuntimeElements) { skip() }\n```\n\n---\n\n## `neoforge\u002Fbuild.gradle`\n\n```groovy\nplugins {\n    id \"com.github.johnrengelman.shadow\"\n    id \"dev.architectury.loom\" apply true\n}\n\narchitectury {\n    platformSetupLoomIde()\n    neoForge()\n}\n\nloom {\n    accessWidenerPath = project(\":common\").loom.accessWidenerPath\n}\n\nconfigurations {\n    common\n    shadowCommon\n    compileClasspath.extendsFrom common\n    runtimeClasspath.extendsFrom common\n    developmentNeoForge.extendsFrom common\n}\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${rootProject.minecraft_version}\"\n    mappings loom.officialMojangMappings()\n\n    neoForge \"net.neoforged:neoforge:${rootProject.neoforge_version}\"\n    modApi \"dev.architectury:architectury-api:${rootProject.architectury_version}:neoforge\"\n\n    common(project(path: \":common\", configuration: \"namedElements\")) { transitive false }\n    shadowCommon(project(path: \":common\", configuration: \"transformProductionNeoForge\")) { transitive false }\n}\n\nshadowJar {\n    exclude \"architectury.common.json\"\n    configurations = [project.configurations.shadowCommon]\n    archiveClassifier = \"dev-shadow\"\n}\n\nremapJar {\n    input.fileValue shadowJar.archiveFile.get().asFile\n    dependsOn shadowJar\n    archiveClassifier = \"\"\n}\n\njar { archiveClassifier = \"dev\" }\n```\n\n---\n\n## Shared Common Code\n\n### `common\u002F...\u002FMyMod.java`\n```java\npackage com.example.mymod;\n\nimport dev.architectury.registry.registries.DeferredRegister;\nimport dev.architectury.registry.registries.RegistrySupplier;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.resources.ResourceLocation;\nimport net.minecraft.world.item.Item;\n\npublic class MyMod {\n    public static final String MOD_ID = \"mymod\";\n\n    \u002F\u002F Architectury's DeferredRegister — works on both platforms\n    public static final DeferredRegister\u003CItem> ITEMS =\n        DeferredRegister.create(MOD_ID, BuiltInRegistries.ITEM);\n\n    public static final RegistrySupplier\u003CItem> MY_ITEM =\n        ITEMS.register(\"my_item\", () -> new Item(new Item.Properties()));\n\n    public static void init() {\n        ITEMS.register(); \u002F\u002F registers with both platforms\n    }\n}\n```\n\n### `@ExpectPlatform` — platform-specific methods\n\nDefine the contract in `common\u002F`:\n```java\npackage com.example.mymod.platform;\n\nimport dev.architectury.injectables.annotations.ExpectPlatform;\nimport net.minecraft.world.level.material.Fluid;\n\npublic class PlatformHelper {\n\n    @ExpectPlatform\n    public static boolean isModLoaded(String modId) {\n        \u002F\u002F This body is replaced at compile time by the platform implementation\n        throw new AssertionError(\"ExpectPlatform implementation not found\");\n    }\n\n    @ExpectPlatform\n    public static boolean isClient() {\n        throw new AssertionError();\n    }\n}\n```\n\nImplement in `fabric\u002F...\u002Fplatform\u002FPlatformHelperImpl.java`:\n```java\npackage com.example.mymod.platform;\n\nimport net.fabricmc.loader.api.FabricLoader;\n\n\u002F\u002F Class name must match: \u003Ccommon class name>Impl\npublic class PlatformHelperImpl {\n\n    public static boolean isModLoaded(String modId) {\n        return FabricLoader.getInstance().isModLoaded(modId);\n    }\n\n    public static boolean isClient() {\n        return FabricLoader.getInstance().getEnvironmentType() ==\n            net.fabricmc.api.EnvType.CLIENT;\n    }\n}\n```\n\nImplement in `neoforge\u002F...\u002Fplatform\u002FPlatformHelperImpl.java`:\n```java\npackage com.example.mymod.platform;\n\nimport net.neoforged.fml.ModList;\nimport net.neoforged.fml.loading.FMLEnvironment;\n\npublic class PlatformHelperImpl {\n\n    public static boolean isModLoaded(String modId) {\n        return ModList.get().isLoaded(modId);\n    }\n\n    public static boolean isClient() {\n        return FMLEnvironment.dist.isClient();\n    }\n}\n```\n\n---\n\n## Fabric Entrypoint\n\n### `fabric\u002F...\u002FMyModFabric.java`\n```java\npackage com.example.mymod.fabric;\n\nimport com.example.mymod.MyMod;\nimport net.fabricmc.api.ModInitializer;\n\npublic class MyModFabric implements ModInitializer {\n    @Override\n    public void onInitialize() {\n        MyMod.init();\n    }\n}\n```\n\n### `fabric\u002F...\u002Fresources\u002Ffabric.mod.json`\n```json\n{\n  \"schemaVersion\": 1,\n  \"id\": \"mymod\",\n  \"version\": \"${version}\",\n  \"name\": \"My Mod\",\n  \"description\": \"A multiloader example mod\",\n  \"license\": \"MIT\",\n  \"environment\": \"*\",\n  \"entrypoints\": {\n    \"main\": [\"com.example.mymod.fabric.MyModFabric\"]\n  },\n  \"depends\": {\n    \"fabricloader\": \">=0.16.0\",\n    \"fabric-api\": \"*\",\n    \"architectury\": \">=13.0.0\",\n    \"minecraft\": \"~1.21\"\n  }\n}\n```\n\n---\n\n## NeoForge Entrypoint\n\n### `neoforge\u002F...\u002FMyModNeoForge.java`\n```java\npackage com.example.mymod.neoforge;\n\nimport com.example.mymod.MyMod;\nimport net.neoforged.bus.api.IEventBus;\nimport net.neoforged.fml.common.Mod;\n\n@Mod(MyMod.MOD_ID)\npublic class MyModNeoForge {\n    public MyModNeoForge(IEventBus modEventBus) {\n        MyMod.init();\n    }\n}\n```\n\n### `neoforge\u002F...\u002Fresources\u002FMETA-INF\u002Fneoforge.mods.toml`\n```toml\nmodLoader = \"javafml\"\nloaderVersion = \"[4,)\"\nlicense = \"MIT\"\n\n[[mods]]\nmodId = \"mymod\"\nversion = \"${file.jarVersion}\"\ndisplayName = \"My Mod\"\ndescription = \"A multiloader example mod\"\n\n[[dependencies.mymod]]\nmodId = \"neoforge\"\ntype = \"required\"\nversionRange = \"[21.1,)\"\nordering = \"NONE\"\nside = \"BOTH\"\n\n[[dependencies.mymod]]\nmodId = \"minecraft\"\ntype = \"required\"\nversionRange = \"[1.21.1,)\"\nordering = \"NONE\"\nside = \"BOTH\"\n```\n\n---\n\n## Build Commands\n\n```bash\n# Build both JARs simultaneously\n.\u002Fgradlew build\n\n# Outputs:\n#   fabric\u002Fbuild\u002Flibs\u002Fmy-mod-fabric-1.0.0+1.21.1.jar\n#   neoforge\u002Fbuild\u002Flibs\u002Fmy-mod-neoforge-1.0.0+1.21.1.jar\n\n# Run in dev environment\n.\u002Fgradlew :fabric:runClient\n.\u002Fgradlew :neoforge:runClient\n.\u002Fgradlew :neoforge:runServer\n\n# Datagen (if applicable)\n.\u002Fgradlew :neoforge:runData\n```\n\n---\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Using `net.neoforged.*` \u002F `net.fabricmc.*` in `common\u002F` | Only use vanilla MC and Architectury APIs in common |\n| Direct field access on `DeferredRegister` (NeoForge style) in common | Use Architectury's `DeferredRegister` |\n| Forgetting `@ExpectPlatform` throws `AssertionError` at runtime | Both `fabric\u002F` and `neoforge\u002F` must have matching `*Impl` classes |\n| Assets duplicated in fabric\u002F and neoforge\u002F | Keep assets in `common\u002Fsrc\u002Fmain\u002Fresources\u002Fassets\u002F` |\n| Mixins in common — not supported on NeoForge | Put Mixins in the platform subprojects only |\n| Accessing world\u002Fregistry on mod init thread | Use `mod bus` events for setup; never access world on init |\n\n---\n\n## References\n\n- Architectury API GitHub: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-api\n- Architectury Loom: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-loom\n- Architectury templates: https:\u002F\u002Fgithub.com\u002Farchitectury\u002Farchitectury-templates\n- Architectury docs: https:\u002F\u002Fdocs.architectury.dev\u002F\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FJahrome907\u002Fminecraft-codex-skills\u002Fminecraft-multiloader",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill minecraft-multiloader",{"tool":69,"command":70},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill minecraft-multiloader",{"tool":72,"command":73},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill minecraft-multiloader","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FJahrome907\u002Fminecraft-codex-skills\u002Fminecraft-multiloader\u002FSKILL.md",true,[77,83,87,91,95],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"project-context-template.md","REFERENCE","参考文档",543,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-generate-project-context\u002Fproject-context-template.md",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"steps\u002Fstep-01-discover.md",6016,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-generate-project-context\u002Fsteps\u002Fstep-01-discover.md",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"steps\u002Fstep-02-generate.md",9135,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-generate-project-context\u002Fsteps\u002Fstep-02-generate.md",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"steps\u002Fstep-03-complete.md",8122,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-generate-project-context\u002Fsteps\u002Fstep-03-complete.md",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"workflow.md",1749,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-generate-project-context\u002Fworkflow.md",[100,110,120,129,135,142],{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":49},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[105],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[107,108,109],"model","model hierarchy","model hierarchy skill",{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":116,"publishedAt":49},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[115],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[117,118,119],"MCP","zoom","zoom mcp",{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":49},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[126,127,128,118],"sdk","zoom apps sdk","apps",{"skillNo":130,"name":131,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":49},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[131],{"skillNo":136,"name":137,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":141,"publishedAt":49},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[140],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[137],{"skillNo":143,"name":144,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":49},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[144]]