basic-memory 0.14.2__tar.gz → 0.14.4__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 (315) hide show
  1. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/test.yml +12 -3
  2. basic_memory-0.14.4/CLA.md +71 -0
  3. basic_memory-0.14.4/CLAUDE.md +171 -0
  4. {basic_memory-0.14.2 → basic_memory-0.14.4}/CONTRIBUTING.md +6 -1
  5. {basic_memory-0.14.2 → basic_memory-0.14.4}/Dockerfile +15 -2
  6. basic_memory-0.14.4/LEGAL_INVENTORY_GUIDE.md +250 -0
  7. {basic_memory-0.14.2 → basic_memory-0.14.4}/PKG-INFO +21 -92
  8. {basic_memory-0.14.2 → basic_memory-0.14.4}/README.md +19 -90
  9. basic_memory-0.14.4/create_csv_exhibits.py +88 -0
  10. basic_memory-0.14.4/create_individual_exhibits.py +208 -0
  11. {basic_memory-0.14.2 → basic_memory-0.14.4}/docs/Docker.md +47 -16
  12. basic_memory-0.14.4/docs/character-handling.md +241 -0
  13. {basic_memory-0.14.2 → basic_memory-0.14.4}/justfile +4 -1
  14. basic_memory-0.14.4/legal_exhibits/drew_cain_exhibit_a.csv +31 -0
  15. basic_memory-0.14.4/legal_exhibits/joe_exhibit_a.csv +28 -0
  16. basic_memory-0.14.4/legal_file_inventory.py +438 -0
  17. basic_memory-0.14.4/legal_inventory/basic_memory_inventory_20250730_110133.csv +272 -0
  18. basic_memory-0.14.4/legal_inventory_git/basic_memory_inventory_20250729_200145.md +1936 -0
  19. basic_memory-0.14.4/legal_inventory_main/basic_memory_inventory_20250730_094006.csv +272 -0
  20. basic_memory-0.14.4/legal_inventory_main/basic_memory_inventory_20250730_094006.md +1943 -0
  21. basic_memory-0.14.4/legal_inventory_main/basic_memory_inventory_20250730_101521.json +6788 -0
  22. basic_memory-0.14.4/legal_inventory_sample.json +5479 -0
  23. basic_memory-0.14.4/legal_inventory_sample.md +294 -0
  24. {basic_memory-0.14.2 → basic_memory-0.14.4}/pyproject.toml +2 -2
  25. basic_memory-0.14.4/scripts/generate_legal_inventory.py +483 -0
  26. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/__init__.py +1 -1
  27. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/env.py +3 -1
  28. basic_memory-0.14.4/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +53 -0
  29. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/app.py +4 -1
  30. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/management_router.py +3 -1
  31. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/project_router.py +21 -13
  32. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/resource_router.py +3 -3
  33. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/app.py +3 -3
  34. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/__init__.py +1 -2
  35. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/db.py +5 -5
  36. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/import_chatgpt.py +3 -2
  37. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/import_claude_conversations.py +3 -1
  38. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/import_claude_projects.py +3 -1
  39. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/import_memory_json.py +5 -2
  40. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/mcp.py +3 -15
  41. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/project.py +46 -6
  42. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/status.py +4 -1
  43. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/sync.py +10 -2
  44. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/main.py +0 -1
  45. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/config.py +61 -34
  46. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/db.py +2 -6
  47. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/deps.py +3 -2
  48. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/file_utils.py +65 -0
  49. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/chatgpt_importer.py +20 -10
  50. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/memory_json_importer.py +22 -7
  51. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/utils.py +2 -2
  52. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/entity_parser.py +2 -2
  53. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/markdown_processor.py +2 -2
  54. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/plugins.py +42 -26
  55. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/utils.py +1 -1
  56. basic_memory-0.14.4/src/basic_memory/mcp/async_client.py +28 -0
  57. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/project_session.py +6 -4
  58. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/__init__.py +0 -2
  59. basic_memory-0.14.4/src/basic_memory/mcp/server.py +46 -0
  60. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/build_context.py +12 -2
  61. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/move_note.py +24 -12
  62. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/project_management.py +22 -7
  63. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/read_content.py +16 -0
  64. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/read_note.py +17 -2
  65. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/sync_status.py +3 -2
  66. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/write_note.py +9 -1
  67. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/models/knowledge.py +13 -2
  68. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/models/project.py +3 -3
  69. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/entity_repository.py +2 -2
  70. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/project_repository.py +19 -1
  71. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/search_repository.py +7 -3
  72. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/base.py +40 -10
  73. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/importer.py +1 -0
  74. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/memory.py +23 -11
  75. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/context_service.py +12 -2
  76. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/directory_service.py +7 -0
  77. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/entity_service.py +56 -10
  78. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/initialization.py +0 -75
  79. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/project_service.py +93 -36
  80. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/sync/background_sync.py +4 -3
  81. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/sync/sync_service.py +53 -4
  82. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/sync/watch_service.py +31 -8
  83. basic_memory-0.14.4/src/basic_memory/utils.py +379 -0
  84. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/conftest.py +25 -38
  85. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_build_context_validation.py +7 -6
  86. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_delete_note_integration.py +37 -29
  87. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_edit_note_integration.py +28 -28
  88. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_list_directory_integration.py +96 -20
  89. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_move_note_integration.py +43 -87
  90. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_project_management_integration.py +85 -82
  91. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_project_state_sync_integration.py +28 -25
  92. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_read_content_integration.py +6 -6
  93. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_read_note_integration.py +6 -6
  94. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_search_integration.py +15 -15
  95. {basic_memory-0.14.2 → basic_memory-0.14.4}/test-int/mcp/test_write_note_integration.py +89 -25
  96. basic_memory-0.14.4/tests/api/test_async_client.py +36 -0
  97. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_knowledge_router.py +5 -2
  98. basic_memory-0.14.4/tests/api/test_project_router.py +396 -0
  99. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_resource_router.py +11 -10
  100. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_cli_tools.py +36 -1
  101. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_import_chatgpt.py +3 -1
  102. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_import_claude_conversations.py +3 -1
  103. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_import_claude_projects.py +4 -1
  104. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_import_memory_json.py +40 -0
  105. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_project_commands.py +87 -1
  106. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_sync.py +11 -20
  107. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/conftest.py +7 -42
  108. basic_memory-0.14.4/tests/db/test_issue_254_foreign_key_constraints.py +154 -0
  109. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_markdown_plugins.py +46 -0
  110. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/conftest.py +0 -2
  111. basic_memory-0.14.4/tests/mcp/test_obsidian_yaml_formatting.py +181 -0
  112. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_prompts.py +1 -1
  113. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_build_context.py +20 -0
  114. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_move_note.py +264 -0
  115. basic_memory-0.14.4/tests/mcp/test_tool_read_content.py +459 -0
  116. basic_memory-0.14.4/tests/mcp/test_tool_read_note.py +620 -0
  117. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_write_note.py +405 -10
  118. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_project_repository.py +28 -0
  119. basic_memory-0.14.4/tests/repository/test_search_repository_edit_bug_fix.py +270 -0
  120. basic_memory-0.14.4/tests/schemas/test_memory_serialization.py +234 -0
  121. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/schemas/test_schemas.py +9 -5
  122. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_context_service.py +100 -0
  123. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_directory_service.py +22 -0
  124. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_entity_service.py +2 -2
  125. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_initialization.py +0 -176
  126. basic_memory-0.14.4/tests/services/test_project_removal_bug.py +125 -0
  127. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_project_service.py +132 -19
  128. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_project_service_operations.py +3 -3
  129. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_search_service.py +2 -2
  130. basic_memory-0.14.4/tests/sync/test_character_conflicts.py +343 -0
  131. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/sync/test_sync_service.py +12 -6
  132. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/sync/test_tmp_files.py +2 -2
  133. basic_memory-0.14.4/tests/sync/test_watch_service_edge_cases.py +273 -0
  134. basic_memory-0.14.4/tests/test_config.py +166 -0
  135. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/test_db_migration_deduplication.py +4 -6
  136. basic_memory-0.14.4/tests/test_production_cascade_delete.py +325 -0
  137. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/utils/test_file_utils.py +28 -0
  138. basic_memory-0.14.4/tests/utils/test_frontmatter_obsidian_compatible.py +183 -0
  139. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/utils/test_parse_tags.py +18 -0
  140. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/utils/test_permalink_formatting.py +3 -0
  141. basic_memory-0.14.4/tests/utils/test_validate_project_path.py +413 -0
  142. {basic_memory-0.14.2 → basic_memory-0.14.4}/uv.lock +401 -216
  143. basic_memory-0.14.2/CLA.md +0 -34
  144. basic_memory-0.14.2/CLAUDE.md +0 -257
  145. basic_memory-0.14.2/src/basic_memory/cli/commands/auth.py +0 -136
  146. basic_memory-0.14.2/src/basic_memory/mcp/async_client.py +0 -8
  147. basic_memory-0.14.2/src/basic_memory/mcp/auth_provider.py +0 -270
  148. basic_memory-0.14.2/src/basic_memory/mcp/external_auth_provider.py +0 -321
  149. basic_memory-0.14.2/src/basic_memory/mcp/prompts/sync_status.py +0 -112
  150. basic_memory-0.14.2/src/basic_memory/mcp/server.py +0 -109
  151. basic_memory-0.14.2/src/basic_memory/mcp/supabase_auth_provider.py +0 -463
  152. basic_memory-0.14.2/src/basic_memory/services/migration_service.py +0 -168
  153. basic_memory-0.14.2/src/basic_memory/utils.py +0 -216
  154. basic_memory-0.14.2/test-int/cli/test_reset_integration.py +0 -158
  155. basic_memory-0.14.2/tests/api/test_project_router.py +0 -198
  156. basic_memory-0.14.2/tests/cli/test_auth_commands.py +0 -352
  157. basic_memory-0.14.2/tests/mcp/test_auth_provider.py +0 -313
  158. basic_memory-0.14.2/tests/mcp/test_server.py +0 -144
  159. basic_memory-0.14.2/tests/mcp/test_tool_read_note.py +0 -296
  160. basic_memory-0.14.2/tests/sync/test_watch_service_edge_cases.py +0 -68
  161. basic_memory-0.14.2/tests/test_config.py +0 -78
  162. {basic_memory-0.14.2 → basic_memory-0.14.4}/.claude/commands/release/beta.md +0 -0
  163. {basic_memory-0.14.2 → basic_memory-0.14.4}/.claude/commands/release/changelog.md +0 -0
  164. {basic_memory-0.14.2 → basic_memory-0.14.4}/.claude/commands/release/release-check.md +0 -0
  165. {basic_memory-0.14.2 → basic_memory-0.14.4}/.claude/commands/release/release.md +0 -0
  166. {basic_memory-0.14.2 → basic_memory-0.14.4}/.claude/commands/test-live.md +0 -0
  167. {basic_memory-0.14.2 → basic_memory-0.14.4}/.dockerignore +0 -0
  168. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  169. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  170. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  171. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  172. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/dependabot.yml +0 -0
  173. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/claude.yml +0 -0
  174. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/dev-release.yml +0 -0
  175. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/docker.yml +0 -0
  176. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/pr-title.yml +0 -0
  177. {basic_memory-0.14.2 → basic_memory-0.14.4}/.github/workflows/release.yml +0 -0
  178. {basic_memory-0.14.2 → basic_memory-0.14.4}/.gitignore +0 -0
  179. {basic_memory-0.14.2 → basic_memory-0.14.4}/.python-version +0 -0
  180. {basic_memory-0.14.2 → basic_memory-0.14.4}/CHANGELOG.md +0 -0
  181. {basic_memory-0.14.2 → basic_memory-0.14.4}/CITATION.cff +0 -0
  182. {basic_memory-0.14.2 → basic_memory-0.14.4}/CODE_OF_CONDUCT.md +0 -0
  183. {basic_memory-0.14.2 → basic_memory-0.14.4}/LICENSE +0 -0
  184. {basic_memory-0.14.2 → basic_memory-0.14.4}/SECURITY.md +0 -0
  185. {basic_memory-0.14.2 → basic_memory-0.14.4}/docker-compose.yml +0 -0
  186. {basic_memory-0.14.2 → basic_memory-0.14.4}/docs/AI Assistant Guide.md +0 -0
  187. {basic_memory-0.14.2 → basic_memory-0.14.4}/llms-install.md +0 -0
  188. {basic_memory-0.14.2 → basic_memory-0.14.4}/memory.json +0 -0
  189. {basic_memory-0.14.2 → basic_memory-0.14.4}/smithery.yaml +0 -0
  190. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/alembic.ini +0 -0
  191. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/migrations.py +0 -0
  192. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/script.py.mako +0 -0
  193. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  194. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  195. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  196. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  197. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  198. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  199. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/__init__.py +0 -0
  200. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/__init__.py +0 -0
  201. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/directory_router.py +0 -0
  202. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/importer_router.py +0 -0
  203. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/knowledge_router.py +0 -0
  204. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/memory_router.py +0 -0
  205. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/prompt_router.py +0 -0
  206. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/search_router.py +0 -0
  207. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/routers/utils.py +0 -0
  208. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/api/template_loader.py +0 -0
  209. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/__init__.py +0 -0
  210. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/cli/commands/tool.py +0 -0
  211. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/__init__.py +0 -0
  212. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/base.py +0 -0
  213. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  214. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  215. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/__init__.py +0 -0
  216. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/markdown/schemas.py +0 -0
  217. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/__init__.py +0 -0
  218. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  219. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  220. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  221. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/search.py +0 -0
  222. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/prompts/utils.py +0 -0
  223. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  224. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/resources/project_info.py +0 -0
  225. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/__init__.py +0 -0
  226. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/canvas.py +0 -0
  227. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  228. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  229. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  230. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  231. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/search.py +0 -0
  232. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/utils.py +0 -0
  233. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/mcp/tools/view_note.py +0 -0
  234. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/models/__init__.py +0 -0
  235. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/models/base.py +0 -0
  236. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/models/search.py +0 -0
  237. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/__init__.py +0 -0
  238. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/observation_repository.py +0 -0
  239. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/project_info_repository.py +0 -0
  240. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/relation_repository.py +0 -0
  241. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/repository/repository.py +0 -0
  242. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/__init__.py +0 -0
  243. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/delete.py +0 -0
  244. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/directory.py +0 -0
  245. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/project_info.py +0 -0
  246. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/prompt.py +0 -0
  247. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/request.py +0 -0
  248. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/response.py +0 -0
  249. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/schemas/search.py +0 -0
  250. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/__init__.py +0 -0
  251. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/exceptions.py +0 -0
  252. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/file_service.py +0 -0
  253. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/link_resolver.py +0 -0
  254. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/search_service.py +0 -0
  255. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/service.py +0 -0
  256. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/services/sync_status_service.py +0 -0
  257. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/sync/__init__.py +0 -0
  258. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  259. {basic_memory-0.14.2 → basic_memory-0.14.4}/src/basic_memory/templates/prompts/search.hbs +0 -0
  260. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/Non-MarkdownFileSupport.pdf +0 -0
  261. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/Screenshot.png +0 -0
  262. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/__init__.py +0 -0
  263. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/conftest.py +0 -0
  264. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_continue_conversation_template.py +0 -0
  265. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_directory_router.py +0 -0
  266. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_importer_router.py +0 -0
  267. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_management_router.py +0 -0
  268. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_memory_router.py +0 -0
  269. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_project_router_operations.py +0 -0
  270. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_prompt_router.py +0 -0
  271. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_search_router.py +0 -0
  272. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_search_template.py +0 -0
  273. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_template_loader.py +0 -0
  274. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/api/test_template_loader_helpers.py +0 -0
  275. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/conftest.py +0 -0
  276. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_project_info.py +0 -0
  277. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_status.py +0 -0
  278. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/cli/test_version.py +0 -0
  279. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/importers/test_importer_base.py +0 -0
  280. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/importers/test_importer_utils.py +0 -0
  281. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/__init__.py +0 -0
  282. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_entity_parser.py +0 -0
  283. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_markdown_processor.py +0 -0
  284. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_observation_edge_cases.py +0 -0
  285. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_parser_edge_cases.py +0 -0
  286. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_relation_edge_cases.py +0 -0
  287. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/markdown/test_task_detection.py +0 -0
  288. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_resource_project_info.py +0 -0
  289. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_resources.py +0 -0
  290. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_canvas.py +0 -0
  291. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_delete_note.py +0 -0
  292. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_edit_note.py +0 -0
  293. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_list_directory.py +0 -0
  294. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_recent_activity.py +0 -0
  295. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_resource.py +0 -0
  296. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_search.py +0 -0
  297. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_sync_status.py +0 -0
  298. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_utils.py +0 -0
  299. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/mcp/test_tool_view_note.py +0 -0
  300. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_entity_repository.py +0 -0
  301. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_entity_repository_upsert.py +0 -0
  302. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_observation_repository.py +0 -0
  303. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_project_info_repository.py +0 -0
  304. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_relation_repository.py +0 -0
  305. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_repository.py +0 -0
  306. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/repository/test_search_repository.py +0 -0
  307. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/schemas/test_memory_url.py +0 -0
  308. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/schemas/test_memory_url_validation.py +0 -0
  309. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/schemas/test_search.py +0 -0
  310. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_file_service.py +0 -0
  311. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_link_resolver.py +0 -0
  312. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/services/test_sync_status_service.py +0 -0
  313. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/sync/test_sync_wikilink_issue.py +0 -0
  314. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/sync/test_watch_service.py +0 -0
  315. {basic_memory-0.14.2 → basic_memory-0.14.4}/tests/utils/test_utf8_handling.py +0 -0
@@ -14,11 +14,12 @@ on:
14
14
 
15
15
  jobs:
16
16
  test:
17
- runs-on: ubuntu-latest
18
17
  strategy:
19
18
  fail-fast: false
20
19
  matrix:
20
+ os: [ubuntu-latest, windows-latest]
21
21
  python-version: [ "3.12" ]
22
+ runs-on: ${{ matrix.os }}
22
23
 
23
24
  steps:
24
25
  - uses: actions/checkout@v4
@@ -35,10 +36,18 @@ jobs:
35
36
  run: |
36
37
  pip install uv
37
38
 
38
- - name: Install just
39
+ - name: Install just (Linux/macOS)
40
+ if: runner.os != 'Windows'
39
41
  run: |
40
42
  curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
41
43
 
44
+ - name: Install just (Windows)
45
+ if: runner.os == 'Windows'
46
+ run: |
47
+ # Install just using Chocolatey (pre-installed on GitHub Actions Windows runners)
48
+ choco install just --yes
49
+ shell: pwsh
50
+
42
51
  - name: Create virtual env
43
52
  run: |
44
53
  uv venv
@@ -54,4 +63,4 @@ jobs:
54
63
  - name: Run tests
55
64
  run: |
56
65
  uv pip install pytest pytest-cov
57
- just test
66
+ just test
@@ -0,0 +1,71 @@
1
+ # Contributor License Agreement
2
+
3
+ ## Copyright Assignment and License Grant
4
+
5
+ By signing this Contributor License Agreement ("Agreement"), you accept and agree to the following terms and conditions
6
+ for your present and future Contributions submitted
7
+ to Basic Machines LLC. Except for the license granted herein to Basic Machines LLC and recipients of software
8
+ distributed by Basic Machines LLC, you reserve all right,
9
+ title, and interest in and to your Contributions.
10
+
11
+ ### 1. Definitions
12
+
13
+ "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this
14
+ Agreement with Basic Machines LLC.
15
+
16
+ "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work,
17
+ that is intentionally submitted by You to Basic
18
+ Machines LLC for inclusion in, or documentation of, any of the products owned or managed by Basic Machines LLC (the "
19
+ Work").
20
+
21
+ ### 2. Grant of Copyright License
22
+
23
+ Subject to the terms and conditions of this Agreement, You hereby grant to Basic Machines LLC and to recipients of
24
+ software distributed by Basic Machines LLC a perpetual,
25
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to use, copy, modify, merge, publish,
26
+ distribute, sublicense, and/or sell copies of the
27
+ Work, and to permit persons to whom the Work is furnished to do so.
28
+
29
+ ### 3. Assignment of Copyright
30
+
31
+ You hereby assign to Basic Machines LLC all right, title, and interest worldwide in all Copyright covering your
32
+ Contributions. Basic Machines LLC may license the
33
+ Contributions under any license terms, including copyleft, permissive, commercial, or proprietary licenses.
34
+
35
+ ### 4. Grant of Patent License
36
+
37
+ Subject to the terms and conditions of this Agreement, You hereby grant to Basic Machines LLC and to recipients of
38
+ software distributed by Basic Machines LLC a perpetual,
39
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to
40
+ make, have made, use, offer to sell, sell, import, and
41
+ otherwise transfer the Work.
42
+
43
+ ### 5. Developer Certificate of Origin
44
+
45
+ By making a Contribution to this project, You certify that:
46
+
47
+ (a) The Contribution was created in whole or in part by You and You have the right to submit it under this Agreement; or
48
+
49
+ (b) The Contribution is based upon previous work that, to the best of Your knowledge, is covered under an appropriate
50
+ open source license and You have the right under that
51
+ license to submit that work with modifications, whether created in whole or in part by You, under this Agreement; or
52
+
53
+ (c) The Contribution was provided directly to You by some other person who certified (a), (b) or (c) and You have not
54
+ modified it.
55
+
56
+ (d) You understand and agree that this project and the Contribution are public and that a record of the Contribution (
57
+ including all personal information You submit with
58
+ it, including Your sign-off) is maintained indefinitely and may be redistributed consistent with this project or the
59
+ open source license(s) involved.
60
+
61
+ ### 6. Representations
62
+
63
+ You represent that you are legally entitled to grant the above license and assignment. If your employer(s) has rights to
64
+ intellectual property that you create that
65
+ includes your Contributions, you represent that you have received permission to make Contributions on behalf of that
66
+ employer, or that your employer has waived such rights
67
+ for your Contributions to Basic Machines LLC.
68
+
69
+ ---
70
+
71
+ This Agreement is effective as of the date you first submit a Contribution to Basic Machines LLC.
@@ -0,0 +1,171 @@
1
+ # CLAUDE.md - Basic Memory Project Guide
2
+
3
+ ## Project Overview
4
+
5
+ Basic Memory is a local-first knowledge management system built on the Model Context Protocol (MCP). It enables
6
+ bidirectional communication between LLMs (like Claude) and markdown files, creating a personal knowledge graph that can
7
+ be traversed using links between documents.
8
+
9
+ ## CODEBASE DEVELOPMENT
10
+
11
+ ### Project information
12
+
13
+ See the [README.md](README.md) file for a project overview.
14
+
15
+ ### Build and Test Commands
16
+
17
+ - Install: `make install` or `pip install -e ".[dev]"`
18
+ - Run tests: `uv run pytest -p pytest_mock -v` or `make test`
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`
26
+
27
+ ### Code Style Guidelines
28
+
29
+ - Line length: 100 characters max
30
+ - Python 3.12+ with full type annotations
31
+ - Format with ruff (consistent styling)
32
+ - Import order: standard lib, third-party, local imports
33
+ - Naming: snake_case for functions/variables, PascalCase for classes
34
+ - Prefer async patterns with SQLAlchemy 2.0
35
+ - Use Pydantic v2 for data validation and schemas
36
+ - CLI uses Typer for command structure
37
+ - API uses FastAPI for endpoints
38
+ - Follow the repository pattern for data access
39
+ - Tools communicate to api routers via the httpx ASGI client (in process)
40
+
41
+ ### Codebase Architecture
42
+
43
+ - `/alembic` - Alembic db migrations
44
+ - `/api` - FastAPI implementation of REST endpoints
45
+ - `/cli` - Typer command-line interface
46
+ - `/markdown` - Markdown parsing and processing
47
+ - `/mcp` - Model Context Protocol server implementation
48
+ - `/models` - SQLAlchemy ORM models
49
+ - `/repository` - Data access layer
50
+ - `/schemas` - Pydantic models for validation
51
+ - `/services` - Business logic layer
52
+ - `/sync` - File synchronization services
53
+
54
+ ### Development Notes
55
+
56
+ - MCP tools are defined in src/basic_memory/mcp/tools/
57
+ - MCP prompts are defined in src/basic_memory/mcp/prompts/
58
+ - MCP tools should be atomic, composable operations
59
+ - Use `textwrap.dedent()` for multi-line string formatting in prompts and tools
60
+ - MCP Prompts are used to invoke tools and format content with instructions for an LLM
61
+ - Schema changes require Alembic migrations
62
+ - SQLite is used for indexing and full text search, files are source of truth
63
+ - Testing uses pytest with asyncio support (strict mode)
64
+ - Test database uses in-memory SQLite
65
+ - Avoid creating mocks in tests in most circumstances.
66
+ - Each test runs in a standalone environment with in memory SQLite and tmp_file directory
67
+
68
+ ## BASIC MEMORY PRODUCT USAGE
69
+
70
+ ### Knowledge Structure
71
+
72
+ - Entity: Any concept, document, or idea represented as a markdown file
73
+ - Observation: A categorized fact about an entity (`- [category] content`)
74
+ - Relation: A directional link between entities (`- relation_type [[Target]]`)
75
+ - Frontmatter: YAML metadata at the top of markdown files
76
+ - Knowledge representation follows precise markdown format:
77
+ - Observations with [category] prefixes
78
+ - Relations with WikiLinks [[Entity]]
79
+ - Frontmatter with metadata
80
+
81
+ ### Basic Memory Commands
82
+
83
+ - Sync knowledge: `basic-memory sync` or `basic-memory sync --watch`
84
+ - Import from Claude: `basic-memory import claude conversations`
85
+ - Import from ChatGPT: `basic-memory import chatgpt`
86
+ - Import from Memory JSON: `basic-memory import memory-json`
87
+ - Check sync status: `basic-memory status`
88
+ - Tool access: `basic-memory tools` (provides CLI access to MCP tools)
89
+ - Guide: `basic-memory tools basic-memory-guide`
90
+ - Continue: `basic-memory tools continue-conversation --topic="search"`
91
+
92
+ ### MCP Capabilities
93
+
94
+ - Basic Memory exposes these MCP tools to LLMs:
95
+
96
+ **Content Management:**
97
+ - `write_note(title, content, folder, tags)` - Create/update markdown notes with semantic observations and relations
98
+ - `read_note(identifier, page, page_size)` - Read notes by title, permalink, or memory:// URL with knowledge graph
99
+ awareness
100
+ - `read_file(path)` - Read raw file content (text, images, binaries) without knowledge graph processing
101
+
102
+ **Knowledge Graph Navigation:**
103
+ - `build_context(url, depth, timeframe)` - Navigate the knowledge graph via memory:// URLs for conversation
104
+ continuity
105
+ - `recent_activity(type, depth, timeframe)` - Get recently updated information with specified timeframe (e.g., "
106
+ 1d", "1 week")
107
+
108
+ **Search & Discovery:**
109
+ - `search(query, page, page_size)` - Full-text search across all content with filtering options
110
+
111
+ **Visualization:**
112
+ - `canvas(nodes, edges, title, folder)` - Generate Obsidian canvas files for knowledge graph visualization
113
+
114
+ - MCP Prompts for better AI interaction:
115
+ - `ai_assistant_guide()` - Guidance on effectively using Basic Memory tools for AI assistants
116
+ - `continue_conversation(topic, timeframe)` - Continue previous conversations with relevant historical context
117
+ - `search(query, after_date)` - Search with detailed, formatted results for better context understanding
118
+ - `recent_activity(timeframe)` - View recently changed items with formatted output
119
+ - `json_canvas_spec()` - Full JSON Canvas specification for Obsidian visualization
120
+
121
+ ## AI-Human Collaborative Development
122
+
123
+ Basic Memory emerged from and enables a new kind of development process that combines human and AI capabilities. Instead
124
+ of using AI just for code generation, we've developed a true collaborative workflow:
125
+
126
+ 1. AI (LLM) writes initial implementation based on specifications and context
127
+ 2. Human reviews, runs tests, and commits code with any necessary adjustments
128
+ 3. Knowledge persists across conversations using Basic Memory's knowledge graph
129
+ 4. Development continues seamlessly across different AI sessions with consistent context
130
+ 5. Results improve through iterative collaboration and shared understanding
131
+
132
+ This approach has allowed us to tackle more complex challenges and build a more robust system than either humans or AI
133
+ could achieve independently.
134
+
135
+ ## GitHub Integration
136
+
137
+ Basic Memory has taken AI-Human collaboration to the next level by integrating Claude directly into the development workflow through GitHub:
138
+
139
+ ### GitHub MCP Tools
140
+
141
+ Using the GitHub Model Context Protocol server, Claude can now:
142
+
143
+ - **Repository Management**:
144
+ - View repository files and structure
145
+ - Read file contents
146
+ - Create new branches
147
+ - Create and update files
148
+
149
+ - **Issue Management**:
150
+ - Create new issues
151
+ - Comment on existing issues
152
+ - Close and update issues
153
+ - Search across issues
154
+
155
+ - **Pull Request Workflow**:
156
+ - Create pull requests
157
+ - Review code changes
158
+ - Add comments to PRs
159
+
160
+ This integration enables Claude to participate as a full team member in the development process, not just as a code generation tool. Claude's GitHub account ([bm-claudeai](https://github.com/bm-claudeai)) is a member of the Basic Machines organization with direct contributor access to the codebase.
161
+
162
+ ### Collaborative Development Process
163
+
164
+ With GitHub integration, the development workflow includes:
165
+
166
+ 1. **Direct code review** - Claude can analyze PRs and provide detailed feedback
167
+ 2. **Contribution tracking** - All of Claude's contributions are properly attributed in the Git history
168
+ 3. **Branch management** - Claude can create feature branches for implementations
169
+ 4. **Documentation maintenance** - Claude can keep documentation updated as the code evolves
170
+
171
+ This level of integration represents a new paradigm in AI-human collaboration, where the AI assistant becomes a full-fledged team member rather than just a tool for generating code snippets.
@@ -27,7 +27,12 @@ project and how to get started as a developer.
27
27
 
28
28
  > **Note**: Basic Memory uses [just](https://just.systems) as a modern command runner. Install with `brew install just` or `cargo install just`.
29
29
 
30
- 3. **Run the Tests**:
30
+ 3. **Activate the Virtual Environment**
31
+ ```bash
32
+ source .venv/bin/activate
33
+ ```
34
+
35
+ 4. **Run the Tests**:
31
36
  ```bash
32
37
  # Run all tests
33
38
  just test
@@ -1,5 +1,9 @@
1
1
  FROM python:3.12-slim-bookworm
2
2
 
3
+ # Build arguments for user ID and group ID (defaults to 1000)
4
+ ARG UID=1000
5
+ ARG GID=1000
6
+
3
7
  # Copy uv from official image
4
8
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
5
9
 
@@ -7,6 +11,11 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
7
11
  ENV PYTHONUNBUFFERED=1 \
8
12
  PYTHONDONTWRITEBYTECODE=1
9
13
 
14
+ # Create a group and user with the provided UID/GID
15
+ # Check if the GID already exists, if not create appgroup
16
+ RUN (getent group ${GID} || groupadd --gid ${GID} appgroup) && \
17
+ useradd --uid ${UID} --gid ${GID} --create-home --shell /bin/bash appuser
18
+
10
19
  # Copy the project into the image
11
20
  ADD . /app
12
21
 
@@ -14,13 +23,17 @@ ADD . /app
14
23
  WORKDIR /app
15
24
  RUN uv sync --locked
16
25
 
17
- # Create data directory
18
- RUN mkdir -p /app/data
26
+ # Create necessary directories and set ownership
27
+ RUN mkdir -p /app/data /app/.basic-memory && \
28
+ chown -R appuser:${GID} /app
19
29
 
20
30
  # Set default data directory and add venv to PATH
21
31
  ENV BASIC_MEMORY_HOME=/app/data \
22
32
  PATH="/app/.venv/bin:$PATH"
23
33
 
34
+ # Switch to the non-root user
35
+ USER appuser
36
+
24
37
  # Expose port
25
38
  EXPOSE 8000
26
39
 
@@ -0,0 +1,250 @@
1
+ # Legal File Inventory Guide
2
+
3
+ ## Overview
4
+
5
+ This guide documents the comprehensive file inventory script created for Basic Memory's legal documentation needs, including copyright assignments and company agreement exhibits.
6
+
7
+ ## Repository Analysis Summary
8
+
9
+ ### Repository Structure
10
+ - **Primary Language**: Python (3,958 files)
11
+ - **License**: GNU Affero General Public License v3.0
12
+ - **Total Contributors**: 12 identified contributors
13
+ - **Main Contributors**:
14
+ - `phernandez@basicmachines.co` / `paul@basicmachines.co` (Paul Hernandez) - 700+ commits
15
+ - `groksrc@gmail.com` / `groksrc@users.noreply.github.com` (Drew Cain) - 18+ commits
16
+ - Various AI bots and automated systems
17
+
18
+ ### File Type Distribution
19
+ Based on the analysis, the repository contains:
20
+
21
+ | Extension | Count | Purpose |
22
+ |-----------|-------|---------|
23
+ | `.py` | 3,958 | Python source code |
24
+ | `.pyi` | 4,536 | Python type stubs (dependencies) |
25
+ | `.pyc` | 1,435 | Compiled Python (excluded from inventory) |
26
+ | `.md` | 34 | Documentation files |
27
+ | `.toml` | 179 | Configuration files |
28
+ | `.html` | 119 | Coverage reports and documentation |
29
+ | `.txt` | 127 | Various text files |
30
+
31
+ ### Contributors by Email Domain
32
+
33
+ **Basic Machines Contributors:**
34
+ - `phernandez@basicmachines.co` - 547 commits (Primary maintainer)
35
+ - `paul@basicmachines.co` / `paulmh@gmail.com` - 170 commits (Paul Hernandez)
36
+ - `claude@basicmachines.co` - 3 commits (AI assistant)
37
+
38
+ **External Contributors:**
39
+ - `groksrc@gmail.com` / `groksrc@users.noreply.github.com` - 18 commits (Drew Cain)
40
+ - Various one-time contributors (1-2 commits each)
41
+
42
+ **Automated Systems:**
43
+ - GitHub Actions, semantic-release, and other bots
44
+
45
+ ## Legal Inventory Script Features
46
+
47
+ ### What It Includes
48
+
49
+ **Source Files:**
50
+ - All Python source code (`.py` files)
51
+ - Configuration files (`.toml`, `.yaml`, `.json`, etc.)
52
+ - Documentation (`.md`, `.rst`, `.txt`)
53
+ - Build and deployment scripts
54
+ - Database migrations and SQL files
55
+ - Legal and license files
56
+
57
+ **Metadata for Each File:**
58
+ - File path, size, and creation/modification dates
59
+ - Git history (creation date, last modified, commit count)
60
+ - Contributors and their line contributions
61
+ - Primary author identification
62
+ - File categorization
63
+ - SHA-256 hash for integrity verification
64
+
65
+ ### What It Excludes
66
+
67
+ **Generated/Build Artifacts:**
68
+ - `__pycache__/` and `.pyc` files
69
+ - Build directories (`build/`, `dist/`, `htmlcov/`)
70
+ - Coverage reports and cache files
71
+
72
+ **Dependencies:**
73
+ - Virtual environment files (`.venv/`, `venv/`)
74
+ - Third-party packages (`site-packages/`, `*.dist-info/`)
75
+ - Lock files (`uv.lock`, `package-lock.json`)
76
+
77
+ **IDE/Editor Files:**
78
+ - `.idea/`, `.vscode/`, `.DS_Store`
79
+ - Temporary and swap files
80
+
81
+ **Version Control:**
82
+ - `.git/` directory contents
83
+ - Git configuration files
84
+
85
+ ## Usage Instructions
86
+
87
+ ### Basic Usage
88
+
89
+ ```bash
90
+ # Generate CSV inventory (default)
91
+ python3 legal_file_inventory.py
92
+
93
+ # Generate Markdown report
94
+ python3 legal_file_inventory.py --format markdown --output legal_report.md
95
+
96
+ # Generate JSON with full metadata
97
+ python3 legal_file_inventory.py --format json --output legal_data.json
98
+
99
+ # Specify different repository path
100
+ python3 legal_file_inventory.py --repo-path /path/to/repo --output inventory.csv
101
+ ```
102
+
103
+ ### Command Line Options
104
+
105
+ - `--output`, `-o`: Output file path (default: `basic_memory_legal_inventory.csv`)
106
+ - `--format`, `-f`: Output format - `csv`, `json`, or `markdown` (default: `csv`)
107
+ - `--repo-path`, `-r`: Repository path (default: current directory)
108
+
109
+ ### Output Formats
110
+
111
+ **CSV Format:**
112
+ - Suitable for spreadsheet applications
113
+ - Contains all metadata fields
114
+ - Contributors stored as JSON string in separate column
115
+
116
+ **JSON Format:**
117
+ - Complete structured data
118
+ - Includes summary statistics and detailed file information
119
+ - Best for programmatic processing
120
+
121
+ **Markdown Format:**
122
+ - Human-readable report
123
+ - Summary statistics and contributor rankings
124
+ - Detailed table of all files
125
+
126
+ ## Legal Documentation Applications
127
+
128
+ ### Copyright Assignment Use Cases
129
+
130
+ 1. **Contributor Identification**: The script identifies all contributors to each file based on git blame analysis
131
+ 2. **Primary Author Recognition**: Determines the primary author of each file (contributor with most lines)
132
+ 3. **Contribution Metrics**: Provides line counts and commit counts per contributor
133
+ 4. **File Categorization**: Groups files by purpose (source code, documentation, configuration, etc.)
134
+
135
+ ### Company Agreement Exhibits
136
+
137
+ The inventory provides comprehensive documentation of:
138
+
139
+ 1. **Intellectual Property Scope**: All source code files and their origins
140
+ 2. **Contributor Tracking**: Complete list of all individuals who have contributed code
141
+ 3. **File Integrity**: SHA-256 hashes for verification of file contents
142
+ 4. **Historical Documentation**: Git creation dates and modification history
143
+
144
+ ### Due Diligence Documentation
145
+
146
+ The script generates data suitable for:
147
+
148
+ 1. **Legal Review**: Comprehensive file listing with contributor information
149
+ 2. **IP Audit**: Identification of all copyright holders
150
+ 3. **License Compliance**: Verification of file ownership and licensing
151
+ 4. **Asset Documentation**: Complete inventory of company code assets
152
+
153
+ ## Integration with Legal Processes
154
+
155
+ ### Recommended Workflow
156
+
157
+ 1. **Generate Inventory**: Run the script to create current file inventory
158
+ 2. **Legal Review**: Have legal counsel review the contributor list and file categorization
159
+ 3. **Copyright Assignment**: Use contributor data to ensure proper copyright assignments
160
+ 4. **Document Attachment**: Include inventory as exhibit in company agreements
161
+ 5. **Regular Updates**: Re-run inventory for significant releases or legal milestones
162
+
163
+ ### Key Legal Considerations
164
+
165
+ **AGPL-3.0 License:**
166
+ - All files are under AGPL-3.0 unless otherwise specified
167
+ - Contributors retain copyright but license under AGPL-3.0 terms
168
+ - Company needs proper copyright assignments for proprietary licensing
169
+
170
+ **Contributor Rights:**
171
+ - External contributors may retain rights to their contributions
172
+ - Proper contributor license agreements (CLAs) should be in place
173
+ - AI-generated content may have different legal status
174
+
175
+ **File Categories for Legal Review:**
176
+ - **Source Code**: Core IP, requires copyright assignment
177
+ - **Configuration**: May contain proprietary deployment information
178
+ - **Documentation**: Usually less sensitive but may contain trade secrets
179
+ - **Legal/License**: Critical for compliance verification
180
+
181
+ ## Maintenance and Updates
182
+
183
+ ### When to Regenerate Inventory
184
+
185
+ - Before major releases
186
+ - During legal document preparation
187
+ - After significant contributor additions
188
+ - For annual compliance reviews
189
+ - During acquisition or investment processes
190
+
191
+ ### Validation Steps
192
+
193
+ 1. Verify contributor email mapping is accurate
194
+ 2. Check that file categorization makes sense
195
+ 3. Ensure excluded files are appropriate
196
+ 4. Review contributor counts against expectations
197
+ 5. Validate file hashes for integrity
198
+
199
+ ## Technical Implementation Notes
200
+
201
+ ### Git Integration
202
+ - Uses `git blame --line-porcelain` for detailed contributor analysis
203
+ - Tracks file history with `git log --follow`
204
+ - Handles renamed files and complex git histories
205
+
206
+ ### Performance Considerations
207
+ - Scans repository incrementally to handle large codebases
208
+ - Excludes binary dependencies to reduce processing time
209
+ - Caches git operations where possible
210
+
211
+ ### Error Handling
212
+ - Gracefully handles files not in git
213
+ - Continues processing if individual files fail
214
+ - Provides detailed error reporting
215
+
216
+ ## Security and Privacy
217
+
218
+ ### Data Sensitivity
219
+ - Contains contributor names and email addresses
220
+ - May reveal internal file structure and organization
221
+ - Should be treated as confidential legal documentation
222
+
223
+ ### Recommended Handling
224
+ - Limit access to legal and executive team
225
+ - Store in secure, access-controlled systems
226
+ - Consider redacting contributor emails for external sharing
227
+ - Regular cleanup of generated inventory files
228
+
229
+ ## Troubleshooting
230
+
231
+ ### Common Issues
232
+
233
+ **Git Not Available:**
234
+ - Ensure git is installed and repository is initialized
235
+ - Check that the script is run from within the repository
236
+
237
+ **Permission Errors:**
238
+ - Ensure read access to all repository files
239
+ - Check write permissions for output directory
240
+
241
+ **Large Repository Performance:**
242
+ - Consider running on subsets of files for very large repositories
243
+ - Use `--repo-path` to target specific subdirectories
244
+
245
+ **Contributor Mapping Issues:**
246
+ - Git usernames may not match real identities
247
+ - Consider post-processing to normalize contributor names
248
+ - Review .mailmap files for git identity consolidation
249
+
250
+ This comprehensive legal file inventory system provides the foundation for proper intellectual property documentation and legal compliance for the Basic Memory project.