basic-memory 0.20.0__tar.gz → 0.20.2__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.20.0 → basic_memory-0.20.2}/CHANGELOG.md +20 -0
  2. {basic_memory-0.20.0 → basic_memory-0.20.2}/PKG-INFO +1 -1
  3. {basic_memory-0.20.0 → basic_memory-0.20.2}/server.json +2 -2
  4. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/__init__.py +1 -1
  5. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/auto_update.py +5 -7
  6. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/project.py +14 -3
  7. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/config.py +47 -5
  8. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/conftest.py +2 -0
  9. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/conftest.py +2 -0
  10. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_auto_update.py +25 -0
  11. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_json_output.py +2 -0
  12. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_add_with_local_path.py +2 -0
  13. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_list_and_ls.py +5 -2
  14. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_set_cloud_local.py +24 -0
  15. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_workspace_commands.py +4 -0
  16. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/conftest.py +2 -0
  17. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note.py +8 -0
  18. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service.py +10 -0
  19. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_config.py +126 -0
  20. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/beta.md +0 -0
  21. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/changelog.md +0 -0
  22. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/release-check.md +0 -0
  23. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/release.md +0 -0
  24. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/spec.md +0 -0
  25. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/test-live.md +0 -0
  26. {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/settings.json +0 -0
  27. {basic_memory-0.20.0 → basic_memory-0.20.2}/.dockerignore +0 -0
  28. {basic_memory-0.20.0 → basic_memory-0.20.2}/.env.example +0 -0
  29. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  30. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  32. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  33. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/dependabot.yml +0 -0
  34. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude-code-review.yml +0 -0
  35. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude-issue-triage.yml +0 -0
  36. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude.yml +0 -0
  37. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/dev-release.yml +0 -0
  38. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/docker.yml +0 -0
  39. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/pr-title.yml +0 -0
  40. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/release.yml +0 -0
  41. {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/test.yml +0 -0
  42. {basic_memory-0.20.0 → basic_memory-0.20.2}/.gitignore +0 -0
  43. {basic_memory-0.20.0 → basic_memory-0.20.2}/.python-version +0 -0
  44. {basic_memory-0.20.0 → basic_memory-0.20.2}/AGENTS.md +0 -0
  45. {basic_memory-0.20.0 → basic_memory-0.20.2}/CITATION.cff +0 -0
  46. {basic_memory-0.20.0 → basic_memory-0.20.2}/CLA.md +0 -0
  47. {basic_memory-0.20.0 → basic_memory-0.20.2}/CLAUDE.md +0 -0
  48. {basic_memory-0.20.0 → basic_memory-0.20.2}/CODE_OF_CONDUCT.md +0 -0
  49. {basic_memory-0.20.0 → basic_memory-0.20.2}/CONTRIBUTING.md +0 -0
  50. {basic_memory-0.20.0 → basic_memory-0.20.2}/Dockerfile +0 -0
  51. {basic_memory-0.20.0 → basic_memory-0.20.2}/LICENSE +0 -0
  52. {basic_memory-0.20.0 → basic_memory-0.20.2}/NOTE-FORMAT.md +0 -0
  53. {basic_memory-0.20.0 → basic_memory-0.20.2}/README.md +0 -0
  54. {basic_memory-0.20.0 → basic_memory-0.20.2}/SECURITY.md +0 -0
  55. {basic_memory-0.20.0 → basic_memory-0.20.2}/docker-compose-postgres.yml +0 -0
  56. {basic_memory-0.20.0 → basic_memory-0.20.2}/docker-compose.yml +0 -0
  57. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/ARCHITECTURE.md +0 -0
  58. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/Docker.md +0 -0
  59. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/NOTE-FORMAT.md +0 -0
  60. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
  61. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/ai-assistant-guide-extended.md +0 -0
  62. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/character-handling.md +0 -0
  63. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/cloud-cli.md +0 -0
  64. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/cloud-semantic-search-value.md +0 -0
  65. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/mcp-ui-bakeoff-instructions.md +0 -0
  66. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/metadata-search.md +0 -0
  67. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/post-v0.18.0-test-plan.md +0 -0
  68. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/releases/v0.19.0.md +0 -0
  69. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/semantic-search-test-log.md +0 -0
  70. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/semantic-search.md +0 -0
  71. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
  72. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
  73. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-SCHEMA.md +0 -0
  74. {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/testing-coverage.md +0 -0
  75. {basic_memory-0.20.0 → basic_memory-0.20.2}/justfile +0 -0
  76. {basic_memory-0.20.0 → basic_memory-0.20.2}/llms-install.md +0 -0
  77. {basic_memory-0.20.0 → basic_memory-0.20.2}/pyproject.toml +0 -0
  78. {basic_memory-0.20.0 → basic_memory-0.20.2}/smithery.yaml +0 -0
  79. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/alembic.ini +0 -0
  80. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/env.py +0 -0
  81. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/migrations.py +0 -0
  82. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/script.py.mako +0 -0
  83. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  84. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  85. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  86. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  87. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  88. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  89. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  90. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  91. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  92. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  93. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  94. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  95. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  96. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  97. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  98. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
  99. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
  100. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
  101. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
  102. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/__init__.py +0 -0
  103. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/app.py +0 -0
  104. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/container.py +0 -0
  105. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/template_loader.py +0 -0
  106. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/__init__.py +0 -0
  107. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  108. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  109. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  110. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  111. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  112. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  113. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  114. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  115. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
  116. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  117. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/utils.py +0 -0
  118. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/__init__.py +0 -0
  119. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/analytics.py +0 -0
  120. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/app.py +0 -0
  121. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/auth.py +0 -0
  122. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/__init__.py +0 -0
  123. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  124. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  125. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  126. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  127. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  128. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
  129. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  130. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  131. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  132. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  133. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  134. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  135. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  136. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  137. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
  138. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/command_utils.py +0 -0
  139. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/db.py +0 -0
  140. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/doctor.py +0 -0
  141. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/format.py +0 -0
  142. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  143. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  144. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  145. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  146. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/mcp.py +0 -0
  147. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/routing.py +0 -0
  148. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/schema.py +0 -0
  149. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/status.py +0 -0
  150. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/tool.py +0 -0
  151. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/update.py +0 -0
  152. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/container.py +0 -0
  153. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/main.py +0 -0
  154. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/promo.py +0 -0
  155. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/db.py +0 -0
  156. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/__init__.py +0 -0
  157. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/config.py +0 -0
  158. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/db.py +0 -0
  159. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/importers.py +0 -0
  160. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/projects.py +0 -0
  161. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/repositories.py +0 -0
  162. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/services.py +0 -0
  163. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps.py +0 -0
  164. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/file_utils.py +0 -0
  165. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/ignore_utils.py +0 -0
  166. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/__init__.py +0 -0
  167. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/base.py +0 -0
  168. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  169. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  170. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  171. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/memory_json_importer.py +0 -0
  172. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/utils.py +0 -0
  173. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/__init__.py +0 -0
  174. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/entity_parser.py +0 -0
  175. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/markdown_processor.py +0 -0
  176. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/plugins.py +0 -0
  177. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/schemas.py +0 -0
  178. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/utils.py +0 -0
  179. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/__init__.py +0 -0
  180. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/async_client.py +0 -0
  181. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/__init__.py +0 -0
  182. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/directory.py +0 -0
  183. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  184. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/memory.py +0 -0
  185. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/project.py +0 -0
  186. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/resource.py +0 -0
  187. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/schema.py +0 -0
  188. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/search.py +0 -0
  189. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/container.py +0 -0
  190. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/formatting.py +0 -0
  191. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/project_context.py +0 -0
  192. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  193. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  194. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  195. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  196. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/search.py +0 -0
  197. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/utils.py +0 -0
  198. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/__init__.py +0 -0
  199. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  200. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
  201. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/project_info.py +0 -0
  202. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/release_notes.md +0 -0
  203. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/ui.py +0 -0
  204. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/server.py +0 -0
  205. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/__init__.py +0 -0
  206. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/build_context.py +0 -0
  207. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/canvas.py +0 -0
  208. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  209. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
  210. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  211. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  212. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  213. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/move_note.py +0 -0
  214. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/project_management.py +0 -0
  215. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/read_content.py +0 -0
  216. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/read_note.py +0 -0
  217. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  218. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/release_notes.py +0 -0
  219. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/schema.py +0 -0
  220. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/search.py +0 -0
  221. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
  222. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/utils.py +0 -0
  223. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/view_note.py +0 -0
  224. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/workspaces.py +0 -0
  225. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/write_note.py +0 -0
  226. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/__init__.py +0 -0
  227. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
  228. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
  229. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
  230. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
  231. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
  232. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
  233. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/sdk.py +0 -0
  234. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/templates.py +0 -0
  235. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/__init__.py +0 -0
  236. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/base.py +0 -0
  237. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/knowledge.py +0 -0
  238. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/project.py +0 -0
  239. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/search.py +0 -0
  240. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/project_resolver.py +0 -0
  241. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/__init__.py +0 -0
  242. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/embedding_provider.py +0 -0
  243. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
  244. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/entity_repository.py +0 -0
  245. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/fastembed_provider.py +0 -0
  246. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/metadata_filters.py +0 -0
  247. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/observation_repository.py +0 -0
  248. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/openai_provider.py +0 -0
  249. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  250. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/project_info_repository.py +0 -0
  251. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/project_repository.py +0 -0
  252. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/relation_repository.py +0 -0
  253. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/repository.py +0 -0
  254. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_index_row.py +0 -0
  255. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_repository.py +0 -0
  256. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_repository_base.py +0 -0
  257. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/semantic_errors.py +0 -0
  258. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  259. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/runtime.py +0 -0
  260. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/__init__.py +0 -0
  261. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/diff.py +0 -0
  262. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/inference.py +0 -0
  263. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/parser.py +0 -0
  264. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/resolver.py +0 -0
  265. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/validator.py +0 -0
  266. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/__init__.py +0 -0
  267. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/base.py +0 -0
  268. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/cloud.py +0 -0
  269. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/delete.py +0 -0
  270. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/directory.py +0 -0
  271. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/importer.py +0 -0
  272. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/memory.py +0 -0
  273. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/project_info.py +0 -0
  274. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/prompt.py +0 -0
  275. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/request.py +0 -0
  276. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/response.py +0 -0
  277. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/schema.py +0 -0
  278. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/search.py +0 -0
  279. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/sync_report.py +0 -0
  280. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/__init__.py +0 -0
  281. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/entity.py +0 -0
  282. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/graph.py +0 -0
  283. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/resource.py +0 -0
  284. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/__init__.py +0 -0
  285. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/context_service.py +0 -0
  286. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/directory_service.py +0 -0
  287. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/entity_service.py +0 -0
  288. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/exceptions.py +0 -0
  289. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/file_service.py +0 -0
  290. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/initialization.py +0 -0
  291. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/link_resolver.py +0 -0
  292. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/project_service.py +0 -0
  293. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/search_service.py +0 -0
  294. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/service.py +0 -0
  295. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/__init__.py +0 -0
  296. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/background_sync.py +0 -0
  297. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/coordinator.py +0 -0
  298. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/sync_service.py +0 -0
  299. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/watch_service.py +0 -0
  300. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  301. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/templates/prompts/search.hbs +0 -0
  302. {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/utils.py +0 -0
  303. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/BENCHMARKS.md +0 -0
  304. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
  305. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
  306. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  307. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_project_commands_integration.py +0 -0
  308. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_routing_integration.py +0 -0
  309. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_search_notes_meta_integration.py +0 -0
  310. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_version_integration.py +0 -0
  311. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/compare_search_benchmarks.py +0 -0
  312. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
  313. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
  314. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
  315. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
  316. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
  317. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
  318. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
  319. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
  320. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
  321. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
  322. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
  323. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
  324. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
  325. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
  326. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
  327. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
  328. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
  329. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
  330. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
  331. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
  332. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
  333. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
  334. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
  335. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
  336. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
  337. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
  338. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
  339. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
  340. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
  341. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
  342. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
  343. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
  344. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
  345. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
  346. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
  347. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
  348. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
  349. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
  350. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
  351. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
  352. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
  353. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
  354. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
  355. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
  356. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
  357. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
  358. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
  359. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
  360. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
  361. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
  362. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
  363. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
  364. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
  365. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
  366. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
  367. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
  368. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
  369. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
  370. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
  371. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Book.md +0 -0
  372. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
  373. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Person.md +0 -0
  374. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
  375. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
  376. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
  377. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
  378. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
  379. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
  380. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
  381. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
  382. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
  383. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
  384. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
  385. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
  386. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_build_context_underscore.py +0 -0
  387. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_build_context_validation.py +0 -0
  388. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  389. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  390. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_delete_directory_integration.py +0 -0
  391. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_delete_note_integration.py +0 -0
  392. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_edit_note_integration.py +0 -0
  393. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  394. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_list_directory_integration.py +0 -0
  395. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_move_directory_integration.py +0 -0
  396. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_move_note_integration.py +0 -0
  397. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_output_format_json_integration.py +0 -0
  398. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_pagination_integration.py +0 -0
  399. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_permalink_collision_integration.py +0 -0
  400. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_project_management_integration.py +0 -0
  401. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  402. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_read_content_integration.py +0 -0
  403. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_read_note_integration.py +0 -0
  404. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_search_integration.py +0 -0
  405. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  406. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_smoke_integration.py +0 -0
  407. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_string_params_integration.py +0 -0
  408. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_ui_sdk_integration.py +0 -0
  409. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_write_note_integration.py +0 -0
  410. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/__init__.py +0 -0
  411. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/conftest.py +0 -0
  412. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/corpus.py +0 -0
  413. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/metrics.py +0 -0
  414. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/report.py +0 -0
  415. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
  416. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_search_diagnostics.py +0 -0
  417. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_semantic_coverage.py +0 -0
  418. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_semantic_quality.py +0 -0
  419. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_db_wal_mode.py +0 -0
  420. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_disable_permalinks_integration.py +0 -0
  421. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/__init__.py +0 -0
  422. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/conftest.py +0 -0
  423. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/helpers.py +0 -0
  424. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_diff_integration.py +0 -0
  425. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_inference_integration.py +0 -0
  426. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_parser_integration.py +0 -0
  427. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_validator_integration.py +0 -0
  428. {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_search_performance_benchmark.py +0 -0
  429. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/Non-MarkdownFileSupport.pdf +0 -0
  430. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/README.md +0 -0
  431. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/Screenshot.png +0 -0
  432. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/__init__.py +0 -0
  433. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/__init__.py +0 -0
  434. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/conftest.py +0 -0
  435. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_directory_router.py +0 -0
  436. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_importer_router.py +0 -0
  437. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_knowledge_router.py +0 -0
  438. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_memory_router.py +0 -0
  439. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_project_router.py +0 -0
  440. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_prompt_router.py +0 -0
  441. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_resource_router.py +0 -0
  442. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_schema_router.py +0 -0
  443. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_search_router.py +0 -0
  444. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  445. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  446. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_upload_command_routing.py +0 -0
  447. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_upload_path.py +0 -0
  448. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_analytics.py +0 -0
  449. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_auth_cli_auth.py +0 -0
  450. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_container.py +0 -0
  451. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_exit.py +0 -0
  452. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_schema.py +0 -0
  453. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tool_exit.py +0 -0
  454. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tool_json_output.py +0 -0
  455. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tools.py +0 -0
  456. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_authentication.py +0 -0
  457. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_promo.py +0 -0
  458. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_status.py +0 -0
  459. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_db_reset_exit.py +0 -0
  460. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_ignore_utils.py +0 -0
  461. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_chatgpt.py +0 -0
  462. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_claude_conversations.py +0 -0
  463. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_claude_projects.py +0 -0
  464. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_memory_json.py +0 -0
  465. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_info_errors.py +0 -0
  466. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_restore_commands.py +0 -0
  467. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_routing.py +0 -0
  468. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_snapshot_commands.py +0 -0
  469. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_update_command.py +0 -0
  470. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_upload.py +0 -0
  471. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  472. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_conversation_indexing.py +0 -0
  473. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_importer_base.py +0 -0
  474. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_importer_utils.py +0 -0
  475. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/__init__.py +0 -0
  476. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  477. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_entity_parser.py +0 -0
  478. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  479. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_plugins.py +0 -0
  480. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_processor.py +0 -0
  481. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_utils.py +0 -0
  482. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_observation_edge_cases.py +0 -0
  483. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_parser_edge_cases.py +0 -0
  484. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_relation_edge_cases.py +0 -0
  485. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_task_detection.py +0 -0
  486. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/clients/__init__.py +0 -0
  487. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/clients/test_clients.py +0 -0
  488. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/conftest.py +0 -0
  489. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_async_client_force_local.py +0 -0
  490. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_async_client_modes.py +0 -0
  491. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_client_schema.py +0 -0
  492. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_mcp_container.py +0 -0
  493. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  494. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  495. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_project_context.py +0 -0
  496. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_prompt_tool_delegation.py +0 -0
  497. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_prompts.py +0 -0
  498. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  499. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_resources.py +0 -0
  500. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_server_lifespan_branches.py +0 -0
  501. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_build_context.py +0 -0
  502. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_canvas.py +0 -0
  503. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_cloud_discovery.py +0 -0
  504. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_contracts.py +0 -0
  505. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_delete_note.py +0 -0
  506. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_edit_note.py +0 -0
  507. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_json_output_modes.py +0 -0
  508. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_list_directory.py +0 -0
  509. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_move_note.py +0 -0
  510. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_project_management.py +0 -0
  511. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_read_content.py +0 -0
  512. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_read_note.py +0 -0
  513. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_recent_activity.py +0 -0
  514. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_resource.py +0 -0
  515. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_schema.py +0 -0
  516. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_search.py +0 -0
  517. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_utils.py +0 -0
  518. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
  519. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_view_note.py +0 -0
  520. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_workspace_management.py +0 -0
  521. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  522. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note_metadata.py +0 -0
  523. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_resources.py +0 -0
  524. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_sdk.py +0 -0
  525. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_templates.py +0 -0
  526. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  527. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_distance_to_similarity.py +0 -0
  528. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_repository.py +0 -0
  529. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_repository_upsert.py +0 -0
  530. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  531. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_fastembed_provider.py +0 -0
  532. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_hybrid_fusion.py +0 -0
  533. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_metadata_filters.py +0 -0
  534. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
  535. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_observation_repository.py +0 -0
  536. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_openai_provider.py +0 -0
  537. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_postgres_search_repository.py +0 -0
  538. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_postgres_search_repository_unit.py +0 -0
  539. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_project_info_repository.py +0 -0
  540. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_project_repository.py +0 -0
  541. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_relation_repository.py +0 -0
  542. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_repository.py +0 -0
  543. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_index_row.py +0 -0
  544. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_repository.py +0 -0
  545. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  546. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
  547. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_semantic_search_base.py +0 -0
  548. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
  549. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_vector_pagination.py +0 -0
  550. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_vector_threshold.py +0 -0
  551. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/__init__.py +0 -0
  552. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_diff.py +0 -0
  553. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_inference.py +0 -0
  554. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_parser.py +0 -0
  555. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_resolver.py +0 -0
  556. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_validator.py +0 -0
  557. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  558. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_serialization.py +0 -0
  559. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_url.py +0 -0
  560. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_url_validation.py +0 -0
  561. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  562. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_schemas.py +0 -0
  563. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_search.py +0 -0
  564. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_context_service.py +0 -0
  565. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_directory_service.py +0 -0
  566. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_entity_service.py +0 -0
  567. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  568. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_file_service.py +0 -0
  569. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_initialization.py +0 -0
  570. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  571. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_link_resolver.py +0 -0
  572. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_removal_bug.py +0 -0
  573. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_cloud_info.py +0 -0
  574. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_embedding_status.py +0 -0
  575. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_operations.py +0 -0
  576. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_search_service.py +0 -0
  577. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_semantic_search.py +0 -0
  578. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_task_scheduler_semantic.py +0 -0
  579. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_character_conflicts.py +0 -0
  580. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_coordinator.py +0 -0
  581. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_service.py +0 -0
  582. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_service_incremental.py +0 -0
  583. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_wikilink_issue.py +0 -0
  584. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_tmp_files.py +0 -0
  585. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service.py +0 -0
  586. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  587. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_edge_cases.py +0 -0
  588. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_reload.py +0 -0
  589. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_stress.py +0 -0
  590. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_coerce.py +0 -0
  591. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_deps.py +0 -0
  592. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_production_cascade_delete.py +0 -0
  593. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_project_resolver.py +0 -0
  594. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_rclone_commands.py +0 -0
  595. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_runtime.py +0 -0
  596. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_file_utils.py +0 -0
  597. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  598. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_parse_tags.py +0 -0
  599. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_permalink_formatting.py +0 -0
  600. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_setup_logging.py +0 -0
  601. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_timezone_utils.py +0 -0
  602. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_utf8_handling.py +0 -0
  603. {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_validate_project_path.py +0 -0
  604. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/.gitignore +0 -0
  605. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/build.mjs +0 -0
  606. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/package-lock.json +0 -0
  607. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/package.json +0 -0
  608. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
  609. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
  610. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
  611. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
  612. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
  613. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
  614. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
  615. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
  616. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
  617. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
  618. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
  619. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
  620. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
  621. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
  622. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
  623. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
  624. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
  625. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
  626. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
  627. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
  628. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
  629. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
  630. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
  631. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
  632. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
  633. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
  634. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
  635. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
  636. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
  637. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/note-preview.tsx +0 -0
  638. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/search-results.tsx +0 -0
  639. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/styles.css +0 -0
  640. {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/tailwind.config.js +0 -0
  641. {basic_memory-0.20.0 → basic_memory-0.20.2}/uv.lock +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.20.2 (2026-03-10)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Fix auto-update Homebrew detection: `brew outdated` exits 1 when a formula is outdated, not on error
10
+ - Previously treated exit code 1 as a failure, causing "Automatic update check failed" instead of detecting the available update
11
+
12
+ ## v0.20.1 (2026-03-10)
13
+
14
+ ### Bug Fixes
15
+
16
+ - **#661**: Fix `bm project list` MCP column to show transport type (stdio/https) instead of DB presence
17
+ - Renamed "MCP (stdio)" column to "MCP"
18
+ - Shows actual routing mode: `stdio` for local, `https` for cloud projects
19
+ - Clears local path display for cloud-mode projects
20
+ - **#662**: Invalidate config cache when file is modified by another process
21
+ - Adds mtime-based cache validation to `ConfigManager.load_config()`
22
+ - Long-lived processes (MCP stdio server) now detect external config changes
23
+ - Fixes `bm project set-cloud` having no effect on running MCP server
24
+
5
25
  ## v0.20.0 (2026-03-10)
6
26
 
7
27
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.20.0
3
+ Version: 0.20.2
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
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/basicmachines-co/basic-memory.git",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.20.0",
9
+ "version": "0.20.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.20.0",
14
+ "version": "0.20.2",
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.20.0"
4
+ __version__ = "0.20.2"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -134,13 +134,11 @@ def _check_homebrew_update_available(silent: bool) -> tuple[bool, str | None]:
134
134
  silent=silent,
135
135
  capture_output=True,
136
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())
137
+ # Trigger: brew outdated exits 1 when the formula IS outdated (with name on stdout).
138
+ # Why: non-zero exit here means "outdated", not "error".
139
+ # Outcome: check stdout for the package name to determine outdated status.
140
+ stdout = (result.stdout or "").strip()
141
+ is_outdated = PACKAGE_NAME in stdout
144
142
  return is_outdated, None
145
143
 
146
144
 
@@ -128,7 +128,7 @@ def list_projects(
128
128
  table.add_column("Cloud Path", style="green")
129
129
  table.add_column("Workspace", style="green")
130
130
  table.add_column("CLI Route", style="blue")
131
- table.add_column("MCP (stdio)", style="blue")
131
+ table.add_column("MCP", style="blue")
132
132
  table.add_column("Sync", style="green")
133
133
  table.add_column("Default", style="magenta")
134
134
 
@@ -164,6 +164,11 @@ def list_projects(
164
164
  elif entry and entry.mode == ProjectMode.LOCAL and entry.path:
165
165
  local_path = format_path(normalize_project_path(entry.path))
166
166
 
167
+ # Clear local path for cloud-mode projects — only local projects
168
+ # should display a local path
169
+ if entry and entry.mode == ProjectMode.CLOUD:
170
+ local_path = ""
171
+
167
172
  cloud_path = ""
168
173
  if cloud_project is not None:
169
174
  cloud_path = normalize_project_path(cloud_project.path)
@@ -182,7 +187,13 @@ def list_projects(
182
187
  is_default = config.default_project == project_name
183
188
 
184
189
  has_sync = bool(entry and entry.local_sync_path)
185
- mcp_stdio_target = "local" if local_project is not None else "n/a"
190
+ # Determine MCP transport based on project routing mode
191
+ if entry and entry.mode == ProjectMode.CLOUD:
192
+ mcp_transport = "https"
193
+ elif entry is None and cloud_project is not None:
194
+ mcp_transport = "https"
195
+ else:
196
+ mcp_transport = "stdio"
186
197
 
187
198
  # Show workspace name (type) for cloud-sourced projects
188
199
  ws_label = ""
@@ -195,7 +206,7 @@ def list_projects(
195
206
  "local_path": local_path,
196
207
  "cloud_path": cloud_path,
197
208
  "cli_route": cli_route,
198
- "mcp_stdio": mcp_stdio_target,
209
+ "mcp_stdio": mcp_transport,
199
210
  "sync": has_sync,
200
211
  "is_default": is_default,
201
212
  }
@@ -645,6 +645,12 @@ class BasicMemoryConfig(BaseSettings):
645
645
 
646
646
  # Module-level cache for configuration
647
647
  _CONFIG_CACHE: Optional[BasicMemoryConfig] = None
648
+ # Track config file mtime+size so cross-process changes (e.g. `bm project set-cloud`
649
+ # in a separate terminal) invalidate the cache in long-lived processes like the
650
+ # MCP stdio server. Using both mtime and size guards against coarse-granularity
651
+ # filesystems where two writes within the same second share the same mtime.
652
+ _CONFIG_MTIME: Optional[float] = None
653
+ _CONFIG_SIZE: Optional[int] = None
648
654
 
649
655
 
650
656
  class ConfigManager:
@@ -678,13 +684,38 @@ class ConfigManager:
678
684
  Environment variables take precedence over file config values,
679
685
  following Pydantic Settings best practices.
680
686
 
681
- Uses module-level cache for performance across ConfigManager instances.
687
+ Uses module-level cache with file mtime validation so that
688
+ cross-process config changes (e.g. `bm project set-cloud` in a
689
+ separate terminal) are picked up by long-lived processes like
690
+ the MCP stdio server.
682
691
  """
683
- global _CONFIG_CACHE
692
+ global _CONFIG_CACHE, _CONFIG_MTIME, _CONFIG_SIZE
684
693
 
685
- # Return cached config if available
694
+ # Trigger: cached config exists but the on-disk file may have been
695
+ # modified by another process (CLI command in a different terminal).
696
+ # Why: the MCP server is long-lived; without this check it would
697
+ # serve stale project routing forever.
698
+ # Outcome: cheap os.stat() per access; re-read only when mtime or size differs.
686
699
  if _CONFIG_CACHE is not None:
687
- return _CONFIG_CACHE
700
+ try:
701
+ st = self.config_file.stat()
702
+ current_mtime = st.st_mtime
703
+ current_size = st.st_size
704
+ except OSError:
705
+ current_mtime = None
706
+ current_size = None
707
+
708
+ if (
709
+ current_mtime is not None
710
+ and current_mtime == _CONFIG_MTIME
711
+ and current_size == _CONFIG_SIZE
712
+ ):
713
+ return _CONFIG_CACHE
714
+
715
+ # mtime/size changed or file gone — invalidate and fall through to re-read
716
+ _CONFIG_CACHE = None
717
+ _CONFIG_MTIME = None
718
+ _CONFIG_SIZE = None
688
719
 
689
720
  if self.config_file.exists():
690
721
  try:
@@ -739,6 +770,15 @@ class ConfigManager:
739
770
 
740
771
  _CONFIG_CACHE = BasicMemoryConfig(**merged_data)
741
772
 
773
+ # Record mtime+size so subsequent calls detect cross-process changes
774
+ try:
775
+ st = self.config_file.stat()
776
+ _CONFIG_MTIME = st.st_mtime
777
+ _CONFIG_SIZE = st.st_size
778
+ except OSError:
779
+ _CONFIG_MTIME = None
780
+ _CONFIG_SIZE = None
781
+
742
782
  # Re-save to normalize legacy config into current format
743
783
  if needs_resave:
744
784
  # Create backup before overwriting so users can revert if needed
@@ -769,10 +809,12 @@ class ConfigManager:
769
809
 
770
810
  def save_config(self, config: BasicMemoryConfig) -> None:
771
811
  """Save configuration to file and invalidate cache."""
772
- global _CONFIG_CACHE
812
+ global _CONFIG_CACHE, _CONFIG_MTIME, _CONFIG_SIZE
773
813
  save_basic_memory_config(self.config_file, config)
774
814
  # Invalidate cache so next load_config() reads fresh data
775
815
  _CONFIG_CACHE = None
816
+ _CONFIG_MTIME = None
817
+ _CONFIG_SIZE = None
776
818
 
777
819
  @property
778
820
  def projects(self) -> Dict[str, str]:
@@ -258,6 +258,8 @@ def config_manager(app_config: BasicMemoryConfig, config_home) -> ConfigManager:
258
258
  from basic_memory import config as config_module
259
259
 
260
260
  config_module._CONFIG_CACHE = None
261
+ config_module._CONFIG_MTIME = None
262
+ config_module._CONFIG_SIZE = None
261
263
 
262
264
  config_manager = ConfigManager()
263
265
  # Update its paths to use the test directory
@@ -25,6 +25,8 @@ def isolated_home(tmp_path, monkeypatch) -> Path:
25
25
  from basic_memory import config as config_module
26
26
 
27
27
  config_module._CONFIG_CACHE = None
28
+ config_module._CONFIG_MTIME = None
29
+ config_module._CONFIG_SIZE = None
28
30
 
29
31
  monkeypatch.setenv("HOME", str(tmp_path))
30
32
  if os.name == "nt":
@@ -12,6 +12,7 @@ from basic_memory.cli.auto_update import (
12
12
  AutoUpdateResult,
13
13
  AutoUpdateStatus,
14
14
  InstallSource,
15
+ _check_homebrew_update_available,
15
16
  _is_interactive_session,
16
17
  detect_install_source,
17
18
  maybe_run_periodic_auto_update,
@@ -129,6 +130,30 @@ def test_force_bypasses_auto_update_disabled(monkeypatch, tmp_path):
129
130
  assert manager.save_calls == 1
130
131
 
131
132
 
133
+ def test_check_homebrew_update_available_exit_code_1_means_outdated(monkeypatch):
134
+ """brew outdated exits 1 when the formula is outdated, not on error."""
135
+
136
+ def _fake_run(command, **kwargs):
137
+ return subprocess.CompletedProcess(
138
+ command, 1, stdout="basicmachines-co/basic-memory/basic-memory\n", stderr=""
139
+ )
140
+
141
+ monkeypatch.setattr("basic_memory.cli.auto_update._run_subprocess", _fake_run)
142
+ is_outdated, _ = _check_homebrew_update_available(silent=False)
143
+ assert is_outdated is True
144
+
145
+
146
+ def test_check_homebrew_update_available_exit_code_0_means_up_to_date(monkeypatch):
147
+ """brew outdated exits 0 when the formula is up to date."""
148
+
149
+ def _fake_run(command, **kwargs):
150
+ return subprocess.CompletedProcess(command, 0, stdout="", stderr="")
151
+
152
+ monkeypatch.setattr("basic_memory.cli.auto_update._run_subprocess", _fake_run)
153
+ is_outdated, _ = _check_homebrew_update_available(silent=False)
154
+ assert is_outdated is False
155
+
156
+
132
157
  def test_homebrew_outdated_triggers_upgrade(monkeypatch, tmp_path):
133
158
  config = _base_config(tmp_path)
134
159
  manager = StubConfigManager(config)
@@ -350,6 +350,8 @@ def write_config(tmp_path, monkeypatch):
350
350
  from basic_memory import config as config_module
351
351
 
352
352
  config_module._CONFIG_CACHE = None
353
+ config_module._CONFIG_MTIME = None
354
+ config_module._CONFIG_SIZE = None
353
355
 
354
356
  config_dir = tmp_path / ".basic-memory"
355
357
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -27,6 +27,8 @@ def mock_config(tmp_path, monkeypatch):
27
27
  from basic_memory import config as config_module
28
28
 
29
29
  config_module._CONFIG_CACHE = None
30
+ config_module._CONFIG_MTIME = None
31
+ config_module._CONFIG_SIZE = None
30
32
 
31
33
  config_dir = tmp_path / ".basic-memory"
32
34
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -29,6 +29,8 @@ def write_config(tmp_path, monkeypatch):
29
29
  from basic_memory import config as config_module
30
30
 
31
31
  config_module._CONFIG_CACHE = None
32
+ config_module._CONFIG_MTIME = None
33
+ config_module._CONFIG_SIZE = None
32
34
 
33
35
  config_dir = tmp_path / ".basic-memory"
34
36
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -122,15 +124,16 @@ def test_project_list_shows_local_cloud_presence_and_routes(
122
124
  assert "Local Path" in result.stdout
123
125
  assert "Cloud Path" in result.stdout
124
126
  assert "CLI Route" in result.stdout
125
- assert "MCP (stdio)" in result.stdout
127
+ assert "MCP" in result.stdout
126
128
 
127
129
  lines = result.stdout.splitlines()
128
130
  alpha_line = next(line for line in lines if "│ alpha" in line)
129
131
  beta_line = next(line for line in lines if "│ beta" in line)
130
132
 
131
133
  assert "local" in alpha_line # CLI route for alpha
134
+ assert "stdio" in alpha_line # Local projects use stdio transport
132
135
  assert "cloud" in beta_line # CLI route for beta
133
- assert "n/a" in beta_line # MCP stdio route is unavailable for cloud-only projects
136
+ assert "https" in beta_line # Cloud projects use HTTPS transport
134
137
  assert "alpha-local" in result.stdout
135
138
  assert "/alpha" in result.stdout
136
139
  assert "/beta" in result.stdout
@@ -22,6 +22,8 @@ def mock_config(tmp_path, monkeypatch):
22
22
  from basic_memory import config as config_module
23
23
 
24
24
  config_module._CONFIG_CACHE = None
25
+ config_module._CONFIG_MTIME = None
26
+ config_module._CONFIG_SIZE = None
25
27
 
26
28
  config_dir = tmp_path / ".basic-memory"
27
29
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -68,6 +70,8 @@ class TestSetCloud:
68
70
  from basic_memory import config as config_module
69
71
 
70
72
  config_module._CONFIG_CACHE = None
73
+ config_module._CONFIG_MTIME = None
74
+ config_module._CONFIG_SIZE = None
71
75
 
72
76
  config_dir = tmp_path / ".basic-memory"
73
77
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -91,6 +95,8 @@ class TestSetCloud:
91
95
  from basic_memory import config as config_module
92
96
 
93
97
  config_module._CONFIG_CACHE = None
98
+ config_module._CONFIG_MTIME = None
99
+ config_module._CONFIG_SIZE = None
94
100
 
95
101
  config_dir = tmp_path / ".basic-memory"
96
102
  config_dir.mkdir(parents=True, exist_ok=True)
@@ -161,11 +167,15 @@ class TestSetLocal:
161
167
 
162
168
  # Manually set workspace_id on the project
163
169
  config_module._CONFIG_CACHE = None
170
+ config_module._CONFIG_MTIME = None
171
+ config_module._CONFIG_SIZE = None
164
172
  config_data = json.loads(mock_config.read_text())
165
173
  config_data["projects"]["research"]["mode"] = "cloud"
166
174
  config_data["projects"]["research"]["workspace_id"] = "11111111-1111-1111-1111-111111111111"
167
175
  mock_config.write_text(json.dumps(config_data, indent=2))
168
176
  config_module._CONFIG_CACHE = None
177
+ config_module._CONFIG_MTIME = None
178
+ config_module._CONFIG_SIZE = None
169
179
 
170
180
  # Set back to local
171
181
  result = runner.invoke(app, ["project", "set-local", "research"])
@@ -173,6 +183,8 @@ class TestSetLocal:
173
183
 
174
184
  # Verify workspace_id was cleared
175
185
  config_module._CONFIG_CACHE = None
186
+ config_module._CONFIG_MTIME = None
187
+ config_module._CONFIG_SIZE = None
176
188
  updated_data = json.loads(mock_config.read_text())
177
189
  assert updated_data["projects"]["research"]["workspace_id"] is None
178
190
  assert updated_data["projects"]["research"]["mode"] == "local"
@@ -187,6 +199,8 @@ class TestSetCloudWithWorkspace:
187
199
  from basic_memory.schemas.cloud import WorkspaceInfo
188
200
 
189
201
  config_module._CONFIG_CACHE = None
202
+ config_module._CONFIG_MTIME = None
203
+ config_module._CONFIG_SIZE = None
190
204
 
191
205
  async def fake_get_available_workspaces():
192
206
  return [
@@ -210,6 +224,8 @@ class TestSetCloudWithWorkspace:
210
224
 
211
225
  # Verify workspace_id was persisted
212
226
  config_module._CONFIG_CACHE = None
227
+ config_module._CONFIG_MTIME = None
228
+ config_module._CONFIG_SIZE = None
213
229
  updated_data = json.loads(mock_config.read_text())
214
230
  assert (
215
231
  updated_data["projects"]["research"]["workspace_id"]
@@ -222,6 +238,8 @@ class TestSetCloudWithWorkspace:
222
238
  from basic_memory.schemas.cloud import WorkspaceInfo
223
239
 
224
240
  config_module._CONFIG_CACHE = None
241
+ config_module._CONFIG_MTIME = None
242
+ config_module._CONFIG_SIZE = None
225
243
 
226
244
  async def fake_get_available_workspaces():
227
245
  return [
@@ -249,17 +267,23 @@ class TestSetCloudWithWorkspace:
249
267
  from basic_memory import config as config_module
250
268
 
251
269
  config_module._CONFIG_CACHE = None
270
+ config_module._CONFIG_MTIME = None
271
+ config_module._CONFIG_SIZE = None
252
272
 
253
273
  # Set default_workspace in config
254
274
  config_data = json.loads(mock_config.read_text())
255
275
  config_data["default_workspace"] = "global-default-tenant-id"
256
276
  mock_config.write_text(json.dumps(config_data, indent=2))
257
277
  config_module._CONFIG_CACHE = None
278
+ config_module._CONFIG_MTIME = None
279
+ config_module._CONFIG_SIZE = None
258
280
 
259
281
  result = runner.invoke(app, ["project", "set-cloud", "research"])
260
282
  assert result.exit_code == 0
261
283
 
262
284
  # Verify workspace_id was set from default
263
285
  config_module._CONFIG_CACHE = None
286
+ config_module._CONFIG_MTIME = None
287
+ config_module._CONFIG_SIZE = None
264
288
  updated_data = json.loads(mock_config.read_text())
265
289
  assert updated_data["projects"]["research"]["workspace_id"] == "global-default-tenant-id"
@@ -76,6 +76,8 @@ class TestWorkspaceSetDefault:
76
76
  monkeypatch.setenv("HOME", str(temp_path))
77
77
  monkeypatch.setenv("BASIC_MEMORY_CONFIG_DIR", str(config_dir))
78
78
  basic_memory.config._CONFIG_CACHE = None
79
+ basic_memory.config._CONFIG_MTIME = None
80
+ basic_memory.config._CONFIG_SIZE = None
79
81
 
80
82
  config_manager = ConfigManager()
81
83
  test_config = BasicMemoryConfig(
@@ -106,6 +108,8 @@ class TestWorkspaceSetDefault:
106
108
 
107
109
  # Verify config was updated
108
110
  basic_memory.config._CONFIG_CACHE = None
111
+ basic_memory.config._CONFIG_MTIME = None
112
+ basic_memory.config._CONFIG_SIZE = None
109
113
  config = ConfigManager().config
110
114
  assert config.default_workspace == "11111111-1111-1111-1111-111111111111"
111
115
 
@@ -138,6 +138,8 @@ def config_manager(app_config: BasicMemoryConfig, config_home: Path, monkeypatch
138
138
  from basic_memory import config as config_module
139
139
 
140
140
  config_module._CONFIG_CACHE = None
141
+ config_module._CONFIG_MTIME = None
142
+ config_module._CONFIG_SIZE = None
141
143
 
142
144
  # Create a new ConfigManager that uses the test home directory
143
145
  config_manager = ConfigManager()
@@ -1257,6 +1257,11 @@ class TestWriteNoteOverwriteGuard:
1257
1257
  # Set config to allow overwrites by default
1258
1258
  app_config.write_note_overwrite_default = True
1259
1259
  config_module._CONFIG_CACHE = app_config
1260
+ # Pin mtime+size to the on-disk file so the cache guard sees a match
1261
+ # and keeps our injected config instead of re-reading from disk.
1262
+ _st = config_manager.config_file.stat()
1263
+ config_module._CONFIG_MTIME = _st.st_mtime
1264
+ config_module._CONFIG_SIZE = _st.st_size
1260
1265
 
1261
1266
  try:
1262
1267
  await write_note(
@@ -1281,6 +1286,9 @@ class TestWriteNoteOverwriteGuard:
1281
1286
  # Restore config
1282
1287
  app_config.write_note_overwrite_default = False
1283
1288
  config_module._CONFIG_CACHE = app_config
1289
+ _st = config_manager.config_file.stat()
1290
+ config_module._CONFIG_MTIME = _st.st_mtime
1291
+ config_module._CONFIG_SIZE = _st.st_size
1284
1292
 
1285
1293
  @pytest.mark.asyncio
1286
1294
  async def test_write_note_new_note_unaffected(self, app, test_project):
@@ -778,6 +778,8 @@ async def test_add_project_with_project_root_sanitizes_paths(
778
778
  from basic_memory import config as config_module
779
779
 
780
780
  config_module._CONFIG_CACHE = None
781
+ config_module._CONFIG_MTIME = None
782
+ config_module._CONFIG_SIZE = None
781
783
 
782
784
  test_cases = [
783
785
  # (project_name, user_path, expected_sanitized_name)
@@ -845,6 +847,8 @@ async def test_add_project_with_project_root_rejects_escape_attempts(
845
847
  from basic_memory import config as config_module
846
848
 
847
849
  config_module._CONFIG_CACHE = None
850
+ config_module._CONFIG_MTIME = None
851
+ config_module._CONFIG_SIZE = None
848
852
 
849
853
  # All of these should succeed by being sanitized to paths under project_root
850
854
  # The sanitization removes dangerous patterns, so they don't escape
@@ -931,6 +935,8 @@ async def test_add_project_with_project_root_normalizes_case(
931
935
  from basic_memory import config as config_module
932
936
 
933
937
  config_module._CONFIG_CACHE = None
938
+ config_module._CONFIG_MTIME = None
939
+ config_module._CONFIG_SIZE = None
934
940
 
935
941
  test_cases = [
936
942
  # (input_path, expected_normalized_path)
@@ -985,6 +991,8 @@ async def test_add_project_with_project_root_detects_case_collisions(
985
991
  from basic_memory import config as config_module
986
992
 
987
993
  config_module._CONFIG_CACHE = None
994
+ config_module._CONFIG_MTIME = None
995
+ config_module._CONFIG_SIZE = None
988
996
 
989
997
  # First, create a project with lowercase path
990
998
  first_project = "documents-project"
@@ -1159,6 +1167,8 @@ async def test_add_project_nested_validation_with_project_root(
1159
1167
  from basic_memory import config as config_module
1160
1168
 
1161
1169
  config_module._CONFIG_CACHE = None
1170
+ config_module._CONFIG_MTIME = None
1171
+ config_module._CONFIG_SIZE = None
1162
1172
 
1163
1173
  parent_project_name = f"cloud-parent-{os.urandom(4).hex()}"
1164
1174
  child_project_name = f"cloud-child-{os.urandom(4).hex()}"