feat(mods): replace packwiz with distribution-fed custom mod volume
Drop packwiz entirely. The server now loads a filtered mod subset from a local ./server-mods volume instead of fetching a packwiz pack at boot. New flow: - tooling/classify-mods.py (tomllib only, no network) reads each jar's META-INF/neoforge.mods.toml and seeds mods-sides.json with a side (client|server|both; default both). Existing entries are preserved. - mods-sides.json: committed, keyed by jar filename, hand-editable override surface. Initial seed: 65 both, 11 client, 0 server (76 jars). - tooling/sync-server-mods.sh mirrors the both/server jars from $DISTRIBUTION_WEB_ROOT into ./server-mods/ (authoritative; prunes strays; halts on a missing jar). Replaces render-pack.sh. - compose: minecraft mounts ./server-mods:/mods:ro with REMOVE_OLD_MODS=TRUE (itzg auto-syncs /mods -> /data/mods). Removed PACKWIZ_URL, the pack. extra_host (auth. kept for authlib), and depends_on caddy (drasl kept). Both classify-mods.py and sync-server-mods.sh resolve their source dir as: CLI arg / MODS_DIST_DIR env / $DISTRIBUTION_WEB_ROOT (in that order). Removed: tooling/render-pack.sh + add-custom-mod.sh (packwiz tooling), pack/ (packwiz source), custom/ (76 jars now sourced from the distribution), the pack. caddy vhost + its mounts/alias, and the packwiz .gitignore block. Client distribution is UNCHANGED: HeliosLauncher still installs the full modset from distribution.json. Docs (CLAUDE.md, plan/04/05/14, runtime) updated; plan/04-packwiz.md stubbed as superseded by plan/04-mods.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,37 +1,7 @@
|
||||
# packwiz — modpack source of truth
|
||||
# packwiz — modpack source of truth (SUPERSEDED)
|
||||
|
||||
## Summary
|
||||
|
||||
`packwiz` (installed at `~/go/bin/packwiz`) authors the modpack. The `./pack`
|
||||
directory is the **single source of truth** for mods, consumed by both:
|
||||
- the **server** (itzg `PACKWIZ_URL`), and
|
||||
- **clients** (Fjord launcher imports the pack / packwiz-installer).
|
||||
|
||||
Caddy serves `./pack` at `pack.ulicraft.net`. packwiz emits **metadata**
|
||||
(`pack.toml`, `index.toml`, `mods/*.pw.toml`); the `.pw.toml` files reference
|
||||
Modrinth/CF **CDN URLs**, so server and clients fetch the jars from those CDNs.
|
||||
The stack assumes the internet is present.
|
||||
|
||||
## Behaviors confirmed
|
||||
|
||||
- **Prune**: packwiz-installer tracks a manifest and **removes** client mods no
|
||||
longer in the index on re-run. (Server side via itzg likewise re-syncs.)
|
||||
- **Download source**: jars come from the CDN URLs in `.pw.toml`, not the pack
|
||||
host (which serves only metadata).
|
||||
- **itzg side filtering**: itzg downloads **server-side mods only**. Client-only
|
||||
mods MUST be tagged `side = "client"` (not `both`) or the server may pull and
|
||||
crash on them.
|
||||
|
||||
## NeoForge pinning
|
||||
|
||||
`pack.toml` pins MC `1.21.1` + NeoForge `21.1.x`. Verify exact NeoForge build
|
||||
against projects.neoforged.net before locking.
|
||||
|
||||
## Tasks
|
||||
|
||||
- [ ] `packwiz init` → `./pack` (MC 1.21.1, modloader neoforge, pinned version)
|
||||
- [ ] Curate mod shortlist (perf/tech/magic/storage/QoL/worldgen/map/voice)
|
||||
- [ ] Tag client-only mods `side = "client"`
|
||||
- [ ] `packwiz refresh`; verify `index.toml` committed (clients fetch it)
|
||||
- [ ] Point server `PACKWIZ_URL=http://pack.ulicraft.net/pack.toml`
|
||||
- [ ] Test install end-to-end on a fresh client
|
||||
> **Superseded by [`04-mods.md`](04-mods.md).** packwiz has been removed.
|
||||
> The server now loads a filtered mod subset from a local `server-mods/` volume
|
||||
> (synced from the distribution repo by `tooling/sync-server-mods.sh`); clients
|
||||
> still get the full set from the HeliosLauncher `distribution.json`.
|
||||
> See `04-mods.md` for the current design.
|
||||
|
||||
Reference in New Issue
Block a user