Tools
pack-validator
Section titled “pack-validator”Lives at tools/pack-validator/pack-validator.exe. The fastest way to use it is to double-click the exe inside a game install — it auto-finds the game root and validates every pack present.
Every platform ships it (1.15.6+). The macOS and Linux builds now bundle the validator too, compiled as a native binary at tools/pack-validator/pack-validator (no .exe). On those platforms run ./pack-validator wherever the examples below show pack-validator.exe; the flags and behaviour are identical.
Three workflows worth knowing:
Check one pack once:
pack-validator.exe path/to/your/packLive linting while you edit (terminal):
pack-validator.exe --quiet --watch path/to/your/packThe validator stays resident, polls the pack folder, and re-validates after every save. Ctrl-C exits.
Live linting in VS Code:
Open the game folder in VS Code (File → Open Folder). The shipped workspace config wires the validator into the editor:
- One-shot: press
Ctrl+Shift+B. Errors land in the Problems panel (Ctrl+Shift+M); click an entry to jump to the offending line. - Continuous watch:
Ctrl+Shift+P→Tasks: Run Task→ Validate packs (watch). The validator stays resident and re-validates after every file save. Stop it withCtrl+Cin its terminal panel.
See the editor setup reference for the full VS Code integration (tasks, snippets, file associations).
Standalone use
Section titled “Standalone use”You don’t need a game install nearby. The validator ships with the core trait, alias, and image-type catalogs baked in (~125 KB), so it works as a standalone single-file drop. Useful if you maintain packs across multiple game versions or want to validate against the latest format without updating your full install.
What it checks
Section titled “What it checks”package.xmlexists and is well-formedGirls.girlsx,Items.itemsx,Traits.traitsx, and random-girl templates parse cleanly- Every
<Girl>has a matchingCharacters/<Name>/folder - Every referenced trait, item, and alias resolves against the core catalog or the pack itself
- Image folders: manifest cross-check, unknown folder names, depth-1 cap, prefix/folder mismatches
- Duplicate names across packs
- Engine-version gating for
<Effect What="PregAdvance">, consumable<use>+<auto_use>blocks, and pack-shipped.traitsx - Structural pass over
<When>blocks in job XML - Authored trait contradictions in
.girlsx/.rgirlsx(1.15.6+): warns when a girl lists two traits from the same<MutexGroup>axis (“multiple BreastSize traits: … — only one can survive at load time; choose one explicitly”) or a direct<Excludes>pair (“Big Boobs excludes Small Boobs, but both are listed”). Checked against the merged core + pack trait registry, so it works even for axes you define in your own pack.
Autofix (1.15.6+) New
Section titled “Autofix (1.15.6+) New”The validator can repair two classes of mistake for you. Preview is the default — nothing is written unless you ask.
pack-validator.exe --autofix # dry-run: print what would change, write nothingpack-validator.exe --autofix-write # apply the fixes --autofix previewedIt does two things:
- Renames mistyped image folders to the names the engine actually reads. Recognised renames:
FootJob → Foot,HandJob → Hand,Portrait/Portraits/Face/Headshot → Profile,Nudes → Nude,Swimming → Swim,Dancing → Dance(case-insensitive match on the folder name). - Strips stale
<Image>entries from a character’simages.xmlwhoseFile=path no longer exists on disk.
Both are deliberately conservative — only changes that are safe and trivial to undo by hand:
- A rename is skipped if the target folder already exists (it never merges into it — the preview tells you to merge that one manually).
- A manifest strip never empties the list: if dropping the dead entries would leave zero resolvable images, the file is left untouched.
- Multi-line
<Image>entries are skipped (only single-line entries are removed).
After a preview, re-run with --autofix-write to apply.
Exit code
Section titled “Exit code”Errors → exit 1. Warnings alone don’t fail the exit code (they’re advisory). Plugs into any CI / release pipeline:
pack-validator.exe --quiet "$PACK_DIR" || exit 1scaffold-new-pack
Section titled “scaffold-new-pack”Ships as tools/pack-authoring-kit/tools/scaffold-new-pack.py and as the VS Code task New pack… (1.15.6+). Creates resources/packages/<Name>/ with a customised package.xml and the kit’s starter Items.itemsx / Traits.traitsx / Girls.girlsx / images.xml, so a fresh pack starts with something to read and adapt rather than an empty folder.
From VS Code: Ctrl+Shift+P → Tasks: Run Task → New pack…. Prompts for a name and an optional id.
From the terminal:
python3 tools/pack-authoring-kit/tools/scaffold-new-pack.py --name "My Pack" [--id my_pack] [--no-templates]--no-templates writes just package.xml. The script refuses to overwrite an existing folder — delete or rename the old one first if you’re regenerating.
Full description and Python prerequisites are in the editor setup reference.
Planned
Section titled “Planned”- Image tagger — assist with naming / manifest generation for a dropped folder of images. A good fit for an AI skill so it can read sibling packs for naming conventions and validate as it writes.