refactor(data): restructure content directory for galaxy scale

Replace flat content/districts/ with hierarchical campaign/system/
station/district structure. Path mirrors canonical IDs, enables
glob-based discovery, and is multi-campaign/DLC ready.

- git mv 46 files preserving history
- New metadata: campaign.yaml, system.yaml, station.yaml
- Rewrite content.yaml with glob-based district discovery
- Add campaign, system, station JSON schemas
- Update district schema: hierarchy fields derived from path
- Update npc-profile schema: accept district-scoped IDs
- Add TODO to 17 dialogue/monologue pool files for generator revision
- Update _meta/README.md with new hierarchy documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-12 21:22:23 +01:00
co-authored by Claude Opus 4.6
parent 8cd7ef21ae
commit 9d53869ca7
73 changed files with 196 additions and 36 deletions
+44
View File
@@ -4,3 +4,47 @@ Directories prefixed with `_` are infrastructure, not game content. The server c
- `_meta/` — Infrastructure metadata (this directory)
- `_schema/` — JSON Schema validation files (draft 2020-12)
## Directory Hierarchy
Content is organized hierarchically to match the game universe:
```
content/
content.yaml # Manifest: campaign list, glob discovery patterns
global/ # Cross-campaign shared content (factions, enums, knowledge)
campaigns/
{campaign}/ # e.g., "main"
campaign.yaml
systems/
{system}/ # e.g., "krenn"
system.yaml
stations/
{station}/ # e.g., "sova"
station.yaml
districts/
{district}/ # e.g., "transit"
district.yaml
npcs/
locations/
triangles/
dialogue/
monologue/
routines/
templates/
```
## Canonical ID Derivation
Identity is derived from directory path at load time — no redundant ID fields in YAML.
- **District:** `{system}.{station}.{district}` (e.g., `krenn.sova.transit`)
- **NPC (within district):** `npc:{slug}` (e.g., `npc:kael-davan`)
- **NPC (cross-district):** `npc:{district}.{slug}` (e.g., `npc:transit.kael-davan`)
- **Location:** `{system}.{station}.{district}.location.{slug}`
## Content Discovery
The loader reads `content.yaml` for enabled campaigns and their glob patterns.
District discovery uses `systems/**/districts/*/district.yaml` — no per-district
manifest entry needed. Adding a district = creating a directory with district.yaml.