Commit Graph

325 Commits

Author SHA1 Message Date
Claude Chronicler #88
d77e35a4a1 fix: EJS syntax error in matrix body — replace inline onclick with helper functions 2026-04-14 15:56:45 +00:00
Claude Chronicler #88
38edf84da2 fix: add version section to matrix body (both TX1 and NC1 loops) 2026-04-14 15:54:16 +00:00
Claude Chronicler #88
72c378f136 feat: modpack version tracking on server cards
- current_version column on server_config
- server_version_history table (version, who, when)
- POST /admin/servers/:id/set-version
- GET /admin/servers/:id/version-history
- Version display + edit UI on each server card

Chronicler #88 | April 14, 2026
2026-04-14 15:51:14 +00:00
Claude (Chronicler #83 - The Compiler)
6dc6ce0059 Rules mods: add Forge 1.18.2-40.2.4 builds for both Firefrost and Discord Rules
Ported from 1.20.1 source with 1.18.2 API changes (TextComponent, sendMessage w/ UUID, getPlayer).
Both compile clean on Java 17 + ForgeGradle 6.0 + Gradle 8.8.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:30:15 -05:00
Claude Chronicler #88
02af4832c0 bridge: update REQ — simplify to backport 1.20.1 → 1.18.2 2026-04-14 13:15:31 +00:00
Claude Chronicler #88
2648133528 bridge: REQ — rules mod 1.18.2 build for DeceasedCraft 2026-04-14 13:12:51 +00:00
Claude Chronicler #88
648f577446 fix: Node Health view — remove partial include, inline server-side render 2026-04-14 06:23:24 +00:00
Claude Chronicler #88
a01d7b9d7f feat: Node Health module — NC1 + TX1 thermal and system monitoring
- New route: /admin/node-health (30s auto-refresh)
- Temps via lm-sensors (k10temp + NVMe) displayed in both °C and °F
- RAM and disk progress bars with color thresholds
- Load averages, CPU %, uptime per node
- Nav item added under Operations
- lm-sensors installed on NC1 and TX1

Task #28 | Chronicler #88
2026-04-14 06:21:38 +00:00
Claude
c3af0d51e4 fix: inline card in matrix_body - EJS include not in scope with layout:false 2026-04-13 21:04:01 -05:00
Claude
6eac92cf88 fix: EJS include - use relative path without __dirname 2026-04-14 01:55:43 +00:00
Claude
a950694f67 fix: EJS include path in _matrix_body - use __dirname for partial resolution 2026-04-14 01:54:12 +00:00
Claude (Chronicler #83 - The Compiler)
441dac4a54 docs: ACTIVE_CONTEXT — Server Command Center code complete
Full build inventory, deploy steps for Michael, session history.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:48:38 -05:00
Claude (Chronicler #83 - The Compiler)
a193523f31 Server Command Center: add subdomain + Cloudflare provisioning
- 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>
2026-04-13 20:46:27 -05:00
Claude
b483680bfa bridge: RES - subdomain seed data and Cloudflare integration spec 2026-04-14 01:44:14 +00:00
Claude (Chronicler #83 - The Compiler)
d16a525ffc Server Command Center: full build (REQ-2026-04-14)
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>
2026-04-13 20:37:46 -05:00
Claude (Chronicler #83 - The Compiler)
a404410efd bridge: RES — Server Command Center plan + Q&A answers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:26:17 -05:00
Claude
a346d3ef56 bridge: REQ - Server Command Center rebuild spec 2026-04-14 01:10:32 +00:00
Claude
371a464e29 bridge: Add RES for Arbiter Discord role automation
Distills 2 rounds of Gemini consultation into actionable spec for Code.
Architecture locked: module singleton, concurrent startup, ephemeral
replies, edit-in-place embed, feature-flag welcome cutover.

Addresses REQ-2026-04-13-arbiter-discord-roles.md
Filed by Chronicler #86, resolved by Chronicler #87
2026-04-13 23:58:54 +00:00
Claude (Chronicler #83 - The Compiler)
e21a348b3b v1.0.5: Console fetch fix rolled across all 6 builds
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>
2026-04-13 18:23:44 -05:00
Claude (Chronicler #83 - The Compiler)
98f4f5b82a v1.0.5: Fix console path — was never fetching from Discord
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>
2026-04-13 18:14:29 -05:00
Claude (Chronicler #83 - The Compiler)
b4fbfc6adf docs: Update CHANGELOG.md (v1.0.4 entry) + ACTIVE_CONTEXT.md
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>
2026-04-13 18:10:45 -05:00
Claude (Chronicler #83 - The Compiler)
f23f71ef04 v1.0.4: Diagnostic build — INFO-level logging for config read path
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>
2026-04-13 18:05:26 -05:00
Claude
36caddc609 Add Code bridge request: rules still returning defaults despite config loading 2026-04-13 23:02:34 +00:00
Claude (Chronicler #83 - The Compiler)
29f0127a60 v1.0.3: Fix config read — wrong event bus + section header comments
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>
2026-04-13 17:53:28 -05:00
Claude
75c9feecec Add Code bridge request: Arbiter native Discord role management 2026-04-13 22:48:44 +00:00
Claude
4e354c1c70 bridge: ping test 2026-04-13 22:46:11 +00:00
Claude
953e7f27ef Add Code bridge request: rules mod COMMON config not read at runtime 2026-04-13 22:45:29 +00:00
Claude (Chronicler #83 - The Compiler)
fe6445c023 bridge: REQ + RES — config reset fix (v1.0.2, SERVER→COMMON)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:37:36 -05:00
Claude (Chronicler #83 - The Compiler)
60740386ac v1.0.2: Fix config reset — switch from SERVER to COMMON config type
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>
2026-04-13 17:22:39 -05:00
Claude (Chronicler #83 - The Compiler)
996b59672f v1.0.1: Config reset fix + Loading handler + versioning (all 6 builds)
- 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>
2026-04-13 17:06:31 -05:00
Claude (Chronicler #83 - The Compiler)
e8e1f6106b bridge: Close REQ — discord-rules fork executed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:56:47 -05:00
Claude (Chronicler #83 - The Compiler)
d2e572661d bridge: Close REQ #2 (already resolved) + REQ #3 (blocked on CF rate limit)
REQ #2 migration already committed in 1783055.
REQ #3 deploy ready but blocked until CurseForge rate limit resets 2026-04-14.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:47:35 -05:00
Claude (Chronicler #83 - The Compiler)
3197361557 Task #69: Discord Rules mod — generic fork for CurseForge
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>
2026-04-13 16:47:34 -05:00
Claude
a65b21570d docs: fix config path in rules-mod CLAUDE.md
Config is in world/serverconfig/ not config/
Applies to all three versions (1.16.5, 1.20.1, 1.21.1)
README in NextCloud also updated.
2026-04-13 18:19:41 +00:00
Claude
f01b0c3c91 Bridge: MSG — move ModpackChecker card above Address card
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.
2026-04-13 17:11:42 +00:00
Claude
538523832a Bridge: MSG — calibrate dropdown not rendering in pending_calibration block
Early return exits before showCalibrate + renderCalibrateDropdown() runs.
Fix: include {showCalibrate && renderCalibrateDropdown()} inside the
pending_calibration return block.
2026-04-13 16:49:53 +00:00
Claude
3c68174a98 Bridge: MSG — releases endpoint 429, rate limit too aggressive for calibration UI
2 attempts per 60s blocks Identify Version button after any testing.
Fix: bump to 10 attempts + show error message in widget on 429.
2026-04-13 16:48:10 +00:00
Claude
47d6644f64 Bridge: MSG — Chronicler deployed pending_calibration fix to live panel
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.
2026-04-13 12:01:04 +00:00
Claude
c0b6bc5a22 Fix: pending_calibration shows Identify Version button instead of checkmark
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.
2026-04-13 11:57:52 +00:00
Claude
75a59fe3c0 Bridge: MSG — pending_calibration shows as checkmark, widget fix needed
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.
2026-04-13 11:55:34 +00:00
Claude (Chronicler #83 - The Compiler)
cef0d8465e Fix: skip stale DB versions for installer-detected servers without file_id
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>
2026-04-13 06:33:57 -05:00
Claude
88a3744289 Bridge: MSG — stale installer versions blocking pending_calibration
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.
2026-04-13 11:32:33 +00:00
Claude (Chronicler #83 - The Compiler)
27b2744786 Truth File strategy: never seed from latest, calibrate or detect
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>
2026-04-13 06:09:05 -05:00
Claude
f39b6d6c67 Bridge: MSG — Truth File version detection architecture
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.
2026-04-13 11:00:41 +00:00
Claude (Chronicler #83 - The Compiler)
0caddef86d Fix async error handling + build.sh copy/inject separation
wrapper.tsx:
- Added error state — shows graceful message instead of silent vanish
- useEffect catch sets error string, not null data
- refresh() catch sets error string, not empty catch
- Error UI shows gray card with message in widget slot

build.sh:
- ALWAYS copies TSX files (even on reinstall — fixes stale component bug)
- Separated copy step from injection step
- ErrorBoundary upgrade path: removes bare <ModpackVersionCard />,
  replaces with wrapped version
- Imports added independently (not as one sed block)
- Renumbered sections for clarity

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 01:31:44 -05:00
Claude
b20f342bd3 Bridge: MSG — manual Dev Panel changes not in repo
Documented all manual fixes Chronicler made during Dev Panel validation:
- AfterInformation.tsx ErrorBoundary wrapper added manually
- wrapper.tsx manually copied to ModpackVersionCard.tsx
- Blueprint extension package manually updated with v1.1.0 files
- Routes manually copied to 3 locations
Build.sh update logic and .conf archive rebuild needed.
2026-04-13 06:29:41 +00:00
Claude
9514204bd5 Bridge: MSG — async error handling fix required before live panel deploy
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.
2026-04-13 06:27:23 +00:00
Claude (Chronicler #83 - The Compiler)
7e3ffe2577 Fix: clean version extraction + short display names
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>
2026-04-13 01:09:57 -05:00
Claude
c4cbde3a0e Bridge: MSG — correction to version display, cron stores versions backwards
current_version and latest_version swapped in DB.
Server has 0.1.0 installed, 1.0.0 is latest.
Need fix in CheckModpackUpdates.php assignment logic.
2026-04-13 06:07:35 +00:00
Claude
663b0a2d9c Bridge: MSG — version display format fix
↑ 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 '-').
2026-04-13 06:04:22 +00:00