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).
132 lines
9.1 KiB
Markdown
132 lines
9.1 KiB
Markdown
# Code Status Update
|
||
**Last Updated:** 2026-04-15 (post-launch, late night — Michael away)
|
||
|
||
## Environment Change
|
||
Now running **locally on the Nitro** (Windows 11) instead of the remote dev server. Working directory: `C:\Users\mkrau\firefrost-services`. Git remote still pushes to Gitea. Git identity configured repo-local as `Claude Code <claude@firefrostgaming.com>`.
|
||
|
||
## Current Focus
|
||
Bridge queue empty. Launch went out earlier with reaction-roles + Carl-bot migration shipped (`f4f96df`). Bitch Bot scaffold complete on Nitro, awaiting Dev Panel compile.
|
||
|
||
## Post-Launch Session 2026-04-15
|
||
|
||
### Shipped
|
||
- **REQ-2026-04-15-reaction-roles** (`f4f96df`) — pre-launch dispatch. Reaction roles for #get-roles (3 messages, 20 emoji→role mappings), Wanderer auto-assign + welcome DM on `guildMemberAdd`, link-reminder DM after Stripe checkout. Added `GuildMessageReactions` + `DirectMessages` intents and `Partials.Message/Channel/Reaction` to client. All silent-fail.
|
||
- **REQ-2026-04-15-bitch-bot** — full source scaffold. NeoForge 1.21.1 mod, 7 Java files + gradle config + mods.toml + sample-provision.json + project CLAUDE.md. Mirrors rules-mod/1.21.1 layout. **NOT compiled — Java/Gradle not available on Nitro per CLAUDE.md. Compile on Dev Panel.**
|
||
- Files: `BitchBot.java` (entry + ServerStartedEvent), `Provisioner.java` (sequenced step runner with per-step try/catch), `ProvisionConfig.java` (Gson POJO), `SchematicLoader.java` (HTTP + SHA-256 + Sponge v2 .schem parser using `NbtIo.read` + varint decode + palette resolution via `BlockStateParser`), `CommandBlockPlacer.java` (impulse command blocks with `/tp @p [origSpawn]` baked into `CommandBlockEntity`), `SignPlacer.java` (oak signs, 4-line front text via `SignBlockEntity#setText`), `YawpConfigWriter.java` (drops region JSON to `world/serverconfig/yawp/regions/`), `SelfDestruct.java` (locates own jar via `ProtectionDomain` and renames to `.jar.disabled`)
|
||
- Build: `cd services/bitch-bot/1.21.1 && source use-java 21 && /opt/gradle-8.8/bin/gradle build --no-daemon` → `build/libs/BitchBot-1.0.0-neoforge-1.21.1.jar`
|
||
- **Risk areas to test on first compile:** Sponge v2 schematic parser (untested against real WorldEdit output), command block NBT persistence, YAWP file format (best guess at schema — may need a tweak in `YawpConfigWriter` once we see what YAWP actually expects). All failures log gracefully and skip self-destruct so Bitch Bot can be retried.
|
||
|
||
## Session Summary (2026-04-14 Evening)
|
||
|
||
### Rules Mod 1.18.2 Builds — DONE ✅
|
||
- Ported both Firefrost Rules and Discord Rules to Forge 1.18.2-40.2.4
|
||
- API changes: TextComponent, sendMessage(comp, Util.NIL_UUID), getPlayer()
|
||
- ForgeGradle 6.0 + Gradle 8.8 + Java 17
|
||
- Jars: `firefrostrules-1.0.5-1.18.2-forge.jar`, `discord-rules-1.0.5-1.18.2-forge.jar`
|
||
- Both mods now have 4 versions each: 1.16.5, 1.18.2, 1.20.1, 1.21.1
|
||
|
||
### Version UI in Server Matrix — DONE ✅
|
||
- Added installed version display to both TX1 and NC1 card loops in `_matrix_body.ejs`
|
||
- Uses `<% var %>` assignment pattern to avoid single-quote EJS breakage
|
||
- Edit button, save/cancel, version history viewer via HTMX
|
||
- EJS validates clean
|
||
|
||
### PWA Phase 1 — DONE ✅
|
||
- `manifest.json` — standalone app config, cyan theme, app ID
|
||
- `sw.js` — conservative static-only caching, never caches admin routes
|
||
- Placeholder icons (cyan T, 192 + 512) in `src/public/images/`
|
||
- `express.static` middleware added to `src/index.js`
|
||
- PWA meta tags + Apple mobile web app + service worker registration in `layout.ejs`
|
||
|
||
### Task Module — 7 Features — DONE ✅
|
||
1. Slide-out detail panel (click task title → full info overlay from right)
|
||
2. Client-side sorting (number, priority, status, updated) persists in localStorage
|
||
3. Toggleable filter chips (status + priority, multi-select)
|
||
4. Saved filter presets (Launch Fires, Code Queue, Post-Launch, All Open)
|
||
5. Kanban board view (4 columns, toggle persists in localStorage)
|
||
6. Session summary badge ("X tasks completed today")
|
||
7. Code queue badge in sidebar nav (cyan count from tasks tagged 'code')
|
||
- Route updated: added completedToday query, allTasks for kanban
|
||
- Admin middleware: code queue count query for sidebar badge
|
||
|
||
## Earlier Session (2026-04-14)
|
||
|
||
### Server Command Center — CODE COMPLETE ✅
|
||
- Full Arbiter feature build (migrations, services, routes, views)
|
||
- Pending deploy by Michael (see previous ACTIVE_CONTEXT for deploy steps)
|
||
|
||
## Previous Session (2026-04-13)
|
||
|
||
### Task #69: Discord Rules CurseForge Fork — DONE ✅
|
||
- All builds at v1.0.5 (now 4 firefrostrules + 4 discordrules)
|
||
- CurseForge project page copy pending from Chronicler
|
||
|
||
### Rules Mod Config Bug — FIXED ✅
|
||
- v1.0.5 WORKING on Otherworld
|
||
|
||
## Session 2026-04-15 (local Nitro)
|
||
|
||
### Shipped
|
||
- **Task #166 — Trinity Console Issue Tracker** (`b0b69fb`, +916 lines)
|
||
- Migration 141: `issues`, `issue_attachments`, `issue_comments` tables + indexes
|
||
- `src/routes/admin/issues.js` — session-auth UI routes (list/new/detail/status/assign/comments/upload/attachment-serve)
|
||
- `src/routes/api.js` — `/api/internal/issues*` bearer-token REST surface for n8n
|
||
- `src/services/issueNotifier.js` — Discord webhook dispatcher (`DISCORD_ISSUE_WEBHOOK_URL`), silent-fail
|
||
- Views: `index.ejs` (list+filters+stats), `new.ejs` (mobile-first, `accept="image/*"` for phone camera roll), `detail.ejs` (screenshots w/ lightbox, workflow controls, comments)
|
||
- `layout.ejs` sidebar nav link
|
||
- `package.json` adds `multer ^1.4.5-lts.1`
|
||
- CSRF token passed via query string on multipart forms (csurf runs before multer parses body)
|
||
- Screenshots stored at `services/arbiter-3.0/uploads/issues/`, 10 MB/file × 6 max, image MIME filter, path-traversal guard
|
||
- All 4 EJS files validated via `ejs.compile()`, all JS `node --check` clean
|
||
- **Deploy:** `cd /opt/arbiter-3.0 && git pull && npm install && mkdir -p uploads/issues && psql -U arbiter -h 127.0.0.1 -d arbiter_db -f migrations/141_issues.sql && pm2 restart arbiter-3`. Optional: `DISCORD_ISSUE_WEBHOOK_URL` in `.env`.
|
||
|
||
- **Task #163 — Task Description Hygiene Backfill** (`263a7e3`)
|
||
- `scripts/backfill-task-descriptions.js` — reads ops manual archive, strips YAML frontmatter, emits `UPDATE tasks` SQL with `$body$…$body$` dollar quoting
|
||
- Guard: `AND (description IS NULL OR description = '')` — safe to re-run
|
||
- Output: `scripts/out/backfill-task-descriptions.sql` (575 lines), `.md` report
|
||
- **Matched 6/15** from archive: #99, #100, #104, #105, #106, #113
|
||
- **Missing 9** (no archive file, need manual copy): #22 Netdata, #23 Department Structure, #32 Terraria Branding, #48 n8n Rebuild, #49 NotebookLM, #51 Ignis Protocol, #81 Memorial Writing Assistant, #89 DERP Protocol Review, #97 Trinity Console Social Hub
|
||
- **Apply:** `psql -U arbiter -h 127.0.0.1 -d arbiter_db -f scripts/out/backfill-task-descriptions.sql`
|
||
- Note: REQ header claimed 16 tasks but table lists 15 — worked from the table
|
||
|
||
### Archived (no-op verifications)
|
||
- **REQ/RES-2026-04-14-server-command-center** — verified code-complete in `d16a525` (full build) and `a193523` (subdomain + Cloudflare provisioning per RES-2026-04-14-subdomain-seed-data). Migration 139, seed JS, `uptimeKuma.js`, `pterodactyl.js`, `/provision-subdomain` route all present. **Pending Michael's deploy on dev panel.**
|
||
- **REQ-2026-04-14-code-queue-badge-fix** — verified already implemented in `166e4c8` ("Task module: 7 UX features"). Middleware in `admin/index.js` lines 31–42, badge span in `layout.ejs` lines 105–110. Archived as no-op. If badge still not showing after deploy, check whether any open/in_progress tasks actually have `'code'` in their `tags` array — badge correctly hides at count 0.
|
||
|
||
## Pending Bridge Requests
|
||
|
||
### Deferred (post-launch, not urgent)
|
||
- **REQ-2026-04-12-phase11e-gitbook-scope** — GitBook integration scope for ModpackChecker. Explicitly held per Michael.
|
||
|
||
### Previously Completed (can be archived on next pass)
|
||
- REQ-2026-04-14-version-ui-matrix ✅
|
||
- REQ-2026-04-14-pwa-phase1 ✅
|
||
- REQ-2026-04-14-task-module-improvements ✅
|
||
- REQ-2026-04-14-rules-mod-1182 ✅
|
||
|
||
### Previously Completed (can be archived)
|
||
7. REQ-2026-04-12-discord-rules-fork — ✅ Done
|
||
8. REQ-2026-04-12-phase11-prerequisites — ✅ Done
|
||
9. REQ-2026-04-12-phase11a-deploy — ✅ Done
|
||
10. REQ-2026-04-12-phase11bc-deploy — ✅ Done
|
||
11. REQ-2026-04-12-phase11d-badge-debug — ✅ Done
|
||
12. REQ-2026-04-12-phase11d-badge-decision — ✅ Done
|
||
13. REQ-2026-04-12-phase11d-deploy — ✅ Done
|
||
14. REQ-2026-04-13-arbiter-discord-roles — ✅ Done
|
||
15. REQ-2026-04-13-missing-modpack-installations-migration — ✅ Done
|
||
16. REQ-2026-04-13-rules-mod-config-fix-versioning — ✅ Done
|
||
17. REQ-2026-04-13-rules-mod-config-not-read-at-runtime — ✅ Done
|
||
18. REQ-2026-04-13-rules-still-returning-defaults — ✅ Done
|
||
19. REQ-2026-04-13-status-route-mismatch — ✅ Done
|
||
20. REQ-2026-04-13-v110-consolidated-deploy — ✅ Done
|
||
|
||
## Standing Items
|
||
- ModpackChecker v1.1.0 deploy blocked on CurseForge API rate limit
|
||
- CurseForge Discord Rules project page pending Chronicler copy
|
||
- Build router at `/opt/mod-builds/ffg-build.sh`
|
||
|
||
## Discipline Notes
|
||
- CHANGELOG.md updated with every version bump
|
||
- ACTIVE_CONTEXT.md updated at end of each work session
|
||
- EJS validated before every commit
|