Commit Graph

315 Commits

Author SHA1 Message Date
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
Claude (Chronicler #83 - The Compiler)
9e3122c408 bridge: Response — status route exists, needs deploy + protocol reminder
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:56:25 -05:00
Claude
04815fe9ef Bridge: REQ — status route mismatch, widget 404s on page load
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.
2026-04-13 05:55:06 +00:00
Claude (Chronicler #83 - The Compiler)
03d7f87aff bridge: Response — modpack_installations fixed + gentle protocol note
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:46:01 -05:00
Claude (Chronicler #83 - The Compiler)
1783055c99 Fix: graceful handling of missing modpack_installations table
- 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>
2026-04-13 00:44:28 -05:00
Claude
a256aa2090 Bridge: REQ — missing modpack_installations migration file
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.
2026-04-13 05:42:54 +00:00
Claude (Chronicler #83 - The Compiler)
28608e9fa8 Build pipeline hardening: ErrorBoundary, no PHP copies, TS pre-flight
- ErrorBoundary.tsx wraps widget — crashes show fallback, not blank void
- build.sh v1.1.0: removed ALL PHP file copies (Chronicler deploys manually)
- Added set -e / set -u for fail-fast
- Added TypeScript pre-flight check (yarn tsc --noEmit) before build
- Added dynamic Blueprint controller detection via find
- Widget injection now wrapped in <ModpackErrorBoundary>
- Pre-commit PHP lint hook at scripts/pre-commit-hook.sh

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:17:30 -05:00
Claude
7b2f3f810b Bridge: dispatch — ErrorBoundary + build.sh hardening from Gemini consultation
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
2026-04-13 05:15:26 +00:00
Claude
60ab055754 Bridge: dispatch — build.sh clobbers PHP files, remove PHP copy steps 2026-04-13 05:08:23 +00:00
Claude
8c3a0abe26 Bridge: dispatch — fix */6 docblock in source file PERMANENTLY 2026-04-13 04:53:45 +00:00
Claude (Chronicler #83 - The Compiler)
be6b14bd67 Housekeeping: archive stale manifest.json dispatch from responses
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:50:00 -05:00