diff --git a/CHANGELOG.md b/CHANGELOG.md index d5b714a7..aa76ba54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # CHANGELOG -## Unreleased +## v0.21.0 (2026-05-16) + +Workspace-aware everywhere: every MCP tool and CLI command now routes through the +same workspace/project model, the search and sync paths are noticeably faster, +and a handful of long-standing parsing and routing footguns are gone. ### Breaking Changes @@ -11,6 +15,109 @@ - Bare list wikilinks like `- [[Target]]` now index as `links_to`. - Prose list items like `- some other thing [[Target]]` now index as `links_to`. - To preserve existing multi-word relation types on re-sync, quote them before upgrading. + - See **#824**. + +### Features + +- **#816**: `bm orphan` CLI command surfaces entities whose underlying markdown + files are gone, with a flag to clean them out. +- **#789**: Create projects directly by cloud workspace slug from MCP + (`create_memory_project(workspace=...)`). +- **#757**: Discover projects across every accessible cloud workspace in MCP's + project list — no more per-workspace blind spots. +- **#766**: MCP tools accept training-data-friendly parameter aliases + (`q`/`search`/`text` for `query`, etc.) so models reach for them naturally. +- **#776**: `bm db reset` refuses to run while a `basic-memory mcp` process is + alive, so resets can no longer corrupt an open session. +- **#791**: Search responses include result totals so pagers can stop guessing. +- **#719**: Cloud `note_content` tenant schema primitive lands on the backend. +- **#715**: `bm project add` accepts a `--visibility` flag for cloud projects. + +### Bug Fixes + +#### Search and recent activity +- **#832**: SQLite project deletion now sweeps `search_index`, + `search_vector_chunks`, and `search_vector_embeddings`, so a project that + reuses a recycled auto-increment id can't inherit the previous tenant's content. +- **#812**: `recent_activity` orders and filters by `updated_at`, so edits bubble + to the top instead of staying pinned to creation time. +- **#807**: Multi-project `search_notes` is opt-in (`search_all_projects=True`); + default search stays scoped to the resolved project. +- **#785**: `recent_activity` caps responses and emits an explicit truncation + footer instead of silently dropping rows. +- **#713**: Eliminated an N+1 query in search result hydration. + +#### Workspace / project routing +- **#822**: `bm project list` now includes projects from every workspace, not + just the current one. +- **#813**, **#808**, **#806**, **#803**, **#801**, **#795**, **#790**, **#778**, + **#777**, **#722**, **#712**, **#704**: Workspace-qualified permalink routing + is centralized and applied consistently across `edit_note`, `delete_project`, + `build_context`, `memory://` URLs, factory-mode project listing, cloud uploads, + and the API client. + +#### Sync +- **#827**: `rclone bisync` filters from `.bmignore` are preserved across syncs. +- **#815**: Watch service ignores hidden paths relative to the watched project, + not just relative to `$HOME`. +- **#814**: `scan` subprocesses no longer go through the shell, avoiding quoting + issues with paths that contain special characters. +- **#759**: Watch service stays inside `--project` scope. +- **#746**: Canonical markdown is preserved during single-file sync. + +#### Parsing +- **#796**: Picoschema modifier descriptions (`field?(modifier, description)`) + parse correctly. +- **#769**: Obsidian callout blocks are skipped by the observation parser + instead of being mis-extracted as observations. + +#### CLI +- **#775**: `bm project set-cloud` / `set-local` cleans up local DB state for + the affected project. +- **#773**: `bm cloud logout` clears `default_workspace`. +- **#780**: `bm cloud setup` hint points at `bm cloud sync-setup`. +- **#734**: `bm project info` shows cloud index freshness. +- **#718**: Private cloud projects display under their `display_name` instead of + raw UUID. +- **#768**: `read_note` / `view_note` drop no-op pagination params from their + signatures. + +#### Stability +- **#774**: `sqlite-vec` failures during init degrade gracefully to keyword-only + search instead of crashing startup. +- **#733**: Delete-vector and cloud-sync cleanup is now consistent. +- **#702**: Race conditions in concurrent `delete_entity` are resolved. +- **#724**: `external_id` is preserved when entities are re-upserted during a + re-index. +- **#728**: Vector init no longer issues runtime `ALTER TABLE`. +- **#744**: `BASIC_MEMORY_CONFIG_DIR` is honored across remaining call sites. +- **#743**: FastEmbed cache lives under the data dir instead of `/tmp`. +- **#752**: Cloud projects report `source=cloud` in factory mode. +- Stripped null bytes from markdown content before DB insert. +- Allowed long `relation_type` values in API responses. + +#### Installer +- **#772**: Docker-compose config volume mounts under the `appuser` home. +- **#695**: Bumped `brew outdated` timeout from 15s to 60s. + +### Performance + +- **#828**: CLI startup no longer pulls in the local ASGI FastAPI app when it + isn't needed. +- **#751**, **#726**, **#717**, **#714**, single-file/batch indexing: marked + speedups on the sync hot path; unchanged markdown is skipped entirely. +- **#731**, **#723**: Vector sync is faster on both backends, with tuned + fastembed defaults. + +### Maintenance + +- **#825**: Dependency refresh + security hardening. +- Updated to `fastmcp` 3.3.1. +- **#754**: Removed in-house telemetry wrappers in favor of direct `logfire` + usage. +- **#736**: `ty` is now the default typechecker. +- **#771**, **#770**, **#716**: New regression guards for vector-row cleanup, + long relation types, and recent activity hydration. ## v0.20.3 (2026-03-26)