Changelog
All notable changes to Bowerbird are documented here.
For the complete changelog with all details, see CHANGELOG.md in the repository.
Recent Highlights
Section titled “Recent Highlights”Unreleased
Section titled “Unreleased”- Removed deprecated CLI surfaces —
searchandopen, legacylistaliases and hierarchy flags,--textaliases on mutating/audit commands, and legacy audit exclusion inputs now reject. Use the documentedlist,--output,--body,--where,config.excluded_directories, andBWRB_EXCLUDEreplacements. - Faster exact discovery — exact edits avoid unnecessary alias hydration, query resolution shares discovery/ignore work, and snapshot parsing reads each note once. Deterministic large-vault benchmarks and command byte/fault contracts guard the result.
- Safer automation — simple
schema new type --fields name:typecreation is genuinely non-interactive, semantic no-op edits preserve exact bytes, and unique list-name matches no longer open the fuzzy picker. - Recoverable deletion —
delete --backupcopies the selected files and a manifest under.bwrb/backups/before deletion. - Fail-closed schema migration — typed notes remain migration targets after moves outside their configured directory, while required-field cleanup with no safe default returns structured blockers and changes no note or schema state.
- Actionable recovery and truthful previews — ambiguity and malformed-YAML
failures name exact recovery actions, and a wrong-directory
Would movepreview now agrees with the aggregateWould fixcount.
- Existing-note lineage adoption —
bwrb lineage adopt <child> --from <parent>adds a dry-run-first, lock-coordinated path for recording known derivation between existing same-type notes without rewriting their bodies or ordinary metadata - Portable lineage mutation locking — fork, adopt, delete, and note-ID coordination now have real cross-process stress coverage, a focused Windows CI lane, and stable retryable output when a non-force delete target disappears while waiting for its lock
- Edit/lineage concurrency — edit commits now share fork/adopt path locks, replay stale JSON patches from fresh bytes, and return stable retryable output without overwriting newer identity or provenance writes
- Creation placement and identity parity — interactive and JSON creation share canonical output-directory resolution and persist the supplied identity consistently
- Body-only content targeting —
--bodyexcludes YAML frontmatter while preserving original file line numbers and body-only match context - Date settings in config —
config list/editexposes validated date format and granularity settings with deterministic canonical ISO storage - Completion parity — shell completion tracks the visible command surface, real schema/template subcommands, and the full
recentworkflow
- Relative-date fields — position notes before, after, or equal to other notes, with query-time resolution and audit warnings for invalid chains
- Custom calendars — define fictional or alternative calendars for date validation, sorting, comparisons, JSON output, audit, and relative-date anchors
- Lineage foundation — reserved
forked-from, per-fieldreset_on_fork, and audit checks for malformed IDs, dangling provenance, duplicate identities, and cycles establish the shared document-history contract (#802) - Document forks —
bwrb new --fork <target>creates an ordinary sibling note with a fresh ID and immutable immediate-source provenance - Fork lineage inspection —
bwrb list --lineage <target>renders the complete connected fork component, including sibling and cousin branches, as a tree, paths, links, content, or structured JSON - Fork-safe deletion —
bwrb deleterefuses notes with direct fork children or duplicate identities unless forced, preserving child provenance for audit when the parent is deliberately removed - Unified note discovery —
bwrb listis the canonical surface for finding, filtering, inspecting, linking, and opening notes;searchandopenremain available for compatibility - JSON-mode reliability — edit, open, and prompt-mode commands exit cleanly with one coherent JSON result even when stdin remains open
- Mention target exclusions —
mention_exclude_typesandmention_exclude_pathskeep imported/reference notes out of unlinked-mention target pools while still scanning them as source documents - First-occurrence mention linking —
mention_link_onceandaudit --fix --auto --mention-link-oncecan limit auto-fixes to one new wikilink per note/target pair - Type-aware relation resolution — bare wikilink relation refs now resolve against the field source type before treating same-name notes as ambiguous
- Unlinked mention noise — single-word note names require exact casing, common English single-word note names are skipped, aliases remain case-insensitive, and fuzzy suggestions use a length-scaled cap
- Unlinked mention precision — single-word names use full-vault corpus commonness damping and sentence-position guards to avoid casing-only false positives
- Headless migration execution —
schema migrate --executesupports non-interactive--yes/--set-versionworkflows - Migration diff fixes — prompt and date-granularity edits, inherited field structural overrides, and safe relation-source widenings are classified correctly
- Vault path fixes — global and relative vault paths now behave consistently across
init, completion, and command cwd resolution - Write/audit parity — relation writes, required defaults, and plain list prompts now agree with audit validation
- Hierarchy and mention-noise fixes — duplicate ancestor basenames no longer confuse hierarchy walks, and unlinked-mention audit skips structural headings
- Traits — Reusable field bundles you compose into types, instead of repeating fields per type
- Hierarchical scope — Contexts become first-class notes, plus an
under()operator for “anywhere beneath this ancestor” relation queries - Fuzzy search —
--fuzzyscored note/entity lookup, wired into--output content,--open, and--edit recentcommand — List recently modified notes, with--open/--save-asandfile.*sort keys- Partial dates — Date fields accept
YYYYandYYYY-MMprecision via per-field granularity - Aliases — Resolve and link a note by alternate names
- Audit ingest safety net — Unlinked-mention detection, body wikilink/file-link validation, and required body-section checks
- Recurrence — Event-driven recurrence with offset multi-spawn and successor name templates
- Plus a deep audit / migration / ownership hardening wave and several performance wins (see CHANGELOG.md)
- Self-documenting schema — Add a
descriptionto any type, field, orselectoption;bwrb schema list(and its--output json) surfaces them, so the schema itself documents what each type/field/option is for list --sort,--limit,--count— Sort by a frontmatter field, cap rows, or print just the match count- Schema discovery aliases — Shorthand forms for navigating types in
schema list - Raw
_bodyin JSON note creation — Supply a note body directly when creating notes via JSON - Actionable template validation —
templatesurfaces concrete, fixable health warnings - Fixes: unsafe-filename warnings,
edit --jsonoutput handling,listtree hierarchy, and a batch ofnew/edit/delete/search/bulkJSON-mode correctness fixes
Earlier highlights
Section titled “Earlier highlights”- Dashboard queries — Save and run queries with
--save-asandbwrb dashboard - Unified opener — Consistent
--appmodes across commands - Multi-select fields — Select multiple options with
multiple: true - Boolean and number primitives — New field types
Breaking Changes
Section titled “Breaking Changes”- Removed deprecated schema commands (use unified verb pattern)
- Renamed
inputprompt totext - Renamed
dynamicprompt torelation
See the full changelog for complete details.