basic-memory 0.19.2__tar.gz → 0.20.0__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.
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CHANGELOG.md +13 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/PKG-INFO +31 -1
- {basic_memory-0.19.2 → basic_memory-0.20.0}/README.md +30 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/llms-install.md +17 -1
- {basic_memory-0.19.2 → basic_memory-0.20.0}/server.json +2 -2
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/app.py +10 -4
- basic_memory-0.20.0/src/basic_memory/cli/auto_update.py +391 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/__init__.py +2 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/mcp.py +18 -0
- basic_memory-0.20.0/src/basic_memory/cli/commands/update.py +40 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/main.py +1 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/config.py +16 -0
- basic_memory-0.20.0/tests/cli/test_auto_update.py +374 -0
- basic_memory-0.20.0/tests/cli/test_update_command.py +90 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_config.py +44 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/spec.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.claude/settings.json +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.dockerignore +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.env.example +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/dependabot.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/release.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.github/workflows/test.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.gitignore +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/.python-version +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/AGENTS.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CITATION.cff +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CLA.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CLAUDE.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/CONTRIBUTING.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/Dockerfile +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/LICENSE +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/SECURITY.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docker-compose.yml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/Docker.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/character-handling.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/cloud-cli.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/metadata-search.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/semantic-search.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/docs/testing-coverage.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/justfile +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/pyproject.toml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/smithery.yaml +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/db.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_string_params_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/report.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/README.md +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/Screenshot.png +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_json_output.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_project_list_and_ls.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_project_set_cloud_local.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/cli/test_workspace_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_workspace_management.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_semantic_search_base.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/__init__.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_project_service_embedding_status.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_coerce.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_deps.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/test_runtime.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_setup_logging.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/ui/tool-ui-react/tailwind.config.js +0 -0
- {basic_memory-0.19.2 → basic_memory-0.20.0}/uv.lock +0 -0
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.20.0 (2026-03-10)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- **#643**: Default-on auto-update system and `bm update` command
|
|
10
|
+
- Automatic background update checks for CLI installs (uv tool, Homebrew)
|
|
11
|
+
- Install-source detection (homebrew, uv_tool, uvx, unknown) with uvx skip behavior
|
|
12
|
+
- Periodic check gating via `auto_update_last_checked_at` + `update_check_interval` config
|
|
13
|
+
- Manager-specific update flows: Homebrew (`brew upgrade`) and uv tool (`uv tool upgrade`)
|
|
14
|
+
- Silent, non-blocking MCP behavior via daemon thread before server run
|
|
15
|
+
- Manual commands: `bm update` (force check + apply) and `bm update --check` (check only)
|
|
16
|
+
- New config fields: `auto_update`, `update_check_interval`, `auto_update_last_checked_at`
|
|
17
|
+
|
|
5
18
|
## v0.19.2 (2026-03-09)
|
|
6
19
|
|
|
7
20
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.0
|
|
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
|
|
@@ -126,6 +126,36 @@ uv tool install basic-memory
|
|
|
126
126
|
|
|
127
127
|
You can view shared context via files in `~/basic-memory` (default directory location).
|
|
128
128
|
|
|
129
|
+
## Automatic Updates
|
|
130
|
+
|
|
131
|
+
Basic Memory includes a default-on auto-update flow for CLI installs.
|
|
132
|
+
|
|
133
|
+
- **Auto-install supported:** `uv tool` and Homebrew installs
|
|
134
|
+
- **Default check interval:** every 24 hours (`86400` seconds)
|
|
135
|
+
- **MCP-safe behavior:** update checks run silently in `basic-memory mcp` mode
|
|
136
|
+
- **`uvx` behavior:** skipped (runtime is ephemeral and managed by `uvx`)
|
|
137
|
+
|
|
138
|
+
Manual update commands:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Check now and install if supported
|
|
142
|
+
bm update
|
|
143
|
+
|
|
144
|
+
# Check only, do not install
|
|
145
|
+
bm update --check
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Config options in `~/.basic-memory/config.json`:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"auto_update": true,
|
|
153
|
+
"update_check_interval": 86400
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
To disable automatic updates, set `"auto_update": false`.
|
|
158
|
+
|
|
129
159
|
## Why Basic Memory?
|
|
130
160
|
|
|
131
161
|
Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
|
|
@@ -75,6 +75,36 @@ uv tool install basic-memory
|
|
|
75
75
|
|
|
76
76
|
You can view shared context via files in `~/basic-memory` (default directory location).
|
|
77
77
|
|
|
78
|
+
## Automatic Updates
|
|
79
|
+
|
|
80
|
+
Basic Memory includes a default-on auto-update flow for CLI installs.
|
|
81
|
+
|
|
82
|
+
- **Auto-install supported:** `uv tool` and Homebrew installs
|
|
83
|
+
- **Default check interval:** every 24 hours (`86400` seconds)
|
|
84
|
+
- **MCP-safe behavior:** update checks run silently in `basic-memory mcp` mode
|
|
85
|
+
- **`uvx` behavior:** skipped (runtime is ephemeral and managed by `uvx`)
|
|
86
|
+
|
|
87
|
+
Manual update commands:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Check now and install if supported
|
|
91
|
+
bm update
|
|
92
|
+
|
|
93
|
+
# Check only, do not install
|
|
94
|
+
bm update --check
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Config options in `~/.basic-memory/config.json`:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"auto_update": true,
|
|
102
|
+
"update_check_interval": 86400
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
To disable automatic updates, set `"auto_update": false`.
|
|
107
|
+
|
|
78
108
|
## Why Basic Memory?
|
|
79
109
|
|
|
80
110
|
Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
|
|
@@ -54,6 +54,22 @@ Or for a one-time sync:
|
|
|
54
54
|
basic-memory sync
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### 4. Updating Basic Memory
|
|
58
|
+
|
|
59
|
+
Basic Memory supports automatic updates by default for `uv tool` and Homebrew installs.
|
|
60
|
+
|
|
61
|
+
For manual checks and upgrades:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Check now and install if supported
|
|
65
|
+
bm update
|
|
66
|
+
|
|
67
|
+
# Check only, do not install
|
|
68
|
+
bm update --check
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
To disable automatic updates, set `"auto_update": false` in `~/.basic-memory/config.json`.
|
|
72
|
+
|
|
57
73
|
## Configuration Options
|
|
58
74
|
|
|
59
75
|
### Custom Directory
|
|
@@ -125,4 +141,4 @@ If you encounter issues:
|
|
|
125
141
|
cat ~/.basic-memory/basic-memory.log
|
|
126
142
|
```
|
|
127
143
|
|
|
128
|
-
For more detailed information, refer to the [full documentation](https://
|
|
144
|
+
For more detailed information, refer to the [full documentation](https://docs.basicmemory.com/).
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/basicmachines-co/basic-memory.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.20.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "0.20.0",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
16
|
"runtimeArguments": [
|
|
17
17
|
{"type": "positional", "value": "basic-memory"},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
|
|
2
2
|
|
|
3
3
|
# Package version - updated by release automation
|
|
4
|
-
__version__ = "0.
|
|
4
|
+
__version__ = "0.20.0"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -8,6 +8,7 @@ from typing import Optional # noqa: E402
|
|
|
8
8
|
|
|
9
9
|
import typer # noqa: E402
|
|
10
10
|
|
|
11
|
+
from basic_memory.cli.auto_update import maybe_run_periodic_auto_update # noqa: E402
|
|
11
12
|
from basic_memory.cli.container import CliContainer, set_container # noqa: E402
|
|
12
13
|
from basic_memory.cli.promo import maybe_show_cloud_promo, maybe_show_init_line # noqa: E402
|
|
13
14
|
from basic_memory.config import init_cli_logging # noqa: E402
|
|
@@ -52,10 +53,14 @@ def app_callback(
|
|
|
52
53
|
# Outcome: one-time plain line printed before the subcommand runs.
|
|
53
54
|
maybe_show_init_line(ctx.invoked_subcommand)
|
|
54
55
|
|
|
55
|
-
# Trigger: register
|
|
56
|
-
# Why: promo output
|
|
57
|
-
# Outcome:
|
|
58
|
-
|
|
56
|
+
# Trigger: register post-command messaging callbacks.
|
|
57
|
+
# Why: informational/promo/update output belongs below command results.
|
|
58
|
+
# Outcome: command output remains primary, with optional follow-up notices afterwards.
|
|
59
|
+
def _post_command_messages() -> None:
|
|
60
|
+
maybe_show_cloud_promo(ctx.invoked_subcommand)
|
|
61
|
+
maybe_run_periodic_auto_update(ctx.invoked_subcommand)
|
|
62
|
+
|
|
63
|
+
ctx.call_on_close(_post_command_messages)
|
|
59
64
|
|
|
60
65
|
# Run initialization for commands that don't use the API
|
|
61
66
|
# Skip for 'mcp' command - it has its own lifespan that handles initialization
|
|
@@ -70,6 +75,7 @@ def app_callback(
|
|
|
70
75
|
"tool",
|
|
71
76
|
"reset",
|
|
72
77
|
"reindex",
|
|
78
|
+
"update",
|
|
73
79
|
"watch",
|
|
74
80
|
}
|
|
75
81
|
if (
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"""Automatic update checks and upgrades for the Basic Memory CLI."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
import urllib.error
|
|
9
|
+
import urllib.request
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from datetime import datetime, timedelta
|
|
12
|
+
from enum import Enum
|
|
13
|
+
|
|
14
|
+
from loguru import logger
|
|
15
|
+
from packaging.version import InvalidVersion, Version
|
|
16
|
+
from rich.console import Console
|
|
17
|
+
|
|
18
|
+
import basic_memory
|
|
19
|
+
from basic_memory.config import ConfigManager
|
|
20
|
+
|
|
21
|
+
PACKAGE_NAME = "basic-memory"
|
|
22
|
+
PYPI_JSON_URL = "https://pypi.org/pypi/basic-memory/json"
|
|
23
|
+
|
|
24
|
+
PYPI_TIMEOUT_SECONDS = 5
|
|
25
|
+
BREW_OUTDATED_TIMEOUT_SECONDS = 15
|
|
26
|
+
UV_UPGRADE_TIMEOUT_SECONDS = 180
|
|
27
|
+
BREW_UPGRADE_TIMEOUT_SECONDS = 600
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class InstallSource(str, Enum):
|
|
31
|
+
"""How the running CLI appears to have been installed."""
|
|
32
|
+
|
|
33
|
+
HOMEBREW = "homebrew"
|
|
34
|
+
UV_TOOL = "uv_tool"
|
|
35
|
+
UVX = "uvx"
|
|
36
|
+
UNKNOWN = "unknown"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AutoUpdateStatus(str, Enum):
|
|
40
|
+
"""Result classification for update checks and installs."""
|
|
41
|
+
|
|
42
|
+
SKIPPED = "skipped"
|
|
43
|
+
UP_TO_DATE = "up_to_date"
|
|
44
|
+
UPDATE_AVAILABLE = "update_available"
|
|
45
|
+
UPDATED = "updated"
|
|
46
|
+
FAILED = "failed"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass(frozen=True)
|
|
50
|
+
class AutoUpdateResult:
|
|
51
|
+
"""Structured result for update checks/install attempts."""
|
|
52
|
+
|
|
53
|
+
status: AutoUpdateStatus
|
|
54
|
+
source: InstallSource
|
|
55
|
+
checked: bool
|
|
56
|
+
update_available: bool
|
|
57
|
+
updated: bool
|
|
58
|
+
latest_version: str | None = None
|
|
59
|
+
message: str | None = None
|
|
60
|
+
error: str | None = None
|
|
61
|
+
restart_recommended: bool = False
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def detect_install_source(executable: str | None = None) -> InstallSource:
|
|
65
|
+
"""Infer installation source from the active interpreter path."""
|
|
66
|
+
active_executable = executable or sys.executable
|
|
67
|
+
normalized = active_executable.lower().replace("\\", "/")
|
|
68
|
+
|
|
69
|
+
if "cellar/basic-memory" in normalized:
|
|
70
|
+
return InstallSource.HOMEBREW
|
|
71
|
+
if "uv/tools/basic-memory" in normalized:
|
|
72
|
+
return InstallSource.UV_TOOL
|
|
73
|
+
if "/uv/archive-" in normalized:
|
|
74
|
+
return InstallSource.UVX
|
|
75
|
+
return InstallSource.UNKNOWN
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _is_interactive_session() -> bool:
|
|
79
|
+
"""Return whether stdin/stdout are interactive terminals."""
|
|
80
|
+
try:
|
|
81
|
+
return sys.stdin.isatty() and sys.stdout.isatty()
|
|
82
|
+
except ValueError:
|
|
83
|
+
# Trigger: stdin/stdout may be closed during transport teardown.
|
|
84
|
+
# Why: isatty() raises ValueError on closed descriptors.
|
|
85
|
+
# Outcome: treat as non-interactive and suppress periodic output.
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _run_subprocess(
|
|
90
|
+
command: list[str],
|
|
91
|
+
*,
|
|
92
|
+
timeout_seconds: int,
|
|
93
|
+
silent: bool,
|
|
94
|
+
capture_output: bool,
|
|
95
|
+
) -> subprocess.CompletedProcess[str]:
|
|
96
|
+
"""Run a subprocess with explicit stdio behavior for protocol safety."""
|
|
97
|
+
# Trigger: silent operation (MCP/background) with no need for subprocess output.
|
|
98
|
+
# Why: prevent protocol/terminal pollution from child process output.
|
|
99
|
+
# Outcome: stdout/stderr are discarded unless explicit capture is requested.
|
|
100
|
+
use_devnull = silent and not capture_output
|
|
101
|
+
stdout_target = subprocess.DEVNULL if use_devnull else subprocess.PIPE
|
|
102
|
+
stderr_target = subprocess.DEVNULL if use_devnull else subprocess.PIPE
|
|
103
|
+
|
|
104
|
+
return subprocess.run(
|
|
105
|
+
command,
|
|
106
|
+
stdin=subprocess.DEVNULL,
|
|
107
|
+
stdout=stdout_target,
|
|
108
|
+
stderr=stderr_target,
|
|
109
|
+
text=True,
|
|
110
|
+
timeout=timeout_seconds,
|
|
111
|
+
check=False,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _version_from_pypi() -> str:
|
|
116
|
+
"""Fetch the latest published package version from PyPI."""
|
|
117
|
+
request = urllib.request.Request(
|
|
118
|
+
PYPI_JSON_URL,
|
|
119
|
+
headers={"User-Agent": f"basic-memory-cli/{basic_memory.__version__}"},
|
|
120
|
+
)
|
|
121
|
+
with urllib.request.urlopen(request, timeout=PYPI_TIMEOUT_SECONDS) as response:
|
|
122
|
+
payload = json.loads(response.read().decode("utf-8"))
|
|
123
|
+
latest = payload.get("info", {}).get("version")
|
|
124
|
+
if not latest:
|
|
125
|
+
raise RuntimeError("PyPI JSON response did not include info.version")
|
|
126
|
+
return str(latest)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _check_homebrew_update_available(silent: bool) -> tuple[bool, str | None]:
|
|
130
|
+
"""Check whether Homebrew reports an outdated basic-memory formula."""
|
|
131
|
+
result = _run_subprocess(
|
|
132
|
+
["brew", "outdated", "--quiet", PACKAGE_NAME],
|
|
133
|
+
timeout_seconds=BREW_OUTDATED_TIMEOUT_SECONDS,
|
|
134
|
+
silent=silent,
|
|
135
|
+
capture_output=True,
|
|
136
|
+
)
|
|
137
|
+
if result.returncode != 0:
|
|
138
|
+
stderr = (result.stderr or "").strip()
|
|
139
|
+
stdout = (result.stdout or "").strip()
|
|
140
|
+
detail = stderr or stdout or "brew outdated failed"
|
|
141
|
+
raise RuntimeError(detail)
|
|
142
|
+
|
|
143
|
+
is_outdated = bool((result.stdout or "").strip())
|
|
144
|
+
return is_outdated, None
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _check_pypi_update_available() -> tuple[bool, str]:
|
|
148
|
+
"""Compare installed package version with PyPI latest version."""
|
|
149
|
+
latest = _version_from_pypi()
|
|
150
|
+
try:
|
|
151
|
+
current_version = Version(basic_memory.__version__)
|
|
152
|
+
latest_version = Version(latest)
|
|
153
|
+
except InvalidVersion as exc:
|
|
154
|
+
raise RuntimeError(
|
|
155
|
+
f"Could not compare versions (current={basic_memory.__version__}, latest={latest})"
|
|
156
|
+
) from exc
|
|
157
|
+
|
|
158
|
+
return latest_version > current_version, latest
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _manual_update_hint(source: InstallSource) -> str:
|
|
162
|
+
"""Return manager-appropriate manual update instructions."""
|
|
163
|
+
if source == InstallSource.UV_TOOL:
|
|
164
|
+
return "Run `uv tool upgrade basic-memory`."
|
|
165
|
+
if source == InstallSource.HOMEBREW:
|
|
166
|
+
return "Run `brew upgrade basic-memory`."
|
|
167
|
+
return (
|
|
168
|
+
"Automatic install is not supported for this environment. "
|
|
169
|
+
"Update with your package manager (for pip: `python3 -m pip install -U basic-memory`)."
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def _save_last_checked_timestamp(config_manager: ConfigManager, checked_at: datetime) -> None:
|
|
174
|
+
"""Persist the timestamp for the most recent attempted update check."""
|
|
175
|
+
config = config_manager.load_config()
|
|
176
|
+
config.auto_update_last_checked_at = checked_at
|
|
177
|
+
config_manager.save_config(config)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def run_auto_update(
|
|
181
|
+
*,
|
|
182
|
+
force: bool = False,
|
|
183
|
+
check_only: bool = False,
|
|
184
|
+
silent: bool = False,
|
|
185
|
+
config_manager: ConfigManager | None = None,
|
|
186
|
+
now: datetime | None = None,
|
|
187
|
+
executable: str | None = None,
|
|
188
|
+
) -> AutoUpdateResult:
|
|
189
|
+
"""Run update check/install flow and return a structured result."""
|
|
190
|
+
manager = config_manager or ConfigManager()
|
|
191
|
+
config = manager.load_config()
|
|
192
|
+
source = detect_install_source(executable)
|
|
193
|
+
checked_at = now or datetime.now()
|
|
194
|
+
|
|
195
|
+
if source == InstallSource.UVX:
|
|
196
|
+
return AutoUpdateResult(
|
|
197
|
+
status=AutoUpdateStatus.SKIPPED,
|
|
198
|
+
source=source,
|
|
199
|
+
checked=False,
|
|
200
|
+
update_available=False,
|
|
201
|
+
updated=False,
|
|
202
|
+
message="uvx runtime detected; updates are managed by uvx cache resolution.",
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
if not force and not config.auto_update:
|
|
206
|
+
return AutoUpdateResult(
|
|
207
|
+
status=AutoUpdateStatus.SKIPPED,
|
|
208
|
+
source=source,
|
|
209
|
+
checked=False,
|
|
210
|
+
update_available=False,
|
|
211
|
+
updated=False,
|
|
212
|
+
message="Auto-update is disabled in config.",
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
if not force and config.auto_update_last_checked_at is not None:
|
|
216
|
+
try:
|
|
217
|
+
elapsed = checked_at - config.auto_update_last_checked_at
|
|
218
|
+
except TypeError:
|
|
219
|
+
# Trigger: mixed naive/aware datetimes from manual config edits.
|
|
220
|
+
# Why: datetime subtraction fails for mixed tz-awareness.
|
|
221
|
+
# Outcome: ignore the gate once and continue with a forced check path.
|
|
222
|
+
logger.warning("Auto-update interval gate skipped due to incompatible timestamp format")
|
|
223
|
+
else:
|
|
224
|
+
if elapsed < timedelta(seconds=config.update_check_interval):
|
|
225
|
+
return AutoUpdateResult(
|
|
226
|
+
status=AutoUpdateStatus.SKIPPED,
|
|
227
|
+
source=source,
|
|
228
|
+
checked=False,
|
|
229
|
+
update_available=False,
|
|
230
|
+
updated=False,
|
|
231
|
+
message="Update check interval has not elapsed.",
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
# --- Availability check ---
|
|
236
|
+
latest_version: str | None = None
|
|
237
|
+
if source == InstallSource.HOMEBREW:
|
|
238
|
+
update_available, latest_version = _check_homebrew_update_available(silent=silent)
|
|
239
|
+
else:
|
|
240
|
+
update_available, latest_version = _check_pypi_update_available()
|
|
241
|
+
|
|
242
|
+
if not update_available:
|
|
243
|
+
return AutoUpdateResult(
|
|
244
|
+
status=AutoUpdateStatus.UP_TO_DATE,
|
|
245
|
+
source=source,
|
|
246
|
+
checked=True,
|
|
247
|
+
update_available=False,
|
|
248
|
+
updated=False,
|
|
249
|
+
latest_version=latest_version,
|
|
250
|
+
message=f"Basic Memory is up to date ({basic_memory.__version__}).",
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
if check_only:
|
|
254
|
+
return AutoUpdateResult(
|
|
255
|
+
status=AutoUpdateStatus.UPDATE_AVAILABLE,
|
|
256
|
+
source=source,
|
|
257
|
+
checked=True,
|
|
258
|
+
update_available=True,
|
|
259
|
+
updated=False,
|
|
260
|
+
latest_version=latest_version,
|
|
261
|
+
message=(
|
|
262
|
+
f"Update available (latest: {latest_version or 'unknown'}). "
|
|
263
|
+
f"{_manual_update_hint(source)}"
|
|
264
|
+
),
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
if source == InstallSource.UNKNOWN:
|
|
268
|
+
return AutoUpdateResult(
|
|
269
|
+
status=AutoUpdateStatus.UPDATE_AVAILABLE,
|
|
270
|
+
source=source,
|
|
271
|
+
checked=True,
|
|
272
|
+
update_available=True,
|
|
273
|
+
updated=False,
|
|
274
|
+
latest_version=latest_version,
|
|
275
|
+
message=(
|
|
276
|
+
f"Update available (latest: {latest_version or 'unknown'}). "
|
|
277
|
+
f"{_manual_update_hint(source)}"
|
|
278
|
+
),
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
# --- Automatic install ---
|
|
282
|
+
command = (
|
|
283
|
+
["uv", "tool", "upgrade", PACKAGE_NAME]
|
|
284
|
+
if source == InstallSource.UV_TOOL
|
|
285
|
+
else ["brew", "upgrade", PACKAGE_NAME]
|
|
286
|
+
)
|
|
287
|
+
timeout = (
|
|
288
|
+
UV_UPGRADE_TIMEOUT_SECONDS
|
|
289
|
+
if source == InstallSource.UV_TOOL
|
|
290
|
+
else BREW_UPGRADE_TIMEOUT_SECONDS
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
install_result = _run_subprocess(
|
|
294
|
+
command,
|
|
295
|
+
timeout_seconds=timeout,
|
|
296
|
+
silent=silent,
|
|
297
|
+
capture_output=not silent,
|
|
298
|
+
)
|
|
299
|
+
if install_result.returncode != 0:
|
|
300
|
+
stderr = (install_result.stderr or "").strip() if install_result.stderr else ""
|
|
301
|
+
stdout = (install_result.stdout or "").strip() if install_result.stdout else ""
|
|
302
|
+
detail = stderr or stdout or "update command failed"
|
|
303
|
+
return AutoUpdateResult(
|
|
304
|
+
status=AutoUpdateStatus.FAILED,
|
|
305
|
+
source=source,
|
|
306
|
+
checked=True,
|
|
307
|
+
update_available=True,
|
|
308
|
+
updated=False,
|
|
309
|
+
latest_version=latest_version,
|
|
310
|
+
message="Automatic update failed.",
|
|
311
|
+
error=detail,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return AutoUpdateResult(
|
|
315
|
+
status=AutoUpdateStatus.UPDATED,
|
|
316
|
+
source=source,
|
|
317
|
+
checked=True,
|
|
318
|
+
update_available=True,
|
|
319
|
+
updated=True,
|
|
320
|
+
latest_version=latest_version,
|
|
321
|
+
message=(
|
|
322
|
+
"Basic Memory was updated successfully. "
|
|
323
|
+
"Restart running sessions to use the new version."
|
|
324
|
+
),
|
|
325
|
+
restart_recommended=True,
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
except (
|
|
329
|
+
RuntimeError,
|
|
330
|
+
urllib.error.URLError,
|
|
331
|
+
ValueError,
|
|
332
|
+
TimeoutError,
|
|
333
|
+
subprocess.SubprocessError,
|
|
334
|
+
OSError,
|
|
335
|
+
) as exc:
|
|
336
|
+
logger.warning(f"Auto-update check failed: {exc}")
|
|
337
|
+
return AutoUpdateResult(
|
|
338
|
+
status=AutoUpdateStatus.FAILED,
|
|
339
|
+
source=source,
|
|
340
|
+
checked=True,
|
|
341
|
+
update_available=False,
|
|
342
|
+
updated=False,
|
|
343
|
+
message="Automatic update check failed.",
|
|
344
|
+
error=str(exc),
|
|
345
|
+
)
|
|
346
|
+
finally:
|
|
347
|
+
# Trigger: we attempted a check path (including failures).
|
|
348
|
+
# Why: repeated failing checks on every command create noise and unnecessary network load.
|
|
349
|
+
# Outcome: next periodic check is gated by update_check_interval.
|
|
350
|
+
try:
|
|
351
|
+
_save_last_checked_timestamp(manager, checked_at)
|
|
352
|
+
except Exception as exc: # pragma: no cover
|
|
353
|
+
logger.warning(f"Failed to persist auto-update timestamp: {exc}")
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def maybe_run_periodic_auto_update(
|
|
357
|
+
invoked_subcommand: str | None,
|
|
358
|
+
*,
|
|
359
|
+
config_manager: ConfigManager | None = None,
|
|
360
|
+
is_interactive: bool | None = None,
|
|
361
|
+
console: Console | None = None,
|
|
362
|
+
) -> AutoUpdateResult | None:
|
|
363
|
+
"""Run a periodic auto-update check for interactive CLI sessions."""
|
|
364
|
+
interactive = _is_interactive_session() if is_interactive is None else is_interactive
|
|
365
|
+
if not interactive:
|
|
366
|
+
return None
|
|
367
|
+
if invoked_subcommand in {None, "mcp", "update"}:
|
|
368
|
+
return None
|
|
369
|
+
|
|
370
|
+
result = run_auto_update(
|
|
371
|
+
force=False,
|
|
372
|
+
check_only=False,
|
|
373
|
+
silent=False,
|
|
374
|
+
config_manager=config_manager,
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
if result.status in {
|
|
378
|
+
AutoUpdateStatus.UPDATE_AVAILABLE,
|
|
379
|
+
AutoUpdateStatus.UPDATED,
|
|
380
|
+
AutoUpdateStatus.FAILED,
|
|
381
|
+
}:
|
|
382
|
+
out = console or Console()
|
|
383
|
+
if result.status == AutoUpdateStatus.UPDATED:
|
|
384
|
+
out.print(f"[green]{result.message}[/green]")
|
|
385
|
+
elif result.status == AutoUpdateStatus.FAILED:
|
|
386
|
+
error_detail = f" {result.error}" if result.error else ""
|
|
387
|
+
out.print(f"[yellow]{result.message}{error_detail}[/yellow]")
|
|
388
|
+
elif result.message:
|
|
389
|
+
out.print(f"[cyan]{result.message}[/cyan]")
|
|
390
|
+
|
|
391
|
+
return result
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"""MCP server command with streamable HTTP transport."""
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
import threading
|
|
4
5
|
from typing import Any, Optional
|
|
5
6
|
|
|
6
7
|
import typer
|
|
7
8
|
from loguru import logger
|
|
8
9
|
|
|
9
10
|
from basic_memory.cli.app import app
|
|
11
|
+
from basic_memory.cli.auto_update import AutoUpdateStatus, run_auto_update
|
|
10
12
|
from basic_memory.config import ConfigManager, init_mcp_logging
|
|
11
13
|
|
|
12
14
|
|
|
@@ -80,6 +82,22 @@ def mcp(
|
|
|
80
82
|
os.environ["BASIC_MEMORY_MCP_PROJECT"] = project_name
|
|
81
83
|
logger.info(f"MCP server constrained to project: {project_name}")
|
|
82
84
|
|
|
85
|
+
def _run_background_auto_update() -> None:
|
|
86
|
+
result = run_auto_update(force=False, check_only=False, silent=True)
|
|
87
|
+
if result.restart_recommended:
|
|
88
|
+
logger.info(
|
|
89
|
+
"A newer Basic Memory version was installed and will apply on next restart."
|
|
90
|
+
)
|
|
91
|
+
elif result.status == AutoUpdateStatus.FAILED and result.error:
|
|
92
|
+
logger.warning(f"MCP background auto-update failed: {result.error}")
|
|
93
|
+
|
|
94
|
+
# Trigger: stdio transport corresponds to local user installs.
|
|
95
|
+
# Why: server transports (HTTP/SSE) run in managed environments where
|
|
96
|
+
# package-manager self-upgrades are inappropriate.
|
|
97
|
+
# Outcome: background auto-update runs only for local stdio MCP sessions.
|
|
98
|
+
if transport == "stdio":
|
|
99
|
+
threading.Thread(target=_run_background_auto_update, daemon=True).start()
|
|
100
|
+
|
|
83
101
|
# Run the MCP server (blocks)
|
|
84
102
|
# Lifespan handles: initialization, migrations, file sync, cleanup
|
|
85
103
|
logger.info(f"Starting MCP server with {transport.upper()} transport")
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Manual update command for Basic Memory CLI."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
|
|
6
|
+
from basic_memory.cli.app import app
|
|
7
|
+
from basic_memory.cli.auto_update import AutoUpdateStatus, run_auto_update
|
|
8
|
+
|
|
9
|
+
console = Console()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("update")
|
|
13
|
+
def update(
|
|
14
|
+
check: bool = typer.Option(
|
|
15
|
+
False,
|
|
16
|
+
"--check",
|
|
17
|
+
help="Check for updates only (do not install).",
|
|
18
|
+
),
|
|
19
|
+
) -> None:
|
|
20
|
+
"""Check for updates and install when supported."""
|
|
21
|
+
result = run_auto_update(force=True, check_only=check, silent=False)
|
|
22
|
+
|
|
23
|
+
if result.status == AutoUpdateStatus.FAILED:
|
|
24
|
+
detail = f" {result.error}" if result.error else ""
|
|
25
|
+
console.print(f"[red]{result.message or 'Update failed.'}{detail}[/red]")
|
|
26
|
+
raise typer.Exit(1)
|
|
27
|
+
|
|
28
|
+
if result.status == AutoUpdateStatus.UPDATED:
|
|
29
|
+
console.print(f"[green]{result.message or 'Basic Memory updated successfully.'}[/green]")
|
|
30
|
+
return
|
|
31
|
+
|
|
32
|
+
if result.status == AutoUpdateStatus.UP_TO_DATE:
|
|
33
|
+
console.print(f"[green]{result.message or 'Basic Memory is up to date.'}[/green]")
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
if result.status == AutoUpdateStatus.UPDATE_AVAILABLE:
|
|
37
|
+
console.print(f"[cyan]{result.message or 'Update available.'}[/cyan]")
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
console.print(f"[dim]{result.message or 'No update action was performed.'}[/dim]")
|