basic-memory 0.13.5__tar.gz → 0.13.6__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.
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CHANGELOG.md +74 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CLAUDE.md +36 -14
- {basic_memory-0.13.5 → basic_memory-0.13.6}/PKG-INFO +22 -5
- {basic_memory-0.13.5 → basic_memory-0.13.6}/README.md +21 -4
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/env.py +3 -3
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/db.py +42 -8
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/write_note.py +3 -1
- basic_memory-0.13.6/src/basic_memory/repository/entity_repository.py +251 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/entity_service.py +20 -16
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/initialization.py +15 -11
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/templates/prompts/continue_conversation.hbs +1 -1
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_write_note.py +246 -1
- basic_memory-0.13.6/tests/repository/test_entity_repository_upsert.py +248 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_entity_service.py +24 -66
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_initialization.py +10 -9
- basic_memory-0.13.6/tests/test_db_migration_deduplication.py +187 -0
- basic_memory-0.13.5/src/basic_memory/repository/entity_repository.py +0 -98
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/check-health.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/commands.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/lint-fix.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/test-coverage.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.env.oauth.example +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/dependabot.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/workflows/release.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.github/workflows/test.yml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.gitignore +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.mcp.json +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/.python-version +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/AUTH.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CITATION.cff +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CLA.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/CONTRIBUTING.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/Dockerfile +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/LICENSE +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/SECURITY.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/basic-memory.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/AI Assistant Guide.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/CLI Reference.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Canvas.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Claude.ai Integration.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Getting Started with Basic Memory.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Knowledge Format.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/OAuth Authentication Guide.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Obsidian Integration.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Supabase OAuth Setup.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Technical Information.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/User Guide.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/Welcome to Basic memory.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/Canvas.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/Claude-Obsidian-Demo.mp4 +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/Prompt.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/disk-ai-logo-400x400.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/disk-ai-logo.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/prompt 1.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/prompt2.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/prompt3.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/attachments/prompt4.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/docs/publish.js +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Brewing Equipment.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Coffee Bean Origins.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Coffee Brewing Methods.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Coffee Flavor Map.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Coffee Knowledge Base.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Flavor Extraction.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Perfect Pour Over Coffee Method.canvas +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/Coffee Notes/Tasting Notes.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/examples/testing/Test Note Creation - Basic Functionality.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/justfile +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/llms-install.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/memory.json +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/pyproject.toml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/scripts/install.sh +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/smithery.yaml +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/directory_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/importer_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/knowledge_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/management_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/memory_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/project_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/prompt_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/resource_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/search_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/routers/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/auth.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/sync.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/config.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/auth_provider.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/external_auth_provider.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/project_session.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/sync_status.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/sync_status.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/migration_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/services/sync_status_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/static/ai_assistant_guide.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/static/json_canvas_spec_1_0.md +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/conftest.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/Screenshot.png +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/conftest.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_continue_conversation_template.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_directory_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_importer_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_knowledge_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_management_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_memory_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_project_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_project_router_operations.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_prompt_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_resource_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_search_router.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_search_template.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_template_loader.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/api/test_template_loader_helpers.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/conftest.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_auth_commands.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_project_commands.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_project_info.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_status.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_sync.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/cli/test_version.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/conftest.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_auth_provider.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_resource_project_info.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_server.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_sync_status.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/services/test_sync_status_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.13.5 → basic_memory-0.13.6}/uv.lock +0 -0
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## v0.13.6 (2025-06-18)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- **Custom Entity Types** - Support for custom entity types in write_note
|
|
8
|
+
([`7789864`](https://github.com/basicmachines-co/basic-memory/commit/77898644933589c2da9bdd60571d54137a5309ed))
|
|
9
|
+
- Fixed `entity_type` parameter for `write_note` MCP tool to respect value passed in
|
|
10
|
+
- Frontmatter `type` field automatically respected when no explicit parameter provided
|
|
11
|
+
- Maintains backward compatibility with default "note" type
|
|
12
|
+
|
|
13
|
+
- **#139**: Fix "UNIQUE constraint failed: entity.permalink" database error
|
|
14
|
+
([`c6215fd`](https://github.com/basicmachines-co/basic-memory/commit/c6215fd819f9564ead91cf3a950f855241446096))
|
|
15
|
+
- Implement SQLAlchemy UPSERT strategy to handle permalink conflicts gracefully
|
|
16
|
+
- Eliminates crashes when creating notes with existing titles in same folders
|
|
17
|
+
- Seamlessly updates existing entities instead of failing with constraint errors
|
|
18
|
+
|
|
19
|
+
- **Database Migration Performance** - Eliminate redundant migration initialization
|
|
20
|
+
([`84d2aaf`](https://github.com/basicmachines-co/basic-memory/commit/84d2aaf6414dd083af4b0df73f6c8139b63468f6))
|
|
21
|
+
- Fix duplicate migration calls that slowed system startup
|
|
22
|
+
- Improve performance with multiple projects (tested with 28+ projects)
|
|
23
|
+
- Add migration deduplication safeguards with comprehensive test coverage
|
|
24
|
+
|
|
25
|
+
- **User Experience** - Correct spelling error in continue_conversation prompt
|
|
26
|
+
([`b4c26a6`](https://github.com/basicmachines-co/basic-memory/commit/b4c26a613379e6f2ba655efe3d7d8d40c27999e5))
|
|
27
|
+
- Fix "Chose a folder" → "Choose a folder" in MCP prompt instructions
|
|
28
|
+
- Improve grammar and clarity in user-facing prompt text
|
|
29
|
+
|
|
30
|
+
### Documentation
|
|
31
|
+
|
|
32
|
+
- **Website Updates** - Add new website and community links to README
|
|
33
|
+
([`3fdce68`](https://github.com/basicmachines-co/basic-memory/commit/3fdce683d7ad8b6f4855d7138d5ff2136d4c07bc))
|
|
34
|
+
|
|
35
|
+
- **Project Documentation** - Update README.md and CLAUDE.md with latest project information
|
|
36
|
+
([`782cb2d`](https://github.com/basicmachines-co/basic-memory/commit/782cb2df28803482d209135a054e67cc32d7363e))
|
|
37
|
+
|
|
38
|
+
### Technical Improvements
|
|
39
|
+
|
|
40
|
+
- **Comprehensive Test Coverage** - Add extensive test suites for new features
|
|
41
|
+
- Custom entity type validation with 8 new test scenarios
|
|
42
|
+
- UPSERT behavior testing with edge case coverage
|
|
43
|
+
- Migration deduplication testing with 6 test scenarios
|
|
44
|
+
- Database constraint handling validation
|
|
45
|
+
|
|
46
|
+
- **Code Quality** - Enhanced error handling and validation
|
|
47
|
+
- Improved SQLAlchemy patterns with modern UPSERT operations
|
|
48
|
+
- Better conflict resolution strategies for entity management
|
|
49
|
+
- Strengthened database consistency guarantees
|
|
50
|
+
|
|
51
|
+
### Performance
|
|
52
|
+
|
|
53
|
+
- **Database Operations** - Faster startup and improved scalability
|
|
54
|
+
- Reduced migration overhead for multi-project setups
|
|
55
|
+
- Optimized conflict resolution for entity creation
|
|
56
|
+
- Enhanced performance with growing knowledge bases
|
|
57
|
+
|
|
58
|
+
### Migration Guide
|
|
59
|
+
|
|
60
|
+
This release includes automatic database improvements. No manual migration required:
|
|
61
|
+
|
|
62
|
+
- Existing notes and entity types continue working unchanged
|
|
63
|
+
- New `entity_type` parameter is optional and backward compatible
|
|
64
|
+
- Database performance improvements apply automatically
|
|
65
|
+
- All existing MCP tool behavior preserved
|
|
66
|
+
|
|
67
|
+
### Installation
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# Latest stable release
|
|
71
|
+
uv tool install basic-memory
|
|
72
|
+
|
|
73
|
+
# Update existing installation
|
|
74
|
+
uv tool upgrade basic-memory
|
|
75
|
+
```
|
|
76
|
+
|
|
3
77
|
## v0.13.5 (2025-06-11)
|
|
4
78
|
|
|
5
79
|
### Bug Fixes
|
|
@@ -97,15 +97,26 @@ See the [README.md](README.md) file for a project overview.
|
|
|
97
97
|
|
|
98
98
|
**Content Management:**
|
|
99
99
|
- `write_note(title, content, folder, tags)` - Create/update markdown notes with semantic observations and relations
|
|
100
|
-
- `read_note(identifier, page, page_size)` - Read notes by title, permalink, or memory:// URL with knowledge graph
|
|
101
|
-
|
|
102
|
-
- `
|
|
100
|
+
- `read_note(identifier, page, page_size)` - Read notes by title, permalink, or memory:// URL with knowledge graph awareness
|
|
101
|
+
- `edit_note(identifier, operation, content)` - Edit notes incrementally (append, prepend, find/replace, section replace)
|
|
102
|
+
- `move_note(identifier, destination_path)` - Move notes with database consistency and search reindexing
|
|
103
|
+
- `view_note(identifier)` - Display notes as formatted artifacts for better readability in Claude Desktop
|
|
104
|
+
- `read_content(path)` - Read raw file content (text, images, binaries) without knowledge graph processing
|
|
105
|
+
- `delete_note(identifier)` - Delete notes from knowledge base
|
|
106
|
+
|
|
107
|
+
**Project Management:**
|
|
108
|
+
- `list_memory_projects()` - List all available projects with status indicators
|
|
109
|
+
- `switch_project(project_name)` - Switch to different project context during conversations
|
|
110
|
+
- `get_current_project()` - Show currently active project with statistics
|
|
111
|
+
- `create_memory_project(name, path, set_default)` - Create new Basic Memory projects
|
|
112
|
+
- `delete_project(name)` - Delete projects from configuration and database
|
|
113
|
+
- `set_default_project(name)` - Set default project in config
|
|
114
|
+
- `sync_status()` - Check file synchronization status and background operations
|
|
103
115
|
|
|
104
116
|
**Knowledge Graph Navigation:**
|
|
105
|
-
- `build_context(url, depth, timeframe)` - Navigate the knowledge graph via memory:// URLs for conversation
|
|
106
|
-
|
|
107
|
-
- `
|
|
108
|
-
1d", "1 week")
|
|
117
|
+
- `build_context(url, depth, timeframe)` - Navigate the knowledge graph via memory:// URLs for conversation continuity
|
|
118
|
+
- `recent_activity(type, depth, timeframe)` - Get recently updated information with specified timeframe (e.g., "1d", "1 week")
|
|
119
|
+
- `list_directory(dir_name, depth, file_name_glob)` - List directory contents with filtering and depth control
|
|
109
120
|
|
|
110
121
|
**Search & Discovery:**
|
|
111
122
|
- `search_notes(query, page, page_size)` - Full-text search across all content with filtering options
|
|
@@ -212,13 +223,24 @@ Basic Memory uses `uv-dynamic-versioning` for automatic version management based
|
|
|
212
223
|
- Users install with: `pip install basic-memory --pre`
|
|
213
224
|
- Use for milestone testing before stable release
|
|
214
225
|
|
|
215
|
-
#### Stable Releases (
|
|
216
|
-
-
|
|
217
|
-
-
|
|
226
|
+
#### Stable Releases (Automated)
|
|
227
|
+
- Use the automated release system: `just release v0.13.0`
|
|
228
|
+
- Includes comprehensive quality checks (lint, format, type-check, tests)
|
|
229
|
+
- Automatically updates version in `__init__.py`
|
|
230
|
+
- Creates git tag and pushes to GitHub
|
|
231
|
+
- Triggers GitHub Actions workflow for PyPI publication
|
|
218
232
|
- Users install with: `pip install basic-memory`
|
|
219
233
|
|
|
234
|
+
**Manual method (legacy):**
|
|
235
|
+
- Create version tag: `git tag v0.13.0 && git push origin v0.13.0`
|
|
236
|
+
|
|
220
237
|
### For Development
|
|
221
|
-
-
|
|
222
|
-
-
|
|
223
|
-
-
|
|
224
|
-
- `
|
|
238
|
+
- **Automated releases**: Use `just release v0.13.x` for stable releases and `just beta v0.13.0b1` for beta releases
|
|
239
|
+
- **Quality gates**: All releases require passing lint, format, type-check, and test suites
|
|
240
|
+
- **Version management**: Versions automatically derived from git tags via `uv-dynamic-versioning`
|
|
241
|
+
- **Configuration**: `pyproject.toml` uses `dynamic = ["version"]`
|
|
242
|
+
- **Release automation**: `__init__.py` updated automatically during release process
|
|
243
|
+
- **CI/CD**: GitHub Actions handles building and PyPI publication
|
|
244
|
+
|
|
245
|
+
## Development Notes
|
|
246
|
+
- make sure you sign off on commits
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.6
|
|
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
|
|
@@ -51,8 +51,11 @@ Basic Memory lets you build persistent knowledge through natural conversations w
|
|
|
51
51
|
Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
|
|
52
52
|
enable any compatible LLM to read and write to your local knowledge base.
|
|
53
53
|
|
|
54
|
-
- Website: https://
|
|
54
|
+
- Website: https://basicmemory.com
|
|
55
|
+
- Company: https://basicmachines.co
|
|
55
56
|
- Documentation: https://memory.basicmachines.co
|
|
57
|
+
- Discord: https://discord.gg/tyvKNccgqN
|
|
58
|
+
- YouTube: https://www.youtube.com/@basicmachines-co
|
|
56
59
|
|
|
57
60
|
## Pick up your conversation right where you left off
|
|
58
61
|
|
|
@@ -99,8 +102,7 @@ Memory for Claude Desktop:
|
|
|
99
102
|
npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
|
|
100
103
|
```
|
|
101
104
|
|
|
102
|
-
This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
|
|
103
|
-
Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
|
|
105
|
+
This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. Note: The Smithery installation uses their hosted MCP server, while your data remains stored locally as Markdown files.
|
|
104
106
|
|
|
105
107
|
### Glama.ai
|
|
106
108
|
|
|
@@ -191,7 +193,8 @@ The note embeds semantic content and links to other topics via simple Markdown f
|
|
|
191
193
|
|
|
192
194
|
3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
|
|
193
195
|
|
|
194
|
-
- Realtime sync is enabled by default with
|
|
196
|
+
- Realtime sync is enabled by default starting with v0.12.0
|
|
197
|
+
- Project switching during conversations is supported starting with v0.13.0
|
|
195
198
|
|
|
196
199
|
4. In a chat with the LLM, you can reference a topic:
|
|
197
200
|
|
|
@@ -389,10 +392,20 @@ Basic Memory will sync the files in your project in real time if you make manual
|
|
|
389
392
|
```
|
|
390
393
|
write_note(title, content, folder, tags) - Create or update notes
|
|
391
394
|
read_note(identifier, page, page_size) - Read notes by title or permalink
|
|
395
|
+
edit_note(identifier, operation, content) - Edit notes incrementally (append, prepend, find/replace)
|
|
396
|
+
move_note(identifier, destination_path) - Move notes with database consistency
|
|
397
|
+
view_note(identifier) - Display notes as formatted artifacts for better readability
|
|
392
398
|
build_context(url, depth, timeframe) - Navigate knowledge graph via memory:// URLs
|
|
393
399
|
search_notes(query, page, page_size) - Search across your knowledge base
|
|
394
400
|
recent_activity(type, depth, timeframe) - Find recently updated information
|
|
395
401
|
canvas(nodes, edges, title, folder) - Generate knowledge visualizations
|
|
402
|
+
list_memory_projects() - List all available projects with status
|
|
403
|
+
switch_project(project_name) - Switch to different project context
|
|
404
|
+
get_current_project() - Show current project and statistics
|
|
405
|
+
create_memory_project(name, path, set_default) - Create new projects
|
|
406
|
+
delete_project(name) - Delete projects from configuration
|
|
407
|
+
set_default_project(name) - Set default project
|
|
408
|
+
sync_status() - Check file synchronization status
|
|
396
409
|
```
|
|
397
410
|
|
|
398
411
|
5. Example prompts to try:
|
|
@@ -403,6 +416,10 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
|
|
|
403
416
|
"Create a canvas visualization of my project components"
|
|
404
417
|
"Read my notes on the authentication system"
|
|
405
418
|
"What have I been working on in the past week?"
|
|
419
|
+
"Switch to my work-notes project"
|
|
420
|
+
"List all my available projects"
|
|
421
|
+
"Edit my coffee brewing note to add a new technique"
|
|
422
|
+
"Move my old meeting notes to the archive folder"
|
|
406
423
|
```
|
|
407
424
|
|
|
408
425
|
## Futher info
|
|
@@ -13,8 +13,11 @@ Basic Memory lets you build persistent knowledge through natural conversations w
|
|
|
13
13
|
Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
|
|
14
14
|
enable any compatible LLM to read and write to your local knowledge base.
|
|
15
15
|
|
|
16
|
-
- Website: https://
|
|
16
|
+
- Website: https://basicmemory.com
|
|
17
|
+
- Company: https://basicmachines.co
|
|
17
18
|
- Documentation: https://memory.basicmachines.co
|
|
19
|
+
- Discord: https://discord.gg/tyvKNccgqN
|
|
20
|
+
- YouTube: https://www.youtube.com/@basicmachines-co
|
|
18
21
|
|
|
19
22
|
## Pick up your conversation right where you left off
|
|
20
23
|
|
|
@@ -61,8 +64,7 @@ Memory for Claude Desktop:
|
|
|
61
64
|
npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
|
|
62
65
|
```
|
|
63
66
|
|
|
64
|
-
This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
|
|
65
|
-
Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
|
|
67
|
+
This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. Note: The Smithery installation uses their hosted MCP server, while your data remains stored locally as Markdown files.
|
|
66
68
|
|
|
67
69
|
### Glama.ai
|
|
68
70
|
|
|
@@ -153,7 +155,8 @@ The note embeds semantic content and links to other topics via simple Markdown f
|
|
|
153
155
|
|
|
154
156
|
3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
|
|
155
157
|
|
|
156
|
-
- Realtime sync is enabled by default with
|
|
158
|
+
- Realtime sync is enabled by default starting with v0.12.0
|
|
159
|
+
- Project switching during conversations is supported starting with v0.13.0
|
|
157
160
|
|
|
158
161
|
4. In a chat with the LLM, you can reference a topic:
|
|
159
162
|
|
|
@@ -351,10 +354,20 @@ Basic Memory will sync the files in your project in real time if you make manual
|
|
|
351
354
|
```
|
|
352
355
|
write_note(title, content, folder, tags) - Create or update notes
|
|
353
356
|
read_note(identifier, page, page_size) - Read notes by title or permalink
|
|
357
|
+
edit_note(identifier, operation, content) - Edit notes incrementally (append, prepend, find/replace)
|
|
358
|
+
move_note(identifier, destination_path) - Move notes with database consistency
|
|
359
|
+
view_note(identifier) - Display notes as formatted artifacts for better readability
|
|
354
360
|
build_context(url, depth, timeframe) - Navigate knowledge graph via memory:// URLs
|
|
355
361
|
search_notes(query, page, page_size) - Search across your knowledge base
|
|
356
362
|
recent_activity(type, depth, timeframe) - Find recently updated information
|
|
357
363
|
canvas(nodes, edges, title, folder) - Generate knowledge visualizations
|
|
364
|
+
list_memory_projects() - List all available projects with status
|
|
365
|
+
switch_project(project_name) - Switch to different project context
|
|
366
|
+
get_current_project() - Show current project and statistics
|
|
367
|
+
create_memory_project(name, path, set_default) - Create new projects
|
|
368
|
+
delete_project(name) - Delete projects from configuration
|
|
369
|
+
set_default_project(name) - Set default project
|
|
370
|
+
sync_status() - Check file synchronization status
|
|
358
371
|
```
|
|
359
372
|
|
|
360
373
|
5. Example prompts to try:
|
|
@@ -365,6 +378,10 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
|
|
|
365
378
|
"Create a canvas visualization of my project components"
|
|
366
379
|
"Read my notes on the authentication system"
|
|
367
380
|
"What have I been working on in the past week?"
|
|
381
|
+
"Switch to my work-notes project"
|
|
382
|
+
"List all my available projects"
|
|
383
|
+
"Edit my coffee brewing note to add a new technique"
|
|
384
|
+
"Move my old meeting notes to the archive folder"
|
|
368
385
|
```
|
|
369
386
|
|
|
370
387
|
## Futher info
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
|
|
2
2
|
|
|
3
3
|
# Package version - updated by release automation
|
|
4
|
-
__version__ = "0.13.
|
|
4
|
+
__version__ = "0.13.6"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -8,12 +8,12 @@ from sqlalchemy import pool
|
|
|
8
8
|
|
|
9
9
|
from alembic import context
|
|
10
10
|
|
|
11
|
-
from basic_memory.models import Base
|
|
12
|
-
|
|
13
11
|
# set config.env to "test" for pytest to prevent logging to file in utils.setup_logging()
|
|
14
12
|
os.environ["BASIC_MEMORY_ENV"] = "test"
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
# Import after setting environment variable # noqa: E402
|
|
15
|
+
from basic_memory.config import app_config # noqa: E402
|
|
16
|
+
from basic_memory.models import Base # noqa: E402
|
|
17
17
|
|
|
18
18
|
# this is the Alembic Config object, which provides
|
|
19
19
|
# access to the values within the .ini file in use.
|
|
@@ -23,6 +23,7 @@ from basic_memory.repository.search_repository import SearchRepository
|
|
|
23
23
|
# Module level state
|
|
24
24
|
_engine: Optional[AsyncEngine] = None
|
|
25
25
|
_session_maker: Optional[async_sessionmaker[AsyncSession]] = None
|
|
26
|
+
_migrations_completed: bool = False
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
class DatabaseType(Enum):
|
|
@@ -72,18 +73,35 @@ async def scoped_session(
|
|
|
72
73
|
await factory.remove()
|
|
73
74
|
|
|
74
75
|
|
|
76
|
+
def _create_engine_and_session(
|
|
77
|
+
db_path: Path, db_type: DatabaseType = DatabaseType.FILESYSTEM
|
|
78
|
+
) -> tuple[AsyncEngine, async_sessionmaker[AsyncSession]]:
|
|
79
|
+
"""Internal helper to create engine and session maker."""
|
|
80
|
+
db_url = DatabaseType.get_db_url(db_path, db_type)
|
|
81
|
+
logger.debug(f"Creating engine for db_url: {db_url}")
|
|
82
|
+
engine = create_async_engine(db_url, connect_args={"check_same_thread": False})
|
|
83
|
+
session_maker = async_sessionmaker(engine, expire_on_commit=False)
|
|
84
|
+
return engine, session_maker
|
|
85
|
+
|
|
86
|
+
|
|
75
87
|
async def get_or_create_db(
|
|
76
88
|
db_path: Path,
|
|
77
89
|
db_type: DatabaseType = DatabaseType.FILESYSTEM,
|
|
90
|
+
ensure_migrations: bool = True,
|
|
91
|
+
app_config: Optional["BasicMemoryConfig"] = None,
|
|
78
92
|
) -> tuple[AsyncEngine, async_sessionmaker[AsyncSession]]: # pragma: no cover
|
|
79
93
|
"""Get or create database engine and session maker."""
|
|
80
94
|
global _engine, _session_maker
|
|
81
95
|
|
|
82
96
|
if _engine is None:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
97
|
+
_engine, _session_maker = _create_engine_and_session(db_path, db_type)
|
|
98
|
+
|
|
99
|
+
# Run migrations automatically unless explicitly disabled
|
|
100
|
+
if ensure_migrations:
|
|
101
|
+
if app_config is None:
|
|
102
|
+
from basic_memory.config import app_config as global_app_config
|
|
103
|
+
app_config = global_app_config
|
|
104
|
+
await run_migrations(app_config, db_type)
|
|
87
105
|
|
|
88
106
|
# These checks should never fail since we just created the engine and session maker
|
|
89
107
|
# if they were None, but we'll check anyway for the type checker
|
|
@@ -100,12 +118,13 @@ async def get_or_create_db(
|
|
|
100
118
|
|
|
101
119
|
async def shutdown_db() -> None: # pragma: no cover
|
|
102
120
|
"""Clean up database connections."""
|
|
103
|
-
global _engine, _session_maker
|
|
121
|
+
global _engine, _session_maker, _migrations_completed
|
|
104
122
|
|
|
105
123
|
if _engine:
|
|
106
124
|
await _engine.dispose()
|
|
107
125
|
_engine = None
|
|
108
126
|
_session_maker = None
|
|
127
|
+
_migrations_completed = False
|
|
109
128
|
|
|
110
129
|
|
|
111
130
|
@asynccontextmanager
|
|
@@ -119,7 +138,7 @@ async def engine_session_factory(
|
|
|
119
138
|
for each test. For production use, use get_or_create_db() instead.
|
|
120
139
|
"""
|
|
121
140
|
|
|
122
|
-
global _engine, _session_maker
|
|
141
|
+
global _engine, _session_maker, _migrations_completed
|
|
123
142
|
|
|
124
143
|
db_url = DatabaseType.get_db_url(db_path, db_type)
|
|
125
144
|
logger.debug(f"Creating engine for db_url: {db_url}")
|
|
@@ -143,12 +162,20 @@ async def engine_session_factory(
|
|
|
143
162
|
await _engine.dispose()
|
|
144
163
|
_engine = None
|
|
145
164
|
_session_maker = None
|
|
165
|
+
_migrations_completed = False
|
|
146
166
|
|
|
147
167
|
|
|
148
168
|
async def run_migrations(
|
|
149
|
-
app_config: BasicMemoryConfig, database_type=DatabaseType.FILESYSTEM
|
|
169
|
+
app_config: BasicMemoryConfig, database_type=DatabaseType.FILESYSTEM, force: bool = False
|
|
150
170
|
): # pragma: no cover
|
|
151
171
|
"""Run any pending alembic migrations."""
|
|
172
|
+
global _migrations_completed
|
|
173
|
+
|
|
174
|
+
# Skip if migrations already completed unless forced
|
|
175
|
+
if _migrations_completed and not force:
|
|
176
|
+
logger.debug("Migrations already completed in this session, skipping")
|
|
177
|
+
return
|
|
178
|
+
|
|
152
179
|
logger.info("Running database migrations...")
|
|
153
180
|
try:
|
|
154
181
|
# Get the absolute path to the alembic directory relative to this file
|
|
@@ -170,11 +197,18 @@ async def run_migrations(
|
|
|
170
197
|
command.upgrade(config, "head")
|
|
171
198
|
logger.info("Migrations completed successfully")
|
|
172
199
|
|
|
173
|
-
|
|
200
|
+
# Get session maker - ensure we don't trigger recursive migration calls
|
|
201
|
+
if _session_maker is None:
|
|
202
|
+
_, session_maker = _create_engine_and_session(app_config.database_path, database_type)
|
|
203
|
+
else:
|
|
204
|
+
session_maker = _session_maker
|
|
174
205
|
|
|
175
206
|
# initialize the search Index schema
|
|
176
207
|
# the project_id is not used for init_search_index, so we pass a dummy value
|
|
177
208
|
await SearchRepository(session_maker, 1).init_search_index()
|
|
209
|
+
|
|
210
|
+
# Mark migrations as completed
|
|
211
|
+
_migrations_completed = True
|
|
178
212
|
except Exception as e: # pragma: no cover
|
|
179
213
|
logger.error(f"Error running migrations: {e}")
|
|
180
214
|
raise
|
|
@@ -27,6 +27,7 @@ async def write_note(
|
|
|
27
27
|
content: str,
|
|
28
28
|
folder: str,
|
|
29
29
|
tags=None, # Remove type hint completely to avoid schema issues
|
|
30
|
+
entity_type: str = "note",
|
|
30
31
|
project: Optional[str] = None,
|
|
31
32
|
) -> str:
|
|
32
33
|
"""Write a markdown note to the knowledge base.
|
|
@@ -58,6 +59,7 @@ async def write_note(
|
|
|
58
59
|
Use forward slashes (/) as separators. Examples: "notes", "projects/2025", "research/ml"
|
|
59
60
|
tags: Tags to categorize the note. Can be a list of strings, a comma-separated string, or None.
|
|
60
61
|
Note: If passing from external MCP clients, use a string format (e.g. "tag1,tag2,tag3")
|
|
62
|
+
entity_type: Type of entity to create. Defaults to "note". Can be "guide", "report", "config", etc.
|
|
61
63
|
project: Optional project name to write to. If not provided, uses current active project.
|
|
62
64
|
|
|
63
65
|
Returns:
|
|
@@ -84,7 +86,7 @@ async def write_note(
|
|
|
84
86
|
entity = Entity(
|
|
85
87
|
title=title,
|
|
86
88
|
folder=folder,
|
|
87
|
-
entity_type=
|
|
89
|
+
entity_type=entity_type,
|
|
88
90
|
content_type="text/markdown",
|
|
89
91
|
content=content,
|
|
90
92
|
entity_metadata=metadata,
|