basic-memory 0.19.1__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.1 → basic_memory-0.20.0}/CHANGELOG.md +25 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/PKG-INFO +31 -1
- {basic_memory-0.19.1 → basic_memory-0.20.0}/README.md +30 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/llms-install.md +17 -1
- {basic_memory-0.19.1 → basic_memory-0.20.0}/server.json +2 -2
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.19.1 → 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.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/__init__.py +2 -0
- {basic_memory-0.19.1 → 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.1 → basic_memory-0.20.0}/src/basic_memory/cli/main.py +1 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/config.py +16 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/canvas.py +5 -3
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/search.py +12 -2
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/write_note.py +4 -3
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/search_repository_base.py +24 -9
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/project_service.py +70 -44
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/utils.py +63 -3
- basic_memory-0.20.0/test-int/mcp/test_string_params_integration.py +167 -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.1 → basic_memory-0.20.0}/tests/repository/test_semantic_search_base.py +23 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_project_service_embedding_status.py +41 -0
- basic_memory-0.20.0/tests/test_coerce.py +58 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_config.py +44 -0
- basic_memory-0.20.0/tests/utils/test_setup_logging.py +162 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/spec.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.claude/settings.json +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.dockerignore +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.env.example +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/dependabot.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/release.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.github/workflows/test.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.gitignore +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/.python-version +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/AGENTS.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/CITATION.cff +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/CLA.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/CLAUDE.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/CONTRIBUTING.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/Dockerfile +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/LICENSE +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/SECURITY.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docker-compose.yml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/Docker.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/character-handling.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/cloud-cli.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/metadata-search.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/semantic-search.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/docs/testing-coverage.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/justfile +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/pyproject.toml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/smithery.yaml +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.19.1 → 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.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.19.1 → 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.1 → 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.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.19.1 → 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.1 → basic_memory-0.20.0}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/db.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/report.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/README.md +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/Screenshot.png +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_json_output.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_project_list_and_ls.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_project_set_cloud_local.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/cli/test_workspace_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_workspace_management.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/__init__.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_deps.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/test_runtime.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.19.1 → 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.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/ui/tool-ui-react/tailwind.config.js +0 -0
- {basic_memory-0.19.1 → basic_memory-0.20.0}/uv.lock +0 -0
|
@@ -2,6 +2,31 @@
|
|
|
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
|
+
|
|
18
|
+
## v0.19.2 (2026-03-09)
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
- **#657**: Coerce string params to list/dict in MCP tools
|
|
23
|
+
- MCP clients that serialize `list`/`dict` arguments as JSON strings no longer fail Pydantic validation
|
|
24
|
+
- Adds `BeforeValidator` coercion to `search_notes` (`entity_types`, `note_types`, `tags`, `metadata_filters`), `write_note` (`metadata`), and `canvas` (`nodes`, `edges`)
|
|
25
|
+
- **#655**: Handle SQLite and Windows semantic search regressions
|
|
26
|
+
- Fix embedding status query for non-semantic SQLite databases
|
|
27
|
+
- Windows-safe log file rotation with per-process log filenames
|
|
28
|
+
- Robust `setup_logging` that handles all environments cleanly
|
|
29
|
+
|
|
5
30
|
## v0.19.1 (2026-03-08)
|
|
6
31
|
|
|
7
32
|
### 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]")
|