Repository navigation
Seafile Vault CLI v0.2.0
Highlights
- Added a secure streamed
downloadcommand with bounded reads, SHA-256 results, mode-0600 temporary files, held parent-directory descriptors, and atomic publish/overwrite behavior. - Added file-only
statfor direct remote metadata and deterministicremote_not_founderrors. - Added
list --compact,--recursive, and--type file|dir; compact output omits modifier emails, lock metadata, object/repository IDs, and other Seafile internals. - Added idempotent
mkdir --parents. - Plain
mkdirnow rejects exact-name conflicts instead of allowing Seafile to silently create names such asHousing (1).
Safety and correctness
- Temporary download links remain internal to
downloadand are redacted from errors. - Destination symlinks, directories, and special files are rejected.
- Partial writes, truncated responses, size-limit failures, HTTP failures, and missing remote files do not publish partial downloads or corrupt an existing destination.
- Download destination operations use a held parent directory descriptor for validation, temporary creation, atomic publication, cleanup, and fsync.
- Seafile directory-create responses are checked for implicit conflict renames; unexpected renamed directories are cleaned up and reported as errors.
Verification
- 195 local tests passed with Ruff clean.
- GitHub Actions passed on Python 3.11, 3.12, and 3.13, followed by wheel/sdist build and artifact verification.
twine checkpassed for both release artifacts.- Clean wheel installation passed CLI and optional MCP smoke tests.
- A reversible live Seafile smoke test passed recursive/idempotent mkdir, conflict rejection, upload, stat, compact/recursive listing, download, no-overwrite, overwrite, SHA-256 verification, missing-file handling, and complete remote cleanup.
AGPL-3.0-only.