basic-memory 0.20.0__tar.gz → 0.20.2__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.2}/CHANGELOG.md +20 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/PKG-INFO +1 -1
- {basic_memory-0.20.0 → basic_memory-0.20.2}/server.json +2 -2
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/auto_update.py +5 -7
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/project.py +14 -3
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/config.py +47 -5
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_auto_update.py +25 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_json_output.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_add_with_local_path.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_list_and_ls.py +5 -2
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_set_cloud_local.py +24 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_workspace_commands.py +4 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/conftest.py +2 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note.py +8 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service.py +10 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_config.py +126 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/spec.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.claude/settings.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.dockerignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.env.example +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/dependabot.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/release.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.github/workflows/test.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.gitignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/.python-version +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/AGENTS.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/CITATION.cff +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/CLA.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/CLAUDE.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/CONTRIBUTING.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/Dockerfile +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/LICENSE +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/README.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/SECURITY.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docker-compose.yml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/Docker.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/character-handling.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/cloud-cli.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/metadata-search.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/semantic-search.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/docs/testing-coverage.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/justfile +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/llms-install.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/pyproject.toml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/smithery.yaml +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/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.2}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/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.2}/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.2}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/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.2}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/commands/update.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_string_params_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/report.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/README.md +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/Screenshot.png +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_update_command.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_workspace_management.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_semantic_search_base.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/__init__.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_embedding_status.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_coerce.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_deps.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/test_runtime.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_setup_logging.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/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.2}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/ui/tool-ui-react/tailwind.config.js +0 -0
- {basic_memory-0.20.0 → basic_memory-0.20.2}/uv.lock +0 -0
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.20.2 (2026-03-10)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Fix auto-update Homebrew detection: `brew outdated` exits 1 when a formula is outdated, not on error
|
|
10
|
+
- Previously treated exit code 1 as a failure, causing "Automatic update check failed" instead of detecting the available update
|
|
11
|
+
|
|
12
|
+
## v0.20.1 (2026-03-10)
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- **#661**: Fix `bm project list` MCP column to show transport type (stdio/https) instead of DB presence
|
|
17
|
+
- Renamed "MCP (stdio)" column to "MCP"
|
|
18
|
+
- Shows actual routing mode: `stdio` for local, `https` for cloud projects
|
|
19
|
+
- Clears local path display for cloud-mode projects
|
|
20
|
+
- **#662**: Invalidate config cache when file is modified by another process
|
|
21
|
+
- Adds mtime-based cache validation to `ConfigManager.load_config()`
|
|
22
|
+
- Long-lived processes (MCP stdio server) now detect external config changes
|
|
23
|
+
- Fixes `bm project set-cloud` having no effect on running MCP server
|
|
24
|
+
|
|
5
25
|
## v0.20.0 (2026-03-10)
|
|
6
26
|
|
|
7
27
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.2
|
|
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.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.20.
|
|
14
|
+
"version": "0.20.2",
|
|
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.2"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -134,13 +134,11 @@ def _check_homebrew_update_available(silent: bool) -> tuple[bool, str | None]:
|
|
|
134
134
|
silent=silent,
|
|
135
135
|
capture_output=True,
|
|
136
136
|
)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
is_outdated = bool((result.stdout or "").strip())
|
|
137
|
+
# Trigger: brew outdated exits 1 when the formula IS outdated (with name on stdout).
|
|
138
|
+
# Why: non-zero exit here means "outdated", not "error".
|
|
139
|
+
# Outcome: check stdout for the package name to determine outdated status.
|
|
140
|
+
stdout = (result.stdout or "").strip()
|
|
141
|
+
is_outdated = PACKAGE_NAME in stdout
|
|
144
142
|
return is_outdated, None
|
|
145
143
|
|
|
146
144
|
|
|
@@ -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":
|
|
@@ -12,6 +12,7 @@ from basic_memory.cli.auto_update import (
|
|
|
12
12
|
AutoUpdateResult,
|
|
13
13
|
AutoUpdateStatus,
|
|
14
14
|
InstallSource,
|
|
15
|
+
_check_homebrew_update_available,
|
|
15
16
|
_is_interactive_session,
|
|
16
17
|
detect_install_source,
|
|
17
18
|
maybe_run_periodic_auto_update,
|
|
@@ -129,6 +130,30 @@ def test_force_bypasses_auto_update_disabled(monkeypatch, tmp_path):
|
|
|
129
130
|
assert manager.save_calls == 1
|
|
130
131
|
|
|
131
132
|
|
|
133
|
+
def test_check_homebrew_update_available_exit_code_1_means_outdated(monkeypatch):
|
|
134
|
+
"""brew outdated exits 1 when the formula is outdated, not on error."""
|
|
135
|
+
|
|
136
|
+
def _fake_run(command, **kwargs):
|
|
137
|
+
return subprocess.CompletedProcess(
|
|
138
|
+
command, 1, stdout="basicmachines-co/basic-memory/basic-memory\n", stderr=""
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
monkeypatch.setattr("basic_memory.cli.auto_update._run_subprocess", _fake_run)
|
|
142
|
+
is_outdated, _ = _check_homebrew_update_available(silent=False)
|
|
143
|
+
assert is_outdated is True
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def test_check_homebrew_update_available_exit_code_0_means_up_to_date(monkeypatch):
|
|
147
|
+
"""brew outdated exits 0 when the formula is up to date."""
|
|
148
|
+
|
|
149
|
+
def _fake_run(command, **kwargs):
|
|
150
|
+
return subprocess.CompletedProcess(command, 0, stdout="", stderr="")
|
|
151
|
+
|
|
152
|
+
monkeypatch.setattr("basic_memory.cli.auto_update._run_subprocess", _fake_run)
|
|
153
|
+
is_outdated, _ = _check_homebrew_update_available(silent=False)
|
|
154
|
+
assert is_outdated is False
|
|
155
|
+
|
|
156
|
+
|
|
132
157
|
def test_homebrew_outdated_triggers_upgrade(monkeypatch, tmp_path):
|
|
133
158
|
config = _base_config(tmp_path)
|
|
134
159
|
manager = StubConfigManager(config)
|
|
@@ -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()}"
|