Browsers strip/ignore <script> tags injected via innerHTML. Moved all vanilla
form init logic (MC version loading, node stats, port assignment, helper
functions) from _vanilla_form.ejs into index.ejs loadVanillaForm() callback
where it runs in a proper script context.
_vanilla_form.ejs <script> block replaced with a comment explaining why.
index.ejs now defines vfShowNode, vfRefreshPort, vfUpdateJava as global
functions callable from the form's onchange handlers.
Migration 145: mc_versions table with java_version, paper/forge/neoforge/fabric
support flags, seeded with 11 known versions for immediate use.
New: src/services/mcVersionSync.js
- javaVersionForMC() handles both 1.x.y legacy and 26.x.y calendar schemes
- Daily 3AM pg-boss cron fetches Paper API + Modrinth /tag/game_version, upserts
mc_versions with correct loader flags and Java version mapping
- getVersions(filter) for DB-backed lookups with loader filtering
- semver.rcompare for proper version sorting across both schemes
Routes: GET /admin/modpack-installer/mc-versions — JSON endpoint for dynamic
version dropdowns, filterable by loader (paper/forge/neoforge/fabric), with
hardcoded fallback if DB is unavailable.
Views updated:
- _vanilla_form.ejs: MC version dropdown loaded dynamically (Paper-only filter),
Java auto-select reads java_version from DB row
- index.ejs: search filter version dropdown loaded dynamically from mc_versions
- _pack_details.ejs: client-side Java logic handles major >= 26
index.js: registers mc-version-sync cron via pg-boss after queue init.
package.json: added semver ^7.6.3.
ACTIVE_CONTEXT updated.
1. Node selector shows live RAM/disk usage from Pterodactyl API (/node-info endpoint)
2. Disk allocation field, pre-filled at 3× estimated pack size
3. JVM args textarea auto-populated with Aikar G1GC flags
4. Spawn type: added 'vanilla' as new default, cleaned labels
5. Java version auto-selects from MC version (<=1.16→8, 1.17-1.20→17, 1.21+→21)
6. Port auto-assigned from max used port on node (/next-port endpoint), read-only + Re-roll
7. Pack size estimate shown on details card from provider file metadata
New endpoints: GET /node-info (Pterodactyl nodes API), GET /next-port?node=X (DB query)
All changes in _pack_details.ejs + modpack-installer.js. No migrations.
First-boot server provisioner. Named by Holly. Architecture per Gemini 4-round
consultation. Drops a provision.json in server root, mod runs once on
ServerStartedEvent: pastes spawn schematic, places TP command blocks pointing
at the original level.dat spawn, sets worldspawn, gamerules, YAWP region file,
self-destructs by renaming jar to .jar.disabled.
Files (services/bitch-bot/1.21.1/):
- build.gradle / settings.gradle / gradle.properties / gradle wrapper (mirrors rules-mod 1.21.1)
- META-INF/neoforge.mods.toml
- BitchBot.java — @Mod entry, ServerStartedEvent listener, Throwable net
- Provisioner.java — sequenced step runner, per-step try/catch, success tracking gates self-destruct
- ProvisionConfig.java — Gson POJO matching provision.json schema verbatim
- SchematicLoader.java — HTTP download + SHA-256 verify + Sponge v2 .schem parser (NbtIo + varint + BlockStateParser palette)
- CommandBlockPlacer.java — impulse command blocks with /tp @p baked into CommandBlockEntity
- SignPlacer.java — oak signs, 4-line front text via SignBlockEntity#setText
- YawpConfigWriter.java — drops region JSON to world/serverconfig/yawp/regions/{name}.json
- SelfDestruct.java — ProtectionDomain → CodeSource → jar rename, Windows fallback to deleteOnExit
Plus services/bitch-bot/CLAUDE.md (project doc) and sample-provision.json.
NOT COMPILED — no Java/Gradle on Nitro per repo CLAUDE.md. Compile on Dev Panel:
cd /opt/mod-builds/firefrost-services/services/bitch-bot/1.21.1
source use-java 21
/opt/gradle-8.8/bin/gradle build --no-daemon
Risk areas flagged in CLAUDE.md for first compile: schematic parser (untested
against real WorldEdit output), YAWP file format (best-guess schema).
16 tasks have empty descriptions in DB but full specs exist in archived
markdown files. Code needs to backfill from docs/archive/tasks-index-archived/.
Chronicler #89
Mobile-first issue tracker for Holly. Screenshot upload from phone,
minimal friction submission while in-game. Full schema, API routes,
and UI spec for Code.
Chronicler #89
Rules mod 1.18.2, version UI, PWA Phase 1, task module 7 features.
Full pending request inventory with priority order.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New files:
- 139_server_config.sql — DB migration for short_name system
- 139_seed_server_config.js — auto-populates 17 servers from Pterodactyl
- src/services/uptimeKuma.js — Socket.IO direct (no npm wrapper)
- src/services/pterodactyl.js — power actions + console commands
Modified files:
- servers.js — 6 new POST routes (short-name, lock, createserver,
delserver, power, console) + short_name-based channel detection
- _server_card.ejs — full rebuild with command center UI
- _matrix_body.ejs — refactored from 144 lines to 20 (uses partial)
- package.json — added socket.io-client
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Console /rules now fetches from Discord async (was returning hardcoded
fallback without attempting fetch). DIAG logging kept for observability.
All 6 builds at 1.0.5. CHANGELOG.md, INSTALL.md, ACTIVE_CONTEXT.md updated.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Console /rules hit early return before DIAG logs and before any
Discord fetch. Now fetches async like the player path. DIAG logs
moved before the player/console branch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CHANGELOG now includes diagnostic builds. ACTIVE_CONTEXT reflects
full session state for Chronicler pickup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added [DIAG] logs to RulesCommand (token length, channel, messageId,
isValid) and DiscordFetcher (fetch attempt, raw messageId on failure).
1.20.1 only — for Otherworld debugging.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1.20.1: ModConfigEvent fires on mod bus, not MinecraftForge.EVENT_BUS.
Moved Loading/Reloading to FMLJavaModLoadingContext.getModEventBus().
Added config file header warning about preserving [section] headers.
Debug logging in RulesCommand prints token length + channel at runtime.
All 6 builds bumped to 1.0.3.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>