v0.5.0
First user-facing organization primitive: tag-based file labeling.
Backend-only release; desktop UI lands in v0.5.1.
Added
- Tag domain type + normalization (
perima-core).
Tag { id, name, first_seen }value type;normalize()applies
trim → NFC → lowercase withMAX_TAG_LEN = 64guard.
CoreError::InvalidTagvariant for validation failures.
TagRepositorytrait with 8 methods (upsert_tag,delete_tag,
attach,detach,list_tags,tags_for_hashes,
files_with_tag,count_files_for_tag). - V005 migration +
SqliteTagRepository(perima-db).
tagsandfile_tagstables (CRDT-compliant: soft deletes,
updated_at+device_idon every mutable row, no UNIQUE on
mutable columns, no FK cascades). Content-addressed via
blake3_hash. Composite(blake3_hash, tag_id)covering index +
reversetag_idindex.tags_for_hashesbatches via
params_from_iter; short-circuits on empty slice.
14 new tests including Barrier-driven concurrent upsert. - CLI tag subcommand (
perima).
perima tag add <path> <tags...>(1+ required),
perima tag rm <path> <tag>,
perima tag ls [--json]with per-tag file counts.
perima ls --tag <name>filters the file listing to tagged files.
3 new integration tests.