Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment on lines +10 to +11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a blank line after the ### Fixed heading.

markdownlint-cli2 reports MD022 because the heading is not followed by a blank line.

Proposed fix
 ### Fixed
+
 - `omind doctor` printed the `pip install 'omind[embed]'` hint **twice** in the
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Fixed
- `omind doctor` printed the `pip install 'omind[embed]'` hint **twice** in the
### Fixed
- `omind doctor` printed the `pip install 'omind[embed]'` hint **twice** in the
🧰 Tools
🪛 markdownlint-cli2 (0.23.1)

[warning] 10-10: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CHANGELOG.md` around lines 10 - 11, Add a blank line immediately after the
`### Fixed` heading in the changelog, before its list item, so the Markdown
structure satisfies MD022.

Source: Linters/SAST tools

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
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion src/omind/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
9 changes: 7 additions & 2 deletions src/omind/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})",
Comment on lines +784 to +791

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Lead with the recall impact required by the PR objective.

The warning places {reason} and the installation hint before {cost}. The estimated recall improvement therefore appears last. Move {cost} immediately after the semantic-search status, then append the reason and optional installation hint.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omind/cli.py` around lines 784 - 791, Update the warning message
constructed in the semantic search check to place the cost/recall impact
immediately after the semantic-search status, followed by the existing reason
and optional installation hint. Preserve the current values and formatting for
reason, hint, and cost while changing only their order in the CheckResult
message.

)
)

Expand Down
6 changes: 5 additions & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment on lines +303 to +307

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Exercise the de-duplication branch.

The mocked reason at Line 298 does not contain omind[embed], so this test covers only the fallback append branch. An implementation that always appends the hint would still pass. Include the installation command in the mocked reason or add a second test case where the reason already contains it, then assert that the count remains one.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_cli.py` around lines 303 - 307, Update the test around the mocked
reason for search_semantic so it includes “omind[embed]”, exercising the
de-duplication path rather than only the fallback append path. Keep the existing
assertion that message.count("omind[embed]") equals one, and preserve coverage
for the append behavior if it is not already tested separately.

2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.