Repro
box install wheels-base-template # 4.0.3
ls db/
# => doesn't exist
unzip -l wheels-base-template.zip | grep db/ matches nothing.
Expected
The conventional db/ directory ships (the LuCLI wheels new template ships db/), so SQLite/H2 file paths under db/ work without a manual mkdir.
Actual
No db/ in the published zip, even though tools/build/scripts/prepare-base.sh:34 does cp -r db "${BUILD_DIR}/" and db/.keep exists at the v4.0.3 tag.
Root cause
tools/build/base/.gitignore (copied into the build dir as the package .gitignore) contains /db/**, and CommandBox package publish honors .gitignore patterns — so the directory is silently stripped from the zip. Other .keep files (vendor/.keep, tests/_assets/**/.keep) ship fine, confirming it's the ignore pattern, not a .keep/empty-dir limitation.
Suggested fix
Either drop /db/** from tools/build/base/.gitignore and rely on box.json ignore only for publish-time exclusions, or keep the gitignore for end users but whitelist the keep file (!/db/.keep). Add a publish-time assertion (the release.yml 'Validate Package Structure' step) that db/ is present in the prepared directory AND in the final zip.
Evidence from audit journey j1-template-install (wheels-base-template 4.0.3 zip inspected from CommandBox artifact cache, 2026-06-12).
Repro
unzip -l wheels-base-template.zip | grep db/matches nothing.Expected
The conventional
db/directory ships (the LuCLIwheels newtemplate shipsdb/), so SQLite/H2 file paths underdb/work without a manualmkdir.Actual
No
db/in the published zip, even thoughtools/build/scripts/prepare-base.sh:34doescp -r db "${BUILD_DIR}/"anddb/.keepexists at the v4.0.3 tag.Root cause
tools/build/base/.gitignore(copied into the build dir as the package.gitignore) contains/db/**, and CommandBoxpackage publishhonors .gitignore patterns — so the directory is silently stripped from the zip. Other.keepfiles (vendor/.keep,tests/_assets/**/.keep) ship fine, confirming it's the ignore pattern, not a .keep/empty-dir limitation.Suggested fix
Either drop
/db/**fromtools/build/base/.gitignoreand rely on box.jsonignoreonly for publish-time exclusions, or keep the gitignore for end users but whitelist the keep file (!/db/.keep). Add a publish-time assertion (the release.yml 'Validate Package Structure' step) thatdb/is present in the prepared directory AND in the final zip.Evidence from audit journey j1-template-install (wheels-base-template 4.0.3 zip inspected from CommandBox artifact cache, 2026-06-12).