Skip to content

Tools

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/pack

Live linting while you edit (terminal):

pack-validator.exe --quiet --watch path/to/your/pack

The 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+PTasks: Run TaskValidate packs (watch). The validator stays resident and re-validates after every file save. Stop it with Ctrl+C in its terminal panel.

See the editor setup reference for the full VS Code integration (tasks, snippets, file associations).

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.

  • package.xml exists and is well-formed
  • Girls.girlsx, Items.itemsx, Traits.traitsx, and random-girl templates parse cleanly
  • Every <Girl> has a matching Characters/<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.

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 nothing
pack-validator.exe --autofix-write # apply the fixes --autofix previewed

It 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’s images.xml whose File= 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.

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 1

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+PTasks: Run TaskNew 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.

  • 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.