- Migration: added subdomain, server_ip, server_port columns
- Seed: rewritten with hardcoded identifiers + full subdomain/IP/port data
from Chronicler #87 audit (no more Pterodactyl API dependency)
- Route: POST /:id/provision-subdomain creates A + SRV records via
Cloudflare API, saves subdomain to server_config
- Card: subdomain section shows FQDN if provisioned, provision button
with inline input if not
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>
SERVER configs in world/serverconfig/ are tied to the world load/unload
lifecycle, causing Forge to overwrite edited values on every restart.
COMMON configs in config/ load once at startup and persist reliably.
Config location changed:
firefrostrules: config/firefrostrules-common.toml
discordrules: config/discordrules-common.toml
All 6 builds updated (3 firefrostrules + 3 discordrules).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added ModConfigEvent.Loading handler to detect default config on startup
- Warns clearly in logs when bot_token is still YOUR_TOKEN_HERE
- Bumped all 6 builds to 1.0.1 (3 firefrostrules + 3 discordrules)
- Created CHANGELOG.md and INSTALL.md with correct install procedure
- Updated CLAUDE.md with install procedure note
- 1.16.5 uses ModConfig.Loading (different class hierarchy from 1.20.1+)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fork firefrost-rules into discord-rules with configurable colors,
emoji strip toggle, MIT license, and generic branding. All 3 versions
compiled: 1.21.1 (NeoForge/NC1), 1.20.1 (Forge), 1.16.5 (Forge).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Holly feedback: card should be first thing seen when opening server console.
Especially important for pending_calibration servers after restart.
Post-launch: detect restart event and re-prompt version confirmation.
Early return exits before showCalibrate + renderCalibrateDropdown() runs.
Fix: include {showCalibrate && renderCalibrateDropdown()} inside the
pending_calibration return block.
Michael on mobile, Chronicler deployed directly via Trinity Core.
No code changes — existing wrapper.tsx + controller already had the fix.
Just needed frontend rebuild. 1939 modules compiled clean.
Chronicler #85 direct fix (Code unavailable on mobile):
- ModpackAPIController: add pending_calibration flag to serverStatus response
- wrapper.tsx: add pending_calibration to StatusData interface
- wrapper.tsx: render Identify Version button when pending_calibration is true
Replaces false green checkmark for servers needing calibration.
API returns configured:true + update_available:false for pending servers.
Widget needs pending_calibration flag in API response + TSX check.
DeceasedCraft showing green checkmark instead of Identify Version button.
Installer-method servers had full filenames as current_version (e.g.
"DeceasedCraft_Beta_DH_Edition_5.10.16") which prevented reaching
pending_calibration. Now only uses DB current_version if file_id is
also set (validated) or detection method isn't installer.
Migration clears existing stale rows → pending_calibration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DB fallback picks up old full filename strings before Truth File check.
installer-method servers never reach pending_calibration.
Fix: skip DB fallback for installer method unless current_file_id is set.
Plus one-time data cleanup needed.
CheckModpackUpdates:
- Reads .modpack-checker.json Truth File from server filesystem
- Falls back to manifest.json, extracts fileID, writes Truth File
- NEVER seeds current_version from latest API result
- Unknown version → status: pending_calibration (not up_to_date)
- Removed seedCurrentVersion heuristic — replaced with Truth File
- writeTruthFile() helper writes .modpack-checker.json via Wings
ModpackAPIController:
- calibrate() now writes Truth File after DB update
- Persists across server reinstalls and cron runs
wrapper.tsx:
- pending_calibration: shows "Version unknown" + "Identify Version" button
- Ignored servers: muted card with "Resume" button (not hidden)
- Extracted renderCalibrateDropdown() for reuse
- Error state shows message instead of vanishing
Migration:
- Updates existing unknown+detected rows to pending_calibration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete spec for Code:
- Stop seeding from latest (CRITICAL)
- Detection chain: DB → Truth File → manifest.json → pending_calibration
- Write Truth File on any successful detection + on calibration
- pending_calibration DB status + widget UI
- Muted card for ignore toggle (not return null)
- Migration for new status enum value
- DaemonFileRepository::putContent() for Truth File writes
Based on 3 rounds of Gemini consultation + live Wings API testing.
Gemini flagged: ErrorBoundary doesn't catch async failures.
useEffect .catch() silently hides widget, refresh catch{} is empty.
Need error state with graceful message before we push to live panel.
ModpackApiService: regex extracts semver from CurseForge displayName
"All the Mods 9-0.1.0" → version: "0.1.0", display_name: full string
Widget: short name + version helpers
"All the Mods 9 - ATM9" → "ATM9"
Display: "ATM9 0.1.0 → 1.0.0 ↑" (update) or "✓ ATM9 — 1.0.0" (current)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
↑ 1.0.0 → All the Mods 9-0.1.0 should read ↑ ATM9 1.0.0 → 0.1.0
Need short name from modpack_name (after ' - ') and
short version from latest_version (after last '-').
Widget calls /servers/{uuid}/status but route is /status (no uuid).
useEffect hits 404, widget shows nothing until manual refresh.
Option A preferred: register route with {server} param.
- Cron and controller wrap modpack_installations queries in try/catch
- Falls through to egg variable / file detection if table missing
- Added migration with IF NOT EXISTS for fresh installs
- Migration won't drop the table (may be Pterodactyl-owned)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Table exists on live panel but was never committed to repo.
Blocks fresh installs. Code needs to write the migration.
Schema captured from live panel via Trinity Core.
Priority order:
1. ErrorBoundary.tsx wrapping widget injection
2. set -e + tsc --noEmit pre-flight in build.sh
3. Pre-commit PHP lint hook
4. Dev Panel test before live panel