basic-memory 0.19.2__tar.gz → 0.20.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.
Files changed (641) hide show
  1. {basic_memory-0.19.2 → basic_memory-0.20.1}/CHANGELOG.md +26 -0
  2. {basic_memory-0.19.2 → basic_memory-0.20.1}/PKG-INFO +31 -1
  3. {basic_memory-0.19.2 → basic_memory-0.20.1}/README.md +30 -0
  4. {basic_memory-0.19.2 → basic_memory-0.20.1}/llms-install.md +17 -1
  5. {basic_memory-0.19.2 → basic_memory-0.20.1}/server.json +2 -2
  6. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/__init__.py +1 -1
  7. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/app.py +10 -4
  8. basic_memory-0.20.1/src/basic_memory/cli/auto_update.py +391 -0
  9. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/__init__.py +2 -0
  10. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/mcp.py +18 -0
  11. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/project.py +14 -3
  12. basic_memory-0.20.1/src/basic_memory/cli/commands/update.py +40 -0
  13. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/main.py +1 -0
  14. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/config.py +63 -5
  15. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/conftest.py +2 -0
  16. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/conftest.py +2 -0
  17. basic_memory-0.20.1/tests/cli/test_auto_update.py +374 -0
  18. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_json_output.py +2 -0
  19. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_project_add_with_local_path.py +2 -0
  20. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_project_list_and_ls.py +5 -2
  21. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_project_set_cloud_local.py +24 -0
  22. basic_memory-0.20.1/tests/cli/test_update_command.py +90 -0
  23. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_workspace_commands.py +4 -0
  24. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/conftest.py +2 -0
  25. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note.py +8 -0
  26. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_project_service.py +10 -0
  27. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_config.py +170 -0
  28. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/release/beta.md +0 -0
  29. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/release/changelog.md +0 -0
  30. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/release/release-check.md +0 -0
  31. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/release/release.md +0 -0
  32. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/spec.md +0 -0
  33. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/commands/test-live.md +0 -0
  34. {basic_memory-0.19.2 → basic_memory-0.20.1}/.claude/settings.json +0 -0
  35. {basic_memory-0.19.2 → basic_memory-0.20.1}/.dockerignore +0 -0
  36. {basic_memory-0.19.2 → basic_memory-0.20.1}/.env.example +0 -0
  37. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  39. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  40. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  41. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/dependabot.yml +0 -0
  42. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/claude-code-review.yml +0 -0
  43. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/claude-issue-triage.yml +0 -0
  44. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/claude.yml +0 -0
  45. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/dev-release.yml +0 -0
  46. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/docker.yml +0 -0
  47. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/pr-title.yml +0 -0
  48. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/release.yml +0 -0
  49. {basic_memory-0.19.2 → basic_memory-0.20.1}/.github/workflows/test.yml +0 -0
  50. {basic_memory-0.19.2 → basic_memory-0.20.1}/.gitignore +0 -0
  51. {basic_memory-0.19.2 → basic_memory-0.20.1}/.python-version +0 -0
  52. {basic_memory-0.19.2 → basic_memory-0.20.1}/AGENTS.md +0 -0
  53. {basic_memory-0.19.2 → basic_memory-0.20.1}/CITATION.cff +0 -0
  54. {basic_memory-0.19.2 → basic_memory-0.20.1}/CLA.md +0 -0
  55. {basic_memory-0.19.2 → basic_memory-0.20.1}/CLAUDE.md +0 -0
  56. {basic_memory-0.19.2 → basic_memory-0.20.1}/CODE_OF_CONDUCT.md +0 -0
  57. {basic_memory-0.19.2 → basic_memory-0.20.1}/CONTRIBUTING.md +0 -0
  58. {basic_memory-0.19.2 → basic_memory-0.20.1}/Dockerfile +0 -0
  59. {basic_memory-0.19.2 → basic_memory-0.20.1}/LICENSE +0 -0
  60. {basic_memory-0.19.2 → basic_memory-0.20.1}/NOTE-FORMAT.md +0 -0
  61. {basic_memory-0.19.2 → basic_memory-0.20.1}/SECURITY.md +0 -0
  62. {basic_memory-0.19.2 → basic_memory-0.20.1}/docker-compose-postgres.yml +0 -0
  63. {basic_memory-0.19.2 → basic_memory-0.20.1}/docker-compose.yml +0 -0
  64. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/ARCHITECTURE.md +0 -0
  65. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/Docker.md +0 -0
  66. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/NOTE-FORMAT.md +0 -0
  67. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
  68. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/ai-assistant-guide-extended.md +0 -0
  69. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/character-handling.md +0 -0
  70. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/cloud-cli.md +0 -0
  71. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/cloud-semantic-search-value.md +0 -0
  72. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/mcp-ui-bakeoff-instructions.md +0 -0
  73. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/metadata-search.md +0 -0
  74. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/post-v0.18.0-test-plan.md +0 -0
  75. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/releases/v0.19.0.md +0 -0
  76. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/semantic-search-test-log.md +0 -0
  77. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/semantic-search.md +0 -0
  78. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
  79. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
  80. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/specs/SPEC-SCHEMA.md +0 -0
  81. {basic_memory-0.19.2 → basic_memory-0.20.1}/docs/testing-coverage.md +0 -0
  82. {basic_memory-0.19.2 → basic_memory-0.20.1}/justfile +0 -0
  83. {basic_memory-0.19.2 → basic_memory-0.20.1}/pyproject.toml +0 -0
  84. {basic_memory-0.19.2 → basic_memory-0.20.1}/smithery.yaml +0 -0
  85. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/alembic.ini +0 -0
  86. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/env.py +0 -0
  87. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/migrations.py +0 -0
  88. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/script.py.mako +0 -0
  89. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  90. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  91. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  92. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  93. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  94. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  95. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  96. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  97. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  98. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  99. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  100. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  101. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  102. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  103. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  104. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
  105. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
  106. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
  107. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
  108. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/__init__.py +0 -0
  109. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/app.py +0 -0
  110. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/container.py +0 -0
  111. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/template_loader.py +0 -0
  112. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/__init__.py +0 -0
  113. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  114. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  115. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  116. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  117. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  118. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  119. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  120. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  121. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
  122. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  123. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/api/v2/utils.py +0 -0
  124. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/__init__.py +0 -0
  125. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/analytics.py +0 -0
  126. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/auth.py +0 -0
  127. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  128. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  129. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  130. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  131. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  132. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
  133. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  134. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  135. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  136. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  137. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  138. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  139. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  140. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  141. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
  142. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/command_utils.py +0 -0
  143. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/db.py +0 -0
  144. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/doctor.py +0 -0
  145. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/format.py +0 -0
  146. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  147. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  148. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  149. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  150. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/routing.py +0 -0
  151. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/schema.py +0 -0
  152. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/status.py +0 -0
  153. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/commands/tool.py +0 -0
  154. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/container.py +0 -0
  155. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/cli/promo.py +0 -0
  156. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/db.py +0 -0
  157. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/__init__.py +0 -0
  158. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/config.py +0 -0
  159. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/db.py +0 -0
  160. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/importers.py +0 -0
  161. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/projects.py +0 -0
  162. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/repositories.py +0 -0
  163. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps/services.py +0 -0
  164. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/deps.py +0 -0
  165. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/file_utils.py +0 -0
  166. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/ignore_utils.py +0 -0
  167. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/__init__.py +0 -0
  168. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/base.py +0 -0
  169. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  170. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  171. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  172. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/memory_json_importer.py +0 -0
  173. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/importers/utils.py +0 -0
  174. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/__init__.py +0 -0
  175. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/entity_parser.py +0 -0
  176. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/markdown_processor.py +0 -0
  177. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/plugins.py +0 -0
  178. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/schemas.py +0 -0
  179. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/markdown/utils.py +0 -0
  180. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/__init__.py +0 -0
  181. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/async_client.py +0 -0
  182. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/__init__.py +0 -0
  183. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/directory.py +0 -0
  184. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  185. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/memory.py +0 -0
  186. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/project.py +0 -0
  187. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/resource.py +0 -0
  188. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/schema.py +0 -0
  189. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/search.py +0 -0
  190. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/container.py +0 -0
  191. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/formatting.py +0 -0
  192. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/project_context.py +0 -0
  193. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  194. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  195. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  196. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  197. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/search.py +0 -0
  198. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/utils.py +0 -0
  199. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/__init__.py +0 -0
  200. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  201. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
  202. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/project_info.py +0 -0
  203. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/release_notes.md +0 -0
  204. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/ui.py +0 -0
  205. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/server.py +0 -0
  206. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/__init__.py +0 -0
  207. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/build_context.py +0 -0
  208. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/canvas.py +0 -0
  209. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  210. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
  211. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  212. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  213. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  214. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/move_note.py +0 -0
  215. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/project_management.py +0 -0
  216. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/read_content.py +0 -0
  217. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/read_note.py +0 -0
  218. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  219. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/release_notes.py +0 -0
  220. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/schema.py +0 -0
  221. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/search.py +0 -0
  222. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
  223. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/utils.py +0 -0
  224. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/view_note.py +0 -0
  225. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/workspaces.py +0 -0
  226. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/write_note.py +0 -0
  227. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/__init__.py +0 -0
  228. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
  229. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
  230. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
  231. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
  232. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
  233. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
  234. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/sdk.py +0 -0
  235. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/templates.py +0 -0
  236. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/models/__init__.py +0 -0
  237. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/models/base.py +0 -0
  238. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/models/knowledge.py +0 -0
  239. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/models/project.py +0 -0
  240. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/models/search.py +0 -0
  241. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/project_resolver.py +0 -0
  242. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/__init__.py +0 -0
  243. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/embedding_provider.py +0 -0
  244. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
  245. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/entity_repository.py +0 -0
  246. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/fastembed_provider.py +0 -0
  247. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/metadata_filters.py +0 -0
  248. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/observation_repository.py +0 -0
  249. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/openai_provider.py +0 -0
  250. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  251. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/project_info_repository.py +0 -0
  252. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/project_repository.py +0 -0
  253. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/relation_repository.py +0 -0
  254. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/repository.py +0 -0
  255. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/search_index_row.py +0 -0
  256. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/search_repository.py +0 -0
  257. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/search_repository_base.py +0 -0
  258. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/semantic_errors.py +0 -0
  259. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  260. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/runtime.py +0 -0
  261. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/__init__.py +0 -0
  262. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/diff.py +0 -0
  263. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/inference.py +0 -0
  264. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/parser.py +0 -0
  265. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/resolver.py +0 -0
  266. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schema/validator.py +0 -0
  267. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/__init__.py +0 -0
  268. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/base.py +0 -0
  269. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/cloud.py +0 -0
  270. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/delete.py +0 -0
  271. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/directory.py +0 -0
  272. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/importer.py +0 -0
  273. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/memory.py +0 -0
  274. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/project_info.py +0 -0
  275. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/prompt.py +0 -0
  276. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/request.py +0 -0
  277. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/response.py +0 -0
  278. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/schema.py +0 -0
  279. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/search.py +0 -0
  280. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/sync_report.py +0 -0
  281. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/__init__.py +0 -0
  282. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/entity.py +0 -0
  283. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/graph.py +0 -0
  284. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/resource.py +0 -0
  285. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/__init__.py +0 -0
  286. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/context_service.py +0 -0
  287. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/directory_service.py +0 -0
  288. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/entity_service.py +0 -0
  289. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/exceptions.py +0 -0
  290. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/file_service.py +0 -0
  291. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/initialization.py +0 -0
  292. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/link_resolver.py +0 -0
  293. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/project_service.py +0 -0
  294. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/search_service.py +0 -0
  295. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/services/service.py +0 -0
  296. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/sync/__init__.py +0 -0
  297. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/sync/background_sync.py +0 -0
  298. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/sync/coordinator.py +0 -0
  299. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/sync/sync_service.py +0 -0
  300. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/sync/watch_service.py +0 -0
  301. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  302. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/templates/prompts/search.hbs +0 -0
  303. {basic_memory-0.19.2 → basic_memory-0.20.1}/src/basic_memory/utils.py +0 -0
  304. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/BENCHMARKS.md +0 -0
  305. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
  306. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
  307. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  308. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_project_commands_integration.py +0 -0
  309. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_routing_integration.py +0 -0
  310. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_search_notes_meta_integration.py +0 -0
  311. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/cli/test_version_integration.py +0 -0
  312. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/compare_search_benchmarks.py +0 -0
  313. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
  314. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
  315. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
  316. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
  317. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
  318. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
  319. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
  320. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
  321. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
  322. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
  323. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
  324. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
  325. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
  326. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
  327. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
  328. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
  329. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
  330. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
  331. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
  332. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
  333. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
  334. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
  335. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
  336. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
  337. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
  338. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
  339. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
  340. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
  341. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
  342. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
  343. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
  344. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
  345. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
  346. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
  347. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
  348. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
  349. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
  350. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
  351. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
  352. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
  353. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
  354. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
  355. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
  356. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
  357. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
  358. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
  359. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
  360. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
  361. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
  362. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
  363. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
  364. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
  365. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
  366. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
  367. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
  368. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
  369. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
  370. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
  371. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
  372. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Book.md +0 -0
  373. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
  374. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Person.md +0 -0
  375. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
  376. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
  377. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
  378. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
  379. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
  380. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
  381. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
  382. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
  383. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
  384. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
  385. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
  386. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
  387. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_build_context_underscore.py +0 -0
  388. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_build_context_validation.py +0 -0
  389. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  390. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  391. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_delete_directory_integration.py +0 -0
  392. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_delete_note_integration.py +0 -0
  393. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_edit_note_integration.py +0 -0
  394. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  395. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_list_directory_integration.py +0 -0
  396. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_move_directory_integration.py +0 -0
  397. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_move_note_integration.py +0 -0
  398. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_output_format_json_integration.py +0 -0
  399. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_pagination_integration.py +0 -0
  400. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_permalink_collision_integration.py +0 -0
  401. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_project_management_integration.py +0 -0
  402. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  403. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_read_content_integration.py +0 -0
  404. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_read_note_integration.py +0 -0
  405. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_search_integration.py +0 -0
  406. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  407. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_smoke_integration.py +0 -0
  408. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_string_params_integration.py +0 -0
  409. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_ui_sdk_integration.py +0 -0
  410. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/mcp/test_write_note_integration.py +0 -0
  411. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/__init__.py +0 -0
  412. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/conftest.py +0 -0
  413. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/corpus.py +0 -0
  414. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/metrics.py +0 -0
  415. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/report.py +0 -0
  416. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
  417. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/test_search_diagnostics.py +0 -0
  418. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/test_semantic_coverage.py +0 -0
  419. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/semantic/test_semantic_quality.py +0 -0
  420. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_db_wal_mode.py +0 -0
  421. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_disable_permalinks_integration.py +0 -0
  422. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/__init__.py +0 -0
  423. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/conftest.py +0 -0
  424. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/helpers.py +0 -0
  425. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/test_diff_integration.py +0 -0
  426. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/test_inference_integration.py +0 -0
  427. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/test_parser_integration.py +0 -0
  428. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_schema/test_validator_integration.py +0 -0
  429. {basic_memory-0.19.2 → basic_memory-0.20.1}/test-int/test_search_performance_benchmark.py +0 -0
  430. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/Non-MarkdownFileSupport.pdf +0 -0
  431. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/README.md +0 -0
  432. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/Screenshot.png +0 -0
  433. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/__init__.py +0 -0
  434. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/__init__.py +0 -0
  435. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/conftest.py +0 -0
  436. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_directory_router.py +0 -0
  437. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_importer_router.py +0 -0
  438. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_knowledge_router.py +0 -0
  439. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_memory_router.py +0 -0
  440. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_project_router.py +0 -0
  441. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_prompt_router.py +0 -0
  442. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_resource_router.py +0 -0
  443. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_schema_router.py +0 -0
  444. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/api/v2/test_search_router.py +0 -0
  445. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  446. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  447. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/cloud/test_upload_command_routing.py +0 -0
  448. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/cloud/test_upload_path.py +0 -0
  449. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_analytics.py +0 -0
  450. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_auth_cli_auth.py +0 -0
  451. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_container.py +0 -0
  452. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_exit.py +0 -0
  453. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_schema.py +0 -0
  454. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_tool_exit.py +0 -0
  455. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_tool_json_output.py +0 -0
  456. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cli_tools.py +0 -0
  457. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cloud_authentication.py +0 -0
  458. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cloud_promo.py +0 -0
  459. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_cloud_status.py +0 -0
  460. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_db_reset_exit.py +0 -0
  461. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_ignore_utils.py +0 -0
  462. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_import_chatgpt.py +0 -0
  463. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_import_claude_conversations.py +0 -0
  464. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_import_claude_projects.py +0 -0
  465. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_import_memory_json.py +0 -0
  466. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_project_info_errors.py +0 -0
  467. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_restore_commands.py +0 -0
  468. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_routing.py +0 -0
  469. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_snapshot_commands.py +0 -0
  470. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/cli/test_upload.py +0 -0
  471. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  472. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/importers/test_conversation_indexing.py +0 -0
  473. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/importers/test_importer_base.py +0 -0
  474. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/importers/test_importer_utils.py +0 -0
  475. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/__init__.py +0 -0
  476. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  477. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_entity_parser.py +0 -0
  478. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  479. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_markdown_plugins.py +0 -0
  480. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_markdown_processor.py +0 -0
  481. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_markdown_utils.py +0 -0
  482. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_observation_edge_cases.py +0 -0
  483. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_parser_edge_cases.py +0 -0
  484. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_relation_edge_cases.py +0 -0
  485. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/markdown/test_task_detection.py +0 -0
  486. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/clients/__init__.py +0 -0
  487. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/clients/test_clients.py +0 -0
  488. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/conftest.py +0 -0
  489. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_async_client_force_local.py +0 -0
  490. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_async_client_modes.py +0 -0
  491. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_client_schema.py +0 -0
  492. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_mcp_container.py +0 -0
  493. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  494. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  495. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_project_context.py +0 -0
  496. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_prompt_tool_delegation.py +0 -0
  497. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_prompts.py +0 -0
  498. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  499. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_resources.py +0 -0
  500. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_server_lifespan_branches.py +0 -0
  501. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_build_context.py +0 -0
  502. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_canvas.py +0 -0
  503. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_cloud_discovery.py +0 -0
  504. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_contracts.py +0 -0
  505. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_delete_note.py +0 -0
  506. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_edit_note.py +0 -0
  507. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_json_output_modes.py +0 -0
  508. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_list_directory.py +0 -0
  509. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_move_note.py +0 -0
  510. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_project_management.py +0 -0
  511. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_read_content.py +0 -0
  512. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_read_note.py +0 -0
  513. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_recent_activity.py +0 -0
  514. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_resource.py +0 -0
  515. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_schema.py +0 -0
  516. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_search.py +0 -0
  517. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_utils.py +0 -0
  518. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
  519. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_view_note.py +0 -0
  520. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_workspace_management.py +0 -0
  521. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  522. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note_metadata.py +0 -0
  523. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_ui_resources.py +0 -0
  524. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_ui_sdk.py +0 -0
  525. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/test_ui_templates.py +0 -0
  526. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  527. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_distance_to_similarity.py +0 -0
  528. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_entity_repository.py +0 -0
  529. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_entity_repository_upsert.py +0 -0
  530. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  531. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_fastembed_provider.py +0 -0
  532. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_hybrid_fusion.py +0 -0
  533. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_metadata_filters.py +0 -0
  534. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
  535. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_observation_repository.py +0 -0
  536. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_openai_provider.py +0 -0
  537. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_postgres_search_repository.py +0 -0
  538. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_postgres_search_repository_unit.py +0 -0
  539. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_project_info_repository.py +0 -0
  540. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_project_repository.py +0 -0
  541. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_relation_repository.py +0 -0
  542. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_repository.py +0 -0
  543. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_search_index_row.py +0 -0
  544. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_search_repository.py +0 -0
  545. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  546. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
  547. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_semantic_search_base.py +0 -0
  548. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
  549. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_vector_pagination.py +0 -0
  550. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/repository/test_vector_threshold.py +0 -0
  551. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/__init__.py +0 -0
  552. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/test_diff.py +0 -0
  553. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/test_inference.py +0 -0
  554. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/test_parser.py +0 -0
  555. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/test_resolver.py +0 -0
  556. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schema/test_validator.py +0 -0
  557. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  558. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_memory_serialization.py +0 -0
  559. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_memory_url.py +0 -0
  560. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_memory_url_validation.py +0 -0
  561. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  562. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_schemas.py +0 -0
  563. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/schemas/test_search.py +0 -0
  564. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_context_service.py +0 -0
  565. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_directory_service.py +0 -0
  566. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_entity_service.py +0 -0
  567. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  568. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_file_service.py +0 -0
  569. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_initialization.py +0 -0
  570. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  571. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_link_resolver.py +0 -0
  572. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_project_removal_bug.py +0 -0
  573. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_project_service_cloud_info.py +0 -0
  574. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_project_service_embedding_status.py +0 -0
  575. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_project_service_operations.py +0 -0
  576. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_search_service.py +0 -0
  577. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_semantic_search.py +0 -0
  578. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/services/test_task_scheduler_semantic.py +0 -0
  579. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_character_conflicts.py +0 -0
  580. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_coordinator.py +0 -0
  581. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_sync_service.py +0 -0
  582. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_sync_service_incremental.py +0 -0
  583. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_sync_wikilink_issue.py +0 -0
  584. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_tmp_files.py +0 -0
  585. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_watch_service.py +0 -0
  586. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  587. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_watch_service_edge_cases.py +0 -0
  588. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_watch_service_reload.py +0 -0
  589. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/sync/test_watch_service_stress.py +0 -0
  590. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_coerce.py +0 -0
  591. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_deps.py +0 -0
  592. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_production_cascade_delete.py +0 -0
  593. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_project_resolver.py +0 -0
  594. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_rclone_commands.py +0 -0
  595. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/test_runtime.py +0 -0
  596. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_file_utils.py +0 -0
  597. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  598. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_parse_tags.py +0 -0
  599. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_permalink_formatting.py +0 -0
  600. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_setup_logging.py +0 -0
  601. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_timezone_utils.py +0 -0
  602. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_utf8_handling.py +0 -0
  603. {basic_memory-0.19.2 → basic_memory-0.20.1}/tests/utils/test_validate_project_path.py +0 -0
  604. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/.gitignore +0 -0
  605. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/build.mjs +0 -0
  606. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/package-lock.json +0 -0
  607. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/package.json +0 -0
  608. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
  609. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
  610. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
  611. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
  612. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
  613. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
  614. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
  615. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
  616. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
  617. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
  618. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
  619. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
  620. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
  621. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
  622. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
  623. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
  624. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
  625. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
  626. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
  627. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
  628. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
  629. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
  630. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
  631. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
  632. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
  633. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
  634. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
  635. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
  636. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
  637. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/note-preview.tsx +0 -0
  638. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/search-results.tsx +0 -0
  639. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/src/styles.css +0 -0
  640. {basic_memory-0.19.2 → basic_memory-0.20.1}/ui/tool-ui-react/tailwind.config.js +0 -0
  641. {basic_memory-0.19.2 → basic_memory-0.20.1}/uv.lock +0 -0
@@ -2,6 +2,32 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.20.1 (2026-03-10)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **#661**: Fix `bm project list` MCP column to show transport type (stdio/https) instead of DB presence
10
+ - Renamed "MCP (stdio)" column to "MCP"
11
+ - Shows actual routing mode: `stdio` for local, `https` for cloud projects
12
+ - Clears local path display for cloud-mode projects
13
+ - **#662**: Invalidate config cache when file is modified by another process
14
+ - Adds mtime-based cache validation to `ConfigManager.load_config()`
15
+ - Long-lived processes (MCP stdio server) now detect external config changes
16
+ - Fixes `bm project set-cloud` having no effect on running MCP server
17
+
18
+ ## v0.20.0 (2026-03-10)
19
+
20
+ ### Features
21
+
22
+ - **#643**: Default-on auto-update system and `bm update` command
23
+ - Automatic background update checks for CLI installs (uv tool, Homebrew)
24
+ - Install-source detection (homebrew, uv_tool, uvx, unknown) with uvx skip behavior
25
+ - Periodic check gating via `auto_update_last_checked_at` + `update_check_interval` config
26
+ - Manager-specific update flows: Homebrew (`brew upgrade`) and uv tool (`uv tool upgrade`)
27
+ - Silent, non-blocking MCP behavior via daemon thread before server run
28
+ - Manual commands: `bm update` (force check + apply) and `bm update --check` (check only)
29
+ - New config fields: `auto_update`, `update_check_interval`, `auto_update_last_checked_at`
30
+
5
31
  ## v0.19.2 (2026-03-09)
6
32
 
7
33
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.19.2
3
+ Version: 0.20.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
@@ -126,6 +126,36 @@ uv tool install basic-memory
126
126
 
127
127
  You can view shared context via files in `~/basic-memory` (default directory location).
128
128
 
129
+ ## Automatic Updates
130
+
131
+ Basic Memory includes a default-on auto-update flow for CLI installs.
132
+
133
+ - **Auto-install supported:** `uv tool` and Homebrew installs
134
+ - **Default check interval:** every 24 hours (`86400` seconds)
135
+ - **MCP-safe behavior:** update checks run silently in `basic-memory mcp` mode
136
+ - **`uvx` behavior:** skipped (runtime is ephemeral and managed by `uvx`)
137
+
138
+ Manual update commands:
139
+
140
+ ```bash
141
+ # Check now and install if supported
142
+ bm update
143
+
144
+ # Check only, do not install
145
+ bm update --check
146
+ ```
147
+
148
+ Config options in `~/.basic-memory/config.json`:
149
+
150
+ ```json
151
+ {
152
+ "auto_update": true,
153
+ "update_check_interval": 86400
154
+ }
155
+ ```
156
+
157
+ To disable automatic updates, set `"auto_update": false`.
158
+
129
159
  ## Why Basic Memory?
130
160
 
131
161
  Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
@@ -75,6 +75,36 @@ uv tool install basic-memory
75
75
 
76
76
  You can view shared context via files in `~/basic-memory` (default directory location).
77
77
 
78
+ ## Automatic Updates
79
+
80
+ Basic Memory includes a default-on auto-update flow for CLI installs.
81
+
82
+ - **Auto-install supported:** `uv tool` and Homebrew installs
83
+ - **Default check interval:** every 24 hours (`86400` seconds)
84
+ - **MCP-safe behavior:** update checks run silently in `basic-memory mcp` mode
85
+ - **`uvx` behavior:** skipped (runtime is ephemeral and managed by `uvx`)
86
+
87
+ Manual update commands:
88
+
89
+ ```bash
90
+ # Check now and install if supported
91
+ bm update
92
+
93
+ # Check only, do not install
94
+ bm update --check
95
+ ```
96
+
97
+ Config options in `~/.basic-memory/config.json`:
98
+
99
+ ```json
100
+ {
101
+ "auto_update": true,
102
+ "update_check_interval": 86400
103
+ }
104
+ ```
105
+
106
+ To disable automatic updates, set `"auto_update": false`.
107
+
78
108
  ## Why Basic Memory?
79
109
 
80
110
  Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
@@ -54,6 +54,22 @@ Or for a one-time sync:
54
54
  basic-memory sync
55
55
  ```
56
56
 
57
+ ### 4. Updating Basic Memory
58
+
59
+ Basic Memory supports automatic updates by default for `uv tool` and Homebrew installs.
60
+
61
+ For manual checks and upgrades:
62
+
63
+ ```bash
64
+ # Check now and install if supported
65
+ bm update
66
+
67
+ # Check only, do not install
68
+ bm update --check
69
+ ```
70
+
71
+ To disable automatic updates, set `"auto_update": false` in `~/.basic-memory/config.json`.
72
+
57
73
  ## Configuration Options
58
74
 
59
75
  ### Custom Directory
@@ -125,4 +141,4 @@ If you encounter issues:
125
141
  cat ~/.basic-memory/basic-memory.log
126
142
  ```
127
143
 
128
- For more detailed information, refer to the [full documentation](https://memory.basicmachines.co/).
144
+ For more detailed information, refer to the [full documentation](https://docs.basicmemory.com/).
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/basicmachines-co/basic-memory.git",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.19.2",
9
+ "version": "0.20.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.19.2",
14
+ "version": "0.20.1",
15
15
  "runtimeHint": "uvx",
16
16
  "runtimeArguments": [
17
17
  {"type": "positional", "value": "basic-memory"},
@@ -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.19.2"
4
+ __version__ = "0.20.1"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -8,6 +8,7 @@ from typing import Optional # noqa: E402
8
8
 
9
9
  import typer # noqa: E402
10
10
 
11
+ from basic_memory.cli.auto_update import maybe_run_periodic_auto_update # noqa: E402
11
12
  from basic_memory.cli.container import CliContainer, set_container # noqa: E402
12
13
  from basic_memory.cli.promo import maybe_show_cloud_promo, maybe_show_init_line # noqa: E402
13
14
  from basic_memory.config import init_cli_logging # noqa: E402
@@ -52,10 +53,14 @@ def app_callback(
52
53
  # Outcome: one-time plain line printed before the subcommand runs.
53
54
  maybe_show_init_line(ctx.invoked_subcommand)
54
55
 
55
- # Trigger: register promo as a post-command callback.
56
- # Why: promo output should appear after the command's own output, not before.
57
- # Outcome: promo panel renders below the command results (status tree, table, etc.).
58
- ctx.call_on_close(lambda: maybe_show_cloud_promo(ctx.invoked_subcommand))
56
+ # Trigger: register post-command messaging callbacks.
57
+ # Why: informational/promo/update output belongs below command results.
58
+ # Outcome: command output remains primary, with optional follow-up notices afterwards.
59
+ def _post_command_messages() -> None:
60
+ maybe_show_cloud_promo(ctx.invoked_subcommand)
61
+ maybe_run_periodic_auto_update(ctx.invoked_subcommand)
62
+
63
+ ctx.call_on_close(_post_command_messages)
59
64
 
60
65
  # Run initialization for commands that don't use the API
61
66
  # Skip for 'mcp' command - it has its own lifespan that handles initialization
@@ -70,6 +75,7 @@ def app_callback(
70
75
  "tool",
71
76
  "reset",
72
77
  "reindex",
78
+ "update",
73
79
  "watch",
74
80
  }
75
81
  if (
@@ -0,0 +1,391 @@
1
+ """Automatic update checks and upgrades for the Basic Memory CLI."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ import urllib.error
9
+ import urllib.request
10
+ from dataclasses import dataclass
11
+ from datetime import datetime, timedelta
12
+ from enum import Enum
13
+
14
+ from loguru import logger
15
+ from packaging.version import InvalidVersion, Version
16
+ from rich.console import Console
17
+
18
+ import basic_memory
19
+ from basic_memory.config import ConfigManager
20
+
21
+ PACKAGE_NAME = "basic-memory"
22
+ PYPI_JSON_URL = "https://pypi.org/pypi/basic-memory/json"
23
+
24
+ PYPI_TIMEOUT_SECONDS = 5
25
+ BREW_OUTDATED_TIMEOUT_SECONDS = 15
26
+ UV_UPGRADE_TIMEOUT_SECONDS = 180
27
+ BREW_UPGRADE_TIMEOUT_SECONDS = 600
28
+
29
+
30
+ class InstallSource(str, Enum):
31
+ """How the running CLI appears to have been installed."""
32
+
33
+ HOMEBREW = "homebrew"
34
+ UV_TOOL = "uv_tool"
35
+ UVX = "uvx"
36
+ UNKNOWN = "unknown"
37
+
38
+
39
+ class AutoUpdateStatus(str, Enum):
40
+ """Result classification for update checks and installs."""
41
+
42
+ SKIPPED = "skipped"
43
+ UP_TO_DATE = "up_to_date"
44
+ UPDATE_AVAILABLE = "update_available"
45
+ UPDATED = "updated"
46
+ FAILED = "failed"
47
+
48
+
49
+ @dataclass(frozen=True)
50
+ class AutoUpdateResult:
51
+ """Structured result for update checks/install attempts."""
52
+
53
+ status: AutoUpdateStatus
54
+ source: InstallSource
55
+ checked: bool
56
+ update_available: bool
57
+ updated: bool
58
+ latest_version: str | None = None
59
+ message: str | None = None
60
+ error: str | None = None
61
+ restart_recommended: bool = False
62
+
63
+
64
+ def detect_install_source(executable: str | None = None) -> InstallSource:
65
+ """Infer installation source from the active interpreter path."""
66
+ active_executable = executable or sys.executable
67
+ normalized = active_executable.lower().replace("\\", "/")
68
+
69
+ if "cellar/basic-memory" in normalized:
70
+ return InstallSource.HOMEBREW
71
+ if "uv/tools/basic-memory" in normalized:
72
+ return InstallSource.UV_TOOL
73
+ if "/uv/archive-" in normalized:
74
+ return InstallSource.UVX
75
+ return InstallSource.UNKNOWN
76
+
77
+
78
+ def _is_interactive_session() -> bool:
79
+ """Return whether stdin/stdout are interactive terminals."""
80
+ try:
81
+ return sys.stdin.isatty() and sys.stdout.isatty()
82
+ except ValueError:
83
+ # Trigger: stdin/stdout may be closed during transport teardown.
84
+ # Why: isatty() raises ValueError on closed descriptors.
85
+ # Outcome: treat as non-interactive and suppress periodic output.
86
+ return False
87
+
88
+
89
+ def _run_subprocess(
90
+ command: list[str],
91
+ *,
92
+ timeout_seconds: int,
93
+ silent: bool,
94
+ capture_output: bool,
95
+ ) -> subprocess.CompletedProcess[str]:
96
+ """Run a subprocess with explicit stdio behavior for protocol safety."""
97
+ # Trigger: silent operation (MCP/background) with no need for subprocess output.
98
+ # Why: prevent protocol/terminal pollution from child process output.
99
+ # Outcome: stdout/stderr are discarded unless explicit capture is requested.
100
+ use_devnull = silent and not capture_output
101
+ stdout_target = subprocess.DEVNULL if use_devnull else subprocess.PIPE
102
+ stderr_target = subprocess.DEVNULL if use_devnull else subprocess.PIPE
103
+
104
+ return subprocess.run(
105
+ command,
106
+ stdin=subprocess.DEVNULL,
107
+ stdout=stdout_target,
108
+ stderr=stderr_target,
109
+ text=True,
110
+ timeout=timeout_seconds,
111
+ check=False,
112
+ )
113
+
114
+
115
+ def _version_from_pypi() -> str:
116
+ """Fetch the latest published package version from PyPI."""
117
+ request = urllib.request.Request(
118
+ PYPI_JSON_URL,
119
+ headers={"User-Agent": f"basic-memory-cli/{basic_memory.__version__}"},
120
+ )
121
+ with urllib.request.urlopen(request, timeout=PYPI_TIMEOUT_SECONDS) as response:
122
+ payload = json.loads(response.read().decode("utf-8"))
123
+ latest = payload.get("info", {}).get("version")
124
+ if not latest:
125
+ raise RuntimeError("PyPI JSON response did not include info.version")
126
+ return str(latest)
127
+
128
+
129
+ def _check_homebrew_update_available(silent: bool) -> tuple[bool, str | None]:
130
+ """Check whether Homebrew reports an outdated basic-memory formula."""
131
+ result = _run_subprocess(
132
+ ["brew", "outdated", "--quiet", PACKAGE_NAME],
133
+ timeout_seconds=BREW_OUTDATED_TIMEOUT_SECONDS,
134
+ silent=silent,
135
+ capture_output=True,
136
+ )
137
+ if result.returncode != 0:
138
+ stderr = (result.stderr or "").strip()
139
+ stdout = (result.stdout or "").strip()
140
+ detail = stderr or stdout or "brew outdated failed"
141
+ raise RuntimeError(detail)
142
+
143
+ is_outdated = bool((result.stdout or "").strip())
144
+ return is_outdated, None
145
+
146
+
147
+ def _check_pypi_update_available() -> tuple[bool, str]:
148
+ """Compare installed package version with PyPI latest version."""
149
+ latest = _version_from_pypi()
150
+ try:
151
+ current_version = Version(basic_memory.__version__)
152
+ latest_version = Version(latest)
153
+ except InvalidVersion as exc:
154
+ raise RuntimeError(
155
+ f"Could not compare versions (current={basic_memory.__version__}, latest={latest})"
156
+ ) from exc
157
+
158
+ return latest_version > current_version, latest
159
+
160
+
161
+ def _manual_update_hint(source: InstallSource) -> str:
162
+ """Return manager-appropriate manual update instructions."""
163
+ if source == InstallSource.UV_TOOL:
164
+ return "Run `uv tool upgrade basic-memory`."
165
+ if source == InstallSource.HOMEBREW:
166
+ return "Run `brew upgrade basic-memory`."
167
+ return (
168
+ "Automatic install is not supported for this environment. "
169
+ "Update with your package manager (for pip: `python3 -m pip install -U basic-memory`)."
170
+ )
171
+
172
+
173
+ def _save_last_checked_timestamp(config_manager: ConfigManager, checked_at: datetime) -> None:
174
+ """Persist the timestamp for the most recent attempted update check."""
175
+ config = config_manager.load_config()
176
+ config.auto_update_last_checked_at = checked_at
177
+ config_manager.save_config(config)
178
+
179
+
180
+ def run_auto_update(
181
+ *,
182
+ force: bool = False,
183
+ check_only: bool = False,
184
+ silent: bool = False,
185
+ config_manager: ConfigManager | None = None,
186
+ now: datetime | None = None,
187
+ executable: str | None = None,
188
+ ) -> AutoUpdateResult:
189
+ """Run update check/install flow and return a structured result."""
190
+ manager = config_manager or ConfigManager()
191
+ config = manager.load_config()
192
+ source = detect_install_source(executable)
193
+ checked_at = now or datetime.now()
194
+
195
+ if source == InstallSource.UVX:
196
+ return AutoUpdateResult(
197
+ status=AutoUpdateStatus.SKIPPED,
198
+ source=source,
199
+ checked=False,
200
+ update_available=False,
201
+ updated=False,
202
+ message="uvx runtime detected; updates are managed by uvx cache resolution.",
203
+ )
204
+
205
+ if not force and not config.auto_update:
206
+ return AutoUpdateResult(
207
+ status=AutoUpdateStatus.SKIPPED,
208
+ source=source,
209
+ checked=False,
210
+ update_available=False,
211
+ updated=False,
212
+ message="Auto-update is disabled in config.",
213
+ )
214
+
215
+ if not force and config.auto_update_last_checked_at is not None:
216
+ try:
217
+ elapsed = checked_at - config.auto_update_last_checked_at
218
+ except TypeError:
219
+ # Trigger: mixed naive/aware datetimes from manual config edits.
220
+ # Why: datetime subtraction fails for mixed tz-awareness.
221
+ # Outcome: ignore the gate once and continue with a forced check path.
222
+ logger.warning("Auto-update interval gate skipped due to incompatible timestamp format")
223
+ else:
224
+ if elapsed < timedelta(seconds=config.update_check_interval):
225
+ return AutoUpdateResult(
226
+ status=AutoUpdateStatus.SKIPPED,
227
+ source=source,
228
+ checked=False,
229
+ update_available=False,
230
+ updated=False,
231
+ message="Update check interval has not elapsed.",
232
+ )
233
+
234
+ try:
235
+ # --- Availability check ---
236
+ latest_version: str | None = None
237
+ if source == InstallSource.HOMEBREW:
238
+ update_available, latest_version = _check_homebrew_update_available(silent=silent)
239
+ else:
240
+ update_available, latest_version = _check_pypi_update_available()
241
+
242
+ if not update_available:
243
+ return AutoUpdateResult(
244
+ status=AutoUpdateStatus.UP_TO_DATE,
245
+ source=source,
246
+ checked=True,
247
+ update_available=False,
248
+ updated=False,
249
+ latest_version=latest_version,
250
+ message=f"Basic Memory is up to date ({basic_memory.__version__}).",
251
+ )
252
+
253
+ if check_only:
254
+ return AutoUpdateResult(
255
+ status=AutoUpdateStatus.UPDATE_AVAILABLE,
256
+ source=source,
257
+ checked=True,
258
+ update_available=True,
259
+ updated=False,
260
+ latest_version=latest_version,
261
+ message=(
262
+ f"Update available (latest: {latest_version or 'unknown'}). "
263
+ f"{_manual_update_hint(source)}"
264
+ ),
265
+ )
266
+
267
+ if source == InstallSource.UNKNOWN:
268
+ return AutoUpdateResult(
269
+ status=AutoUpdateStatus.UPDATE_AVAILABLE,
270
+ source=source,
271
+ checked=True,
272
+ update_available=True,
273
+ updated=False,
274
+ latest_version=latest_version,
275
+ message=(
276
+ f"Update available (latest: {latest_version or 'unknown'}). "
277
+ f"{_manual_update_hint(source)}"
278
+ ),
279
+ )
280
+
281
+ # --- Automatic install ---
282
+ command = (
283
+ ["uv", "tool", "upgrade", PACKAGE_NAME]
284
+ if source == InstallSource.UV_TOOL
285
+ else ["brew", "upgrade", PACKAGE_NAME]
286
+ )
287
+ timeout = (
288
+ UV_UPGRADE_TIMEOUT_SECONDS
289
+ if source == InstallSource.UV_TOOL
290
+ else BREW_UPGRADE_TIMEOUT_SECONDS
291
+ )
292
+
293
+ install_result = _run_subprocess(
294
+ command,
295
+ timeout_seconds=timeout,
296
+ silent=silent,
297
+ capture_output=not silent,
298
+ )
299
+ if install_result.returncode != 0:
300
+ stderr = (install_result.stderr or "").strip() if install_result.stderr else ""
301
+ stdout = (install_result.stdout or "").strip() if install_result.stdout else ""
302
+ detail = stderr or stdout or "update command failed"
303
+ return AutoUpdateResult(
304
+ status=AutoUpdateStatus.FAILED,
305
+ source=source,
306
+ checked=True,
307
+ update_available=True,
308
+ updated=False,
309
+ latest_version=latest_version,
310
+ message="Automatic update failed.",
311
+ error=detail,
312
+ )
313
+
314
+ return AutoUpdateResult(
315
+ status=AutoUpdateStatus.UPDATED,
316
+ source=source,
317
+ checked=True,
318
+ update_available=True,
319
+ updated=True,
320
+ latest_version=latest_version,
321
+ message=(
322
+ "Basic Memory was updated successfully. "
323
+ "Restart running sessions to use the new version."
324
+ ),
325
+ restart_recommended=True,
326
+ )
327
+
328
+ except (
329
+ RuntimeError,
330
+ urllib.error.URLError,
331
+ ValueError,
332
+ TimeoutError,
333
+ subprocess.SubprocessError,
334
+ OSError,
335
+ ) as exc:
336
+ logger.warning(f"Auto-update check failed: {exc}")
337
+ return AutoUpdateResult(
338
+ status=AutoUpdateStatus.FAILED,
339
+ source=source,
340
+ checked=True,
341
+ update_available=False,
342
+ updated=False,
343
+ message="Automatic update check failed.",
344
+ error=str(exc),
345
+ )
346
+ finally:
347
+ # Trigger: we attempted a check path (including failures).
348
+ # Why: repeated failing checks on every command create noise and unnecessary network load.
349
+ # Outcome: next periodic check is gated by update_check_interval.
350
+ try:
351
+ _save_last_checked_timestamp(manager, checked_at)
352
+ except Exception as exc: # pragma: no cover
353
+ logger.warning(f"Failed to persist auto-update timestamp: {exc}")
354
+
355
+
356
+ def maybe_run_periodic_auto_update(
357
+ invoked_subcommand: str | None,
358
+ *,
359
+ config_manager: ConfigManager | None = None,
360
+ is_interactive: bool | None = None,
361
+ console: Console | None = None,
362
+ ) -> AutoUpdateResult | None:
363
+ """Run a periodic auto-update check for interactive CLI sessions."""
364
+ interactive = _is_interactive_session() if is_interactive is None else is_interactive
365
+ if not interactive:
366
+ return None
367
+ if invoked_subcommand in {None, "mcp", "update"}:
368
+ return None
369
+
370
+ result = run_auto_update(
371
+ force=False,
372
+ check_only=False,
373
+ silent=False,
374
+ config_manager=config_manager,
375
+ )
376
+
377
+ if result.status in {
378
+ AutoUpdateStatus.UPDATE_AVAILABLE,
379
+ AutoUpdateStatus.UPDATED,
380
+ AutoUpdateStatus.FAILED,
381
+ }:
382
+ out = console or Console()
383
+ if result.status == AutoUpdateStatus.UPDATED:
384
+ out.print(f"[green]{result.message}[/green]")
385
+ elif result.status == AutoUpdateStatus.FAILED:
386
+ error_detail = f" {result.error}" if result.error else ""
387
+ out.print(f"[yellow]{result.message}{error_detail}[/yellow]")
388
+ elif result.message:
389
+ out.print(f"[cyan]{result.message}[/cyan]")
390
+
391
+ return result
@@ -8,6 +8,7 @@ from . import (
8
8
  project,
9
9
  format,
10
10
  schema,
11
+ update,
11
12
  )
12
13
 
13
14
  __all__ = [
@@ -23,4 +24,5 @@ __all__ = [
23
24
  "project",
24
25
  "format",
25
26
  "schema",
27
+ "update",
26
28
  ]
@@ -1,12 +1,14 @@
1
1
  """MCP server command with streamable HTTP transport."""
2
2
 
3
3
  import os
4
+ import threading
4
5
  from typing import Any, Optional
5
6
 
6
7
  import typer
7
8
  from loguru import logger
8
9
 
9
10
  from basic_memory.cli.app import app
11
+ from basic_memory.cli.auto_update import AutoUpdateStatus, run_auto_update
10
12
  from basic_memory.config import ConfigManager, init_mcp_logging
11
13
 
12
14
 
@@ -80,6 +82,22 @@ def mcp(
80
82
  os.environ["BASIC_MEMORY_MCP_PROJECT"] = project_name
81
83
  logger.info(f"MCP server constrained to project: {project_name}")
82
84
 
85
+ def _run_background_auto_update() -> None:
86
+ result = run_auto_update(force=False, check_only=False, silent=True)
87
+ if result.restart_recommended:
88
+ logger.info(
89
+ "A newer Basic Memory version was installed and will apply on next restart."
90
+ )
91
+ elif result.status == AutoUpdateStatus.FAILED and result.error:
92
+ logger.warning(f"MCP background auto-update failed: {result.error}")
93
+
94
+ # Trigger: stdio transport corresponds to local user installs.
95
+ # Why: server transports (HTTP/SSE) run in managed environments where
96
+ # package-manager self-upgrades are inappropriate.
97
+ # Outcome: background auto-update runs only for local stdio MCP sessions.
98
+ if transport == "stdio":
99
+ threading.Thread(target=_run_background_auto_update, daemon=True).start()
100
+
83
101
  # Run the MCP server (blocks)
84
102
  # Lifespan handles: initialization, migrations, file sync, cleanup
85
103
  logger.info(f"Starting MCP server with {transport.upper()} transport")