Closes Phase 2. Modules live on a mount, never in the image — that is what lets an operator add one to a pull-only deployment without building anything. `./modules` is a bind mount rather than a named volume: placing a module directory by hand is a supported install (MODULE_SYSTEM.md §2.5), and that has to be doable from the host rather than through `docker cp`. Read-write, because the admin panel's install/uninstall unpacks and removes directories there. The directory is tracked via its README so it exists in the checkout with the operator's own ownership — Docker recreates a missing bind-mount source as root:root, which the container user could not then write. `.dockerignore` excludes it so a module in the builder's working tree can never ship inside an image. Also corrects the route-manifest generator's list of filesystem-conditional mounts, which never picked up `/modules` when PR 7 added it. Comment only; the generator filters on an allowlist, so its behaviour was already right. Verified against a real container, not just a parsed compose file: image carries an empty node-owned /app/modules despite a module in the build context; a module on the bind mount loads, mounts, replays and reaches `started`; `/api/v1/public/modules` lists it; the chunk serves from the entry's directory only (server source and module.json 404) with `no-cache`; the injected tag follows core's bundle; and in Chrome the page renders on first paint inside core's PublicLayout with its nav row interleaved into core's public nav, under enforced `script-src 'self'` with zero CSP reports and no console errors. Removing the directory by hand reconciles the row to `startup_failed`/`require` and leaves core healthy with no injection. 933 server + 160 client tests pass, manifest unchanged at 230 routes, swagger regenerates byte-identical. Co-Authored-By: Claude <noreply@anthropic.com>
68 lines
1.9 KiB
Plaintext
68 lines
1.9 KiB
Plaintext
# dependencies
|
|
node_modules/
|
|
client/node_modules/
|
|
server/node_modules/
|
|
|
|
# build output
|
|
client/dist/
|
|
|
|
# test coverage (generated in CI for SonarQube)
|
|
server/coverage/
|
|
coverage/
|
|
|
|
# env / secrets
|
|
.env
|
|
*.env
|
|
!.env.example
|
|
|
|
# runtime data
|
|
server/uploads/
|
|
uploads/
|
|
server/logs/
|
|
logs/
|
|
|
|
# Installed modules (docs/website/MODULE_SYSTEM.md). Core ships no module, so
|
|
# anything here is an operator's install or a developer's scratch copy. The
|
|
# directory itself IS tracked, via its README: docker-compose.yml bind-mounts it,
|
|
# and a missing bind-mount source is recreated by Docker as root-owned.
|
|
modules/*
|
|
!modules/README.md
|
|
|
|
# Operator-supplied spawn atlas artwork. Creature art is never committed: sprites
|
|
# are extracted from the operator's own UO client .mul/.uop files and are theirs,
|
|
# not ours to redistribute. The images live under server/uploads/atlas/, already
|
|
# ignored above; this is the slug -> file-name map pointing at them.
|
|
# See docs/website/SPAWN_ATLAS.md and db/data/spawnAtlas.art.example.json.
|
|
server/db/data/spawnAtlas.art.json
|
|
|
|
# Operator-supplied cliloc table. UO's localization strings are EA's, extracted
|
|
# from the operator's own client and converted once (docs/website/CLILOCS.md);
|
|
# the repo ships no string table, for the same reason it ships no artwork and no
|
|
# map snapshot. This covers the conventional in-repo location — the supported
|
|
# arrangement is a path OUTSIDE the repo, set from Admin → Shard.
|
|
server/db/data/cliloc*
|
|
server/db/data/clilocs.*
|
|
# The build output of tools/cliloc-export (a throwaway helper, not a package).
|
|
server/tools/cliloc-export/bin/
|
|
server/tools/cliloc-export/obj/
|
|
|
|
# reference material (extracted from the provided archives)
|
|
_reference/
|
|
|
|
# logs / os
|
|
*.log
|
|
npm-debug.log*
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# editor / tooling local settings
|
|
.claude/settings.local.json
|
|
.vscode/
|
|
.idea/
|
|
|
|
# local planning docs (not part of the tracked codebase)
|
|
.plans/
|
|
|
|
# scratch / temp scripts
|
|
_*.ps1
|