basic-memory 0.13.5__tar.gz → 0.13.7__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 (314) hide show
  1. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/workflows/release.yml +29 -1
  2. {basic_memory-0.13.5 → basic_memory-0.13.7}/CHANGELOG.md +74 -0
  3. {basic_memory-0.13.5 → basic_memory-0.13.7}/CLAUDE.md +45 -14
  4. {basic_memory-0.13.5 → basic_memory-0.13.7}/PKG-INFO +22 -5
  5. {basic_memory-0.13.5 → basic_memory-0.13.7}/README.md +21 -4
  6. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/__init__.py +1 -1
  7. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/env.py +3 -3
  8. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/db.py +42 -8
  9. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/write_note.py +3 -1
  10. basic_memory-0.13.7/src/basic_memory/repository/entity_repository.py +251 -0
  11. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/entity_service.py +20 -16
  12. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/initialization.py +15 -11
  13. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/templates/prompts/continue_conversation.hbs +1 -1
  14. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_write_note.py +246 -1
  15. basic_memory-0.13.7/tests/repository/test_entity_repository_upsert.py +248 -0
  16. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_entity_service.py +24 -66
  17. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_initialization.py +10 -9
  18. basic_memory-0.13.7/tests/test_db_migration_deduplication.py +187 -0
  19. basic_memory-0.13.5/src/basic_memory/repository/entity_repository.py +0 -98
  20. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/check-health.md +0 -0
  21. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/commands.md +0 -0
  22. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/lint-fix.md +0 -0
  23. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/release/beta.md +0 -0
  24. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/release/changelog.md +0 -0
  25. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/release/release-check.md +0 -0
  26. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/release/release.md +0 -0
  27. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/test-coverage.md +0 -0
  28. {basic_memory-0.13.5 → basic_memory-0.13.7}/.claude/commands/test-live.md +0 -0
  29. {basic_memory-0.13.5 → basic_memory-0.13.7}/.env.oauth.example +0 -0
  30. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  31. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  32. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  33. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  34. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/dependabot.yml +0 -0
  35. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/workflows/claude.yml +0 -0
  36. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/workflows/dev-release.yml +0 -0
  37. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/workflows/pr-title.yml +0 -0
  38. {basic_memory-0.13.5 → basic_memory-0.13.7}/.github/workflows/test.yml +0 -0
  39. {basic_memory-0.13.5 → basic_memory-0.13.7}/.gitignore +0 -0
  40. {basic_memory-0.13.5 → basic_memory-0.13.7}/.mcp.json +0 -0
  41. {basic_memory-0.13.5 → basic_memory-0.13.7}/.python-version +0 -0
  42. {basic_memory-0.13.5 → basic_memory-0.13.7}/AUTH.md +0 -0
  43. {basic_memory-0.13.5 → basic_memory-0.13.7}/CITATION.cff +0 -0
  44. {basic_memory-0.13.5 → basic_memory-0.13.7}/CLA.md +0 -0
  45. {basic_memory-0.13.5 → basic_memory-0.13.7}/CODE_OF_CONDUCT.md +0 -0
  46. {basic_memory-0.13.5 → basic_memory-0.13.7}/CONTRIBUTING.md +0 -0
  47. {basic_memory-0.13.5 → basic_memory-0.13.7}/Dockerfile +0 -0
  48. {basic_memory-0.13.5 → basic_memory-0.13.7}/LICENSE +0 -0
  49. {basic_memory-0.13.5 → basic_memory-0.13.7}/SECURITY.md +0 -0
  50. {basic_memory-0.13.5 → basic_memory-0.13.7}/basic-memory.md +0 -0
  51. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/AI Assistant Guide.md +0 -0
  52. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/CLI Reference.md +0 -0
  53. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Canvas.md +0 -0
  54. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Claude.ai Integration.md +0 -0
  55. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Getting Started with Basic Memory.md +0 -0
  56. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Knowledge Format.md +0 -0
  57. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/OAuth Authentication Guide.md +0 -0
  58. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Obsidian Integration.md +0 -0
  59. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Supabase OAuth Setup.md +0 -0
  60. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Technical Information.md +0 -0
  61. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/User Guide.md +0 -0
  62. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/Welcome to Basic memory.md +0 -0
  63. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/Canvas.png +0 -0
  64. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/Claude-Obsidian-Demo.mp4 +0 -0
  65. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/Prompt.png +0 -0
  66. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/disk-ai-logo-400x400.png +0 -0
  67. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/disk-ai-logo.png +0 -0
  68. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/prompt 1.png +0 -0
  69. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/prompt2.png +0 -0
  70. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/prompt3.png +0 -0
  71. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/attachments/prompt4.png +0 -0
  72. {basic_memory-0.13.5 → basic_memory-0.13.7}/docs/publish.js +0 -0
  73. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Brewing Equipment.md +0 -0
  74. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Coffee Bean Origins.md +0 -0
  75. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Coffee Brewing Methods.md +0 -0
  76. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Coffee Flavor Map.md +0 -0
  77. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Coffee Knowledge Base.md +0 -0
  78. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Flavor Extraction.md +0 -0
  79. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Perfect Pour Over Coffee Method.canvas +0 -0
  80. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/Coffee Notes/Tasting Notes.md +0 -0
  81. {basic_memory-0.13.5 → basic_memory-0.13.7}/examples/testing/Test Note Creation - Basic Functionality.md +0 -0
  82. {basic_memory-0.13.5 → basic_memory-0.13.7}/justfile +0 -0
  83. {basic_memory-0.13.5 → basic_memory-0.13.7}/llms-install.md +0 -0
  84. {basic_memory-0.13.5 → basic_memory-0.13.7}/memory.json +0 -0
  85. {basic_memory-0.13.5 → basic_memory-0.13.7}/pyproject.toml +0 -0
  86. {basic_memory-0.13.5 → basic_memory-0.13.7}/scripts/install.sh +0 -0
  87. {basic_memory-0.13.5 → basic_memory-0.13.7}/smithery.yaml +0 -0
  88. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/alembic.ini +0 -0
  89. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/migrations.py +0 -0
  90. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/script.py.mako +0 -0
  91. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  92. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  93. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  94. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  95. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  96. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  97. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/__init__.py +0 -0
  98. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/app.py +0 -0
  99. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/__init__.py +0 -0
  100. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/directory_router.py +0 -0
  101. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/importer_router.py +0 -0
  102. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/knowledge_router.py +0 -0
  103. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/management_router.py +0 -0
  104. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/memory_router.py +0 -0
  105. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/project_router.py +0 -0
  106. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/prompt_router.py +0 -0
  107. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/resource_router.py +0 -0
  108. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/search_router.py +0 -0
  109. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/routers/utils.py +0 -0
  110. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/api/template_loader.py +0 -0
  111. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/__init__.py +0 -0
  112. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/app.py +0 -0
  113. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/__init__.py +0 -0
  114. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/auth.py +0 -0
  115. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/db.py +0 -0
  116. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  117. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  118. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  119. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  120. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/mcp.py +0 -0
  121. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/project.py +0 -0
  122. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/status.py +0 -0
  123. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/sync.py +0 -0
  124. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/commands/tool.py +0 -0
  125. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/cli/main.py +0 -0
  126. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/config.py +0 -0
  127. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/deps.py +0 -0
  128. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/file_utils.py +0 -0
  129. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/__init__.py +0 -0
  130. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/base.py +0 -0
  131. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  132. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  133. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  134. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/memory_json_importer.py +0 -0
  135. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/importers/utils.py +0 -0
  136. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/__init__.py +0 -0
  137. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/entity_parser.py +0 -0
  138. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/markdown_processor.py +0 -0
  139. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/plugins.py +0 -0
  140. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/schemas.py +0 -0
  141. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/markdown/utils.py +0 -0
  142. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/__init__.py +0 -0
  143. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/async_client.py +0 -0
  144. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/auth_provider.py +0 -0
  145. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/external_auth_provider.py +0 -0
  146. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/project_session.py +0 -0
  147. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  148. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  149. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  150. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  151. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/search.py +0 -0
  152. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/sync_status.py +0 -0
  153. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/prompts/utils.py +0 -0
  154. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  155. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/resources/project_info.py +0 -0
  156. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/server.py +0 -0
  157. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
  158. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/__init__.py +0 -0
  159. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/build_context.py +0 -0
  160. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/canvas.py +0 -0
  161. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  162. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  163. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  164. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/move_note.py +0 -0
  165. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/project_management.py +0 -0
  166. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/read_content.py +0 -0
  167. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/read_note.py +0 -0
  168. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  169. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/search.py +0 -0
  170. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/sync_status.py +0 -0
  171. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/utils.py +0 -0
  172. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/mcp/tools/view_note.py +0 -0
  173. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/models/__init__.py +0 -0
  174. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/models/base.py +0 -0
  175. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/models/knowledge.py +0 -0
  176. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/models/project.py +0 -0
  177. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/models/search.py +0 -0
  178. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/__init__.py +0 -0
  179. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/observation_repository.py +0 -0
  180. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/project_info_repository.py +0 -0
  181. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/project_repository.py +0 -0
  182. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/relation_repository.py +0 -0
  183. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/repository.py +0 -0
  184. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/repository/search_repository.py +0 -0
  185. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/__init__.py +0 -0
  186. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/base.py +0 -0
  187. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/delete.py +0 -0
  188. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/directory.py +0 -0
  189. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/importer.py +0 -0
  190. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/memory.py +0 -0
  191. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/project_info.py +0 -0
  192. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/prompt.py +0 -0
  193. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/request.py +0 -0
  194. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/response.py +0 -0
  195. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/schemas/search.py +0 -0
  196. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/__init__.py +0 -0
  197. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/context_service.py +0 -0
  198. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/directory_service.py +0 -0
  199. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/exceptions.py +0 -0
  200. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/file_service.py +0 -0
  201. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/link_resolver.py +0 -0
  202. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/migration_service.py +0 -0
  203. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/project_service.py +0 -0
  204. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/search_service.py +0 -0
  205. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/service.py +0 -0
  206. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/services/sync_status_service.py +0 -0
  207. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/sync/__init__.py +0 -0
  208. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/sync/background_sync.py +0 -0
  209. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/sync/sync_service.py +0 -0
  210. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/sync/watch_service.py +0 -0
  211. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/templates/prompts/search.hbs +0 -0
  212. {basic_memory-0.13.5 → basic_memory-0.13.7}/src/basic_memory/utils.py +0 -0
  213. {basic_memory-0.13.5 → basic_memory-0.13.7}/static/ai_assistant_guide.md +0 -0
  214. {basic_memory-0.13.5 → basic_memory-0.13.7}/static/json_canvas_spec_1_0.md +0 -0
  215. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/conftest.py +0 -0
  216. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_build_context_validation.py +0 -0
  217. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_delete_note_integration.py +0 -0
  218. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_edit_note_integration.py +0 -0
  219. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_list_directory_integration.py +0 -0
  220. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_move_note_integration.py +0 -0
  221. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_project_management_integration.py +0 -0
  222. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_read_content_integration.py +0 -0
  223. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_read_note_integration.py +0 -0
  224. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_search_integration.py +0 -0
  225. {basic_memory-0.13.5 → basic_memory-0.13.7}/test-int/mcp/test_write_note_integration.py +0 -0
  226. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/Non-MarkdownFileSupport.pdf +0 -0
  227. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/Screenshot.png +0 -0
  228. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/__init__.py +0 -0
  229. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/conftest.py +0 -0
  230. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_continue_conversation_template.py +0 -0
  231. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_directory_router.py +0 -0
  232. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_importer_router.py +0 -0
  233. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_knowledge_router.py +0 -0
  234. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_management_router.py +0 -0
  235. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_memory_router.py +0 -0
  236. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_project_router.py +0 -0
  237. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_project_router_operations.py +0 -0
  238. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_prompt_router.py +0 -0
  239. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_resource_router.py +0 -0
  240. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_search_router.py +0 -0
  241. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_search_template.py +0 -0
  242. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_template_loader.py +0 -0
  243. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/api/test_template_loader_helpers.py +0 -0
  244. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/conftest.py +0 -0
  245. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_auth_commands.py +0 -0
  246. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_cli_tools.py +0 -0
  247. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_import_chatgpt.py +0 -0
  248. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_import_claude_conversations.py +0 -0
  249. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_import_claude_projects.py +0 -0
  250. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_import_memory_json.py +0 -0
  251. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_project_commands.py +0 -0
  252. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_project_info.py +0 -0
  253. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_status.py +0 -0
  254. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_sync.py +0 -0
  255. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/cli/test_version.py +0 -0
  256. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/conftest.py +0 -0
  257. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/importers/test_importer_base.py +0 -0
  258. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/importers/test_importer_utils.py +0 -0
  259. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/__init__.py +0 -0
  260. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_entity_parser.py +0 -0
  261. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_markdown_plugins.py +0 -0
  262. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_markdown_processor.py +0 -0
  263. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_observation_edge_cases.py +0 -0
  264. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_parser_edge_cases.py +0 -0
  265. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_relation_edge_cases.py +0 -0
  266. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/markdown/test_task_detection.py +0 -0
  267. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/conftest.py +0 -0
  268. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_auth_provider.py +0 -0
  269. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_prompts.py +0 -0
  270. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_resource_project_info.py +0 -0
  271. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_resources.py +0 -0
  272. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_server.py +0 -0
  273. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_build_context.py +0 -0
  274. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_canvas.py +0 -0
  275. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_delete_note.py +0 -0
  276. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_edit_note.py +0 -0
  277. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_list_directory.py +0 -0
  278. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_move_note.py +0 -0
  279. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_read_note.py +0 -0
  280. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_recent_activity.py +0 -0
  281. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_resource.py +0 -0
  282. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_search.py +0 -0
  283. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_sync_status.py +0 -0
  284. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_utils.py +0 -0
  285. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/mcp/test_tool_view_note.py +0 -0
  286. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_entity_repository.py +0 -0
  287. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_observation_repository.py +0 -0
  288. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_project_info_repository.py +0 -0
  289. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_project_repository.py +0 -0
  290. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_relation_repository.py +0 -0
  291. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_repository.py +0 -0
  292. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/repository/test_search_repository.py +0 -0
  293. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/schemas/test_memory_url.py +0 -0
  294. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/schemas/test_memory_url_validation.py +0 -0
  295. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/schemas/test_schemas.py +0 -0
  296. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/schemas/test_search.py +0 -0
  297. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_context_service.py +0 -0
  298. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_directory_service.py +0 -0
  299. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_file_service.py +0 -0
  300. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_link_resolver.py +0 -0
  301. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_project_service.py +0 -0
  302. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_project_service_operations.py +0 -0
  303. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_search_service.py +0 -0
  304. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/services/test_sync_status_service.py +0 -0
  305. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/sync/test_sync_service.py +0 -0
  306. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/sync/test_sync_wikilink_issue.py +0 -0
  307. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/sync/test_tmp_files.py +0 -0
  308. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/sync/test_watch_service.py +0 -0
  309. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/sync/test_watch_service_edge_cases.py +0 -0
  310. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/utils/test_file_utils.py +0 -0
  311. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/utils/test_parse_tags.py +0 -0
  312. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/utils/test_permalink_formatting.py +0 -0
  313. {basic_memory-0.13.5 → basic_memory-0.13.7}/tests/utils/test_utf8_handling.py +0 -0
  314. {basic_memory-0.13.5 → basic_memory-0.13.7}/uv.lock +0 -0
@@ -51,4 +51,32 @@ jobs:
51
51
  - name: Publish to PyPI
52
52
  uses: pypa/gh-action-pypi-publish@release/v1
53
53
  with:
54
- password: ${{ secrets.PYPI_TOKEN }}
54
+ password: ${{ secrets.PYPI_TOKEN }}
55
+
56
+ homebrew:
57
+ name: Update Homebrew Formula
58
+ needs: release
59
+ runs-on: ubuntu-latest
60
+ permissions:
61
+ contents: write
62
+ actions: read
63
+ steps:
64
+ - name: Update Homebrew formula
65
+ uses: mislav/bump-homebrew-formula-action@v3
66
+ with:
67
+ # Formula name in homebrew-basic-memory repo
68
+ formula-name: basic-memory
69
+ # The tap repository
70
+ homebrew-tap: basicmachines-co/homebrew-basic-memory
71
+ # Base branch of the tap repository
72
+ base-branch: main
73
+ # Download URL will be automatically constructed from the tag
74
+ download-url: https://github.com/basicmachines-co/basic-memory/archive/refs/tags/${{ github.ref_name }}.tar.gz
75
+ # Commit message for the formula update
76
+ commit-message: |
77
+ {{formulaName}} {{version}}
78
+
79
+ Created by https://github.com/basicmachines-co/basic-memory/actions/runs/${{ github.run_id }}
80
+ env:
81
+ # Personal Access Token with repo scope for homebrew-basic-memory repo
82
+ COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TOKEN }}
@@ -1,5 +1,79 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.13.6 (2025-06-18)
4
+
5
+ ### Bug Fixes
6
+
7
+ - **Custom Entity Types** - Support for custom entity types in write_note
8
+ ([`7789864`](https://github.com/basicmachines-co/basic-memory/commit/77898644933589c2da9bdd60571d54137a5309ed))
9
+ - Fixed `entity_type` parameter for `write_note` MCP tool to respect value passed in
10
+ - Frontmatter `type` field automatically respected when no explicit parameter provided
11
+ - Maintains backward compatibility with default "note" type
12
+
13
+ - **#139**: Fix "UNIQUE constraint failed: entity.permalink" database error
14
+ ([`c6215fd`](https://github.com/basicmachines-co/basic-memory/commit/c6215fd819f9564ead91cf3a950f855241446096))
15
+ - Implement SQLAlchemy UPSERT strategy to handle permalink conflicts gracefully
16
+ - Eliminates crashes when creating notes with existing titles in same folders
17
+ - Seamlessly updates existing entities instead of failing with constraint errors
18
+
19
+ - **Database Migration Performance** - Eliminate redundant migration initialization
20
+ ([`84d2aaf`](https://github.com/basicmachines-co/basic-memory/commit/84d2aaf6414dd083af4b0df73f6c8139b63468f6))
21
+ - Fix duplicate migration calls that slowed system startup
22
+ - Improve performance with multiple projects (tested with 28+ projects)
23
+ - Add migration deduplication safeguards with comprehensive test coverage
24
+
25
+ - **User Experience** - Correct spelling error in continue_conversation prompt
26
+ ([`b4c26a6`](https://github.com/basicmachines-co/basic-memory/commit/b4c26a613379e6f2ba655efe3d7d8d40c27999e5))
27
+ - Fix "Chose a folder" → "Choose a folder" in MCP prompt instructions
28
+ - Improve grammar and clarity in user-facing prompt text
29
+
30
+ ### Documentation
31
+
32
+ - **Website Updates** - Add new website and community links to README
33
+ ([`3fdce68`](https://github.com/basicmachines-co/basic-memory/commit/3fdce683d7ad8b6f4855d7138d5ff2136d4c07bc))
34
+
35
+ - **Project Documentation** - Update README.md and CLAUDE.md with latest project information
36
+ ([`782cb2d`](https://github.com/basicmachines-co/basic-memory/commit/782cb2df28803482d209135a054e67cc32d7363e))
37
+
38
+ ### Technical Improvements
39
+
40
+ - **Comprehensive Test Coverage** - Add extensive test suites for new features
41
+ - Custom entity type validation with 8 new test scenarios
42
+ - UPSERT behavior testing with edge case coverage
43
+ - Migration deduplication testing with 6 test scenarios
44
+ - Database constraint handling validation
45
+
46
+ - **Code Quality** - Enhanced error handling and validation
47
+ - Improved SQLAlchemy patterns with modern UPSERT operations
48
+ - Better conflict resolution strategies for entity management
49
+ - Strengthened database consistency guarantees
50
+
51
+ ### Performance
52
+
53
+ - **Database Operations** - Faster startup and improved scalability
54
+ - Reduced migration overhead for multi-project setups
55
+ - Optimized conflict resolution for entity creation
56
+ - Enhanced performance with growing knowledge bases
57
+
58
+ ### Migration Guide
59
+
60
+ This release includes automatic database improvements. No manual migration required:
61
+
62
+ - Existing notes and entity types continue working unchanged
63
+ - New `entity_type` parameter is optional and backward compatible
64
+ - Database performance improvements apply automatically
65
+ - All existing MCP tool behavior preserved
66
+
67
+ ### Installation
68
+
69
+ ```bash
70
+ # Latest stable release
71
+ uv tool install basic-memory
72
+
73
+ # Update existing installation
74
+ uv tool upgrade basic-memory
75
+ ```
76
+
3
77
  ## v0.13.5 (2025-06-11)
4
78
 
5
79
  ### Bug Fixes
@@ -97,15 +97,26 @@ See the [README.md](README.md) file for a project overview.
97
97
 
98
98
  **Content Management:**
99
99
  - `write_note(title, content, folder, tags)` - Create/update markdown notes with semantic observations and relations
100
- - `read_note(identifier, page, page_size)` - Read notes by title, permalink, or memory:// URL with knowledge graph
101
- awareness
102
- - `read_file(path)` - Read raw file content (text, images, binaries) without knowledge graph processing
100
+ - `read_note(identifier, page, page_size)` - Read notes by title, permalink, or memory:// URL with knowledge graph awareness
101
+ - `edit_note(identifier, operation, content)` - Edit notes incrementally (append, prepend, find/replace, section replace)
102
+ - `move_note(identifier, destination_path)` - Move notes with database consistency and search reindexing
103
+ - `view_note(identifier)` - Display notes as formatted artifacts for better readability in Claude Desktop
104
+ - `read_content(path)` - Read raw file content (text, images, binaries) without knowledge graph processing
105
+ - `delete_note(identifier)` - Delete notes from knowledge base
106
+
107
+ **Project Management:**
108
+ - `list_memory_projects()` - List all available projects with status indicators
109
+ - `switch_project(project_name)` - Switch to different project context during conversations
110
+ - `get_current_project()` - Show currently active project with statistics
111
+ - `create_memory_project(name, path, set_default)` - Create new Basic Memory projects
112
+ - `delete_project(name)` - Delete projects from configuration and database
113
+ - `set_default_project(name)` - Set default project in config
114
+ - `sync_status()` - Check file synchronization status and background operations
103
115
 
104
116
  **Knowledge Graph Navigation:**
105
- - `build_context(url, depth, timeframe)` - Navigate the knowledge graph via memory:// URLs for conversation
106
- continuity
107
- - `recent_activity(type, depth, timeframe)` - Get recently updated information with specified timeframe (e.g., "
108
- 1d", "1 week")
117
+ - `build_context(url, depth, timeframe)` - Navigate the knowledge graph via memory:// URLs for conversation continuity
118
+ - `recent_activity(type, depth, timeframe)` - Get recently updated information with specified timeframe (e.g., "1d", "1 week")
119
+ - `list_directory(dir_name, depth, file_name_glob)` - List directory contents with filtering and depth control
109
120
 
110
121
  **Search & Discovery:**
111
122
  - `search_notes(query, page, page_size)` - Full-text search across all content with filtering options
@@ -212,13 +223,33 @@ Basic Memory uses `uv-dynamic-versioning` for automatic version management based
212
223
  - Users install with: `pip install basic-memory --pre`
213
224
  - Use for milestone testing before stable release
214
225
 
215
- #### Stable Releases (Manual)
226
+ #### Stable Releases (Automated)
227
+ - Use the automated release system: `just release v0.13.0`
228
+ - Includes comprehensive quality checks (lint, format, type-check, tests)
229
+ - Automatically updates version in `__init__.py`
230
+ - Creates git tag and pushes to GitHub
231
+ - Triggers GitHub Actions workflow for:
232
+ - PyPI publication
233
+ - Homebrew formula update (requires HOMEBREW_TOKEN secret)
234
+
235
+ **Manual method (legacy):**
216
236
  - Create version tag: `git tag v0.13.0 && git push origin v0.13.0`
217
- - Automatically builds, creates GitHub release, and publishes to PyPI
218
- - Users install with: `pip install basic-memory`
237
+
238
+ #### Homebrew Formula Updates
239
+ - Automatically triggered after successful PyPI release
240
+ - Updates formula in `basicmachines-co/homebrew-basic-memory` repo
241
+ - Requires `HOMEBREW_TOKEN` secret in GitHub repository settings:
242
+ - Create a fine-grained Personal Access Token with `Contents: Read and Write` and `Actions: Read` scopes on `basicmachines-co/homebrew-basic-memory`
243
+ - Add as repository secret named `HOMEBREW_TOKEN` in `basicmachines-co/basic-memory`
244
+ - Formula updates include new version URL and SHA256 checksum
219
245
 
220
246
  ### For Development
221
- - No manual version bumping required
222
- - Versions automatically derived from git tags
223
- - `pyproject.toml` uses `dynamic = ["version"]`
224
- - `__init__.py` dynamically reads version from package metadata
247
+ - **Automated releases**: Use `just release v0.13.x` for stable releases and `just beta v0.13.0b1` for beta releases
248
+ - **Quality gates**: All releases require passing lint, format, type-check, and test suites
249
+ - **Version management**: Versions automatically derived from git tags via `uv-dynamic-versioning`
250
+ - **Configuration**: `pyproject.toml` uses `dynamic = ["version"]`
251
+ - **Release automation**: `__init__.py` updated automatically during release process
252
+ - **CI/CD**: GitHub Actions handles building and PyPI publication
253
+
254
+ ## Development Notes
255
+ - make sure you sign off on commits
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.13.5
3
+ Version: 0.13.7
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
@@ -51,8 +51,11 @@ Basic Memory lets you build persistent knowledge through natural conversations w
51
51
  Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
52
52
  enable any compatible LLM to read and write to your local knowledge base.
53
53
 
54
- - Website: https://basicmachines.co
54
+ - Website: https://basicmemory.com
55
+ - Company: https://basicmachines.co
55
56
  - Documentation: https://memory.basicmachines.co
57
+ - Discord: https://discord.gg/tyvKNccgqN
58
+ - YouTube: https://www.youtube.com/@basicmachines-co
56
59
 
57
60
  ## Pick up your conversation right where you left off
58
61
 
@@ -99,8 +102,7 @@ Memory for Claude Desktop:
99
102
  npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
100
103
  ```
101
104
 
102
- This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
103
- Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
105
+ 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.
104
106
 
105
107
  ### Glama.ai
106
108
 
@@ -191,7 +193,8 @@ The note embeds semantic content and links to other topics via simple Markdown f
191
193
 
192
194
  3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
193
195
 
194
- - Realtime sync is enabled by default with the v0.12.0 version
196
+ - Realtime sync is enabled by default starting with v0.12.0
197
+ - Project switching during conversations is supported starting with v0.13.0
195
198
 
196
199
  4. In a chat with the LLM, you can reference a topic:
197
200
 
@@ -389,10 +392,20 @@ Basic Memory will sync the files in your project in real time if you make manual
389
392
  ```
390
393
  write_note(title, content, folder, tags) - Create or update notes
391
394
  read_note(identifier, page, page_size) - Read notes by title or permalink
395
+ edit_note(identifier, operation, content) - Edit notes incrementally (append, prepend, find/replace)
396
+ move_note(identifier, destination_path) - Move notes with database consistency
397
+ view_note(identifier) - Display notes as formatted artifacts for better readability
392
398
  build_context(url, depth, timeframe) - Navigate knowledge graph via memory:// URLs
393
399
  search_notes(query, page, page_size) - Search across your knowledge base
394
400
  recent_activity(type, depth, timeframe) - Find recently updated information
395
401
  canvas(nodes, edges, title, folder) - Generate knowledge visualizations
402
+ list_memory_projects() - List all available projects with status
403
+ switch_project(project_name) - Switch to different project context
404
+ get_current_project() - Show current project and statistics
405
+ create_memory_project(name, path, set_default) - Create new projects
406
+ delete_project(name) - Delete projects from configuration
407
+ set_default_project(name) - Set default project
408
+ sync_status() - Check file synchronization status
396
409
  ```
397
410
 
398
411
  5. Example prompts to try:
@@ -403,6 +416,10 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
403
416
  "Create a canvas visualization of my project components"
404
417
  "Read my notes on the authentication system"
405
418
  "What have I been working on in the past week?"
419
+ "Switch to my work-notes project"
420
+ "List all my available projects"
421
+ "Edit my coffee brewing note to add a new technique"
422
+ "Move my old meeting notes to the archive folder"
406
423
  ```
407
424
 
408
425
  ## Futher info
@@ -13,8 +13,11 @@ Basic Memory lets you build persistent knowledge through natural conversations w
13
13
  Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
14
14
  enable any compatible LLM to read and write to your local knowledge base.
15
15
 
16
- - Website: https://basicmachines.co
16
+ - Website: https://basicmemory.com
17
+ - Company: https://basicmachines.co
17
18
  - Documentation: https://memory.basicmachines.co
19
+ - Discord: https://discord.gg/tyvKNccgqN
20
+ - YouTube: https://www.youtube.com/@basicmachines-co
18
21
 
19
22
  ## Pick up your conversation right where you left off
20
23
 
@@ -61,8 +64,7 @@ Memory for Claude Desktop:
61
64
  npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
62
65
  ```
63
66
 
64
- This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
65
- Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
67
+ 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.
66
68
 
67
69
  ### Glama.ai
68
70
 
@@ -153,7 +155,8 @@ The note embeds semantic content and links to other topics via simple Markdown f
153
155
 
154
156
  3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
155
157
 
156
- - Realtime sync is enabled by default with the v0.12.0 version
158
+ - Realtime sync is enabled by default starting with v0.12.0
159
+ - Project switching during conversations is supported starting with v0.13.0
157
160
 
158
161
  4. In a chat with the LLM, you can reference a topic:
159
162
 
@@ -351,10 +354,20 @@ Basic Memory will sync the files in your project in real time if you make manual
351
354
  ```
352
355
  write_note(title, content, folder, tags) - Create or update notes
353
356
  read_note(identifier, page, page_size) - Read notes by title or permalink
357
+ edit_note(identifier, operation, content) - Edit notes incrementally (append, prepend, find/replace)
358
+ move_note(identifier, destination_path) - Move notes with database consistency
359
+ view_note(identifier) - Display notes as formatted artifacts for better readability
354
360
  build_context(url, depth, timeframe) - Navigate knowledge graph via memory:// URLs
355
361
  search_notes(query, page, page_size) - Search across your knowledge base
356
362
  recent_activity(type, depth, timeframe) - Find recently updated information
357
363
  canvas(nodes, edges, title, folder) - Generate knowledge visualizations
364
+ list_memory_projects() - List all available projects with status
365
+ switch_project(project_name) - Switch to different project context
366
+ get_current_project() - Show current project and statistics
367
+ create_memory_project(name, path, set_default) - Create new projects
368
+ delete_project(name) - Delete projects from configuration
369
+ set_default_project(name) - Set default project
370
+ sync_status() - Check file synchronization status
358
371
  ```
359
372
 
360
373
  5. Example prompts to try:
@@ -365,6 +378,10 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
365
378
  "Create a canvas visualization of my project components"
366
379
  "Read my notes on the authentication system"
367
380
  "What have I been working on in the past week?"
381
+ "Switch to my work-notes project"
382
+ "List all my available projects"
383
+ "Edit my coffee brewing note to add a new technique"
384
+ "Move my old meeting notes to the archive folder"
368
385
  ```
369
386
 
370
387
  ## Futher info
@@ -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.13.5"
4
+ __version__ = "0.13.7"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -8,12 +8,12 @@ from sqlalchemy import pool
8
8
 
9
9
  from alembic import context
10
10
 
11
- from basic_memory.models import Base
12
-
13
11
  # set config.env to "test" for pytest to prevent logging to file in utils.setup_logging()
14
12
  os.environ["BASIC_MEMORY_ENV"] = "test"
15
13
 
16
- from basic_memory.config import app_config
14
+ # Import after setting environment variable # noqa: E402
15
+ from basic_memory.config import app_config # noqa: E402
16
+ from basic_memory.models import Base # noqa: E402
17
17
 
18
18
  # this is the Alembic Config object, which provides
19
19
  # access to the values within the .ini file in use.
@@ -23,6 +23,7 @@ from basic_memory.repository.search_repository import SearchRepository
23
23
  # Module level state
24
24
  _engine: Optional[AsyncEngine] = None
25
25
  _session_maker: Optional[async_sessionmaker[AsyncSession]] = None
26
+ _migrations_completed: bool = False
26
27
 
27
28
 
28
29
  class DatabaseType(Enum):
@@ -72,18 +73,35 @@ async def scoped_session(
72
73
  await factory.remove()
73
74
 
74
75
 
76
+ def _create_engine_and_session(
77
+ db_path: Path, db_type: DatabaseType = DatabaseType.FILESYSTEM
78
+ ) -> tuple[AsyncEngine, async_sessionmaker[AsyncSession]]:
79
+ """Internal helper to create engine and session maker."""
80
+ db_url = DatabaseType.get_db_url(db_path, db_type)
81
+ logger.debug(f"Creating engine for db_url: {db_url}")
82
+ engine = create_async_engine(db_url, connect_args={"check_same_thread": False})
83
+ session_maker = async_sessionmaker(engine, expire_on_commit=False)
84
+ return engine, session_maker
85
+
86
+
75
87
  async def get_or_create_db(
76
88
  db_path: Path,
77
89
  db_type: DatabaseType = DatabaseType.FILESYSTEM,
90
+ ensure_migrations: bool = True,
91
+ app_config: Optional["BasicMemoryConfig"] = None,
78
92
  ) -> tuple[AsyncEngine, async_sessionmaker[AsyncSession]]: # pragma: no cover
79
93
  """Get or create database engine and session maker."""
80
94
  global _engine, _session_maker
81
95
 
82
96
  if _engine is None:
83
- db_url = DatabaseType.get_db_url(db_path, db_type)
84
- logger.debug(f"Creating engine for db_url: {db_url}")
85
- _engine = create_async_engine(db_url, connect_args={"check_same_thread": False})
86
- _session_maker = async_sessionmaker(_engine, expire_on_commit=False)
97
+ _engine, _session_maker = _create_engine_and_session(db_path, db_type)
98
+
99
+ # Run migrations automatically unless explicitly disabled
100
+ if ensure_migrations:
101
+ if app_config is None:
102
+ from basic_memory.config import app_config as global_app_config
103
+ app_config = global_app_config
104
+ await run_migrations(app_config, db_type)
87
105
 
88
106
  # These checks should never fail since we just created the engine and session maker
89
107
  # if they were None, but we'll check anyway for the type checker
@@ -100,12 +118,13 @@ async def get_or_create_db(
100
118
 
101
119
  async def shutdown_db() -> None: # pragma: no cover
102
120
  """Clean up database connections."""
103
- global _engine, _session_maker
121
+ global _engine, _session_maker, _migrations_completed
104
122
 
105
123
  if _engine:
106
124
  await _engine.dispose()
107
125
  _engine = None
108
126
  _session_maker = None
127
+ _migrations_completed = False
109
128
 
110
129
 
111
130
  @asynccontextmanager
@@ -119,7 +138,7 @@ async def engine_session_factory(
119
138
  for each test. For production use, use get_or_create_db() instead.
120
139
  """
121
140
 
122
- global _engine, _session_maker
141
+ global _engine, _session_maker, _migrations_completed
123
142
 
124
143
  db_url = DatabaseType.get_db_url(db_path, db_type)
125
144
  logger.debug(f"Creating engine for db_url: {db_url}")
@@ -143,12 +162,20 @@ async def engine_session_factory(
143
162
  await _engine.dispose()
144
163
  _engine = None
145
164
  _session_maker = None
165
+ _migrations_completed = False
146
166
 
147
167
 
148
168
  async def run_migrations(
149
- app_config: BasicMemoryConfig, database_type=DatabaseType.FILESYSTEM
169
+ app_config: BasicMemoryConfig, database_type=DatabaseType.FILESYSTEM, force: bool = False
150
170
  ): # pragma: no cover
151
171
  """Run any pending alembic migrations."""
172
+ global _migrations_completed
173
+
174
+ # Skip if migrations already completed unless forced
175
+ if _migrations_completed and not force:
176
+ logger.debug("Migrations already completed in this session, skipping")
177
+ return
178
+
152
179
  logger.info("Running database migrations...")
153
180
  try:
154
181
  # Get the absolute path to the alembic directory relative to this file
@@ -170,11 +197,18 @@ async def run_migrations(
170
197
  command.upgrade(config, "head")
171
198
  logger.info("Migrations completed successfully")
172
199
 
173
- _, session_maker = await get_or_create_db(app_config.database_path, database_type)
200
+ # Get session maker - ensure we don't trigger recursive migration calls
201
+ if _session_maker is None:
202
+ _, session_maker = _create_engine_and_session(app_config.database_path, database_type)
203
+ else:
204
+ session_maker = _session_maker
174
205
 
175
206
  # initialize the search Index schema
176
207
  # the project_id is not used for init_search_index, so we pass a dummy value
177
208
  await SearchRepository(session_maker, 1).init_search_index()
209
+
210
+ # Mark migrations as completed
211
+ _migrations_completed = True
178
212
  except Exception as e: # pragma: no cover
179
213
  logger.error(f"Error running migrations: {e}")
180
214
  raise
@@ -27,6 +27,7 @@ async def write_note(
27
27
  content: str,
28
28
  folder: str,
29
29
  tags=None, # Remove type hint completely to avoid schema issues
30
+ entity_type: str = "note",
30
31
  project: Optional[str] = None,
31
32
  ) -> str:
32
33
  """Write a markdown note to the knowledge base.
@@ -58,6 +59,7 @@ async def write_note(
58
59
  Use forward slashes (/) as separators. Examples: "notes", "projects/2025", "research/ml"
59
60
  tags: Tags to categorize the note. Can be a list of strings, a comma-separated string, or None.
60
61
  Note: If passing from external MCP clients, use a string format (e.g. "tag1,tag2,tag3")
62
+ entity_type: Type of entity to create. Defaults to "note". Can be "guide", "report", "config", etc.
61
63
  project: Optional project name to write to. If not provided, uses current active project.
62
64
 
63
65
  Returns:
@@ -84,7 +86,7 @@ async def write_note(
84
86
  entity = Entity(
85
87
  title=title,
86
88
  folder=folder,
87
- entity_type="note",
89
+ entity_type=entity_type,
88
90
  content_type="text/markdown",
89
91
  content=content,
90
92
  entity_metadata=metadata,