basic-memory 0.13.0b4__tar.gz → 0.13.0b5__tar.gz

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

Potentially problematic release.


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

Files changed (325) hide show
  1. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/commands.md +3 -3
  2. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/release/beta.md +3 -3
  3. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/release/release-check.md +3 -3
  4. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/release/release.md +1 -1
  5. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/test-live.md +14 -1
  6. basic_memory-0.13.0b5/.github/workflows/claude.yml +114 -0
  7. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/workflows/test.yml +6 -2
  8. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.gitignore +2 -2
  9. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CLAUDE.md +8 -8
  10. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CONTRIBUTING.md +10 -8
  11. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/PKG-INFO +2 -2
  12. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/RELEASE_NOTES_v0.13.0.md +3 -0
  13. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/AI Assistant Guide.md +18 -2
  14. basic_memory-0.13.0b5/justfile +63 -0
  15. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/pyproject.toml +4 -8
  16. basic_memory-0.13.0b5/src/basic_memory/__init__.py +3 -0
  17. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/knowledge_router.py +13 -0
  18. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/memory_router.py +3 -4
  19. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/project_router.py +6 -5
  20. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/prompt_router.py +2 -2
  21. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/project.py +2 -2
  22. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/status.py +1 -1
  23. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/sync.py +1 -1
  24. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/__init__.py +2 -0
  25. basic_memory-0.13.0b5/src/basic_memory/mcp/prompts/sync_status.py +116 -0
  26. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/server.py +6 -6
  27. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/__init__.py +4 -0
  28. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/build_context.py +32 -7
  29. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/canvas.py +2 -1
  30. basic_memory-0.13.0b5/src/basic_memory/mcp/tools/delete_note.py +191 -0
  31. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/edit_note.py +17 -11
  32. basic_memory-0.13.0b5/src/basic_memory/mcp/tools/move_note.py +299 -0
  33. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/project_management.py +35 -3
  34. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/read_note.py +9 -2
  35. basic_memory-0.13.0b5/src/basic_memory/mcp/tools/search.py +294 -0
  36. basic_memory-0.13.0b5/src/basic_memory/mcp/tools/sync_status.py +254 -0
  37. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/utils.py +47 -0
  38. basic_memory-0.13.0b5/src/basic_memory/mcp/tools/view_note.py +66 -0
  39. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/write_note.py +13 -2
  40. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/search_repository.py +99 -26
  41. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/base.py +33 -5
  42. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/memory.py +58 -1
  43. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/entity_service.py +4 -4
  44. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/initialization.py +32 -5
  45. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/link_resolver.py +20 -5
  46. basic_memory-0.13.0b5/src/basic_memory/services/migration_service.py +168 -0
  47. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/project_service.py +97 -47
  48. basic_memory-0.13.0b5/src/basic_memory/services/sync_status_service.py +181 -0
  49. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/sync/sync_service.py +55 -2
  50. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/static/ai_assistant_guide.md +182 -122
  51. basic_memory-0.13.0b5/test-int/mcp/test_build_context_validation.py +172 -0
  52. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_delete_note_integration.py +0 -1
  53. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_edit_note_integration.py +1 -2
  54. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_move_note_integration.py +36 -42
  55. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_knowledge_router.py +82 -0
  56. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/conftest.py +2 -2
  57. basic_memory-0.13.0b5/tests/cli/test_project_info.py +116 -0
  58. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_status.py +27 -18
  59. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_sync.py +40 -5
  60. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/conftest.py +2 -1
  61. basic_memory-0.13.0b5/tests/mcp/test_tool_delete_note.py +94 -0
  62. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_move_note.py +131 -86
  63. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_search.py +90 -1
  64. basic_memory-0.13.0b5/tests/mcp/test_tool_sync_status.py +170 -0
  65. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_utils.py +89 -3
  66. basic_memory-0.13.0b5/tests/mcp/test_tool_view_note.py +302 -0
  67. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_search_repository.py +182 -0
  68. basic_memory-0.13.0b5/tests/schemas/test_memory_url_validation.py +272 -0
  69. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/schemas/test_schemas.py +149 -1
  70. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_initialization.py +22 -16
  71. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_link_resolver.py +136 -0
  72. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_project_service.py +6 -6
  73. basic_memory-0.13.0b5/tests/services/test_sync_status_service.py +213 -0
  74. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/sync/test_sync_service.py +1 -0
  75. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/uv.lock +97 -273
  76. basic_memory-0.13.0b4/.github/workflows/claude.yml +0 -81
  77. basic_memory-0.13.0b4/Makefile +0 -59
  78. basic_memory-0.13.0b4/src/basic_memory/__init__.py +0 -9
  79. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/delete_note.py +0 -36
  80. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/move_note.py +0 -87
  81. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/search.py +0 -122
  82. basic_memory-0.13.0b4/test-int/mcp/.coverage.Pauls-MacBook-Pro-2.local.66900.XDhpuELx +0 -0
  83. basic_memory-0.13.0b4/tests/.coverage.Pauls-MacBook-Pro-2.local.28077.XqMfGOxx +0 -0
  84. basic_memory-0.13.0b4/tests/api/.coverage.Pauls-MacBook-Pro-2.local.60974.XPpBfqqx +0 -0
  85. basic_memory-0.13.0b4/tests/cli/.coverage.Pauls-MacBook-Pro-2.local.63666.XDIUQNrx +0 -0
  86. basic_memory-0.13.0b4/tests/cli/test_project_info.py +0 -38
  87. basic_memory-0.13.0b4/tests/mcp/.coverage.Pauls-MacBook-Pro-2.local.63904.XiAZuuhx +0 -0
  88. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/check-health.md +0 -0
  89. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/lint-fix.md +0 -0
  90. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/release/changelog.md +0 -0
  91. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.claude/commands/test-coverage.md +0 -0
  92. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.env.oauth.example +0 -0
  93. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  94. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  95. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  96. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  97. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/dependabot.yml +0 -0
  98. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/workflows/dev-release.yml +0 -0
  99. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/workflows/pr-title.yml +0 -0
  100. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.github/workflows/release.yml +0 -0
  101. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.mcp.json +0 -0
  102. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/.python-version +0 -0
  103. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/AUTH.md +0 -0
  104. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CHANGELOG.md +0 -0
  105. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CITATION.cff +0 -0
  106. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CLA.md +0 -0
  107. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/CODE_OF_CONDUCT.md +0 -0
  108. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/Dockerfile +0 -0
  109. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/LICENSE +0 -0
  110. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/README.md +0 -0
  111. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/SECURITY.md +0 -0
  112. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/TESTING.md +0 -0
  113. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/basic-memory.md +0 -0
  114. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/CLI Reference.md +0 -0
  115. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Canvas.md +0 -0
  116. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Claude.ai Integration.md +0 -0
  117. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Getting Started with Basic Memory.md +0 -0
  118. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Knowledge Format.md +0 -0
  119. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/OAuth Authentication Guide.md +0 -0
  120. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Obsidian Integration.md +0 -0
  121. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Supabase OAuth Setup.md +0 -0
  122. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Technical Information.md +0 -0
  123. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/User Guide.md +0 -0
  124. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/Welcome to Basic memory.md +0 -0
  125. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/Canvas.png +0 -0
  126. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/Claude-Obsidian-Demo.mp4 +0 -0
  127. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/Prompt.png +0 -0
  128. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/disk-ai-logo-400x400.png +0 -0
  129. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/disk-ai-logo.png +0 -0
  130. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/prompt 1.png +0 -0
  131. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/prompt2.png +0 -0
  132. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/prompt3.png +0 -0
  133. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/attachments/prompt4.png +0 -0
  134. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/docs/publish.js +0 -0
  135. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Brewing Equipment.md +0 -0
  136. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Coffee Bean Origins.md +0 -0
  137. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Coffee Brewing Methods.md +0 -0
  138. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Coffee Flavor Map.md +0 -0
  139. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Coffee Knowledge Base.md +0 -0
  140. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Flavor Extraction.md +0 -0
  141. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Perfect Pour Over Coffee Method.canvas +0 -0
  142. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/Coffee Notes/Tasting Notes.md +0 -0
  143. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/examples/testing/Test Note Creation - Basic Functionality.md +0 -0
  144. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/llms-install.md +0 -0
  145. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/memory.json +0 -0
  146. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/scripts/install.sh +0 -0
  147. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/smithery.yaml +0 -0
  148. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/alembic.ini +0 -0
  149. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/env.py +0 -0
  150. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/migrations.py +0 -0
  151. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/script.py.mako +0 -0
  152. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  153. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  154. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  155. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  156. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  157. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  158. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/__init__.py +0 -0
  159. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/app.py +0 -0
  160. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/__init__.py +0 -0
  161. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/directory_router.py +0 -0
  162. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/importer_router.py +0 -0
  163. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/management_router.py +0 -0
  164. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/resource_router.py +0 -0
  165. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/search_router.py +0 -0
  166. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/routers/utils.py +0 -0
  167. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/api/template_loader.py +0 -0
  168. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/__init__.py +0 -0
  169. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/app.py +0 -0
  170. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/__init__.py +0 -0
  171. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/auth.py +0 -0
  172. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/db.py +0 -0
  173. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  174. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  175. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  176. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  177. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/mcp.py +0 -0
  178. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/commands/tool.py +0 -0
  179. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/cli/main.py +0 -0
  180. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/config.py +0 -0
  181. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/db.py +0 -0
  182. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/deps.py +0 -0
  183. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/file_utils.py +0 -0
  184. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/__init__.py +0 -0
  185. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/base.py +0 -0
  186. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  187. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  188. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  189. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/memory_json_importer.py +0 -0
  190. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/importers/utils.py +0 -0
  191. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/__init__.py +0 -0
  192. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/entity_parser.py +0 -0
  193. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/markdown_processor.py +0 -0
  194. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/plugins.py +0 -0
  195. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/schemas.py +0 -0
  196. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/markdown/utils.py +0 -0
  197. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/__init__.py +0 -0
  198. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/async_client.py +0 -0
  199. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/auth_provider.py +0 -0
  200. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/external_auth_provider.py +0 -0
  201. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/project_session.py +0 -0
  202. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  203. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  204. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  205. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/search.py +0 -0
  206. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/prompts/utils.py +0 -0
  207. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  208. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/resources/project_info.py +0 -0
  209. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
  210. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  211. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/read_content.py +0 -0
  212. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  213. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/models/__init__.py +0 -0
  214. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/models/base.py +0 -0
  215. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/models/knowledge.py +0 -0
  216. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/models/project.py +0 -0
  217. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/models/search.py +0 -0
  218. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/__init__.py +0 -0
  219. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/entity_repository.py +0 -0
  220. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/observation_repository.py +0 -0
  221. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/project_info_repository.py +0 -0
  222. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/project_repository.py +0 -0
  223. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/relation_repository.py +0 -0
  224. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/repository/repository.py +0 -0
  225. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/__init__.py +0 -0
  226. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/delete.py +0 -0
  227. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/directory.py +0 -0
  228. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/importer.py +0 -0
  229. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/project_info.py +0 -0
  230. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/prompt.py +0 -0
  231. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/request.py +0 -0
  232. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/response.py +0 -0
  233. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/schemas/search.py +0 -0
  234. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/__init__.py +0 -0
  235. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/context_service.py +0 -0
  236. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/directory_service.py +0 -0
  237. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/exceptions.py +0 -0
  238. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/file_service.py +0 -0
  239. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/search_service.py +0 -0
  240. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/services/service.py +0 -0
  241. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/sync/__init__.py +0 -0
  242. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/sync/background_sync.py +0 -0
  243. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/sync/watch_service.py +0 -0
  244. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  245. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/templates/prompts/search.hbs +0 -0
  246. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/src/basic_memory/utils.py +0 -0
  247. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/static/json_canvas_spec_1_0.md +0 -0
  248. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/conftest.py +0 -0
  249. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_list_directory_integration.py +0 -0
  250. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_project_management_integration.py +0 -0
  251. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_read_content_integration.py +0 -0
  252. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_read_note_integration.py +0 -0
  253. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_search_integration.py +0 -0
  254. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/test-int/mcp/test_write_note_integration.py +0 -0
  255. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/Non-MarkdownFileSupport.pdf +0 -0
  256. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/Screenshot.png +0 -0
  257. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/__init__.py +0 -0
  258. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/conftest.py +0 -0
  259. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_continue_conversation_template.py +0 -0
  260. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_directory_router.py +0 -0
  261. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_importer_router.py +0 -0
  262. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_management_router.py +0 -0
  263. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_memory_router.py +0 -0
  264. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_project_router.py +0 -0
  265. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_project_router_operations.py +0 -0
  266. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_prompt_router.py +0 -0
  267. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_resource_router.py +0 -0
  268. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_search_router.py +0 -0
  269. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_search_template.py +0 -0
  270. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_template_loader.py +0 -0
  271. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/api/test_template_loader_helpers.py +0 -0
  272. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_auth_commands.py +0 -0
  273. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_cli_tools.py +0 -0
  274. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_import_chatgpt.py +0 -0
  275. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_import_claude_conversations.py +0 -0
  276. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_import_claude_projects.py +0 -0
  277. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_import_memory_json.py +0 -0
  278. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_project_commands.py +0 -0
  279. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/cli/test_version.py +0 -0
  280. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/conftest.py +0 -0
  281. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/importers/test_importer_base.py +0 -0
  282. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/importers/test_importer_utils.py +0 -0
  283. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/__init__.py +0 -0
  284. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_entity_parser.py +0 -0
  285. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_markdown_plugins.py +0 -0
  286. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_markdown_processor.py +0 -0
  287. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_observation_edge_cases.py +0 -0
  288. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_parser_edge_cases.py +0 -0
  289. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_relation_edge_cases.py +0 -0
  290. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/markdown/test_task_detection.py +0 -0
  291. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_auth_provider.py +0 -0
  292. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_prompts.py +0 -0
  293. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_resource_project_info.py +0 -0
  294. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_resources.py +0 -0
  295. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_server.py +0 -0
  296. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_build_context.py +0 -0
  297. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_canvas.py +0 -0
  298. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_edit_note.py +0 -0
  299. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_list_directory.py +0 -0
  300. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_read_note.py +0 -0
  301. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_recent_activity.py +0 -0
  302. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_resource.py +0 -0
  303. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/mcp/test_tool_write_note.py +0 -0
  304. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_entity_repository.py +0 -0
  305. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_observation_repository.py +0 -0
  306. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_project_info_repository.py +0 -0
  307. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_project_repository.py +0 -0
  308. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_relation_repository.py +0 -0
  309. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/repository/test_repository.py +0 -0
  310. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/schemas/test_memory_url.py +0 -0
  311. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/schemas/test_search.py +0 -0
  312. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_context_service.py +0 -0
  313. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_directory_service.py +0 -0
  314. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_entity_service.py +0 -0
  315. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_file_service.py +0 -0
  316. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_project_service_operations.py +0 -0
  317. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/services/test_search_service.py +0 -0
  318. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/sync/test_sync_wikilink_issue.py +0 -0
  319. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/sync/test_tmp_files.py +0 -0
  320. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/sync/test_watch_service.py +0 -0
  321. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/sync/test_watch_service_edge_cases.py +0 -0
  322. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/utils/test_file_utils.py +0 -0
  323. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/utils/test_parse_tags.py +0 -0
  324. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/utils/test_permalink_formatting.py +0 -0
  325. {basic_memory-0.13.0b4 → basic_memory-0.13.0b5}/tests/utils/test_utf8_handling.py +0 -0
@@ -54,9 +54,9 @@ Each command is implemented as a Markdown file containing structured prompts tha
54
54
  ## Tooling Integration
55
55
 
56
56
  Commands leverage existing project tooling:
57
- - `make check` - Quality checks
58
- - `make test` - Test suite
59
- - `make update-deps` - Dependency updates
57
+ - `just check` - Quality checks
58
+ - `just test` - Test suite
59
+ - `just update-deps` - Dependency updates
60
60
  - `uv` - Package management
61
61
  - `git` - Version control
62
62
  - GitHub Actions - CI/CD pipeline
@@ -20,9 +20,9 @@ You are an expert release manager for the Basic Memory project. When the user ru
20
20
  3. Get the latest beta tag to determine next version if not provided
21
21
 
22
22
  ### Step 2: Quality Assurance
23
- 1. Run `make check` to ensure code quality
23
+ 1. Run `just check` to ensure code quality
24
24
  2. If any checks fail, report issues and stop
25
- 3. Run `make update-deps` to ensure latest dependencies
25
+ 3. Run `just update-deps` to ensure latest dependencies
26
26
  4. Commit any dependency updates with proper message
27
27
 
28
28
  ### Step 3: Version Determination
@@ -62,7 +62,7 @@ Monitor release: https://github.com/basicmachines-co/basic-memory/actions
62
62
  ```
63
63
 
64
64
  ## Context
65
- - Use the existing Makefile targets (`make check`, `make update-deps`)
65
+ - Use the existing justfile targets (`just check`, `just update-deps`)
66
66
  - Follow semantic versioning for beta releases
67
67
  - Maintain release notes in CHANGELOG.md
68
68
  - Use conventional commit messages
@@ -28,7 +28,7 @@ You are an expert QA engineer for the Basic Memory project. When the user runs `
28
28
  ### Step 2: Code Quality Gates
29
29
  1. **Test Suite Validation**
30
30
  ```bash
31
- make test
31
+ just test
32
32
  ```
33
33
  - All tests must pass
34
34
  - Check test coverage (target: 95%+)
@@ -36,8 +36,8 @@ You are an expert QA engineer for the Basic Memory project. When the user runs `
36
36
 
37
37
  2. **Code Quality Checks**
38
38
  ```bash
39
- make lint
40
- make type-check
39
+ just lint
40
+ just type-check
41
41
  ```
42
42
  - No linting errors
43
43
  - No type checking errors
@@ -21,7 +21,7 @@ You are an expert release manager for the Basic Memory project. When the user ru
21
21
  4. Confirm no existing tag with this version
22
22
 
23
23
  ### Step 2: Comprehensive Quality Checks
24
- 1. Run `make check` (lint, format, type-check, full test suite)
24
+ 1. Run `just check` (lint, format, type-check, full test suite)
25
25
  2. Verify test coverage meets minimum requirements (95%+)
26
26
  3. Check that CHANGELOG.md contains entry for this version
27
27
  4. Validate all high-priority issues are closed
@@ -12,7 +12,8 @@ Execute comprehensive real-world testing of Basic Memory using the installed ver
12
12
 
13
13
  ## Implementation
14
14
 
15
- You are an expert QA engineer conducting live testing of Basic Memory. When the user runs `/project:test-live`, execute comprehensive testing following the TESTING.md methodology:
15
+ You are an expert QA engineer conducting live testing of Basic Memory.
16
+ When the user runs `/project:test-live`, execute comprehensive testing following the TESTING.md methodology:
16
17
 
17
18
  ### Pre-Test Setup
18
19
 
@@ -22,12 +23,17 @@ You are an expert QA engineer conducting live testing of Basic Memory. When the
22
23
  - Test MCP connection and tool availability
23
24
 
24
25
  2. **Test Project Creation**
26
+
27
+ Run the bash `date` command to get the current date/time.
28
+
25
29
  ```
26
30
  Create project: "basic-memory-testing-[timestamp]"
27
31
  Location: ~/basic-memory-testing-[timestamp]
28
32
  Purpose: Record all test observations and results
29
33
  ```
30
34
 
35
+ Make sure to switch to the newly created project with the `switch_project()` tool.
36
+
31
37
  3. **Baseline Documentation**
32
38
  Create initial test session note with:
33
39
  - Test environment details
@@ -52,6 +58,13 @@ Test all fundamental MCP tools systematically:
52
58
  - Notes with complex formatting
53
59
  - Performance with large notes
54
60
 
61
+ **view_note Tests:**
62
+ - View notes as formatted artifacts (Claude Desktop)
63
+ - Title extraction from frontmatter and headings
64
+ - Unicode and emoji content in artifacts
65
+ - Error handling for non-existent notes
66
+ - Artifact display quality and readability
67
+
55
68
  **search_notes Tests:**
56
69
  - Simple text queries
57
70
  - Tag-based searches
@@ -0,0 +1,114 @@
1
+ name: Claude Code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_review_comment:
7
+ types: [created]
8
+ issues:
9
+ types: [opened, assigned]
10
+ pull_request_review:
11
+ types: [submitted]
12
+
13
+ jobs:
14
+ claude:
15
+ if: |
16
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
+
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+ pull-requests: read
25
+ issues: read
26
+ id-token: write
27
+ steps:
28
+ - name: Check user permissions
29
+ id: check_membership
30
+ uses: actions/github-script@v7
31
+ with:
32
+ script: |
33
+ let actor;
34
+ if (context.eventName === 'issue_comment') {
35
+ actor = context.payload.comment.user.login;
36
+ } else if (context.eventName === 'pull_request_review_comment') {
37
+ actor = context.payload.comment.user.login;
38
+ } else if (context.eventName === 'pull_request_review') {
39
+ actor = context.payload.review.user.login;
40
+ } else if (context.eventName === 'issues') {
41
+ actor = context.payload.issue.user.login;
42
+ }
43
+
44
+ console.log(`Checking permissions for user: ${actor}`);
45
+
46
+ // List of explicitly allowed users (organization members)
47
+ const allowedUsers = [
48
+ 'phernandez',
49
+ 'groksrc',
50
+ 'nellins',
51
+ 'bm-claudeai'
52
+ ];
53
+
54
+ if (allowedUsers.includes(actor)) {
55
+ console.log(`User ${actor} is in the allowed list`);
56
+ core.setOutput('is_member', true);
57
+ return;
58
+ }
59
+
60
+ // Fallback: Check if user has repository permissions
61
+ try {
62
+ const collaboration = await github.rest.repos.getCollaboratorPermissionLevel({
63
+ owner: context.repo.owner,
64
+ repo: context.repo.repo,
65
+ username: actor
66
+ });
67
+
68
+ const permission = collaboration.data.permission;
69
+ console.log(`User ${actor} has permission level: ${permission}`);
70
+
71
+ // Allow if user has push access or higher (write, maintain, admin)
72
+ const allowed = ['write', 'maintain', 'admin'].includes(permission);
73
+
74
+ core.setOutput('is_member', allowed);
75
+
76
+ if (!allowed) {
77
+ core.notice(`User ${actor} does not have sufficient repository permissions (has: ${permission})`);
78
+ }
79
+ } catch (error) {
80
+ console.log(`Error checking permissions: ${error.message}`);
81
+
82
+ // Final fallback: Check if user is a public member of the organization
83
+ try {
84
+ const membership = await github.rest.orgs.getMembershipForUser({
85
+ org: 'basicmachines-co',
86
+ username: actor
87
+ });
88
+
89
+ const allowed = membership.data.state === 'active';
90
+ core.setOutput('is_member', allowed);
91
+
92
+ if (!allowed) {
93
+ core.notice(`User ${actor} is not a public member of basicmachines-co organization`);
94
+ }
95
+ } catch (membershipError) {
96
+ console.log(`Error checking organization membership: ${membershipError.message}`);
97
+ core.setOutput('is_member', false);
98
+ core.notice(`User ${actor} does not have access to this repository`);
99
+ }
100
+ }
101
+
102
+ - name: Checkout repository
103
+ if: steps.check_membership.outputs.is_member == 'true'
104
+ uses: actions/checkout@v4
105
+ with:
106
+ fetch-depth: 1
107
+
108
+ - name: Run Claude Code
109
+ if: steps.check_membership.outputs.is_member == 'true'
110
+ id: claude
111
+ uses: anthropics/claude-code-action@beta
112
+ with:
113
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
114
+ allowed_tools: Bash(uv run pytest),Bash(uv run ruff check . --fix),Bash(uv run ruff format .),Bash(uv run pyright),Bash(just test),Bash(just lint),Bash(just format),Bash(just type-check),Bash(just check),Read,Write,Edit,MultiEdit,Glob,Grep,LS
@@ -35,6 +35,10 @@ jobs:
35
35
  run: |
36
36
  pip install uv
37
37
 
38
+ - name: Install just
39
+ run: |
40
+ curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
41
+
38
42
  - name: Create virtual env
39
43
  run: |
40
44
  uv venv
@@ -45,9 +49,9 @@ jobs:
45
49
 
46
50
  - name: Run type checks
47
51
  run: |
48
- uv run make type-check
52
+ just type-check
49
53
 
50
54
  - name: Run tests
51
55
  run: |
52
56
  uv pip install pytest pytest-cov
53
- uv run make test
57
+ just test
@@ -42,7 +42,7 @@ ENV/
42
42
 
43
43
  # macOS
44
44
  .DS_Store
45
- /.coverage.*
45
+ .coverage.*
46
46
 
47
47
  # obsidian docs:
48
48
  /docs/.obsidian/
@@ -52,4 +52,4 @@ ENV/
52
52
 
53
53
  # claude action
54
54
  claude-output
55
- **/.claude/settings.local.json
55
+ **/.claude/settings.local.json
@@ -14,15 +14,15 @@ See the [README.md](README.md) file for a project overview.
14
14
 
15
15
  ### Build and Test Commands
16
16
 
17
- - Install: `make install` or `pip install -e ".[dev]"`
18
- - Run tests: `uv run pytest -p pytest_mock -v` or `make test`
17
+ - Install: `just install` or `pip install -e ".[dev]"`
18
+ - Run tests: `uv run pytest -p pytest_mock -v` or `just test`
19
19
  - Single test: `pytest tests/path/to/test_file.py::test_function_name`
20
- - Lint: `make lint` or `ruff check . --fix`
21
- - Type check: `make type-check` or `uv run pyright`
22
- - Format: `make format` or `uv run ruff format .`
23
- - Run all code checks: `make check` (runs lint, format, type-check, test)
24
- - Create db migration: `make migration m="Your migration message"`
25
- - Run development MCP Inspector: `make run-inspector`
20
+ - Lint: `just lint` or `ruff check . --fix`
21
+ - Type check: `just type-check` or `uv run pyright`
22
+ - Format: `just format` or `uv run ruff format .`
23
+ - Run all code checks: `just check` (runs lint, format, type-check, test)
24
+ - Create db migration: `just migration "Your migration message"`
25
+ - Run development MCP Inspector: `just run-inspector`
26
26
 
27
27
  ### Code Style Guidelines
28
28
 
@@ -15,8 +15,8 @@ project and how to get started as a developer.
15
15
 
16
16
  2. **Install Dependencies**:
17
17
  ```bash
18
- # Using make (recommended)
19
- make install
18
+ # Using just (recommended)
19
+ just install
20
20
 
21
21
  # Or using uv
22
22
  uv install -e ".[dev]"
@@ -25,10 +25,12 @@ project and how to get started as a developer.
25
25
  pip install -e ".[dev]"
26
26
  ```
27
27
 
28
+ > **Note**: Basic Memory uses [just](https://just.systems) as a modern command runner. Install with `brew install just` or `cargo install just`.
29
+
28
30
  3. **Run the Tests**:
29
31
  ```bash
30
32
  # Run all tests
31
- make test
33
+ just test
32
34
  # or
33
35
  uv run pytest -p pytest_mock -v
34
36
 
@@ -49,16 +51,16 @@ project and how to get started as a developer.
49
51
  4. **Check Code Quality**:
50
52
  ```bash
51
53
  # Run all checks at once
52
- make check
54
+ just check
53
55
 
54
56
  # Or run individual checks
55
- make lint # Run linting
56
- make format # Format code
57
- make type-check # Type checking
57
+ just lint # Run linting
58
+ just format # Format code
59
+ just type-check # Type checking
58
60
  ```
59
61
  5. **Test Your Changes**: Ensure all tests pass locally and maintain 100% test coverage.
60
62
  ```bash
61
- make test
63
+ just test
62
64
  ```
63
65
  6. **Submit a PR**: Submit a pull request with a detailed description of your changes.
64
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.13.0b4
3
+ Version: 0.13.0b5
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
@@ -25,10 +25,10 @@ Requires-Dist: pydantic-settings>=2.6.1
25
25
  Requires-Dist: pydantic[email,timezone]>=2.10.3
26
26
  Requires-Dist: pyjwt>=2.10.1
27
27
  Requires-Dist: pyright>=1.1.390
28
+ Requires-Dist: pytest-aio>=1.9.0
28
29
  Requires-Dist: python-dotenv>=1.1.0
29
30
  Requires-Dist: python-frontmatter>=1.1.0
30
31
  Requires-Dist: pyyaml>=6.0.1
31
- Requires-Dist: qasync>=0.27.1
32
32
  Requires-Dist: rich>=13.9.4
33
33
  Requires-Dist: sqlalchemy>=2.0.0
34
34
  Requires-Dist: typer>=0.9.0
@@ -8,6 +8,7 @@ Basic Memory v0.13.0 is a **major release** that transforms Basic Memory into a
8
8
  - 🎯 **Switch between projects instantly** during conversations with Claude
9
9
  - ✏️ **Edit notes incrementally** without rewriting entire documents
10
10
  - 📁 **Move and organize notes** with full database consistency
11
+ - 📖 **View notes as formatted artifacts** for better readability in Claude Desktop
11
12
  - 🔍 **Search frontmatter tags** to discover content more easily
12
13
  - 🔐 **OAuth authentication** for secure remote access
13
14
  - ⚡ **Development builds** automatically published for beta testing
@@ -133,10 +134,12 @@ Now searchable by: "coffee", "brewing", "equipment", or "Coffee Brewing Methods"
133
134
  - **`switch_project(project_name)`** - Change active project context during conversations
134
135
  - **`get_current_project()`** - Show currently active project with statistics
135
136
  - **`set_default_project(project_name)`** - Update default project configuration
137
+ - **`sync_status()`** - Check file synchronization status and background operations
136
138
 
137
139
  ### New Note Operations Tools
138
140
  - **`edit_note()`** - Incremental note editing (append, prepend, find/replace, section replace)
139
141
  - **`move_note()`** - Move notes with database consistency and search reindexing
142
+ - **`view_note()`** - Display notes as formatted artifacts for better readability in Claude Desktop
140
143
 
141
144
  ### Enhanced Existing Tools
142
145
  All existing tools now support:
@@ -80,19 +80,21 @@ read_note("memory://specs/search") # By memory URL
80
80
  **Incremental editing** (v0.13.0):
81
81
  ```
82
82
  edit_note(
83
- identifier="Search Design",
83
+ identifier="Search Design", # Must be EXACT title/permalink (strict matching)
84
84
  operation="append", # append, prepend, find_replace, replace_section
85
85
  content="\n## New Section\nContent here..."
86
86
  )
87
87
  ```
88
+ **⚠️ Important:** `edit_note` requires exact identifiers (no fuzzy matching). Use `search_notes()` first if uncertain.
88
89
 
89
90
  **File organization** (v0.13.0):
90
91
  ```
91
92
  move_note(
92
- identifier="Old Note",
93
+ identifier="Old Note", # Must be EXACT title/permalink (strict matching)
93
94
  destination="archive/old-note.md" # Folders created automatically
94
95
  )
95
96
  ```
97
+ **⚠️ Important:** `move_note` requires exact identifiers (no fuzzy matching). Use `search_notes()` first if uncertain.
96
98
 
97
99
  ### Project Management (v0.13.0)
98
100
 
@@ -364,6 +366,20 @@ When creating relations:
364
366
  - If information seems outdated, suggest `basic-memory sync`
365
367
  - Use `recent_activity()` to check if content is current
366
368
 
369
+ **Strict Mode for Edit/Move Operations:**
370
+ - `edit_note()` and `move_note()` require **exact identifiers** (no fuzzy matching for safety)
371
+ - If identifier not found: use `search_notes()` first to find the exact title/permalink
372
+ - Error messages will guide you to find correct identifiers
373
+ - Example workflow:
374
+ ```
375
+ # ❌ This might fail if identifier isn't exact
376
+ edit_note("Meeting Note", "append", "content")
377
+
378
+ # ✅ Safe approach: search first, then use exact result
379
+ results = search_notes("meeting")
380
+ edit_note("Meeting Notes 2024", "append", "content") # Use exact title from search
381
+ ```
382
+
367
383
  ## Best Practices
368
384
 
369
385
  1. **Proactively Record Context**
@@ -0,0 +1,63 @@
1
+ # Basic Memory - Modern Command Runner
2
+
3
+ # Install dependencies
4
+ install:
5
+ pip install -e ".[dev]"
6
+
7
+ # Run unit tests in parallel
8
+ test-unit:
9
+ uv run pytest -p pytest_mock -v -n auto
10
+
11
+ # Run integration tests in parallel
12
+ test-int:
13
+ uv run pytest -p pytest_mock -v --no-cov -n auto test-int
14
+
15
+ # Run all tests
16
+ test: test-unit test-int
17
+
18
+ # Lint and fix code
19
+ lint:
20
+ ruff check . --fix
21
+
22
+ # Type check code
23
+ type-check:
24
+ uv run pyright
25
+
26
+ # Clean build artifacts and cache files
27
+ clean:
28
+ find . -type f -name '*.pyc' -delete
29
+ find . -type d -name '__pycache__' -exec rm -r {} +
30
+ rm -rf installer/build/ installer/dist/ dist/
31
+ rm -f rw.*.dmg .coverage.*
32
+
33
+ # Format code with ruff
34
+ format:
35
+ uv run ruff format .
36
+
37
+ # Run MCP inspector tool
38
+ run-inspector:
39
+ npx @modelcontextprotocol/inspector
40
+
41
+ # Build macOS installer
42
+ installer-mac:
43
+ cd installer && chmod +x make_icons.sh && ./make_icons.sh
44
+ cd installer && uv run python setup.py bdist_mac
45
+
46
+ # Build Windows installer
47
+ installer-win:
48
+ cd installer && uv run python setup.py bdist_win32
49
+
50
+ # Update all dependencies to latest versions
51
+ update-deps:
52
+ uv sync --upgrade
53
+
54
+ # Run all code quality checks and tests
55
+ check: lint format type-check test
56
+
57
+ # Generate Alembic migration with descriptive message
58
+ migration message:
59
+ cd src/basic_memory/alembic && alembic revision --autogenerate -m "{{message}}"
60
+
61
+ # List all available recipes
62
+ default:
63
+ @just --list
@@ -28,12 +28,12 @@ dependencies = [
28
28
  "watchfiles>=1.0.4",
29
29
  "fastapi[standard]>=0.115.8",
30
30
  "alembic>=1.14.1",
31
- "qasync>=0.27.1",
32
31
  "pillow>=11.1.0",
33
32
  "pybars3>=0.9.7",
34
33
  "fastmcp>=2.3.4",
35
34
  "pyjwt>=2.10.1",
36
35
  "python-dotenv>=1.1.0",
36
+ "pytest-aio>=1.9.0",
37
37
  ]
38
38
 
39
39
 
@@ -69,14 +69,8 @@ dev-dependencies = [
69
69
  "pytest-cov>=4.1.0",
70
70
  "pytest-mock>=3.12.0",
71
71
  "pytest-asyncio>=0.24.0",
72
+ "pytest-xdist>=3.0.0",
72
73
  "ruff>=0.1.6",
73
- "pytest>=8.3.4",
74
- "pytest-cov>=4.1.0",
75
- "pytest-mock>=3.12.0",
76
- "pytest-asyncio>=0.24.0",
77
- "ruff>=0.1.6",
78
- "cx-freeze>=7.2.10",
79
- "pyqt6>=6.8.1",
80
74
  ]
81
75
 
82
76
  [tool.hatch.version]
@@ -124,6 +118,8 @@ omit = [
124
118
  "*/background_sync.py", # Background processes
125
119
  "*/cli/main.py", # CLI entry point
126
120
  "*/mcp/tools/project_management.py", # Covered by integration tests
121
+ "*/mcp/tools/sync_status.py", # Covered by integration tests
122
+ "*/services/migration_service.py", # Complex migration scenarios
127
123
  ]
128
124
 
129
125
  [tool.logfire]
@@ -0,0 +1,3 @@
1
+ """basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
2
+
3
+ __version__ = "0.13.0b5"
@@ -14,6 +14,7 @@ from basic_memory.deps import (
14
14
  FileServiceDep,
15
15
  ProjectConfigDep,
16
16
  AppConfigDep,
17
+ SyncServiceDep,
17
18
  )
18
19
  from basic_memory.schemas import (
19
20
  EntityListResponse,
@@ -63,6 +64,7 @@ async def create_or_update_entity(
63
64
  entity_service: EntityServiceDep,
64
65
  search_service: SearchServiceDep,
65
66
  file_service: FileServiceDep,
67
+ sync_service: SyncServiceDep,
66
68
  ) -> EntityResponse:
67
69
  """Create or update an entity. If entity exists, it will be updated, otherwise created."""
68
70
  logger.info(
@@ -85,6 +87,17 @@ async def create_or_update_entity(
85
87
 
86
88
  # reindex
87
89
  await search_service.index_entity(entity, background_tasks=background_tasks)
90
+
91
+ # Attempt immediate relation resolution when creating new entities
92
+ # This helps resolve forward references when related entities are created in the same session
93
+ if created:
94
+ try:
95
+ await sync_service.resolve_relations()
96
+ logger.debug(f"Resolved relations after creating entity: {entity.permalink}")
97
+ except Exception as e: # pragma: no cover
98
+ # Don't fail the entire request if relation resolution fails
99
+ logger.warning(f"Failed to resolve relations after entity creation: {e}")
100
+
88
101
  result = EntityResponse.model_validate(entity)
89
102
 
90
103
  logger.info(
@@ -2,12 +2,11 @@
2
2
 
3
3
  from typing import Annotated, Optional
4
4
 
5
- from dateparser import parse
6
5
  from fastapi import APIRouter, Query
7
6
  from loguru import logger
8
7
 
9
8
  from basic_memory.deps import ContextServiceDep, EntityRepositoryDep
10
- from basic_memory.schemas.base import TimeFrame
9
+ from basic_memory.schemas.base import TimeFrame, parse_timeframe
11
10
  from basic_memory.schemas.memory import (
12
11
  GraphContext,
13
12
  normalize_memory_url,
@@ -40,7 +39,7 @@ async def recent(
40
39
  f"Getting recent context: `{types}` depth: `{depth}` timeframe: `{timeframe}` page: `{page}` page_size: `{page_size}` max_related: `{max_related}`"
41
40
  )
42
41
  # Parse timeframe
43
- since = parse(timeframe)
42
+ since = parse_timeframe(timeframe)
44
43
  limit = page_size
45
44
  offset = (page - 1) * page_size
46
45
 
@@ -78,7 +77,7 @@ async def get_memory_context(
78
77
  memory_url = normalize_memory_url(uri)
79
78
 
80
79
  # Parse timeframe
81
- since = parse(timeframe) if timeframe else None
80
+ since = parse_timeframe(timeframe) if timeframe else None
82
81
  limit = page_size
83
82
  offset = (page - 1) * page_size
84
83
 
@@ -3,7 +3,7 @@
3
3
  from fastapi import APIRouter, HTTPException, Path, Body
4
4
  from typing import Optional
5
5
 
6
- from basic_memory.deps import ProjectServiceDep
6
+ from basic_memory.deps import ProjectServiceDep, ProjectPathDep
7
7
  from basic_memory.schemas import ProjectInfoResponse
8
8
  from basic_memory.schemas.project_info import (
9
9
  ProjectList,
@@ -22,9 +22,10 @@ project_resource_router = APIRouter(prefix="/projects", tags=["project_managemen
22
22
  @project_router.get("/info", response_model=ProjectInfoResponse)
23
23
  async def get_project_info(
24
24
  project_service: ProjectServiceDep,
25
+ project: ProjectPathDep,
25
26
  ) -> ProjectInfoResponse:
26
- """Get comprehensive information about the current Basic Memory project."""
27
- return await project_service.get_project_info()
27
+ """Get comprehensive information about the specified Basic Memory project."""
28
+ return await project_service.get_project_info(project)
28
29
 
29
30
 
30
31
  # Update a project
@@ -47,7 +48,7 @@ async def update_project(
47
48
  """
48
49
  try: # pragma: no cover
49
50
  # Get original project info for the response
50
- old_project = ProjectItem(
51
+ old_project_info = ProjectItem(
51
52
  name=project_name,
52
53
  path=project_service.projects.get(project_name, ""),
53
54
  )
@@ -61,7 +62,7 @@ async def update_project(
61
62
  message=f"Project '{project_name}' updated successfully",
62
63
  status="success",
63
64
  default=(project_name == project_service.default_project),
64
- old_project=old_project,
65
+ old_project=old_project_info,
65
66
  new_project=ProjectItem(name=project_name, path=updated_path),
66
67
  )
67
68
  except ValueError as e: # pragma: no cover
@@ -5,12 +5,12 @@ It centralizes all prompt formatting logic that was previously in the MCP prompt
5
5
  """
6
6
 
7
7
  from datetime import datetime, timezone
8
- from dateparser import parse
9
8
  from fastapi import APIRouter, HTTPException, status
10
9
  from loguru import logger
11
10
 
12
11
  from basic_memory.api.routers.utils import to_graph_context, to_search_results
13
12
  from basic_memory.api.template_loader import template_loader
13
+ from basic_memory.schemas.base import parse_timeframe
14
14
  from basic_memory.deps import (
15
15
  ContextServiceDep,
16
16
  EntityRepositoryDep,
@@ -51,7 +51,7 @@ async def continue_conversation(
51
51
  f"Generating continue conversation prompt, topic: {request.topic}, timeframe: {request.timeframe}"
52
52
  )
53
53
 
54
- since = parse(request.timeframe) if request.timeframe else None
54
+ since = parse_timeframe(request.timeframe) if request.timeframe else None
55
55
 
56
56
  # Initialize search results
57
57
  search_results = []