diff --git a/CHANGELOG.md b/CHANGELOG.md index 55f4196..94471ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [8.1.1] - 2026-08-02 + +### Fixed +- `omind doctor` printed the `pip install 'omind[embed]'` hint **twice** in the + semantic-search warning: `embed.status()`'s reason already carries the install + command for the common cause, and 8.1.0 appended it unconditionally. Found by + running `doctor` on a real Windows install rather than reading the code. + ## [8.1.0] - 2026-08-02 ### Changed diff --git a/pyproject.toml b/pyproject.toml index e4e04c5..c170f42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "omind" -version = "8.1.0" +version = "8.1.1" description = "Reproduce the OMI/Obsidian memory integration for AI agents, plus a local web app to view, edit, and add memory entries." readme = "README.md" requires-python = ">=3.10" diff --git a/src/omind/__init__.py b/src/omind/__init__.py index 2afee3c..17f9c4b 100644 --- a/src/omind/__init__.py +++ b/src/omind/__init__.py @@ -2,4 +2,4 @@ # Copyright 2026 Aaron K. Clark """omind — OMI/Obsidian memory tooling for AI agents.""" -__version__ = "8.1.0" +__version__ = "8.1.1" diff --git a/src/omind/cli.py b/src/omind/cli.py index 11be760..6c149e0 100644 --- a/src/omind/cli.py +++ b/src/omind/cli.py @@ -778,12 +778,17 @@ def _diagnose_search_index(config: SetupConfig) -> list[CheckResult]: # green tick for "your recall is materially worse than it could be" is # the same failure mode as an index that silently stopped updating: the # honest signal existed and did not read as a problem. + # `reason` from embed.status() already carries the install command for + # the common cause (model2vec missing), so appending it unconditionally + # printed it twice — verified on a real Windows install. + reason = str(semantic["reason"]) + cost = "worth ~20pp of recall@1 on a real vault" + hint = "" if "omind[embed]" in reason else "; pip install 'omind[embed]'" results.append( CheckResult( "search_semantic", "warn", - f"semantic search: off (keyword path) — {semantic['reason']}; " - "install the extra for ~20pp better recall: pip install 'omind[embed]'", + f"semantic search: off (keyword path) — {reason}{hint} ({cost})", ) ) diff --git a/tests/test_cli.py b/tests/test_cli.py index 2909063..6ef2a49 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -300,4 +300,8 @@ def test_doctor_warns_when_semantic_search_is_off( config = SetupConfig(vault=tmp_path, folder="OMI") checks = {c.key: c for c in cli._diagnose_search_index(config)} assert checks["search_semantic"].level == "warn" - assert "omind[embed]" in checks["search_semantic"].message + message = checks["search_semantic"].message + assert "omind[embed]" in message + # The reason already carries the install command; saying it twice is what a + # real Windows install actually printed. + assert message.count("omind[embed]") == 1 diff --git a/uv.lock b/uv.lock index e994c53..e93db36 100644 --- a/uv.lock +++ b/uv.lock @@ -2354,7 +2354,7 @@ wheels = [ [[package]] name = "omind" -version = "8.1.0" +version = "8.1.1" source = { editable = "." } dependencies = [ { name = "cryptography" },