Repository navigation
Development
This page covers the stack, the tests, how to check a change on a real server, and how AI takes part.
- Kotlin and Gradle Kotlin DSL, on JDK 25
- Paper API 26.3 and Adventure MiniMessage
- kotlinx-serialization with kaml for the configs
- Exposed and HikariCP over SQLite, MySQL, MariaDB, or PostgreSQL
- MaxMind DB reader for the country database
- Optional,
compileOnly: PlaceholderAPI, Plan, MiniPlaceholders, GriefPrevention, WorldGuard, CoreProtect (API 10 or newer), WorldAPI’s expansion API (com.mairwunnx:worldapi-expansion), and Allay’s (chat.allay:allay-expansion) - For the mods: Fabric Loom and Fabric API, NeoForge through ModDevGradle, and NeoForm’s Minecraft for
modcore
There is no MockBukkit for Paper 26.3, so the tests cover the pure parts:
- the formulas: the curves against numbers from the 1.12.0 jar, and the 2.1 progression on its own
- the bundled files and the language files (
ResourcesTest) - 1.x files, which must keep loading
- the language resolver and the codec
- the SQLite store with a 1.x schema
./gradlew build runs them all. They live in core/src/test, since none needs Bukkit.
-
Build:
./gradlew build. -
Start a real Paper with the jar and the optional plugins, run a few commands, and stop it. The script fails on any error about the plugin:
python3 -I .claude/scripts/paper_smoke.py --game 26.3 --plugin paper/build/libs/mobosses-paper-dev.jar \ --modrinth placeholderapi --modrinth plan \ --jar https://cdn.modrinth.com/data/HQyibRsN/versions/N2WfJ0ll/MiniPlaceholders-Paper-3.2.0.jar \ --modrinth griefprevention --modrinth worldedit --modrinth worldguard \ --jar https://github.com/allay-ai/minecraft/releases/download/v6.33.0/allay-spigot-6.33.0.jar \ --jar https://github.com/MairwunNx/minecraft-worldapi/releases/download/v4.5.0/worldapi-paper-4.5.0.jar \ --command "forceload add 0 0" --command "mobosses spawn zombie 30 epic 0 -60 4 world" \ --command "mobosses reload" --command "mobosses killall" \ --expect "protection: GriefPrevention, WorldGuard" --expect "Bosses removed: 1" \ --expect "Plan found" --expect "MiniPlaceholders found" \ --expect "Expansion Mo’Bosses .* is on: 8 tools, 203 items, a prompt" --expect "WorldAPI found" \ --expect "MoBosses shares mobosses: 6 resources, 7 topics" \ --ignore "Plan\] Failed to enable geolocation"
The console must give coordinates to
spawn. A flat world’s ground is at y -60. Pass--dirto keep the folder and run it again: bosses spawned in the first run must come back in the second. -
For CoreProtect logging, build CoreProtect’s
masterwith-Dproject.branch=developmentuntil a release supports 26.3. -
Natural spawns, fights, abilities, boss bars, names over mobs, and loot need a game client on Paper: a player has to stand near the mobs and hit them. So do Allay’s tools, which run when a player asks Allay.
-
The mods. Their game tests run on a real server for each loader: a boss’s data and stats, difficulty, a save and a load, boats and portals, natural spawns, a solo kill’s payout and loot, temporary blocks, the advancements, the trigger, every ability cast once, and every Allay tool run through Allay’s API, with each answer under its 8000 characters. The client tests open a singleplayer world in a game window, check where Mo’Bosses keeps its files, the language, the owner’s rights, a spawn, the settings screen, and the loot pages in JEI and REI, and save screenshots of them:
./gradlew :fabric:runGameTest :neoforge:runGameTestServer caffeinate -d ./gradlew :fabric:runClientGameTest :neoforge:runClientGameTest
On macOS a sleeping display stalls the game window before the menu, and
caffeinate -dkeeps it awake. Then a dedicated server each, as the Paper check:.claude/scripts/fabric_smoke.pyandneoforge_smoke.py, with the commands inCLAUDE.md. To play by hand:./gradlew :fabric:runClientor./gradlew :neoforge:runClient.
Every Monday the “Autopilot” workflow runs Claude in GitHub Actions: it updates the dependencies and the game version (/update-deps and /update-minecraft in .claude/skills/), fixes what breaks, pushes, and releases when what the plugin ships changed. It needs the CLAUDE_CODE_OAUTH_TOKEN secret.
AI wrote parts of the documentation and the code: the configuration models and serializers at first, then the 2.0 rewrite with languages by IP, protection plugins, and CoreProtect, and the translations. The formulas, classes, and balance are mine. AI also writes the commit messages from the changes.
Next: Releasing