basic-memory 0.20.0__tar.gz → 0.20.1__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.20.0 → basic_memory-0.20.1}/CHANGELOG.md +13 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/PKG-INFO +1 -1
- {basic_memory-0.20.0 → basic_memory-0.20.1}/server.json +2 -2
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/project.py +14 -3
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/config.py +47 -5
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_json_output.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_project_add_with_local_path.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_project_list_and_ls.py +5 -2
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_project_set_cloud_local.py +24 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_workspace_commands.py +4 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note.py +8 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_project_service.py +10 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_config.py +126 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/spec.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.claude/settings.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.dockerignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.env.example +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/dependabot.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/release.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.github/workflows/test.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.gitignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/.python-version +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/AGENTS.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/CITATION.cff +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/CLA.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/CLAUDE.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/CONTRIBUTING.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/Dockerfile +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/LICENSE +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/README.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/SECURITY.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docker-compose.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/Docker.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/character-handling.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/cloud-cli.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/metadata-search.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/semantic-search.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/docs/testing-coverage.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/justfile +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/llms-install.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/pyproject.toml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/smithery.yaml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/auto_update.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/commands/update.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_string_params_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/report.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/README.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/Screenshot.png +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_auto_update.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_update_command.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_workspace_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_semantic_search_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_project_service_embedding_status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_coerce.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_deps.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/test_runtime.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_setup_logging.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/ui/tool-ui-react/tailwind.config.js +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.1}/uv.lock +0 -0
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.20.1 (2026-03-10)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **#661**: Fix `bm project list` MCP column to show transport type (stdio/https) instead of DB presence
|
|
10
|
+
- Renamed "MCP (stdio)" column to "MCP"
|
|
11
|
+
- Shows actual routing mode: `stdio` for local, `https` for cloud projects
|
|
12
|
+
- Clears local path display for cloud-mode projects
|
|
13
|
+
- **#662**: Invalidate config cache when file is modified by another process
|
|
14
|
+
- Adds mtime-based cache validation to `ConfigManager.load_config()`
|
|
15
|
+
- Long-lived processes (MCP stdio server) now detect external config changes
|
|
16
|
+
- Fixes `bm project set-cloud` having no effect on running MCP server
|
|
17
|
+
|
|
5
18
|
## v0.20.0 (2026-03-10)
|
|
6
19
|
|
|
7
20
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.1
|
|
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
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/basicmachines-co/basic-memory.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.20.
|
|
9
|
+
"version": "0.20.1",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.20.
|
|
14
|
+
"version": "0.20.1",
|
|
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.20.
|
|
4
|
+
__version__ = "0.20.1"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -128,7 +128,7 @@ def list_projects(
|
|
|
128
128
|
table.add_column("Cloud Path", style="green")
|
|
129
129
|
table.add_column("Workspace", style="green")
|
|
130
130
|
table.add_column("CLI Route", style="blue")
|
|
131
|
-
table.add_column("MCP
|
|
131
|
+
table.add_column("MCP", style="blue")
|
|
132
132
|
table.add_column("Sync", style="green")
|
|
133
133
|
table.add_column("Default", style="magenta")
|
|
134
134
|
|
|
@@ -164,6 +164,11 @@ def list_projects(
|
|
|
164
164
|
elif entry and entry.mode == ProjectMode.LOCAL and entry.path:
|
|
165
165
|
local_path = format_path(normalize_project_path(entry.path))
|
|
166
166
|
|
|
167
|
+
# Clear local path for cloud-mode projects — only local projects
|
|
168
|
+
# should display a local path
|
|
169
|
+
if entry and entry.mode == ProjectMode.CLOUD:
|
|
170
|
+
local_path = ""
|
|
171
|
+
|
|
167
172
|
cloud_path = ""
|
|
168
173
|
if cloud_project is not None:
|
|
169
174
|
cloud_path = normalize_project_path(cloud_project.path)
|
|
@@ -182,7 +187,13 @@ def list_projects(
|
|
|
182
187
|
is_default = config.default_project == project_name
|
|
183
188
|
|
|
184
189
|
has_sync = bool(entry and entry.local_sync_path)
|
|
185
|
-
|
|
190
|
+
# Determine MCP transport based on project routing mode
|
|
191
|
+
if entry and entry.mode == ProjectMode.CLOUD:
|
|
192
|
+
mcp_transport = "https"
|
|
193
|
+
elif entry is None and cloud_project is not None:
|
|
194
|
+
mcp_transport = "https"
|
|
195
|
+
else:
|
|
196
|
+
mcp_transport = "stdio"
|
|
186
197
|
|
|
187
198
|
# Show workspace name (type) for cloud-sourced projects
|
|
188
199
|
ws_label = ""
|
|
@@ -195,7 +206,7 @@ def list_projects(
|
|
|
195
206
|
"local_path": local_path,
|
|
196
207
|
"cloud_path": cloud_path,
|
|
197
208
|
"cli_route": cli_route,
|
|
198
|
-
"mcp_stdio":
|
|
209
|
+
"mcp_stdio": mcp_transport,
|
|
199
210
|
"sync": has_sync,
|
|
200
211
|
"is_default": is_default,
|
|
201
212
|
}
|
|
@@ -645,6 +645,12 @@ class BasicMemoryConfig(BaseSettings):
|
|
|
645
645
|
|
|
646
646
|
# Module-level cache for configuration
|
|
647
647
|
_CONFIG_CACHE: Optional[BasicMemoryConfig] = None
|
|
648
|
+
# Track config file mtime+size so cross-process changes (e.g. `bm project set-cloud`
|
|
649
|
+
# in a separate terminal) invalidate the cache in long-lived processes like the
|
|
650
|
+
# MCP stdio server. Using both mtime and size guards against coarse-granularity
|
|
651
|
+
# filesystems where two writes within the same second share the same mtime.
|
|
652
|
+
_CONFIG_MTIME: Optional[float] = None
|
|
653
|
+
_CONFIG_SIZE: Optional[int] = None
|
|
648
654
|
|
|
649
655
|
|
|
650
656
|
class ConfigManager:
|
|
@@ -678,13 +684,38 @@ class ConfigManager:
|
|
|
678
684
|
Environment variables take precedence over file config values,
|
|
679
685
|
following Pydantic Settings best practices.
|
|
680
686
|
|
|
681
|
-
Uses module-level cache
|
|
687
|
+
Uses module-level cache with file mtime validation so that
|
|
688
|
+
cross-process config changes (e.g. `bm project set-cloud` in a
|
|
689
|
+
separate terminal) are picked up by long-lived processes like
|
|
690
|
+
the MCP stdio server.
|
|
682
691
|
"""
|
|
683
|
-
global _CONFIG_CACHE
|
|
692
|
+
global _CONFIG_CACHE, _CONFIG_MTIME, _CONFIG_SIZE
|
|
684
693
|
|
|
685
|
-
#
|
|
694
|
+
# Trigger: cached config exists but the on-disk file may have been
|
|
695
|
+
# modified by another process (CLI command in a different terminal).
|
|
696
|
+
# Why: the MCP server is long-lived; without this check it would
|
|
697
|
+
# serve stale project routing forever.
|
|
698
|
+
# Outcome: cheap os.stat() per access; re-read only when mtime or size differs.
|
|
686
699
|
if _CONFIG_CACHE is not None:
|
|
687
|
-
|
|
700
|
+
try:
|
|
701
|
+
st = self.config_file.stat()
|
|
702
|
+
current_mtime = st.st_mtime
|
|
703
|
+
current_size = st.st_size
|
|
704
|
+
except OSError:
|
|
705
|
+
current_mtime = None
|
|
706
|
+
current_size = None
|
|
707
|
+
|
|
708
|
+
if (
|
|
709
|
+
current_mtime is not None
|
|
710
|
+
and current_mtime == _CONFIG_MTIME
|
|
711
|
+
and current_size == _CONFIG_SIZE
|
|
712
|
+
):
|
|
713
|
+
return _CONFIG_CACHE
|
|
714
|
+
|
|
715
|
+
# mtime/size changed or file gone — invalidate and fall through to re-read
|
|
716
|
+
_CONFIG_CACHE = None
|
|
717
|
+
_CONFIG_MTIME = None
|
|
718
|
+
_CONFIG_SIZE = None
|
|
688
719
|
|
|
689
720
|
if self.config_file.exists():
|
|
690
721
|
try:
|
|
@@ -739,6 +770,15 @@ class ConfigManager:
|
|
|
739
770
|
|
|
740
771
|
_CONFIG_CACHE = BasicMemoryConfig(**merged_data)
|
|
741
772
|
|
|
773
|
+
# Record mtime+size so subsequent calls detect cross-process changes
|
|
774
|
+
try:
|
|
775
|
+
st = self.config_file.stat()
|
|
776
|
+
_CONFIG_MTIME = st.st_mtime
|
|
777
|
+
_CONFIG_SIZE = st.st_size
|
|
778
|
+
except OSError:
|
|
779
|
+
_CONFIG_MTIME = None
|
|
780
|
+
_CONFIG_SIZE = None
|
|
781
|
+
|
|
742
782
|
# Re-save to normalize legacy config into current format
|
|
743
783
|
if needs_resave:
|
|
744
784
|
# Create backup before overwriting so users can revert if needed
|
|
@@ -769,10 +809,12 @@ class ConfigManager:
|
|
|
769
809
|
|
|
770
810
|
def save_config(self, config: BasicMemoryConfig) -> None:
|
|
771
811
|
"""Save configuration to file and invalidate cache."""
|
|
772
|
-
global _CONFIG_CACHE
|
|
812
|
+
global _CONFIG_CACHE, _CONFIG_MTIME, _CONFIG_SIZE
|
|
773
813
|
save_basic_memory_config(self.config_file, config)
|
|
774
814
|
# Invalidate cache so next load_config() reads fresh data
|
|
775
815
|
_CONFIG_CACHE = None
|
|
816
|
+
_CONFIG_MTIME = None
|
|
817
|
+
_CONFIG_SIZE = None
|
|
776
818
|
|
|
777
819
|
@property
|
|
778
820
|
def projects(self) -> Dict[str, str]:
|
|
@@ -258,6 +258,8 @@ def config_manager(app_config: BasicMemoryConfig, config_home) -> ConfigManager:
|
|
|
258
258
|
from basic_memory import config as config_module
|
|
259
259
|
|
|
260
260
|
config_module._CONFIG_CACHE = None
|
|
261
|
+
config_module._CONFIG_MTIME = None
|
|
262
|
+
config_module._CONFIG_SIZE = None
|
|
261
263
|
|
|
262
264
|
config_manager = ConfigManager()
|
|
263
265
|
# Update its paths to use the test directory
|
|
@@ -25,6 +25,8 @@ def isolated_home(tmp_path, monkeypatch) -> Path:
|
|
|
25
25
|
from basic_memory import config as config_module
|
|
26
26
|
|
|
27
27
|
config_module._CONFIG_CACHE = None
|
|
28
|
+
config_module._CONFIG_MTIME = None
|
|
29
|
+
config_module._CONFIG_SIZE = None
|
|
28
30
|
|
|
29
31
|
monkeypatch.setenv("HOME", str(tmp_path))
|
|
30
32
|
if os.name == "nt":
|
|
@@ -350,6 +350,8 @@ def write_config(tmp_path, monkeypatch):
|
|
|
350
350
|
from basic_memory import config as config_module
|
|
351
351
|
|
|
352
352
|
config_module._CONFIG_CACHE = None
|
|
353
|
+
config_module._CONFIG_MTIME = None
|
|
354
|
+
config_module._CONFIG_SIZE = None
|
|
353
355
|
|
|
354
356
|
config_dir = tmp_path / ".basic-memory"
|
|
355
357
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -27,6 +27,8 @@ def mock_config(tmp_path, monkeypatch):
|
|
|
27
27
|
from basic_memory import config as config_module
|
|
28
28
|
|
|
29
29
|
config_module._CONFIG_CACHE = None
|
|
30
|
+
config_module._CONFIG_MTIME = None
|
|
31
|
+
config_module._CONFIG_SIZE = None
|
|
30
32
|
|
|
31
33
|
config_dir = tmp_path / ".basic-memory"
|
|
32
34
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -29,6 +29,8 @@ def write_config(tmp_path, monkeypatch):
|
|
|
29
29
|
from basic_memory import config as config_module
|
|
30
30
|
|
|
31
31
|
config_module._CONFIG_CACHE = None
|
|
32
|
+
config_module._CONFIG_MTIME = None
|
|
33
|
+
config_module._CONFIG_SIZE = None
|
|
32
34
|
|
|
33
35
|
config_dir = tmp_path / ".basic-memory"
|
|
34
36
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -122,15 +124,16 @@ def test_project_list_shows_local_cloud_presence_and_routes(
|
|
|
122
124
|
assert "Local Path" in result.stdout
|
|
123
125
|
assert "Cloud Path" in result.stdout
|
|
124
126
|
assert "CLI Route" in result.stdout
|
|
125
|
-
assert "MCP
|
|
127
|
+
assert "MCP" in result.stdout
|
|
126
128
|
|
|
127
129
|
lines = result.stdout.splitlines()
|
|
128
130
|
alpha_line = next(line for line in lines if "│ alpha" in line)
|
|
129
131
|
beta_line = next(line for line in lines if "│ beta" in line)
|
|
130
132
|
|
|
131
133
|
assert "local" in alpha_line # CLI route for alpha
|
|
134
|
+
assert "stdio" in alpha_line # Local projects use stdio transport
|
|
132
135
|
assert "cloud" in beta_line # CLI route for beta
|
|
133
|
-
assert "
|
|
136
|
+
assert "https" in beta_line # Cloud projects use HTTPS transport
|
|
134
137
|
assert "alpha-local" in result.stdout
|
|
135
138
|
assert "/alpha" in result.stdout
|
|
136
139
|
assert "/beta" in result.stdout
|
|
@@ -22,6 +22,8 @@ def mock_config(tmp_path, monkeypatch):
|
|
|
22
22
|
from basic_memory import config as config_module
|
|
23
23
|
|
|
24
24
|
config_module._CONFIG_CACHE = None
|
|
25
|
+
config_module._CONFIG_MTIME = None
|
|
26
|
+
config_module._CONFIG_SIZE = None
|
|
25
27
|
|
|
26
28
|
config_dir = tmp_path / ".basic-memory"
|
|
27
29
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -68,6 +70,8 @@ class TestSetCloud:
|
|
|
68
70
|
from basic_memory import config as config_module
|
|
69
71
|
|
|
70
72
|
config_module._CONFIG_CACHE = None
|
|
73
|
+
config_module._CONFIG_MTIME = None
|
|
74
|
+
config_module._CONFIG_SIZE = None
|
|
71
75
|
|
|
72
76
|
config_dir = tmp_path / ".basic-memory"
|
|
73
77
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -91,6 +95,8 @@ class TestSetCloud:
|
|
|
91
95
|
from basic_memory import config as config_module
|
|
92
96
|
|
|
93
97
|
config_module._CONFIG_CACHE = None
|
|
98
|
+
config_module._CONFIG_MTIME = None
|
|
99
|
+
config_module._CONFIG_SIZE = None
|
|
94
100
|
|
|
95
101
|
config_dir = tmp_path / ".basic-memory"
|
|
96
102
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -161,11 +167,15 @@ class TestSetLocal:
|
|
|
161
167
|
|
|
162
168
|
# Manually set workspace_id on the project
|
|
163
169
|
config_module._CONFIG_CACHE = None
|
|
170
|
+
config_module._CONFIG_MTIME = None
|
|
171
|
+
config_module._CONFIG_SIZE = None
|
|
164
172
|
config_data = json.loads(mock_config.read_text())
|
|
165
173
|
config_data["projects"]["research"]["mode"] = "cloud"
|
|
166
174
|
config_data["projects"]["research"]["workspace_id"] = "11111111-1111-1111-1111-111111111111"
|
|
167
175
|
mock_config.write_text(json.dumps(config_data, indent=2))
|
|
168
176
|
config_module._CONFIG_CACHE = None
|
|
177
|
+
config_module._CONFIG_MTIME = None
|
|
178
|
+
config_module._CONFIG_SIZE = None
|
|
169
179
|
|
|
170
180
|
# Set back to local
|
|
171
181
|
result = runner.invoke(app, ["project", "set-local", "research"])
|
|
@@ -173,6 +183,8 @@ class TestSetLocal:
|
|
|
173
183
|
|
|
174
184
|
# Verify workspace_id was cleared
|
|
175
185
|
config_module._CONFIG_CACHE = None
|
|
186
|
+
config_module._CONFIG_MTIME = None
|
|
187
|
+
config_module._CONFIG_SIZE = None
|
|
176
188
|
updated_data = json.loads(mock_config.read_text())
|
|
177
189
|
assert updated_data["projects"]["research"]["workspace_id"] is None
|
|
178
190
|
assert updated_data["projects"]["research"]["mode"] == "local"
|
|
@@ -187,6 +199,8 @@ class TestSetCloudWithWorkspace:
|
|
|
187
199
|
from basic_memory.schemas.cloud import WorkspaceInfo
|
|
188
200
|
|
|
189
201
|
config_module._CONFIG_CACHE = None
|
|
202
|
+
config_module._CONFIG_MTIME = None
|
|
203
|
+
config_module._CONFIG_SIZE = None
|
|
190
204
|
|
|
191
205
|
async def fake_get_available_workspaces():
|
|
192
206
|
return [
|
|
@@ -210,6 +224,8 @@ class TestSetCloudWithWorkspace:
|
|
|
210
224
|
|
|
211
225
|
# Verify workspace_id was persisted
|
|
212
226
|
config_module._CONFIG_CACHE = None
|
|
227
|
+
config_module._CONFIG_MTIME = None
|
|
228
|
+
config_module._CONFIG_SIZE = None
|
|
213
229
|
updated_data = json.loads(mock_config.read_text())
|
|
214
230
|
assert (
|
|
215
231
|
updated_data["projects"]["research"]["workspace_id"]
|
|
@@ -222,6 +238,8 @@ class TestSetCloudWithWorkspace:
|
|
|
222
238
|
from basic_memory.schemas.cloud import WorkspaceInfo
|
|
223
239
|
|
|
224
240
|
config_module._CONFIG_CACHE = None
|
|
241
|
+
config_module._CONFIG_MTIME = None
|
|
242
|
+
config_module._CONFIG_SIZE = None
|
|
225
243
|
|
|
226
244
|
async def fake_get_available_workspaces():
|
|
227
245
|
return [
|
|
@@ -249,17 +267,23 @@ class TestSetCloudWithWorkspace:
|
|
|
249
267
|
from basic_memory import config as config_module
|
|
250
268
|
|
|
251
269
|
config_module._CONFIG_CACHE = None
|
|
270
|
+
config_module._CONFIG_MTIME = None
|
|
271
|
+
config_module._CONFIG_SIZE = None
|
|
252
272
|
|
|
253
273
|
# Set default_workspace in config
|
|
254
274
|
config_data = json.loads(mock_config.read_text())
|
|
255
275
|
config_data["default_workspace"] = "global-default-tenant-id"
|
|
256
276
|
mock_config.write_text(json.dumps(config_data, indent=2))
|
|
257
277
|
config_module._CONFIG_CACHE = None
|
|
278
|
+
config_module._CONFIG_MTIME = None
|
|
279
|
+
config_module._CONFIG_SIZE = None
|
|
258
280
|
|
|
259
281
|
result = runner.invoke(app, ["project", "set-cloud", "research"])
|
|
260
282
|
assert result.exit_code == 0
|
|
261
283
|
|
|
262
284
|
# Verify workspace_id was set from default
|
|
263
285
|
config_module._CONFIG_CACHE = None
|
|
286
|
+
config_module._CONFIG_MTIME = None
|
|
287
|
+
config_module._CONFIG_SIZE = None
|
|
264
288
|
updated_data = json.loads(mock_config.read_text())
|
|
265
289
|
assert updated_data["projects"]["research"]["workspace_id"] == "global-default-tenant-id"
|
|
@@ -76,6 +76,8 @@ class TestWorkspaceSetDefault:
|
|
|
76
76
|
monkeypatch.setenv("HOME", str(temp_path))
|
|
77
77
|
monkeypatch.setenv("BASIC_MEMORY_CONFIG_DIR", str(config_dir))
|
|
78
78
|
basic_memory.config._CONFIG_CACHE = None
|
|
79
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
80
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
79
81
|
|
|
80
82
|
config_manager = ConfigManager()
|
|
81
83
|
test_config = BasicMemoryConfig(
|
|
@@ -106,6 +108,8 @@ class TestWorkspaceSetDefault:
|
|
|
106
108
|
|
|
107
109
|
# Verify config was updated
|
|
108
110
|
basic_memory.config._CONFIG_CACHE = None
|
|
111
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
112
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
109
113
|
config = ConfigManager().config
|
|
110
114
|
assert config.default_workspace == "11111111-1111-1111-1111-111111111111"
|
|
111
115
|
|
|
@@ -138,6 +138,8 @@ def config_manager(app_config: BasicMemoryConfig, config_home: Path, monkeypatch
|
|
|
138
138
|
from basic_memory import config as config_module
|
|
139
139
|
|
|
140
140
|
config_module._CONFIG_CACHE = None
|
|
141
|
+
config_module._CONFIG_MTIME = None
|
|
142
|
+
config_module._CONFIG_SIZE = None
|
|
141
143
|
|
|
142
144
|
# Create a new ConfigManager that uses the test home directory
|
|
143
145
|
config_manager = ConfigManager()
|
|
@@ -1257,6 +1257,11 @@ class TestWriteNoteOverwriteGuard:
|
|
|
1257
1257
|
# Set config to allow overwrites by default
|
|
1258
1258
|
app_config.write_note_overwrite_default = True
|
|
1259
1259
|
config_module._CONFIG_CACHE = app_config
|
|
1260
|
+
# Pin mtime+size to the on-disk file so the cache guard sees a match
|
|
1261
|
+
# and keeps our injected config instead of re-reading from disk.
|
|
1262
|
+
_st = config_manager.config_file.stat()
|
|
1263
|
+
config_module._CONFIG_MTIME = _st.st_mtime
|
|
1264
|
+
config_module._CONFIG_SIZE = _st.st_size
|
|
1260
1265
|
|
|
1261
1266
|
try:
|
|
1262
1267
|
await write_note(
|
|
@@ -1281,6 +1286,9 @@ class TestWriteNoteOverwriteGuard:
|
|
|
1281
1286
|
# Restore config
|
|
1282
1287
|
app_config.write_note_overwrite_default = False
|
|
1283
1288
|
config_module._CONFIG_CACHE = app_config
|
|
1289
|
+
_st = config_manager.config_file.stat()
|
|
1290
|
+
config_module._CONFIG_MTIME = _st.st_mtime
|
|
1291
|
+
config_module._CONFIG_SIZE = _st.st_size
|
|
1284
1292
|
|
|
1285
1293
|
@pytest.mark.asyncio
|
|
1286
1294
|
async def test_write_note_new_note_unaffected(self, app, test_project):
|
|
@@ -778,6 +778,8 @@ async def test_add_project_with_project_root_sanitizes_paths(
|
|
|
778
778
|
from basic_memory import config as config_module
|
|
779
779
|
|
|
780
780
|
config_module._CONFIG_CACHE = None
|
|
781
|
+
config_module._CONFIG_MTIME = None
|
|
782
|
+
config_module._CONFIG_SIZE = None
|
|
781
783
|
|
|
782
784
|
test_cases = [
|
|
783
785
|
# (project_name, user_path, expected_sanitized_name)
|
|
@@ -845,6 +847,8 @@ async def test_add_project_with_project_root_rejects_escape_attempts(
|
|
|
845
847
|
from basic_memory import config as config_module
|
|
846
848
|
|
|
847
849
|
config_module._CONFIG_CACHE = None
|
|
850
|
+
config_module._CONFIG_MTIME = None
|
|
851
|
+
config_module._CONFIG_SIZE = None
|
|
848
852
|
|
|
849
853
|
# All of these should succeed by being sanitized to paths under project_root
|
|
850
854
|
# The sanitization removes dangerous patterns, so they don't escape
|
|
@@ -931,6 +935,8 @@ async def test_add_project_with_project_root_normalizes_case(
|
|
|
931
935
|
from basic_memory import config as config_module
|
|
932
936
|
|
|
933
937
|
config_module._CONFIG_CACHE = None
|
|
938
|
+
config_module._CONFIG_MTIME = None
|
|
939
|
+
config_module._CONFIG_SIZE = None
|
|
934
940
|
|
|
935
941
|
test_cases = [
|
|
936
942
|
# (input_path, expected_normalized_path)
|
|
@@ -985,6 +991,8 @@ async def test_add_project_with_project_root_detects_case_collisions(
|
|
|
985
991
|
from basic_memory import config as config_module
|
|
986
992
|
|
|
987
993
|
config_module._CONFIG_CACHE = None
|
|
994
|
+
config_module._CONFIG_MTIME = None
|
|
995
|
+
config_module._CONFIG_SIZE = None
|
|
988
996
|
|
|
989
997
|
# First, create a project with lowercase path
|
|
990
998
|
first_project = "documents-project"
|
|
@@ -1159,6 +1167,8 @@ async def test_add_project_nested_validation_with_project_root(
|
|
|
1159
1167
|
from basic_memory import config as config_module
|
|
1160
1168
|
|
|
1161
1169
|
config_module._CONFIG_CACHE = None
|
|
1170
|
+
config_module._CONFIG_MTIME = None
|
|
1171
|
+
config_module._CONFIG_SIZE = None
|
|
1162
1172
|
|
|
1163
1173
|
parent_project_name = f"cloud-parent-{os.urandom(4).hex()}"
|
|
1164
1174
|
child_project_name = f"cloud-child-{os.urandom(4).hex()}"
|
|
@@ -213,6 +213,8 @@ class TestBasicMemoryConfig:
|
|
|
213
213
|
}
|
|
214
214
|
config_manager.config_file.write_text(json.dumps(config_data, indent=2))
|
|
215
215
|
basic_memory.config._CONFIG_CACHE = None
|
|
216
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
217
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
216
218
|
|
|
217
219
|
loaded = config_manager.load_config()
|
|
218
220
|
assert loaded.default_project == "research"
|
|
@@ -238,6 +240,8 @@ class TestBasicMemoryConfig:
|
|
|
238
240
|
}
|
|
239
241
|
config_manager.config_file.write_text(json.dumps(config_data, indent=2))
|
|
240
242
|
basic_memory.config._CONFIG_CACHE = None
|
|
243
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
244
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
241
245
|
|
|
242
246
|
loaded = config_manager.load_config()
|
|
243
247
|
assert loaded.default_project == "work"
|
|
@@ -545,6 +549,8 @@ class TestConfigManager:
|
|
|
545
549
|
import basic_memory.config
|
|
546
550
|
|
|
547
551
|
basic_memory.config._CONFIG_CACHE = None
|
|
552
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
553
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
548
554
|
|
|
549
555
|
# Should load successfully with migration to ProjectEntry
|
|
550
556
|
config = config_manager.load_config()
|
|
@@ -585,6 +591,8 @@ class TestConfigManager:
|
|
|
585
591
|
import basic_memory.config
|
|
586
592
|
|
|
587
593
|
basic_memory.config._CONFIG_CACHE = None
|
|
594
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
595
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
588
596
|
|
|
589
597
|
config = config_manager.load_config()
|
|
590
598
|
|
|
@@ -617,6 +625,8 @@ class TestConfigManager:
|
|
|
617
625
|
import basic_memory.config
|
|
618
626
|
|
|
619
627
|
basic_memory.config._CONFIG_CACHE = None
|
|
628
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
629
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
620
630
|
|
|
621
631
|
loaded = config_manager.load_config()
|
|
622
632
|
assert isinstance(loaded, BasicMemoryConfig)
|
|
@@ -647,6 +657,8 @@ class TestConfigManager:
|
|
|
647
657
|
import basic_memory.config
|
|
648
658
|
|
|
649
659
|
basic_memory.config._CONFIG_CACHE = None
|
|
660
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
661
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
650
662
|
|
|
651
663
|
config_manager.load_config()
|
|
652
664
|
|
|
@@ -678,6 +690,8 @@ class TestConfigManager:
|
|
|
678
690
|
import basic_memory.config
|
|
679
691
|
|
|
680
692
|
basic_memory.config._CONFIG_CACHE = None
|
|
693
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
694
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
681
695
|
|
|
682
696
|
config_manager.load_config()
|
|
683
697
|
|
|
@@ -1099,6 +1113,8 @@ class TestProjectMode:
|
|
|
1099
1113
|
import basic_memory.config
|
|
1100
1114
|
|
|
1101
1115
|
basic_memory.config._CONFIG_CACHE = None
|
|
1116
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
1117
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
1102
1118
|
|
|
1103
1119
|
# Should load successfully with migration
|
|
1104
1120
|
config = config_manager.load_config()
|
|
@@ -1174,6 +1190,116 @@ class TestProjectMode:
|
|
|
1174
1190
|
assert loaded.projects["main"].workspace_id is None
|
|
1175
1191
|
|
|
1176
1192
|
|
|
1193
|
+
class TestConfigCacheMtimeInvalidation:
|
|
1194
|
+
"""Test that config cache is invalidated when file is modified externally."""
|
|
1195
|
+
|
|
1196
|
+
def test_cache_returns_same_config_when_file_unchanged(self, config_home):
|
|
1197
|
+
"""Verify cache hit when config file mtime has not changed."""
|
|
1198
|
+
import basic_memory.config
|
|
1199
|
+
|
|
1200
|
+
basic_memory.config._CONFIG_CACHE = None
|
|
1201
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
1202
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
1203
|
+
|
|
1204
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
1205
|
+
temp_path = Path(temp_dir)
|
|
1206
|
+
config_manager = ConfigManager()
|
|
1207
|
+
config_manager.config_dir = temp_path / "basic-memory"
|
|
1208
|
+
config_manager.config_file = config_manager.config_dir / "config.json"
|
|
1209
|
+
config_manager.config_dir.mkdir(parents=True, exist_ok=True)
|
|
1210
|
+
|
|
1211
|
+
test_config = BasicMemoryConfig(
|
|
1212
|
+
projects={"main": {"path": str(temp_path / "main")}},
|
|
1213
|
+
default_project="main",
|
|
1214
|
+
)
|
|
1215
|
+
config_manager.save_config(test_config)
|
|
1216
|
+
|
|
1217
|
+
# First load populates cache
|
|
1218
|
+
config1 = config_manager.load_config()
|
|
1219
|
+
assert config1.default_project == "main"
|
|
1220
|
+
|
|
1221
|
+
# Second load should return cached config (same object)
|
|
1222
|
+
config2 = config_manager.load_config()
|
|
1223
|
+
assert config1 is config2
|
|
1224
|
+
|
|
1225
|
+
def test_cache_invalidated_when_file_modified(self, config_home):
|
|
1226
|
+
"""Verify cache miss when config file is modified by another process."""
|
|
1227
|
+
import json
|
|
1228
|
+
import os
|
|
1229
|
+
import time
|
|
1230
|
+
|
|
1231
|
+
import basic_memory.config
|
|
1232
|
+
|
|
1233
|
+
basic_memory.config._CONFIG_CACHE = None
|
|
1234
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
1235
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
1236
|
+
|
|
1237
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
1238
|
+
temp_path = Path(temp_dir)
|
|
1239
|
+
config_manager = ConfigManager()
|
|
1240
|
+
config_manager.config_dir = temp_path / "basic-memory"
|
|
1241
|
+
config_manager.config_file = config_manager.config_dir / "config.json"
|
|
1242
|
+
config_manager.config_dir.mkdir(parents=True, exist_ok=True)
|
|
1243
|
+
|
|
1244
|
+
test_config = BasicMemoryConfig(
|
|
1245
|
+
projects={"main": {"path": str(temp_path / "main")}},
|
|
1246
|
+
default_project="main",
|
|
1247
|
+
)
|
|
1248
|
+
config_manager.save_config(test_config)
|
|
1249
|
+
|
|
1250
|
+
# First load populates cache
|
|
1251
|
+
config1 = config_manager.load_config()
|
|
1252
|
+
assert config1.get_project_mode("main") == ProjectMode.LOCAL
|
|
1253
|
+
|
|
1254
|
+
# Simulate external process modifying the config file
|
|
1255
|
+
config_data = json.loads(config_manager.config_file.read_text())
|
|
1256
|
+
config_data["projects"]["main"]["mode"] = "cloud"
|
|
1257
|
+
|
|
1258
|
+
# Ensure mtime actually changes (some filesystems have 1s granularity)
|
|
1259
|
+
time.sleep(0.05)
|
|
1260
|
+
config_manager.config_file.write_text(json.dumps(config_data, indent=2))
|
|
1261
|
+
# Force mtime change on filesystems with coarse granularity
|
|
1262
|
+
new_mtime = os.path.getmtime(config_manager.config_file) + 1
|
|
1263
|
+
os.utime(config_manager.config_file, (new_mtime, new_mtime))
|
|
1264
|
+
|
|
1265
|
+
# Next load should detect mtime change and re-read
|
|
1266
|
+
config2 = config_manager.load_config()
|
|
1267
|
+
assert config2.get_project_mode("main") == ProjectMode.CLOUD
|
|
1268
|
+
assert config1 is not config2
|
|
1269
|
+
|
|
1270
|
+
def test_save_config_resets_mtime(self, config_home):
|
|
1271
|
+
"""Verify save_config clears both cache and mtime."""
|
|
1272
|
+
import basic_memory.config
|
|
1273
|
+
|
|
1274
|
+
basic_memory.config._CONFIG_CACHE = None
|
|
1275
|
+
basic_memory.config._CONFIG_MTIME = None
|
|
1276
|
+
basic_memory.config._CONFIG_SIZE = None
|
|
1277
|
+
|
|
1278
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
1279
|
+
temp_path = Path(temp_dir)
|
|
1280
|
+
config_manager = ConfigManager()
|
|
1281
|
+
config_manager.config_dir = temp_path / "basic-memory"
|
|
1282
|
+
config_manager.config_file = config_manager.config_dir / "config.json"
|
|
1283
|
+
config_manager.config_dir.mkdir(parents=True, exist_ok=True)
|
|
1284
|
+
|
|
1285
|
+
test_config = BasicMemoryConfig(
|
|
1286
|
+
projects={"main": {"path": str(temp_path / "main")}},
|
|
1287
|
+
)
|
|
1288
|
+
config_manager.save_config(test_config)
|
|
1289
|
+
|
|
1290
|
+
# Load to populate cache
|
|
1291
|
+
config_manager.load_config()
|
|
1292
|
+
assert basic_memory.config._CONFIG_CACHE is not None
|
|
1293
|
+
assert basic_memory.config._CONFIG_MTIME is not None
|
|
1294
|
+
assert basic_memory.config._CONFIG_SIZE is not None
|
|
1295
|
+
|
|
1296
|
+
# Save should clear all cache state
|
|
1297
|
+
config_manager.save_config(test_config)
|
|
1298
|
+
assert basic_memory.config._CONFIG_CACHE is None
|
|
1299
|
+
assert basic_memory.config._CONFIG_MTIME is None
|
|
1300
|
+
assert basic_memory.config._CONFIG_SIZE is None
|
|
1301
|
+
|
|
1302
|
+
|
|
1177
1303
|
class TestLocalSyncPathMigration:
|
|
1178
1304
|
"""Test migration that promotes local_sync_path into path for cloud projects."""
|
|
1179
1305
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|