-
2026-08-23 —
FileNaminggains a base-name mode:base_names=Trueacts on the map-suffix-free base of a texture file name (file_utils/file_naming.py). Every operation already worked on the stem, never the extension;base_namesnarrows that one step further, splitting each stem into(base, tail)at its texture-map suffix (_Normal,-basecolor,rockAO) plus any UDIM tile, running the operation on the base and re-attaching the tail.find,rename,set_caseandstrip_charsall take it. That makes one rename carry a whole texture set —rock_Normal,rock_AOandrock_ORM.1001share the baserock— instead of leaving every map with a name that no longer identifies it, and it stops a trailingstrip_charsfrom eating the suffix rather than the name. The split itself is a new registry primitive,MapRegistry.split_map_suffix— it composessplit_tile_tokenwithget_suffix_strip_patternin the one order that works (the tile hides the suffix if it is not taken off first), and it is placed there rather than onFileNamingbecause that pattern's own docstring records two hand-rolled copies of this sequence having drifted already; a third raw consumer is the next chance to drift.ImgUtils.get_base_texture_namenow takes the primitive too, dropping its copy of the plumbing, and a test asserts the two agree. A stem with no registered suffix splits to(stem, ""), so a mixed directory is safe. Default is off — existing callers are byte-for-byte unaffected. -
2026-08-23 — CI only: the post-publish
bump-devbot is retired andpublish.ymlno longer dispatches it.m3trik/push.ps1now steps the release version from what PyPI has and makes a singleRelease X.Y.Zcommit, so the placeholder bump ondevwas dead weight — and the reason every release of this package consumed two or three version numbers (PyPI:0.9.26 → 0.9.28 → 0.9.30). Invariant after a release:dev == main. No code change; nothing publishes from this delta.