basic-memory 0.13.0b4__tar.gz → 0.13.0b6__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 (327) hide show
  1. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/commands.md +3 -3
  2. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/release/beta.md +3 -3
  3. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/release/release-check.md +3 -3
  4. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/release/release.md +1 -1
  5. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/test-live.md +14 -1
  6. basic_memory-0.13.0b6/.github/workflows/claude.yml +114 -0
  7. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/workflows/release.yml +4 -10
  8. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/workflows/test.yml +6 -2
  9. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.gitignore +2 -2
  10. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CLAUDE.md +8 -8
  11. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CONTRIBUTING.md +10 -8
  12. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/PKG-INFO +2 -2
  13. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/RELEASE_NOTES_v0.13.0.md +4 -0
  14. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/AI Assistant Guide.md +25 -2
  15. basic_memory-0.13.0b6/justfile +63 -0
  16. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/pyproject.toml +4 -8
  17. basic_memory-0.13.0b6/src/basic_memory/__init__.py +4 -0
  18. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/knowledge_router.py +13 -0
  19. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/memory_router.py +3 -4
  20. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/project_router.py +6 -5
  21. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/prompt_router.py +2 -2
  22. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/project.py +3 -3
  23. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/status.py +1 -1
  24. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/sync.py +1 -1
  25. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/tool.py +6 -6
  26. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/__init__.py +2 -0
  27. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/recent_activity.py +1 -1
  28. basic_memory-0.13.0b6/src/basic_memory/mcp/prompts/sync_status.py +116 -0
  29. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/server.py +6 -6
  30. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/__init__.py +4 -0
  31. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/build_context.py +32 -7
  32. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/canvas.py +2 -1
  33. basic_memory-0.13.0b6/src/basic_memory/mcp/tools/delete_note.py +191 -0
  34. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/edit_note.py +17 -11
  35. basic_memory-0.13.0b6/src/basic_memory/mcp/tools/move_note.py +299 -0
  36. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/project_management.py +35 -3
  37. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/read_note.py +11 -4
  38. basic_memory-0.13.0b6/src/basic_memory/mcp/tools/search.py +294 -0
  39. basic_memory-0.13.0b6/src/basic_memory/mcp/tools/sync_status.py +254 -0
  40. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/utils.py +47 -0
  41. basic_memory-0.13.0b6/src/basic_memory/mcp/tools/view_note.py +66 -0
  42. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/write_note.py +13 -2
  43. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/search_repository.py +116 -38
  44. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/base.py +33 -5
  45. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/memory.py +58 -1
  46. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/entity_service.py +18 -5
  47. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/initialization.py +32 -5
  48. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/link_resolver.py +20 -5
  49. basic_memory-0.13.0b6/src/basic_memory/services/migration_service.py +168 -0
  50. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/project_service.py +121 -50
  51. basic_memory-0.13.0b6/src/basic_memory/services/sync_status_service.py +181 -0
  52. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/sync/sync_service.py +91 -13
  53. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/static/ai_assistant_guide.md +189 -122
  54. basic_memory-0.13.0b6/test-int/mcp/test_build_context_validation.py +172 -0
  55. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_delete_note_integration.py +0 -1
  56. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_edit_note_integration.py +1 -2
  57. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_move_note_integration.py +36 -42
  58. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_knowledge_router.py +82 -0
  59. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/conftest.py +2 -2
  60. basic_memory-0.13.0b6/tests/cli/test_project_info.py +116 -0
  61. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_status.py +27 -18
  62. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_sync.py +40 -5
  63. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/conftest.py +2 -1
  64. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_prompts.py +9 -9
  65. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_resource_project_info.py +2 -2
  66. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_resources.py +1 -1
  67. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_build_context.py +7 -7
  68. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_canvas.py +6 -6
  69. basic_memory-0.13.0b6/tests/mcp/test_tool_delete_note.py +94 -0
  70. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_edit_note.py +33 -31
  71. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_list_directory.py +17 -17
  72. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_move_note.py +168 -123
  73. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_read_note.py +17 -17
  74. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_recent_activity.py +10 -10
  75. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_resource.py +10 -10
  76. basic_memory-0.13.0b6/tests/mcp/test_tool_search.py +248 -0
  77. basic_memory-0.13.0b6/tests/mcp/test_tool_sync_status.py +170 -0
  78. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_utils.py +89 -3
  79. basic_memory-0.13.0b6/tests/mcp/test_tool_view_note.py +306 -0
  80. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_tool_write_note.py +21 -21
  81. basic_memory-0.13.0b6/tests/repository/test_search_repository.py +519 -0
  82. basic_memory-0.13.0b6/tests/schemas/test_memory_url_validation.py +272 -0
  83. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/schemas/test_schemas.py +149 -1
  84. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_entity_service.py +113 -0
  85. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_initialization.py +22 -16
  86. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_link_resolver.py +136 -0
  87. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_project_service.py +138 -6
  88. basic_memory-0.13.0b6/tests/services/test_sync_status_service.py +213 -0
  89. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/sync/test_sync_service.py +223 -0
  90. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/uv.lock +97 -273
  91. basic_memory-0.13.0b4/.github/workflows/claude.yml +0 -81
  92. basic_memory-0.13.0b4/Makefile +0 -59
  93. basic_memory-0.13.0b4/TESTING.md +0 -337
  94. basic_memory-0.13.0b4/src/basic_memory/__init__.py +0 -9
  95. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/delete_note.py +0 -36
  96. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/move_note.py +0 -87
  97. basic_memory-0.13.0b4/src/basic_memory/mcp/tools/search.py +0 -122
  98. basic_memory-0.13.0b4/test-int/mcp/.coverage.Pauls-MacBook-Pro-2.local.66900.XDhpuELx +0 -0
  99. basic_memory-0.13.0b4/tests/.coverage.Pauls-MacBook-Pro-2.local.28077.XqMfGOxx +0 -0
  100. basic_memory-0.13.0b4/tests/api/.coverage.Pauls-MacBook-Pro-2.local.60974.XPpBfqqx +0 -0
  101. basic_memory-0.13.0b4/tests/cli/.coverage.Pauls-MacBook-Pro-2.local.63666.XDIUQNrx +0 -0
  102. basic_memory-0.13.0b4/tests/cli/test_project_info.py +0 -38
  103. basic_memory-0.13.0b4/tests/mcp/.coverage.Pauls-MacBook-Pro-2.local.63904.XiAZuuhx +0 -0
  104. basic_memory-0.13.0b4/tests/mcp/test_tool_search.py +0 -159
  105. basic_memory-0.13.0b4/tests/repository/test_search_repository.py +0 -303
  106. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/check-health.md +0 -0
  107. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/lint-fix.md +0 -0
  108. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/release/changelog.md +0 -0
  109. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.claude/commands/test-coverage.md +0 -0
  110. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.env.oauth.example +0 -0
  111. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  112. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  113. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  114. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  115. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/dependabot.yml +0 -0
  116. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/workflows/dev-release.yml +0 -0
  117. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.github/workflows/pr-title.yml +0 -0
  118. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.mcp.json +0 -0
  119. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/.python-version +0 -0
  120. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/AUTH.md +0 -0
  121. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CHANGELOG.md +0 -0
  122. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CITATION.cff +0 -0
  123. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CLA.md +0 -0
  124. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/CODE_OF_CONDUCT.md +0 -0
  125. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/Dockerfile +0 -0
  126. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/LICENSE +0 -0
  127. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/README.md +0 -0
  128. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/SECURITY.md +0 -0
  129. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/basic-memory.md +0 -0
  130. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/CLI Reference.md +0 -0
  131. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Canvas.md +0 -0
  132. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Claude.ai Integration.md +0 -0
  133. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Getting Started with Basic Memory.md +0 -0
  134. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Knowledge Format.md +0 -0
  135. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/OAuth Authentication Guide.md +0 -0
  136. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Obsidian Integration.md +0 -0
  137. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Supabase OAuth Setup.md +0 -0
  138. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Technical Information.md +0 -0
  139. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/User Guide.md +0 -0
  140. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/Welcome to Basic memory.md +0 -0
  141. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/Canvas.png +0 -0
  142. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/Claude-Obsidian-Demo.mp4 +0 -0
  143. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/Prompt.png +0 -0
  144. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/disk-ai-logo-400x400.png +0 -0
  145. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/disk-ai-logo.png +0 -0
  146. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/prompt 1.png +0 -0
  147. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/prompt2.png +0 -0
  148. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/prompt3.png +0 -0
  149. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/attachments/prompt4.png +0 -0
  150. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/docs/publish.js +0 -0
  151. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Brewing Equipment.md +0 -0
  152. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Coffee Bean Origins.md +0 -0
  153. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Coffee Brewing Methods.md +0 -0
  154. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Coffee Flavor Map.md +0 -0
  155. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Coffee Knowledge Base.md +0 -0
  156. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Flavor Extraction.md +0 -0
  157. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Perfect Pour Over Coffee Method.canvas +0 -0
  158. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/Coffee Notes/Tasting Notes.md +0 -0
  159. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/examples/testing/Test Note Creation - Basic Functionality.md +0 -0
  160. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/llms-install.md +0 -0
  161. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/memory.json +0 -0
  162. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/scripts/install.sh +0 -0
  163. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/smithery.yaml +0 -0
  164. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/alembic.ini +0 -0
  165. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/env.py +0 -0
  166. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/migrations.py +0 -0
  167. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/script.py.mako +0 -0
  168. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  169. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  170. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  171. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  172. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  173. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  174. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/__init__.py +0 -0
  175. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/app.py +0 -0
  176. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/__init__.py +0 -0
  177. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/directory_router.py +0 -0
  178. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/importer_router.py +0 -0
  179. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/management_router.py +0 -0
  180. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/resource_router.py +0 -0
  181. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/search_router.py +0 -0
  182. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/routers/utils.py +0 -0
  183. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/api/template_loader.py +0 -0
  184. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/__init__.py +0 -0
  185. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/app.py +0 -0
  186. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/__init__.py +0 -0
  187. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/auth.py +0 -0
  188. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/db.py +0 -0
  189. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  190. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  191. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  192. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  193. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/commands/mcp.py +0 -0
  194. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/cli/main.py +0 -0
  195. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/config.py +0 -0
  196. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/db.py +0 -0
  197. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/deps.py +0 -0
  198. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/file_utils.py +0 -0
  199. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/__init__.py +0 -0
  200. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/base.py +0 -0
  201. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  202. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  203. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  204. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/memory_json_importer.py +0 -0
  205. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/importers/utils.py +0 -0
  206. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/__init__.py +0 -0
  207. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/entity_parser.py +0 -0
  208. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/markdown_processor.py +0 -0
  209. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/plugins.py +0 -0
  210. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/schemas.py +0 -0
  211. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/markdown/utils.py +0 -0
  212. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/__init__.py +0 -0
  213. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/async_client.py +0 -0
  214. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/auth_provider.py +0 -0
  215. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/external_auth_provider.py +0 -0
  216. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/project_session.py +0 -0
  217. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  218. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  219. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/search.py +0 -0
  220. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/prompts/utils.py +0 -0
  221. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  222. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/resources/project_info.py +0 -0
  223. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
  224. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  225. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/read_content.py +0 -0
  226. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  227. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/models/__init__.py +0 -0
  228. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/models/base.py +0 -0
  229. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/models/knowledge.py +0 -0
  230. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/models/project.py +0 -0
  231. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/models/search.py +0 -0
  232. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/__init__.py +0 -0
  233. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/entity_repository.py +0 -0
  234. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/observation_repository.py +0 -0
  235. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/project_info_repository.py +0 -0
  236. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/project_repository.py +0 -0
  237. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/relation_repository.py +0 -0
  238. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/repository/repository.py +0 -0
  239. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/__init__.py +0 -0
  240. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/delete.py +0 -0
  241. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/directory.py +0 -0
  242. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/importer.py +0 -0
  243. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/project_info.py +0 -0
  244. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/prompt.py +0 -0
  245. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/request.py +0 -0
  246. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/response.py +0 -0
  247. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/schemas/search.py +0 -0
  248. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/__init__.py +0 -0
  249. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/context_service.py +0 -0
  250. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/directory_service.py +0 -0
  251. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/exceptions.py +0 -0
  252. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/file_service.py +0 -0
  253. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/search_service.py +0 -0
  254. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/services/service.py +0 -0
  255. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/sync/__init__.py +0 -0
  256. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/sync/background_sync.py +0 -0
  257. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/sync/watch_service.py +0 -0
  258. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  259. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/templates/prompts/search.hbs +0 -0
  260. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/src/basic_memory/utils.py +0 -0
  261. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/static/json_canvas_spec_1_0.md +0 -0
  262. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/conftest.py +0 -0
  263. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_list_directory_integration.py +0 -0
  264. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_project_management_integration.py +0 -0
  265. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_read_content_integration.py +0 -0
  266. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_read_note_integration.py +0 -0
  267. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_search_integration.py +0 -0
  268. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/test-int/mcp/test_write_note_integration.py +0 -0
  269. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/Non-MarkdownFileSupport.pdf +0 -0
  270. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/Screenshot.png +0 -0
  271. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/__init__.py +0 -0
  272. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/conftest.py +0 -0
  273. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_continue_conversation_template.py +0 -0
  274. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_directory_router.py +0 -0
  275. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_importer_router.py +0 -0
  276. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_management_router.py +0 -0
  277. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_memory_router.py +0 -0
  278. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_project_router.py +0 -0
  279. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_project_router_operations.py +0 -0
  280. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_prompt_router.py +0 -0
  281. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_resource_router.py +0 -0
  282. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_search_router.py +0 -0
  283. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_search_template.py +0 -0
  284. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_template_loader.py +0 -0
  285. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/api/test_template_loader_helpers.py +0 -0
  286. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_auth_commands.py +0 -0
  287. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_cli_tools.py +0 -0
  288. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_import_chatgpt.py +0 -0
  289. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_import_claude_conversations.py +0 -0
  290. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_import_claude_projects.py +0 -0
  291. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_import_memory_json.py +0 -0
  292. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_project_commands.py +0 -0
  293. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/cli/test_version.py +0 -0
  294. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/conftest.py +0 -0
  295. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/importers/test_importer_base.py +0 -0
  296. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/importers/test_importer_utils.py +0 -0
  297. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/__init__.py +0 -0
  298. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_entity_parser.py +0 -0
  299. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_markdown_plugins.py +0 -0
  300. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_markdown_processor.py +0 -0
  301. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_observation_edge_cases.py +0 -0
  302. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_parser_edge_cases.py +0 -0
  303. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_relation_edge_cases.py +0 -0
  304. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/markdown/test_task_detection.py +0 -0
  305. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_auth_provider.py +0 -0
  306. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/mcp/test_server.py +0 -0
  307. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_entity_repository.py +0 -0
  308. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_observation_repository.py +0 -0
  309. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_project_info_repository.py +0 -0
  310. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_project_repository.py +0 -0
  311. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_relation_repository.py +0 -0
  312. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/repository/test_repository.py +0 -0
  313. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/schemas/test_memory_url.py +0 -0
  314. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/schemas/test_search.py +0 -0
  315. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_context_service.py +0 -0
  316. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_directory_service.py +0 -0
  317. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_file_service.py +0 -0
  318. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_project_service_operations.py +0 -0
  319. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/services/test_search_service.py +0 -0
  320. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/sync/test_sync_wikilink_issue.py +0 -0
  321. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/sync/test_tmp_files.py +0 -0
  322. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/sync/test_watch_service.py +0 -0
  323. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/sync/test_watch_service_edge_cases.py +0 -0
  324. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/utils/test_file_utils.py +0 -0
  325. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/utils/test_parse_tags.py +0 -0
  326. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/tests/utils/test_permalink_formatting.py +0 -0
  327. {basic_memory-0.13.0b4 → basic_memory-0.13.0b6}/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
@@ -32,17 +32,11 @@ jobs:
32
32
  uv sync
33
33
  uv build
34
34
 
35
- - name: Verify version matches tag
35
+ - name: Verify build succeeded
36
36
  run: |
37
- # Get version from built package
38
- PACKAGE_VERSION=$(uv run python -c "import basic_memory; print(basic_memory.__version__)")
39
- TAG_VERSION=${GITHUB_REF_NAME#v} # Remove 'v' prefix from tag
40
- echo "Package version: $PACKAGE_VERSION"
41
- echo "Tag version: $TAG_VERSION"
42
- if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
43
- echo "Version mismatch! Package: $PACKAGE_VERSION, Tag: $TAG_VERSION"
44
- exit 1
45
- fi
37
+ # Verify that build artifacts exist
38
+ ls -la dist/
39
+ echo "Build completed successfully"
46
40
 
47
41
  - name: Create GitHub Release
48
42
  uses: softprops/action-gh-release@v2
@@ -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.0b6
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
@@ -15,6 +16,7 @@ Basic Memory v0.13.0 is a **major release** that transforms Basic Memory into a
15
16
  **Key v0.13.0 Accomplishments:**
16
17
  - ✅ **Complete Project Management System** - Project switching and project-specific operations
17
18
  - ✅ **Advanced Note Editing** - Incremental editing with append, prepend, find/replace, and section operations
19
+ - ✅ **View Notes as Artifacts in Claude Desktop/Web** - Use the view_note tool to view a note as an artifact
18
20
  - ✅ **File Management System** - Full move operations with database consistency and rollback protection
19
21
  - ✅ **Enhanced Search Capabilities** - Frontmatter tags now searchable, improved content discoverability
20
22
  - ✅ **Unified Database Architecture** - Single app-level database for better performance and project management
@@ -133,10 +135,12 @@ Now searchable by: "coffee", "brewing", "equipment", or "Coffee Brewing Methods"
133
135
  - **`switch_project(project_name)`** - Change active project context during conversations
134
136
  - **`get_current_project()`** - Show currently active project with statistics
135
137
  - **`set_default_project(project_name)`** - Update default project configuration
138
+ - **`sync_status()`** - Check file synchronization status and background operations
136
139
 
137
140
  ### New Note Operations Tools
138
141
  - **`edit_note()`** - Incremental note editing (append, prepend, find/replace, section replace)
139
142
  - **`move_note()`** - Move notes with database consistency and search reindexing
143
+ - **`view_note()`** - Display notes as formatted artifacts for better readability in Claude Desktop
140
144
 
141
145
  ### Enhanced Existing Tools
142
146
  All existing tools now support:
@@ -77,22 +77,31 @@ read_note("specs/search-design") # By path
77
77
  read_note("memory://specs/search") # By memory URL
78
78
  ```
79
79
 
80
+ **Viewing notes as formatted artifacts (Claude Desktop):**
81
+ ```
82
+ view_note("Search Design") # Creates readable artifact
83
+ view_note("specs/search-design") # By permalink
84
+ view_note("memory://specs/search") # By memory URL
85
+ ```
86
+
80
87
  **Incremental editing** (v0.13.0):
81
88
  ```
82
89
  edit_note(
83
- identifier="Search Design",
90
+ identifier="Search Design", # Must be EXACT title/permalink (strict matching)
84
91
  operation="append", # append, prepend, find_replace, replace_section
85
92
  content="\n## New Section\nContent here..."
86
93
  )
87
94
  ```
95
+ **⚠️ Important:** `edit_note` requires exact identifiers (no fuzzy matching). Use `search_notes()` first if uncertain.
88
96
 
89
97
  **File organization** (v0.13.0):
90
98
  ```
91
99
  move_note(
92
- identifier="Old Note",
100
+ identifier="Old Note", # Must be EXACT title/permalink (strict matching)
93
101
  destination="archive/old-note.md" # Folders created automatically
94
102
  )
95
103
  ```
104
+ **⚠️ Important:** `move_note` requires exact identifiers (no fuzzy matching). Use `search_notes()` first if uncertain.
96
105
 
97
106
  ### Project Management (v0.13.0)
98
107
 
@@ -364,6 +373,20 @@ When creating relations:
364
373
  - If information seems outdated, suggest `basic-memory sync`
365
374
  - Use `recent_activity()` to check if content is current
366
375
 
376
+ **Strict Mode for Edit/Move Operations:**
377
+ - `edit_note()` and `move_note()` require **exact identifiers** (no fuzzy matching for safety)
378
+ - If identifier not found: use `search_notes()` first to find the exact title/permalink
379
+ - Error messages will guide you to find correct identifiers
380
+ - Example workflow:
381
+ ```
382
+ # ❌ This might fail if identifier isn't exact
383
+ edit_note("Meeting Note", "append", "content")
384
+
385
+ # ✅ Safe approach: search first, then use exact result
386
+ results = search_notes("meeting")
387
+ edit_note("Meeting Notes 2024", "append", "content") # Use exact title from search
388
+ ```
389
+
367
390
  ## Best Practices
368
391
 
369
392
  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,4 @@
1
+ """basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
2
+
3
+ # API version for FastAPI - independent of package version
4
+ __version__ = "v0"
@@ -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