Python CLI that validates i3dMappings in all FS25 mod XML files listed in modDesc.xml, with VS Code problem matcher support.
- Validates all i3dMappings in all XML files declared in modDesc.xml
- Checks that i3dMapping node paths exist in their corresponding I3D scene graphs
- Detects duplicate mapping IDs and duplicate mapped node paths
- Detects unused mappings and common name mismatches
- Detects references to non-existent mapping IDs or node paths
- Verifies that all referenced files in XML and I3D files exist in the mod folder
- VS Code task and problem matcher bootstrap via --init
- Built-in mod ZIP packaging via --package
- Python 3.12+
- Optional: uv for local development workflows
Install from source in editable mode:
uv syncOr with pip:
pip install -e .Run the checker on a mod folder that contains a modDesc.xml:
fs25-mod-checker path\to\mod\folderThe checker automatically:
- Parses modDesc.xml to find all storeItem XML files
- For each XML file, derives the i3d filename (same stem,
.i3dextension) - Runs all checks on each file pair
Output format (VS Code matcher compatible):
absolute\path\to\file.xml:line:1: warning: rule-id: message
Note: column is currently emitted as 1.
Initialize VS Code workspace tasks using the mod folder argument:
fs25-mod-checker path\to\mod\folder --initThis creates or updates .vscode/tasks.json with:
- Check Mod (fs25-mod-checker) — pre-filled with the mod folder path
- Package Mod (Create ZIP) — packages the current workspace
Without a mod folder argument, --init still works but doesn't pre-fill the mod path:
fs25-mod-checker --initMore details: .vscode/PROBLEM_MATCHER_SETUP.md
fs25-mod-checker --packageOptional output path:
fs25-mod-checker --package --output .\releases\MyMod.zipfs25-mod-checker --version| Code | Description |
|---|---|
| invalid-node-path | i3dMapping points to a non-existent I3D node |
| duplicate-mapping-id | Same i3dMapping ID defined multiple times |
| duplicate-node-path | Multiple IDs map to the same I3D node path |
| unused-mapping-id | Mapping defined but never referenced |
| unused-mapping-id-invalid-node | Unused mapping with invalid node path |
| unused-mapping-id-name-mismatch | Unused mapping where node name does not match ID |
| reference-to-non-existent-id | Attribute references a non-existent mapping ID |
| reference-to-non-existent-path | Attribute references a non-existent I3D path |
| missing-reference-file | Referenced file in XML or I3D does not exist in mod folder |
Run tests:
uv run pytest --covRun type checking:
uv run pyrightRun checker on fixture mod folder:
uv run fs25-mod-checker tests/fixtures/FS25_VolvoEWR150E_Fippe3DModdingBuild Windows executable:
scripts\build.cmdBuild Python package:
uv build- Ensure tests pass locally.
- Ensure any release tag matches the version in pyproject.toml.
- Commit all changes.
- Push to GitHub.
Example:
git add .
git commit -m "Prepare docs, license, and CI"
git branch -M main
git remote add origin https://github.com/<your-user>/<your-repo>.git
git push -u origin mainThis project is licensed under the MIT License. See LICENSE.