basic-memory 0.14.0b1__tar.gz → 0.14.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of basic-memory might be problematic. Click here for more details.

Files changed (279) hide show
  1. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CHANGELOG.md +121 -39
  2. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/PKG-INFO +14 -3
  3. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/README.md +12 -1
  4. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/justfile +1 -1
  5. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/pyproject.toml +2 -2
  6. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/__init__.py +1 -1
  7. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/utils.py +3 -1
  8. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/__init__.py +4 -4
  9. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/project_management.py +7 -7
  10. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/search.py +115 -38
  11. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/response.py +1 -1
  12. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_server.py +1 -1
  13. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_edit_note.py +39 -0
  14. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_search.py +63 -22
  15. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_search_repository.py +11 -9
  16. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/schemas/test_schemas.py +30 -0
  17. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/uv.lock +1 -1
  18. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.claude/commands/release/beta.md +0 -0
  19. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.claude/commands/release/changelog.md +0 -0
  20. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.claude/commands/release/release-check.md +0 -0
  21. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.claude/commands/release/release.md +0 -0
  22. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.claude/commands/test-live.md +0 -0
  23. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.dockerignore +0 -0
  24. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  26. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  27. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  28. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/dependabot.yml +0 -0
  29. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/claude.yml +0 -0
  30. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/dev-release.yml +0 -0
  31. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/docker.yml +0 -0
  32. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/pr-title.yml +0 -0
  33. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/release.yml +0 -0
  34. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.github/workflows/test.yml +0 -0
  35. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.gitignore +0 -0
  36. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/.python-version +0 -0
  37. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CITATION.cff +0 -0
  38. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CLA.md +0 -0
  39. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CLAUDE.md +0 -0
  40. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CODE_OF_CONDUCT.md +0 -0
  41. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/CONTRIBUTING.md +0 -0
  42. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/Dockerfile +0 -0
  43. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/LICENSE +0 -0
  44. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/SECURITY.md +0 -0
  45. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/docker-compose.yml +0 -0
  46. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/docs/AI Assistant Guide.md +0 -0
  47. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/docs/Docker.md +0 -0
  48. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/llms-install.md +0 -0
  49. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/memory.json +0 -0
  50. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/smithery.yaml +0 -0
  51. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/alembic.ini +0 -0
  52. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/env.py +0 -0
  53. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/migrations.py +0 -0
  54. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/script.py.mako +0 -0
  55. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  56. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  57. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  58. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  59. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  60. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  61. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/__init__.py +0 -0
  62. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/app.py +0 -0
  63. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/__init__.py +0 -0
  64. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/directory_router.py +0 -0
  65. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/importer_router.py +0 -0
  66. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/knowledge_router.py +0 -0
  67. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/management_router.py +0 -0
  68. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/memory_router.py +0 -0
  69. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/project_router.py +0 -0
  70. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/prompt_router.py +0 -0
  71. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/resource_router.py +0 -0
  72. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/search_router.py +0 -0
  73. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/routers/utils.py +0 -0
  74. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/api/template_loader.py +0 -0
  75. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/__init__.py +0 -0
  76. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/app.py +0 -0
  77. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/__init__.py +0 -0
  78. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/auth.py +0 -0
  79. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/db.py +0 -0
  80. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  81. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  82. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  83. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  84. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/mcp.py +0 -0
  85. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/project.py +0 -0
  86. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/status.py +0 -0
  87. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/sync.py +0 -0
  88. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/commands/tool.py +0 -0
  89. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/cli/main.py +0 -0
  90. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/config.py +0 -0
  91. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/db.py +0 -0
  92. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/deps.py +0 -0
  93. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/file_utils.py +0 -0
  94. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/__init__.py +0 -0
  95. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/base.py +0 -0
  96. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  97. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  98. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  99. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/memory_json_importer.py +0 -0
  100. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/importers/utils.py +0 -0
  101. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/__init__.py +0 -0
  102. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/entity_parser.py +0 -0
  103. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/markdown_processor.py +0 -0
  104. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/plugins.py +0 -0
  105. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/markdown/schemas.py +0 -0
  106. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/__init__.py +0 -0
  107. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/async_client.py +0 -0
  108. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/auth_provider.py +0 -0
  109. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/external_auth_provider.py +0 -0
  110. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/project_session.py +0 -0
  111. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  112. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  113. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  114. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  115. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/search.py +0 -0
  116. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/sync_status.py +0 -0
  117. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/prompts/utils.py +0 -0
  118. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  119. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/resources/project_info.py +0 -0
  120. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/server.py +0 -0
  121. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
  122. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/build_context.py +0 -0
  123. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/canvas.py +0 -0
  124. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  125. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  126. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  127. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/move_note.py +0 -0
  128. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/read_content.py +0 -0
  129. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/read_note.py +0 -0
  130. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  131. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/sync_status.py +0 -0
  132. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/utils.py +0 -0
  133. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/view_note.py +0 -0
  134. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/mcp/tools/write_note.py +0 -0
  135. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/models/__init__.py +0 -0
  136. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/models/base.py +0 -0
  137. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/models/knowledge.py +0 -0
  138. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/models/project.py +0 -0
  139. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/models/search.py +0 -0
  140. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/__init__.py +0 -0
  141. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/entity_repository.py +0 -0
  142. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/observation_repository.py +0 -0
  143. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/project_info_repository.py +0 -0
  144. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/project_repository.py +0 -0
  145. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/relation_repository.py +0 -0
  146. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/repository.py +0 -0
  147. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/repository/search_repository.py +0 -0
  148. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/__init__.py +0 -0
  149. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/base.py +0 -0
  150. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/delete.py +0 -0
  151. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/directory.py +0 -0
  152. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/importer.py +0 -0
  153. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/memory.py +0 -0
  154. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/project_info.py +0 -0
  155. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/prompt.py +0 -0
  156. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/request.py +0 -0
  157. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/schemas/search.py +0 -0
  158. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/__init__.py +0 -0
  159. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/context_service.py +0 -0
  160. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/directory_service.py +0 -0
  161. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/entity_service.py +0 -0
  162. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/exceptions.py +0 -0
  163. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/file_service.py +0 -0
  164. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/initialization.py +0 -0
  165. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/link_resolver.py +0 -0
  166. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/migration_service.py +0 -0
  167. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/project_service.py +0 -0
  168. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/search_service.py +0 -0
  169. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/service.py +0 -0
  170. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/services/sync_status_service.py +0 -0
  171. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/sync/__init__.py +0 -0
  172. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/sync/background_sync.py +0 -0
  173. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/sync/sync_service.py +0 -0
  174. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/sync/watch_service.py +0 -0
  175. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  176. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/templates/prompts/search.hbs +0 -0
  177. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/src/basic_memory/utils.py +0 -0
  178. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/cli/test_reset_integration.py +0 -0
  179. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/conftest.py +0 -0
  180. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_build_context_validation.py +0 -0
  181. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_delete_note_integration.py +0 -0
  182. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_edit_note_integration.py +0 -0
  183. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_list_directory_integration.py +0 -0
  184. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_move_note_integration.py +0 -0
  185. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_project_management_integration.py +0 -0
  186. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  187. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_read_content_integration.py +0 -0
  188. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_read_note_integration.py +0 -0
  189. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_search_integration.py +0 -0
  190. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/test-int/mcp/test_write_note_integration.py +0 -0
  191. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/Non-MarkdownFileSupport.pdf +0 -0
  192. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/Screenshot.png +0 -0
  193. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/__init__.py +0 -0
  194. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/conftest.py +0 -0
  195. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_continue_conversation_template.py +0 -0
  196. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_directory_router.py +0 -0
  197. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_importer_router.py +0 -0
  198. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_knowledge_router.py +0 -0
  199. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_management_router.py +0 -0
  200. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_memory_router.py +0 -0
  201. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_project_router.py +0 -0
  202. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_project_router_operations.py +0 -0
  203. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_prompt_router.py +0 -0
  204. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_resource_router.py +0 -0
  205. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_search_router.py +0 -0
  206. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_search_template.py +0 -0
  207. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_template_loader.py +0 -0
  208. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/api/test_template_loader_helpers.py +0 -0
  209. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/conftest.py +0 -0
  210. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_auth_commands.py +0 -0
  211. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_cli_tools.py +0 -0
  212. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_import_chatgpt.py +0 -0
  213. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_import_claude_conversations.py +0 -0
  214. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_import_claude_projects.py +0 -0
  215. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_import_memory_json.py +0 -0
  216. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_project_commands.py +0 -0
  217. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_project_info.py +0 -0
  218. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_status.py +0 -0
  219. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_sync.py +0 -0
  220. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/cli/test_version.py +0 -0
  221. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/conftest.py +0 -0
  222. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/importers/test_importer_base.py +0 -0
  223. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/importers/test_importer_utils.py +0 -0
  224. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/__init__.py +0 -0
  225. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_entity_parser.py +0 -0
  226. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_markdown_plugins.py +0 -0
  227. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_markdown_processor.py +0 -0
  228. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_observation_edge_cases.py +0 -0
  229. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_parser_edge_cases.py +0 -0
  230. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_relation_edge_cases.py +0 -0
  231. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/markdown/test_task_detection.py +0 -0
  232. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/conftest.py +0 -0
  233. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_auth_provider.py +0 -0
  234. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_prompts.py +0 -0
  235. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_resource_project_info.py +0 -0
  236. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_resources.py +0 -0
  237. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_build_context.py +0 -0
  238. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_canvas.py +0 -0
  239. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_delete_note.py +0 -0
  240. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_list_directory.py +0 -0
  241. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_move_note.py +0 -0
  242. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_read_note.py +0 -0
  243. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_recent_activity.py +0 -0
  244. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_resource.py +0 -0
  245. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_sync_status.py +0 -0
  246. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_utils.py +0 -0
  247. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_view_note.py +0 -0
  248. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/mcp/test_tool_write_note.py +0 -0
  249. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_entity_repository.py +0 -0
  250. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_entity_repository_upsert.py +0 -0
  251. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_observation_repository.py +0 -0
  252. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_project_info_repository.py +0 -0
  253. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_project_repository.py +0 -0
  254. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_relation_repository.py +0 -0
  255. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/repository/test_repository.py +0 -0
  256. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/schemas/test_memory_url.py +0 -0
  257. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/schemas/test_memory_url_validation.py +0 -0
  258. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/schemas/test_search.py +0 -0
  259. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_context_service.py +0 -0
  260. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_directory_service.py +0 -0
  261. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_entity_service.py +0 -0
  262. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_file_service.py +0 -0
  263. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_initialization.py +0 -0
  264. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_link_resolver.py +0 -0
  265. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_project_service.py +0 -0
  266. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_project_service_operations.py +0 -0
  267. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_search_service.py +0 -0
  268. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/services/test_sync_status_service.py +0 -0
  269. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/sync/test_sync_service.py +0 -0
  270. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/sync/test_sync_wikilink_issue.py +0 -0
  271. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/sync/test_tmp_files.py +0 -0
  272. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/sync/test_watch_service.py +0 -0
  273. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/sync/test_watch_service_edge_cases.py +0 -0
  274. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/test_config.py +0 -0
  275. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/test_db_migration_deduplication.py +0 -0
  276. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/utils/test_file_utils.py +0 -0
  277. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/utils/test_parse_tags.py +0 -0
  278. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/utils/test_permalink_formatting.py +0 -0
  279. {basic_memory-0.14.0b1 → basic_memory-0.14.1}/tests/utils/test_utf8_handling.py +0 -0
@@ -1,56 +1,138 @@
1
1
  # CHANGELOG
2
2
 
3
- ## v0.13.8 (2025-06-20)
3
+ ## v0.14.0 (2025-06-26)
4
4
 
5
5
  ### Features
6
6
 
7
- - **Docker Container Support** - Complete Docker integration with volume mounting for Obsidian directories
8
- ([`3269a2f`](https://github.com/basicmachines-co/basic-memory/commit/3269a2f33a7595f6d9e5207924062e2542f46759))
9
- - Docker Compose configuration for easy deployment
10
- - Volume mounting for persistent data and Obsidian integration
11
- - Comprehensive Docker documentation and setup guides
12
- - Streamlined container-based workflow
7
+ - **Docker Container Registry Migration** - Switch from Docker Hub to GitHub Container Registry for better security and integration
8
+ ([`616c1f0`](https://github.com/basicmachines-co/basic-memory/commit/616c1f0710da59c7098a5f4843d4f017877ff7b2))
9
+ - Automated Docker image publishing via GitHub Actions CI/CD pipeline
10
+ - Enhanced container security with GitHub's integrated vulnerability scanning
11
+ - Streamlined container deployment workflow for production environments
12
+
13
+ - **Enhanced Search Documentation** - Comprehensive search syntax examples for improved user experience
14
+ ([`a589f8b`](https://github.com/basicmachines-co/basic-memory/commit/a589f8b894e78cce01eb25656856cfea8785fbbf))
15
+ - Detailed examples for Boolean search operators (AND, OR, NOT)
16
+ - Advanced search patterns including phrase matching and field-specific queries
17
+ - User-friendly documentation for complex search scenarios
18
+
19
+ - **Cross-Project File Management** - Intelligent move operations with project boundary detection
20
+ ([`db5ef7d`](https://github.com/basicmachines-co/basic-memory/commit/db5ef7d35cc0894309c7a57b5741c9dd978526d4))
21
+ - Automatic detection of cross-project move attempts with helpful guidance
22
+ - Clear error messages when attempting unsupported cross-project operations
13
23
 
14
24
  ### Bug Fixes
15
25
 
16
- - **#151**: Fix reset command project configuration persistence issue
17
- ([`af44941`](https://github.com/basicmachines-co/basic-memory/commit/af44941d5aa57b5ad7fcc6af4ed700f49bdb6d4d))
18
- - Reset command now properly clears project configuration from `~/.basic-memory/config.json`
19
- - Eliminates issue where projects would be recreated after database reset
20
- - Ensures clean slate when resetting Basic Memory installation
21
-
22
- - **#148**: Resolve project state inconsistency between MCP and CLI
23
- ([`35e4f73`](https://github.com/basicmachines-co/basic-memory/commit/35e4f73ae8a65501da4d48258ed702f957184c92))
24
- - Fix "Project not found" errors when switching default projects
25
- - MCP session now automatically refreshes when project configuration changes
26
- - Eliminates need to restart MCP server after project operations
27
- - Ensures consistent project state across CLI and MCP interfaces
28
-
29
- - **FastMCP Compatibility** - Resolve deprecation warnings for FastMCP integration
30
- ([`7be001c`](https://github.com/basicmachines-co/basic-memory/commit/7be001ca6834b3344bb6160cbe537b36bcbaa579))
31
- - Update FastMCP usage patterns to eliminate deprecation warnings
32
- - Improve future compatibility with FastMCP library updates
33
- - Clean up entity repository and service layer code
26
+ - **#184**: Preserve permalinks when editing notes without frontmatter permalinks
27
+ ([`c2f4b63`](https://github.com/basicmachines-co/basic-memory/commit/c2f4b632cf04921b1a3c2f0d43831b80c519cb31))
28
+ - Fix permalink preservation during note editing operations
29
+ - Ensure consistent permalink handling across different note formats
30
+ - Maintain note identity and searchability during incremental edits
31
+
32
+ - **#183**: Implement project-specific sync status checks for MCP tools
33
+ ([`12b5152`](https://github.com/basicmachines-co/basic-memory/commit/12b51522bc953fca117fc5bc01fcb29c6ca7e13c))
34
+ - Fix sync status reporting to correctly reflect current project state
35
+ - Resolve inconsistencies where sync status showed global instead of project-specific information
36
+ - Improve project isolation for sync operations and status reporting
37
+
38
+ - **#180**: Handle Boolean search syntax with hyphenated terms
39
+ ([`546e3cd`](https://github.com/basicmachines-co/basic-memory/commit/546e3cd8db98b74f746749d41887f8a213cd0b11))
40
+ - Fix search parsing issues with hyphenated terms in Boolean queries
41
+ - Improve search query tokenization for complex term structures
42
+ - Enhanced search reliability for technical documentation and multi-word concepts
43
+
44
+ - **#174**: Respect BASIC_MEMORY_HOME environment variable in Docker containers
45
+ ([`9f1db23`](https://github.com/basicmachines-co/basic-memory/commit/9f1db23c78d4648e2c242ad1ee27eed85e3f3b5d))
46
+ - Fix Docker container configuration to properly honor custom home directory settings
47
+ - Improve containerized deployment flexibility with environment variable support
48
+ - Ensure consistent behavior between local and containerized installations
49
+
50
+ - **#168**: Scope entity queries by project_id in upsert_entity method
51
+ ([`2a3adc1`](https://github.com/basicmachines-co/basic-memory/commit/2a3adc109a3e4d7ccd65cae4abf63d9bb2338326))
52
+ - Fix entity isolation issues in multi-project setups
53
+ - Prevent cross-project entity conflicts during database operations
54
+ - Strengthen project boundary enforcement at the database level
55
+
56
+ - **#166**: Handle None from_entity in Context API RelationSummary
57
+ ([`8a065c3`](https://github.com/basicmachines-co/basic-memory/commit/8a065c32f4e41613207d29aafc952a56e3a52241))
58
+ - Fix null pointer exceptions in relation processing
59
+ - Improve error handling for incomplete relation data
60
+ - Enhanced stability for knowledge graph traversal operations
61
+
62
+ - **#164**: Remove log level configuration from mcp_server.run()
63
+ ([`224e4bf`](https://github.com/basicmachines-co/basic-memory/commit/224e4bf9e4438c44a82ffc21bd1a282fe9087690))
64
+ - Simplify MCP server startup by removing redundant log level settings
65
+ - Fix potential logging configuration conflicts
66
+ - Streamline server initialization process
67
+
68
+ - **#162**: Ensure permalinks are generated for entities with null permalinks during move operations
69
+ ([`f506507`](https://github.com/basicmachines-co/basic-memory/commit/f50650763dbd4322c132e4bdc959ce4bf074374b))
70
+ - Fix move operations for entities without existing permalinks
71
+ - Automatic permalink generation during file move operations
72
+ - Maintain database consistency during file reorganization
34
73
 
35
74
  ### Technical Improvements
36
75
 
37
- - **Comprehensive Integration Testing** - New test suites for critical user workflows
38
- - Full integration tests for database reset functionality
39
- - End-to-end project state synchronization testing
40
- - Real MCP client-server communication validation
41
- - Direct config file validation without complex mocking
76
+ - **Comprehensive Test Coverage** - Extensive test suites for new features and edge cases
77
+ - Enhanced test coverage for project-specific sync status functionality
78
+ - Additional test scenarios for search syntax validation and edge cases
79
+ - Integration tests for Docker CI workflow and container publishing
80
+ - Comprehensive move operations testing with project boundary validation
81
+
82
+ - **Docker CI/CD Pipeline** - Production-ready automated container publishing
83
+ ([`74847cc`](https://github.com/basicmachines-co/basic-memory/commit/74847cc3807b0c6ed511e0d83e0d560e9f07ec44))
84
+ - Automated Docker image building and publishing on release
85
+ - Multi-architecture container support for AMD64 and ARM64 platforms
86
+ - Integrated security scanning and vulnerability assessments
87
+ - Streamlined deployment pipeline for production environments
88
+
89
+ - **Release Process Improvements** - Enhanced automation and quality gates
90
+ ([`a52ce1c`](https://github.com/basicmachines-co/basic-memory/commit/a52ce1c8605ec2cd450d1f909154172cbc30faa2))
91
+ - Homebrew formula updates limited to stable releases only
92
+ - Improved release automation with better quality control
93
+ - Enhanced CI/CD pipeline reliability and error handling
94
+
95
+ - **Code Quality Enhancements** - Improved error handling and validation
96
+ - Better null safety in entity and relation processing
97
+ - Enhanced project isolation validation throughout the codebase
98
+ - Improved error messages and user guidance for edge cases
99
+ - Strengthened database consistency guarantees across operations
100
+
101
+ ### Infrastructure
102
+
103
+ - **GitHub Container Registry Integration** - Modern container infrastructure
104
+ - Migration from Docker Hub to GitHub Container Registry (ghcr.io)
105
+ - Improved security with integrated vulnerability scanning
106
+ - Better integration with GitHub-based development workflow
107
+ - Enhanced container versioning and artifact management
108
+
109
+ - **Enhanced CI/CD Workflows** - Robust automated testing and deployment
110
+ - Automated Docker image publishing on releases
111
+ - Comprehensive test coverage validation before deployment
112
+ - Multi-platform container building and publishing
113
+ - Integration with GitHub's security and monitoring tools
42
114
 
43
- - **Code Quality** - Enhanced error handling and validation
44
- - Improved project state management across system components
45
- - Better session refresh patterns for configuration changes
46
- - Streamlined Docker setup with reduced image size
115
+ ### Migration Guide
47
116
 
48
- ### Documentation
117
+ This release includes several behind-the-scenes improvements and fixes. All changes are backward compatible:
118
+
119
+ - **Docker Users**: Container images now served from `ghcr.io/basicmachines-co/basic-memory` instead of Docker Hub
120
+ - **Search Users**: Enhanced search syntax handling - existing queries continue to work unchanged
121
+ - **Multi-Project Users**: Improved project isolation - all existing projects remain fully functional
122
+ - **All Users**: Enhanced stability and error handling - no breaking changes to existing workflows
123
+
124
+ ### Installation
49
125
 
50
- - **Docker Integration Guide** - Complete documentation for container deployment
51
- - Step-by-step Docker Compose setup instructions
52
- - Volume mounting configuration for Obsidian workflows
53
- - Container-based development environment setup
126
+ ```bash
127
+ # Latest stable release
128
+ uv tool install basic-memory
129
+
130
+ # Update existing installation
131
+ uv tool upgrade basic-memory
132
+
133
+ # Docker (new registry)
134
+ docker pull ghcr.io/basicmachines-co/basic-memory:latest
135
+ ```
54
136
 
55
137
  ## v0.13.7 (2025-06-19)
56
138
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.14.0b1
3
+ Version: 0.14.1
4
4
  Summary: Local-first knowledge management combining Zettelkasten with knowledge graphs
5
5
  Project-URL: Homepage, https://github.com/basicmachines-co/basic-memory
6
6
  Project-URL: Repository, https://github.com/basicmachines-co/basic-memory
@@ -13,7 +13,7 @@ Requires-Dist: aiosqlite>=0.20.0
13
13
  Requires-Dist: alembic>=1.14.1
14
14
  Requires-Dist: dateparser>=1.2.0
15
15
  Requires-Dist: fastapi[standard]>=0.115.8
16
- Requires-Dist: fastmcp>=2.3.4
16
+ Requires-Dist: fastmcp<2.10.0,>=2.3.4
17
17
  Requires-Dist: greenlet>=3.1.1
18
18
  Requires-Dist: icecream>=2.1.3
19
19
  Requires-Dist: loguru>=0.7.3
@@ -71,6 +71,10 @@ https://github.com/user-attachments/assets/a55d8238-8dd0-454a-be4c-8860dbbd0ddc
71
71
  # Install with uv (recommended)
72
72
  uv tool install basic-memory
73
73
 
74
+ # or with Homebrew
75
+ brew tap basicmachines-co/basic-memory
76
+ brew install basic-memory
77
+
74
78
  # Configure Claude Desktop (edit ~/Library/Application Support/Claude/claude_desktop_config.json)
75
79
  # Add this to your config:
76
80
  {
@@ -104,6 +108,13 @@ npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
104
108
 
105
109
  This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. Note: The Smithery installation uses their hosted MCP server, while your data remains stored locally as Markdown files.
106
110
 
111
+ ### Add to Cursor
112
+
113
+ Once you have installed Basic Memory revisit this page for the 1-click installer for Cursor:
114
+
115
+ [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/install-mcp?name=basic-memory&config=eyJjb21tYW5kIjoiL1VzZXJzL2RyZXcvLmxvY2FsL2Jpbi91dnggYmFzaWMtbWVtb3J5IG1jcCJ9)
116
+
117
+
107
118
  ### Glama.ai
108
119
 
109
120
  <a href="https://glama.ai/mcp/servers/o90kttu9ym">
@@ -252,7 +263,7 @@ title: <Entity title>
252
263
  type: <The type of Entity> (e.g. note)
253
264
  permalink: <a uri slug>
254
265
 
255
- - <optional metadata> (such as tags)
266
+ - <optional metadata> (such as tags)
256
267
  ```
257
268
 
258
269
  ### Observations
@@ -33,6 +33,10 @@ https://github.com/user-attachments/assets/a55d8238-8dd0-454a-be4c-8860dbbd0ddc
33
33
  # Install with uv (recommended)
34
34
  uv tool install basic-memory
35
35
 
36
+ # or with Homebrew
37
+ brew tap basicmachines-co/basic-memory
38
+ brew install basic-memory
39
+
36
40
  # Configure Claude Desktop (edit ~/Library/Application Support/Claude/claude_desktop_config.json)
37
41
  # Add this to your config:
38
42
  {
@@ -66,6 +70,13 @@ npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
66
70
 
67
71
  This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. Note: The Smithery installation uses their hosted MCP server, while your data remains stored locally as Markdown files.
68
72
 
73
+ ### Add to Cursor
74
+
75
+ Once you have installed Basic Memory revisit this page for the 1-click installer for Cursor:
76
+
77
+ [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/install-mcp?name=basic-memory&config=eyJjb21tYW5kIjoiL1VzZXJzL2RyZXcvLmxvY2FsL2Jpbi91dnggYmFzaWMtbWVtb3J5IG1jcCJ9)
78
+
79
+
69
80
  ### Glama.ai
70
81
 
71
82
  <a href="https://glama.ai/mcp/servers/o90kttu9ym">
@@ -214,7 +225,7 @@ title: <Entity title>
214
225
  type: <The type of Entity> (e.g. note)
215
226
  permalink: <a uri slug>
216
227
 
217
- - <optional metadata> (such as tags)
228
+ - <optional metadata> (such as tags)
218
229
  ```
219
230
 
220
231
  ### Observations
@@ -17,7 +17,7 @@ test: test-unit test-int
17
17
 
18
18
  # Lint and fix code
19
19
  lint:
20
- ruff check . --fix
20
+ uv run ruff check . --fix
21
21
 
22
22
  # Type check code
23
23
  type-check:
@@ -30,7 +30,7 @@ dependencies = [
30
30
  "alembic>=1.14.1",
31
31
  "pillow>=11.1.0",
32
32
  "pybars3>=0.9.7",
33
- "fastmcp>=2.3.4",
33
+ "fastmcp>=2.3.4,<2.10.0",
34
34
  "pyjwt>=2.10.1",
35
35
  "python-dotenv>=1.1.0",
36
36
  "pytest-aio>=1.9.0",
@@ -123,4 +123,4 @@ omit = [
123
123
  ]
124
124
 
125
125
  [tool.logfire]
126
- ignore_no_config = true
126
+ ignore_no_config = true
@@ -1,7 +1,7 @@
1
1
  """basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
2
2
 
3
3
  # Package version - updated by release automation
4
- __version__ = "0.14.0b1"
4
+ __version__ = "0.14.1"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -38,7 +38,9 @@ def entity_model_from_markdown(
38
38
  # Update basic fields
39
39
  model.title = markdown.frontmatter.title
40
40
  model.entity_type = markdown.frontmatter.type
41
- model.permalink = markdown.frontmatter.permalink
41
+ # Only update permalink if it exists in frontmatter, otherwise preserve existing
42
+ if markdown.frontmatter.permalink is not None:
43
+ model.permalink = markdown.frontmatter.permalink
42
44
  model.file_path = str(file_path)
43
45
  model.content_type = "text/markdown"
44
46
  model.created_at = markdown.created
@@ -20,24 +20,24 @@ from basic_memory.mcp.tools.edit_note import edit_note
20
20
  from basic_memory.mcp.tools.move_note import move_note
21
21
  from basic_memory.mcp.tools.sync_status import sync_status
22
22
  from basic_memory.mcp.tools.project_management import (
23
- list_projects,
23
+ list_memory_projects,
24
24
  switch_project,
25
25
  get_current_project,
26
26
  set_default_project,
27
- create_project,
27
+ create_memory_project,
28
28
  delete_project,
29
29
  )
30
30
 
31
31
  __all__ = [
32
32
  "build_context",
33
33
  "canvas",
34
- "create_project",
34
+ "create_memory_project",
35
35
  "delete_note",
36
36
  "delete_project",
37
37
  "edit_note",
38
38
  "get_current_project",
39
39
  "list_directory",
40
- "list_projects",
40
+ "list_memory_projects",
41
41
  "move_note",
42
42
  "read_content",
43
43
  "read_note",
@@ -19,7 +19,7 @@ from basic_memory.utils import generate_permalink
19
19
 
20
20
 
21
21
  @mcp.tool("list_memory_projects")
22
- async def list_projects(ctx: Context | None = None) -> str:
22
+ async def list_memory_projects(ctx: Context | None = None) -> str:
23
23
  """List all available projects with their status.
24
24
 
25
25
  Shows all Basic Memory projects that are available, indicating which one
@@ -29,7 +29,7 @@ async def list_projects(ctx: Context | None = None) -> str:
29
29
  Formatted list of projects with status indicators
30
30
 
31
31
  Example:
32
- list_projects()
32
+ list_memory_projects()
33
33
  """
34
34
  if ctx: # pragma: no cover
35
35
  await ctx.info("Listing all available projects")
@@ -144,13 +144,13 @@ async def switch_project(project_name: str, ctx: Context | None = None) -> str:
144
144
  Your session remains on the previous project.
145
145
 
146
146
  ## Troubleshooting:
147
- 1. **Check available projects**: Use `list_projects()` to see valid project names
147
+ 1. **Check available projects**: Use `list_memory_projects()` to see valid project names
148
148
  2. **Verify spelling**: Ensure the project name is spelled correctly
149
149
  3. **Check permissions**: Verify you have access to the requested project
150
150
  4. **Try again**: The error might be temporary
151
151
 
152
152
  ## Available options:
153
- - See all projects: `list_projects()`
153
+ - See all projects: `list_memory_projects()`
154
154
  - Stay on current project: `get_current_project()`
155
155
  - Try different project: `switch_project("correct-project-name")`
156
156
 
@@ -231,7 +231,7 @@ async def set_default_project(project_name: str, ctx: Context | None = None) ->
231
231
 
232
232
 
233
233
  @mcp.tool("create_memory_project")
234
- async def create_project(
234
+ async def create_memory_project(
235
235
  project_name: str, project_path: str, set_default: bool = False, ctx: Context | None = None
236
236
  ) -> str:
237
237
  """Create a new Basic Memory project.
@@ -248,8 +248,8 @@ async def create_project(
248
248
  Confirmation message with project details
249
249
 
250
250
  Example:
251
- create_project("my-research", "~/Documents/research")
252
- create_project("work-notes", "/home/user/work", set_default=True)
251
+ create_memory_project("my-research", "~/Documents/research")
252
+ create_memory_project("work-notes", "/home/user/work", set_default=True)
253
253
  """
254
254
  if ctx: # pragma: no cover
255
255
  await ctx.info(f"Creating project: {project_name} at {project_path}")
@@ -45,13 +45,18 @@ def _format_search_error_response(error_message: str, query: str, search_type: s
45
45
  - Boolean OR: `meeting OR discussion`
46
46
  - Boolean NOT: `project NOT archived`
47
47
  - Grouped: `(project OR planning) AND notes`
48
+ - Exact phrases: `"weekly standup meeting"`
49
+ - Content-specific: `tag:example` or `category:observation`
48
50
 
49
51
  ## Try again with:
50
52
  ```
51
- search_notes("INSERT_CLEAN_QUERY_HERE")
53
+ search_notes("{clean_query}")
52
54
  ```
53
55
 
54
- Replace INSERT_CLEAN_QUERY_HERE with your simplified search terms.
56
+ ## Alternative search strategies:
57
+ - Break into simpler terms: `search_notes("{" ".join(clean_query.split()[:2])}")`
58
+ - Try different search types: `search_notes("{clean_query}", search_type="title")`
59
+ - Use filtering: `search_notes("{clean_query}", types=["entity"])`
55
60
  """).strip()
56
61
 
57
62
  # Project not found errors (check before general "not found")
@@ -85,24 +90,39 @@ def _format_search_error_response(error_message: str, query: str, search_type: s
85
90
 
86
91
  No content found matching '{query}' in the current project.
87
92
 
88
- ## Suggestions to try:
93
+ ## Search strategy suggestions:
89
94
  1. **Broaden your search**: Try fewer or more general terms
90
95
  - Instead of: `{query}`
91
96
  - Try: `{simplified_query}`
92
97
 
93
- 2. **Check spelling**: Verify terms are spelled correctly
94
- 3. **Try different search types**:
95
- - Text search: `search_notes("{query}", search_type="text")`
96
- - Title search: `search_notes("{query}", search_type="title")`
97
- - Permalink search: `search_notes("{query}", search_type="permalink")`
98
-
99
- 4. **Use boolean operators**:
100
- - Try OR search for broader results
101
-
102
- ## Check what content exists:
103
- - Recent activity: `recent_activity(timeframe="7d")`
104
- - List files: `list_directory("/")`
105
- - Browse by folder: `list_directory("/notes")` or `list_directory("/docs")`
98
+ 2. **Check spelling and try variations**:
99
+ - Verify terms are spelled correctly
100
+ - Try synonyms or related terms
101
+
102
+ 3. **Use different search approaches**:
103
+ - **Text search**: `search_notes("{query}", search_type="text")` (searches full content)
104
+ - **Title search**: `search_notes("{query}", search_type="title")` (searches only titles)
105
+ - **Permalink search**: `search_notes("{query}", search_type="permalink")` (searches file paths)
106
+
107
+ 4. **Try boolean operators for broader results**:
108
+ - OR search: `search_notes("{" OR ".join(query.split()[:3])}")`
109
+ - Remove restrictive terms: Focus on the most important keywords
110
+
111
+ 5. **Use filtering to narrow scope**:
112
+ - By content type: `search_notes("{query}", types=["entity"])`
113
+ - By recent content: `search_notes("{query}", after_date="1 week")`
114
+ - By entity type: `search_notes("{query}", entity_types=["observation"])`
115
+
116
+ 6. **Try advanced search patterns**:
117
+ - Tag search: `search_notes("tag:your-tag")`
118
+ - Category search: `search_notes("category:observation")`
119
+ - Pattern matching: `search_notes("*{query}*", search_type="permalink")`
120
+
121
+ ## Explore what content exists:
122
+ - **Recent activity**: `recent_activity(timeframe="7d")` - See what's been updated recently
123
+ - **List directories**: `list_directory("/")` - Browse all content
124
+ - **Browse by folder**: `list_directory("/notes")` or `list_directory("/docs")`
125
+ - **Check project**: `get_current_project()` - Verify you're in the right project
106
126
  """).strip()
107
127
 
108
128
  # Server/API errors
@@ -151,25 +171,36 @@ You don't have permission to search in the current project: {error_message}
151
171
 
152
172
  Error searching for '{query}': {error_message}
153
173
 
154
- ## General troubleshooting:
155
- 1. **Check your query**: Ensure it uses valid search syntax
156
- 2. **Try simpler terms**: Use basic words without special characters
174
+ ## Troubleshooting steps:
175
+ 1. **Simplify your query**: Try basic words without special characters
176
+ 2. **Check search syntax**: Ensure boolean operators are correctly formatted
157
177
  3. **Verify project access**: Make sure you can access the current project
158
- 4. **Check recent activity**: `recent_activity(timeframe="7d")` to see if content exists
159
-
160
- ## Alternative approaches:
161
- - Browse files: `list_directory("/")`
162
- - Try different search type: `search_notes("{query}", search_type="title")`
163
- - Search with filters: `search_notes("{query}", types=["entity"])`
164
-
165
- ## Need help?
166
- - View recent changes: `recent_activity()`
167
- - List projects: `list_projects()`
168
- - Check current project: `get_current_project()`"""
178
+ 4. **Test with simple search**: Try `search_notes("test")` to verify search is working
179
+
180
+ ## Alternative search approaches:
181
+ - **Different search types**:
182
+ - Title only: `search_notes("{query}", search_type="title")`
183
+ - Permalink patterns: `search_notes("{query}*", search_type="permalink")`
184
+ - **With filters**: `search_notes("{query}", types=["entity"])`
185
+ - **Recent content**: `search_notes("{query}", after_date="1 week")`
186
+ - **Boolean variations**: `search_notes("{" OR ".join(query.split()[:2])}")`
187
+
188
+ ## Explore your content:
189
+ - **Browse files**: `list_directory("/")` - See all available content
190
+ - **Recent activity**: `recent_activity(timeframe="7d")` - Check what's been updated
191
+ - **Project info**: `get_current_project()` - Verify current project
192
+ - **All projects**: `list_projects()` - Switch to different project if needed
193
+
194
+ ## Search syntax reference:
195
+ - **Basic**: `keyword` or `multiple words`
196
+ - **Boolean**: `term1 AND term2`, `term1 OR term2`, `term1 NOT term2`
197
+ - **Phrases**: `"exact phrase"`
198
+ - **Grouping**: `(term1 OR term2) AND term3`
199
+ - **Patterns**: `tag:example`, `category:observation`"""
169
200
 
170
201
 
171
202
  @mcp.tool(
172
- description="Search across all content in the knowledge base.",
203
+ description="Search across all content in the knowledge base with advanced syntax support.",
173
204
  )
174
205
  async def search_notes(
175
206
  query: str,
@@ -181,24 +212,60 @@ async def search_notes(
181
212
  after_date: Optional[str] = None,
182
213
  project: Optional[str] = None,
183
214
  ) -> SearchResponse | str:
184
- """Search across all content in the knowledge base.
215
+ """Search across all content in the knowledge base with comprehensive syntax support.
185
216
 
186
217
  This tool searches the knowledge base using full-text search, pattern matching,
187
218
  or exact permalink lookup. It supports filtering by content type, entity type,
188
- and date.
219
+ and date, with advanced boolean and phrase search capabilities.
220
+
221
+ ## Search Syntax Examples
222
+
223
+ ### Basic Searches
224
+ - `search_notes("keyword")` - Find any content containing "keyword"
225
+ - `search_notes("exact phrase")` - Search for exact phrase match
226
+
227
+ ### Advanced Boolean Searches
228
+ - `search_notes("term1 term2")` - Find content with both terms (implicit AND)
229
+ - `search_notes("term1 AND term2")` - Explicit AND search (both terms required)
230
+ - `search_notes("term1 OR term2")` - Either term can be present
231
+ - `search_notes("term1 NOT term2")` - Include term1 but exclude term2
232
+ - `search_notes("(project OR planning) AND notes")` - Grouped boolean logic
233
+
234
+ ### Content-Specific Searches
235
+ - `search_notes("tag:example")` - Search within specific tags (if supported by content)
236
+ - `search_notes("category:observation")` - Filter by observation categories
237
+ - `search_notes("author:username")` - Find content by author (if metadata available)
238
+
239
+ ### Search Type Examples
240
+ - `search_notes("Meeting", search_type="title")` - Search only in titles
241
+ - `search_notes("docs/meeting-*", search_type="permalink")` - Pattern match permalinks
242
+ - `search_notes("keyword", search_type="text")` - Full-text search (default)
243
+
244
+ ### Filtering Options
245
+ - `search_notes("query", types=["entity"])` - Search only entities
246
+ - `search_notes("query", types=["note", "person"])` - Multiple content types
247
+ - `search_notes("query", entity_types=["observation"])` - Filter by entity type
248
+ - `search_notes("query", after_date="2024-01-01")` - Recent content only
249
+ - `search_notes("query", after_date="1 week")` - Relative date filtering
250
+
251
+ ### Advanced Pattern Examples
252
+ - `search_notes("project AND (meeting OR discussion)")` - Complex boolean logic
253
+ - `search_notes("\"exact phrase\" AND keyword")` - Combine phrase and keyword search
254
+ - `search_notes("bug NOT fixed")` - Exclude resolved issues
255
+ - `search_notes("docs/2024-*", search_type="permalink")` - Year-based permalink search
189
256
 
190
257
  Args:
191
- query: The search query string
258
+ query: The search query string (supports boolean operators, phrases, patterns)
192
259
  page: The page number of results to return (default 1)
193
260
  page_size: The number of results to return per page (default 10)
194
261
  search_type: Type of search to perform, one of: "text", "title", "permalink" (default: "text")
195
262
  types: Optional list of note types to search (e.g., ["note", "person"])
196
263
  entity_types: Optional list of entity types to filter by (e.g., ["entity", "observation"])
197
- after_date: Optional date filter for recent content (e.g., "1 week", "2d")
264
+ after_date: Optional date filter for recent content (e.g., "1 week", "2d", "2024-01-01")
198
265
  project: Optional project name to search in. If not provided, uses current active project.
199
266
 
200
267
  Returns:
201
- SearchResponse with results and pagination info
268
+ SearchResponse with results and pagination info, or helpful error guidance if search fails
202
269
 
203
270
  Examples:
204
271
  # Basic text search
@@ -216,16 +283,19 @@ async def search_notes(
216
283
  # Boolean search with grouping
217
284
  results = await search_notes("(project OR planning) AND notes")
218
285
 
286
+ # Exact phrase search
287
+ results = await search_notes("\"weekly standup meeting\"")
288
+
219
289
  # Search with type filter
220
290
  results = await search_notes(
221
291
  query="meeting notes",
222
292
  types=["entity"],
223
293
  )
224
294
 
225
- # Search with entity type filter, e.g., note vs
295
+ # Search with entity type filter
226
296
  results = await search_notes(
227
297
  query="meeting notes",
228
- types=["entity"],
298
+ entity_types=["observation"],
229
299
  )
230
300
 
231
301
  # Search for recent content
@@ -242,6 +312,13 @@ async def search_notes(
242
312
 
243
313
  # Search in specific project
244
314
  results = await search_notes("meeting notes", project="work-project")
315
+
316
+ # Complex search with multiple filters
317
+ results = await search_notes(
318
+ query="(bug OR issue) AND NOT resolved",
319
+ types=["entity"],
320
+ after_date="2024-01-01"
321
+ )
245
322
  """
246
323
  # Create a SearchQuery object based on the parameters
247
324
  search_query = SearchQuery()
@@ -131,7 +131,7 @@ class EntityResponse(SQLAlchemyModel):
131
131
  }
132
132
  """
133
133
 
134
- permalink: Permalink
134
+ permalink: Optional[Permalink]
135
135
  title: str
136
136
  file_path: str
137
137
  entity_type: EntityType
@@ -93,7 +93,7 @@ class TestMCPServer:
93
93
  # Missing SUPABASE_ANON_KEY
94
94
  }
95
95
 
96
- with patch.dict(os.environ, env_vars):
96
+ with patch.dict(os.environ, env_vars, clear=True):
97
97
  with pytest.raises(ValueError, match="SUPABASE_URL and SUPABASE_ANON_KEY must be set"):
98
98
  create_auth_config()
99
99