Bugfix release
Fixes a silent regression in the 0.0.9 zip-create ability: include_hidden=false was only skipping the top-level hidden directory entry itself. RecursiveIteratorIterator::SELF_FIRST does not stop descent when we continue on an entry, so files INSIDE a hidden directory (e.g. .git/objects/xxx) were still added because their basenames don't start with ..
The fix — inspired by the reference download-plugin — checks every segment of each entry's forward-slashed relative path. If any segment starts with ., the entry is excluded. Applied to both the archive assembly (append_dir_to_zip) and the pre-write size guard (estimate_tree_size).
Two small helpers were extracted to keep the iterator bodies tight: normalize_relative() and has_hidden_segment().
Migration
Regenerate any include_hidden=false archives that were produced on 0.0.9 against source trees that contained hidden directories — the 0.0.9 output silently included the full contents of every hidden directory beneath the source.
No breaking changes to REST endpoints, capability requirements, or database schema. Safe upgrade.