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
When mcp-server restarts, activeSessions is cleared but Claude.ai may
still hold the old session ID. Previously this fell to a generic 400 error.
Now returns 404 with clear re-initialize message so clients know to
create a fresh session.
Chronicler #89
Claude.ai upgraded to MCP protocol 2025-11-25 (Streamable HTTP) but Trinity Core
only supported the deprecated 2024-11-05 (HTTP+SSE) transport. This caused the
SSE connection to drop after initialize — tools/list never completed.
Changes:
- Add StreamableHTTPServerTransport alongside existing SSEServerTransport
- app.all('/mcp') handler detects protocol via mcp-session-id header
- Legacy SSE still works via GET /mcp (backwards compatible)
- New Streamable HTTP works via POST /mcp with session headers
- Version bump to 2.4.0
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>
1. Click-to-open slide-out detail panel with full task info
2. Client-side sorting (number, priority, status, updated) with localStorage
3. Toggleable filter chips for status and priority
4. Saved filter presets (Launch Fires, Code Queue, Post-Launch, All Open)
5. Kanban board view with 4 columns (Open, In Progress, Blocked, Done)
6. Session summary badge showing tasks completed today
7. Code queue badge in sidebar nav (cyan count from tags)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds manifest.json, sw.js (static-only caching, never admin routes),
placeholder cyan T icons (192 + 512), express.static middleware, and
PWA meta tags + service worker registration in layout.ejs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>