Implement task properties
Tasks now have arbitrary key/value properties (built on the existing
attrs storage), plus four synthetic properties computed on read:
- state: open | archived (from task location)
- has-links: true | false
- references: comma-separated [[tsk-N]] links found in body
- referenced-by: comma-separated [[tsk-N]] backlinks
CLI:
- tsk prop list <id> list every property on a task
- tsk prop set <id> <k> [v] set a property (value optional for unary)
- tsk prop unset <id> <k> remove a property
- tsk prop find <k> [v] print task ids with property k (matching v
if provided). Includes synthetic props,
so e.g. `tsk prop find state archived`
works.
Tests cover round-tripping stored properties, presence-of-key search,
synthetic property visibility, and unset. Run against both backends.
Tasks for the example "calculated" properties (parent/child-of,
duplicates, source, assigned) are pushed onto the stack and
deprioritized to the bottom; they need their own bidirectional
maintenance logic and are scoped separately.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>