basic-memory 0.18.2__tar.gz → 0.18.3__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.18.2 → basic_memory-0.18.3}/CHANGELOG.md +11 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/PKG-INFO +1 -1
- basic_memory-0.18.3/docs/NOTE-FORMAT.md +494 -0
- basic_memory-0.18.3/docs/specs/SPEC-SCHEMA-IMPL.md +365 -0
- basic_memory-0.18.3/docs/specs/SPEC-SCHEMA.md +462 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/server.json +2 -2
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/app.py +2 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/__init__.py +2 -0
- basic_memory-0.18.3/src/basic_memory/api/v2/routers/schema_router.py +305 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/__init__.py +2 -1
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_commands.py +5 -3
- basic_memory-0.18.3/src/basic_memory/cli/commands/schema.py +336 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/main.py +1 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/__init__.py +2 -0
- basic_memory-0.18.3/src/basic_memory/mcp/clients/schema.py +113 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/__init__.py +6 -0
- basic_memory-0.18.3/src/basic_memory/mcp/tools/schema.py +244 -0
- basic_memory-0.18.3/src/basic_memory/schema/__init__.py +58 -0
- basic_memory-0.18.3/src/basic_memory/schema/diff.py +111 -0
- basic_memory-0.18.3/src/basic_memory/schema/inference.py +323 -0
- basic_memory-0.18.3/src/basic_memory/schema/parser.py +236 -0
- basic_memory-0.18.3/src/basic_memory/schema/resolver.py +118 -0
- basic_memory-0.18.3/src/basic_memory/schema/validator.py +259 -0
- basic_memory-0.18.3/src/basic_memory/schemas/schema.py +121 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-01.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-02.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-03.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-04.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-05.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-06.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-07.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-08.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-09.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-10.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-11.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-12.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-13.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-14.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-15.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-16.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-17.md +14 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-18.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-19.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-20.md +16 -0
- basic_memory-0.18.3/test-int/fixtures/schema/drift/schema/Person.md +18 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/array-single.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/empty-note.md +5 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +20 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/inline-and-type.md +20 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/no-frontmatter.md +11 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/relation-only.md +15 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/type-no-schema.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/unicode-fields.md +19 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ada-lovelace.md +20 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/alan-turing.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +25 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/andrej-karpathy.md +21 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/barbara-liskov.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +20 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/brendan-eich.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/claude-shannon.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dennis-ritchie.md +23 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dijkstra.md +21 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/donald-knuth.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/fei-fei-li.md +20 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +23 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/grace-hopper.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/guido-van-rossum.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/james-gosling.md +21 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/john-carmack.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ken-thompson.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/larry-page.md +18 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/leslie-lamport.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/linus-torvalds.md +26 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/margaret-hamilton.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +18 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/richard-stallman.md +23 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rob-pike.md +23 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +18 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/tim-berners-lee.md +25 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/vint-cerf.md +21 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yann-lecun.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +19 -0
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Book.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Meeting.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Person.md +27 -0
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/SoftwareProject.md +23 -0
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/StrictSchema.md +22 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/basic-memory.md +27 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/explicit-ref-note.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/no-schema-note.md +17 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/paul-graham.md +29 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/rich-hickey.md +24 -0
- basic_memory-0.18.3/test-int/fixtures/schema/valid/standup-2024-01-15.md +32 -0
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/extra-observations.md +27 -0
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-multiple.md +19 -0
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-required.md +19 -0
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/wrong-enum-value.md +21 -0
- basic_memory-0.18.3/test-int/test_schema/__init__.py +1 -0
- basic_memory-0.18.3/test-int/test_schema/conftest.py +85 -0
- basic_memory-0.18.3/test-int/test_schema/helpers.py +61 -0
- basic_memory-0.18.3/test-int/test_schema/test_diff_integration.py +72 -0
- basic_memory-0.18.3/test-int/test_schema/test_inference_integration.py +112 -0
- basic_memory-0.18.3/test-int/test_schema/test_parser_integration.py +83 -0
- basic_memory-0.18.3/test-int/test_schema/test_validator_integration.py +179 -0
- basic_memory-0.18.3/tests/api/v2/test_schema_router.py +347 -0
- basic_memory-0.18.3/tests/schema/__init__.py +1 -0
- basic_memory-0.18.3/tests/schema/test_diff.py +204 -0
- basic_memory-0.18.3/tests/schema/test_inference.py +270 -0
- basic_memory-0.18.3/tests/schema/test_parser.py +255 -0
- basic_memory-0.18.3/tests/schema/test_resolver.py +162 -0
- basic_memory-0.18.3/tests/schema/test_validator.py +257 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_rclone_commands.py +8 -9
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/spec.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.claude/settings.json +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.dockerignore +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.env.example +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/dependabot.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/release.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.github/workflows/test.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.gitignore +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/.python-version +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/AGENTS.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/CITATION.cff +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/CLA.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/CLAUDE.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/CONTRIBUTING.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/Dockerfile +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/LICENSE +0 -0
- {basic_memory-0.18.2/docs → basic_memory-0.18.3}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/README.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/SECURITY.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docker-compose.yml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/Docker.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/character-handling.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/cloud-cli.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/docs/testing-coverage.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/justfile +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/llms-install.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/pyproject.toml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/smithery.yaml +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/config.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/db.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/conftest.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/README.md +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/Screenshot.png +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/conftest.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/conftest.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_config.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_deps.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/test_runtime.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.18.2 → basic_memory-0.18.3}/uv.lock +0 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## v0.18.3 (2026-02-12)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- Use global `--header` flag for Tigris consistency on all rclone transactions
|
|
8
|
+
([`7fcf587`](https://github.com/basicmachines-co/basic-memory/commit/7fcf587))
|
|
9
|
+
- `--header-download` / `--header-upload` only apply to GET/PUT requests, missing S3
|
|
10
|
+
ListObjectsV2 calls that bisync issues first. Non-US users saw stale edge-cached metadata.
|
|
11
|
+
- `--header` applies to ALL HTTP transactions (list, download, upload), fixing bisync for
|
|
12
|
+
users outside the Tigris origin region.
|
|
13
|
+
|
|
3
14
|
## v0.18.2 (2026-02-11)
|
|
4
15
|
|
|
5
16
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.3
|
|
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
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
# Note Format Reference
|
|
2
|
+
|
|
3
|
+
Every document in Basic Memory is a plain Markdown file. Files are the source of truth — changes to files automatically update the knowledge graph in the database. You maintain complete ownership, files work with git, and knowledge persists independently of any AI conversation.
|
|
4
|
+
|
|
5
|
+
## Document Structure
|
|
6
|
+
|
|
7
|
+
A note has three parts: YAML frontmatter, content (observations), and relations.
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
---
|
|
11
|
+
title: Coffee Brewing Methods
|
|
12
|
+
type: note
|
|
13
|
+
tags: [coffee, brewing]
|
|
14
|
+
permalink: coffee-brewing-methods
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Coffee Brewing Methods
|
|
18
|
+
|
|
19
|
+
## Observations
|
|
20
|
+
- [method] Pour over provides more flavor clarity than French press
|
|
21
|
+
- [technique] Water temperature at 205°F extracts optimal compounds #brewing
|
|
22
|
+
- [preference] Ethiopian beans work well with lighter roasts (personal experience)
|
|
23
|
+
|
|
24
|
+
## Relations
|
|
25
|
+
- relates_to [[Coffee Bean Origins]]
|
|
26
|
+
- requires [[Proper Grinding Technique]]
|
|
27
|
+
- contrasts_with [[Tea Brewing Methods]]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The `## Observations` and `## Relations` headings are conventional but not required — the parser detects observations and relations by their syntax patterns anywhere in the document.
|
|
31
|
+
|
|
32
|
+
## Frontmatter
|
|
33
|
+
|
|
34
|
+
YAML metadata between `---` fences at the top of the file.
|
|
35
|
+
|
|
36
|
+
| Field | Required | Default | Description |
|
|
37
|
+
|-------|----------|---------|-------------|
|
|
38
|
+
| `title` | No | filename stem | Used for linking and references. Auto-set from filename if missing. |
|
|
39
|
+
| `type` | No | `note` | Entity type. Used for schema resolution and filtering. |
|
|
40
|
+
| `tags` | No | `[]` | List or comma-separated string. Used for organization and search. |
|
|
41
|
+
| `permalink` | No | generated from title | Stable identifier. Persists even if the file moves. |
|
|
42
|
+
| `schema` | No | none | Schema attachment — dict (inline), string (reference), or omitted (implicit). |
|
|
43
|
+
|
|
44
|
+
Custom fields are allowed. Any key not in the standard set is stored as `entity_metadata` and indexed for search and filtering.
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
---
|
|
48
|
+
title: Paul Graham
|
|
49
|
+
type: Person
|
|
50
|
+
tags: [startups, essays, lisp]
|
|
51
|
+
permalink: paul-graham
|
|
52
|
+
status: active
|
|
53
|
+
source: wikipedia
|
|
54
|
+
---
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Here `status` and `source` are custom fields stored in `entity_metadata`.
|
|
58
|
+
|
|
59
|
+
### Frontmatter Value Handling
|
|
60
|
+
|
|
61
|
+
YAML automatically converts some values to native types. Basic Memory normalizes them:
|
|
62
|
+
|
|
63
|
+
- Date strings (`2025-10-24`) → kept as ISO format strings
|
|
64
|
+
- Numbers (`1.0`) → converted to strings
|
|
65
|
+
- Booleans (`true`) → converted to strings (`"True"`)
|
|
66
|
+
- Lists and dicts → preserved, items normalized recursively
|
|
67
|
+
|
|
68
|
+
This prevents errors when downstream code expects string values.
|
|
69
|
+
|
|
70
|
+
## Observations
|
|
71
|
+
|
|
72
|
+
An observation is a categorized fact about the entity. Written as a Markdown list item.
|
|
73
|
+
|
|
74
|
+
**Syntax:**
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
- [category] content text #tag1 #tag2 (context)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
| Part | Required | Description |
|
|
81
|
+
|------|----------|-------------|
|
|
82
|
+
| `[category]` | Yes | Classification in square brackets. Any text except `[]()` chars. |
|
|
83
|
+
| content | Yes | The fact or statement. |
|
|
84
|
+
| `#tags` | No | Inline tags. Space-separated, each starting with `#`. |
|
|
85
|
+
| `(context)` | No | Parenthesized text at end of line. Supporting details or source. |
|
|
86
|
+
|
|
87
|
+
### Examples
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
- [tech] Uses SQLite for storage #database
|
|
91
|
+
- [design] Follows local-first architecture #architecture
|
|
92
|
+
- [decision] Selected bcrypt for passwords #security (based on OWASP audit)
|
|
93
|
+
- [name] Paul Graham
|
|
94
|
+
- [expertise] Startups
|
|
95
|
+
- [expertise] Lisp
|
|
96
|
+
- [expertise] Essay writing
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Array-like fields use repeated categories — multiple `[expertise]` observations above.
|
|
100
|
+
|
|
101
|
+
### What Is Not an Observation
|
|
102
|
+
|
|
103
|
+
The parser excludes these list item patterns:
|
|
104
|
+
|
|
105
|
+
| Pattern | Example | Reason |
|
|
106
|
+
|---------|---------|--------|
|
|
107
|
+
| Checkboxes | `- [ ] Todo item`, `- [x] Done`, `- [-] Cancelled` | Task list syntax |
|
|
108
|
+
| Markdown links | `- [text](url)` | URL link syntax |
|
|
109
|
+
| Bare wiki links | `- [[Target]]` | Treated as a relation instead |
|
|
110
|
+
|
|
111
|
+
A list item with `#tags` but no `[category]` is still parsed — the tags are extracted and the category defaults to `Note`.
|
|
112
|
+
|
|
113
|
+
## Relations
|
|
114
|
+
|
|
115
|
+
Relations connect documents to form the knowledge graph. There are two kinds.
|
|
116
|
+
|
|
117
|
+
### Explicit Relations
|
|
118
|
+
|
|
119
|
+
Written as list items with a relation type and a `[[wiki link]]` target.
|
|
120
|
+
|
|
121
|
+
**Syntax:**
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
- relation_type [[Target Entity]] (context)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
| Part | Required | Description |
|
|
128
|
+
|------|----------|-------------|
|
|
129
|
+
| `relation_type` | No | Text before `[[`. Defaults to `relates_to` if omitted. |
|
|
130
|
+
| `[[Target]]` | Yes | Wiki link to the target entity. Matched by title or permalink. |
|
|
131
|
+
| `(context)` | No | Parenthesized text after `]]`. Supporting details. |
|
|
132
|
+
|
|
133
|
+
### Examples
|
|
134
|
+
|
|
135
|
+
```markdown
|
|
136
|
+
- implements [[Search Design]]
|
|
137
|
+
- depends_on [[Database Schema]]
|
|
138
|
+
- works_at [[Y Combinator]] (co-founder)
|
|
139
|
+
- [[Some Entity]]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The last example — a bare `[[wiki link]]` in a list item — gets relation type `relates_to`.
|
|
143
|
+
|
|
144
|
+
Common relation types:
|
|
145
|
+
- `implements`, `depends_on`, `relates_to`, `inspired_by`
|
|
146
|
+
- `extends`, `part_of`, `contains`, `pairs_with`
|
|
147
|
+
- `works_at`, `authored`, `collaborated_with`
|
|
148
|
+
|
|
149
|
+
Any text works as a relation type. These are conventions, not a fixed set.
|
|
150
|
+
|
|
151
|
+
### Inline References
|
|
152
|
+
|
|
153
|
+
Wiki links appearing in regular prose (not as list items) create implicit `links_to` relations.
|
|
154
|
+
|
|
155
|
+
```markdown
|
|
156
|
+
This builds on [[Core Design]] and uses [[Utility Functions]].
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
This creates two relations: `links_to [[Core Design]]` and `links_to [[Utility Functions]]`.
|
|
160
|
+
|
|
161
|
+
### Forward References
|
|
162
|
+
|
|
163
|
+
Relations can link to entities that don't exist yet. Basic Memory resolves them when the target is created.
|
|
164
|
+
|
|
165
|
+
## Permalinks and memory:// URLs
|
|
166
|
+
|
|
167
|
+
Every document has a unique **permalink** — a stable identifier derived from its title. You can set one explicitly in frontmatter, or let the system generate it.
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
permalink: auth-approaches-2024
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Permalinks form the basis of `memory://` URLs:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
memory://auth-approaches-2024 # By permalink
|
|
177
|
+
memory://Authentication Approaches # By title (auto-resolves)
|
|
178
|
+
memory://project/auth-approaches # By path
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Pattern matching is supported:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
memory://auth* # Starts with "auth"
|
|
185
|
+
memory://*/approaches # Ends with "approaches"
|
|
186
|
+
memory://project/*/requirements # Nested wildcard
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Schemas
|
|
190
|
+
|
|
191
|
+
Schemas declare the expected structure of a note — which observation categories and relation types a well-formed note should have. They use Picoschema, a compact notation from Google's Dotprompt that fits naturally in YAML frontmatter.
|
|
192
|
+
|
|
193
|
+
### Picoschema Syntax
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
schema:
|
|
197
|
+
name: string, full name # required field with description
|
|
198
|
+
email?: string, contact email # ? = optional
|
|
199
|
+
role?: string, job title
|
|
200
|
+
works_at?: Organization, employer # capitalized type = entity reference
|
|
201
|
+
tags?(array): string, categories # array of type
|
|
202
|
+
status?(enum): [active, inactive] # enum with allowed values
|
|
203
|
+
metadata?(object): # nested object
|
|
204
|
+
updated_at?: string
|
|
205
|
+
source?: string
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
| Notation | Meaning | Example |
|
|
209
|
+
|----------|---------|---------|
|
|
210
|
+
| `field: type` | Required field | `name: string` |
|
|
211
|
+
| `field?: type` | Optional field | `role?: string` |
|
|
212
|
+
| `field(array): type` | Array of values | `expertise(array): string` |
|
|
213
|
+
| `field?(enum): [vals]` | Enum with allowed values | `status?(enum): [active, inactive]` |
|
|
214
|
+
| `field?(object):` | Nested object with sub-fields | `metadata?(object):` |
|
|
215
|
+
| `, description` | Description after comma | `name: string, full name` |
|
|
216
|
+
| `EntityName` | Capitalized type = entity reference | `works_at?: Organization` |
|
|
217
|
+
|
|
218
|
+
**Scalar types:** `string`, `integer`, `number`, `boolean`, `any`
|
|
219
|
+
|
|
220
|
+
Any type not in that set whose first letter is uppercase is treated as an entity reference (a relation target).
|
|
221
|
+
|
|
222
|
+
### Schema-to-Note Mapping
|
|
223
|
+
|
|
224
|
+
Schemas validate against existing observation/relation syntax. Note authors don't learn new syntax.
|
|
225
|
+
|
|
226
|
+
| Schema Declaration | Maps To | Example in Note |
|
|
227
|
+
|--------------------|---------|-----------------|
|
|
228
|
+
| `field: string` | Observation `[field] value` | `- [name] Paul Graham` |
|
|
229
|
+
| `field?(array): string` | Multiple `[field]` observations | `- [expertise] Lisp` (repeated) |
|
|
230
|
+
| `field?: EntityType` | Relation `field [[Target]]` | `- works_at [[Y Combinator]]` |
|
|
231
|
+
| `field?(array): EntityType` | Multiple `field` relations | `- authored [[Book]]` (repeated) |
|
|
232
|
+
| `tags` | Frontmatter `tags` array | `tags: [startups, essays]` |
|
|
233
|
+
| `field?(enum): [vals]` | Observation `[field] value` where value is in the set | `- [status] active` |
|
|
234
|
+
|
|
235
|
+
Observations and relations not covered by the schema are valid — schemas describe a subset, not a straitjacket.
|
|
236
|
+
|
|
237
|
+
### Schema Attachment
|
|
238
|
+
|
|
239
|
+
Three ways to attach a schema to a note, resolved in priority order:
|
|
240
|
+
|
|
241
|
+
**1. Inline schema** — `schema` is a dict in frontmatter:
|
|
242
|
+
|
|
243
|
+
```yaml
|
|
244
|
+
---
|
|
245
|
+
title: Team Standup 2024-01-15
|
|
246
|
+
type: meeting
|
|
247
|
+
schema:
|
|
248
|
+
attendees(array): string, who was there
|
|
249
|
+
decisions(array): string, what was decided
|
|
250
|
+
action_items(array): string, follow-ups
|
|
251
|
+
blockers?(array): string, anything stuck
|
|
252
|
+
---
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Good for one-off structured notes or prototyping a schema before extracting it.
|
|
256
|
+
|
|
257
|
+
**2. Explicit reference** — `schema` is a string naming a schema note:
|
|
258
|
+
|
|
259
|
+
```yaml
|
|
260
|
+
---
|
|
261
|
+
title: Basic Memory
|
|
262
|
+
schema: SoftwareProject
|
|
263
|
+
---
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
or by permalink:
|
|
267
|
+
|
|
268
|
+
```yaml
|
|
269
|
+
---
|
|
270
|
+
title: LLM Memory Patterns
|
|
271
|
+
schema: schema/research-project
|
|
272
|
+
---
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Use when the note's `type` differs from the schema it should validate against, or when multiple schema variants exist.
|
|
276
|
+
|
|
277
|
+
**3. Implicit by type** — no `schema` field, resolved by matching `type`:
|
|
278
|
+
|
|
279
|
+
```yaml
|
|
280
|
+
---
|
|
281
|
+
title: Paul Graham
|
|
282
|
+
type: Person
|
|
283
|
+
---
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
The system looks up a schema note where `entity: Person`. If found, it applies. If not, no validation occurs.
|
|
287
|
+
|
|
288
|
+
**4. No schema** — perfectly fine. Most notes don't need one.
|
|
289
|
+
|
|
290
|
+
### Schema Notes
|
|
291
|
+
|
|
292
|
+
A schema is itself a Basic Memory note with `type: schema`. It lives anywhere (though `schema/` is the conventional directory).
|
|
293
|
+
|
|
294
|
+
```yaml
|
|
295
|
+
# schema/Person.md
|
|
296
|
+
---
|
|
297
|
+
title: Person
|
|
298
|
+
type: schema
|
|
299
|
+
entity: Person
|
|
300
|
+
version: 1
|
|
301
|
+
schema:
|
|
302
|
+
name: string, full name
|
|
303
|
+
role?: string, job title or position
|
|
304
|
+
works_at?: Organization, employer
|
|
305
|
+
expertise?(array): string, areas of knowledge
|
|
306
|
+
email?: string, contact email
|
|
307
|
+
settings:
|
|
308
|
+
validation: warn
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
# Person
|
|
312
|
+
|
|
313
|
+
A human individual in the knowledge graph.
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
| Field | Required | Description |
|
|
317
|
+
|-------|----------|-------------|
|
|
318
|
+
| `type` | Yes | Must be `schema` |
|
|
319
|
+
| `entity` | Yes | The entity type this schema describes (e.g., `Person`) |
|
|
320
|
+
| `version` | No | Schema version number (default: `1`) |
|
|
321
|
+
| `schema` | Yes | Picoschema dict defining the fields |
|
|
322
|
+
| `settings.validation` | No | Validation mode (default: `warn`) |
|
|
323
|
+
|
|
324
|
+
Schema notes are regular notes — they show up in search, can have observations and relations, and participate in the knowledge graph.
|
|
325
|
+
|
|
326
|
+
### Validation Modes
|
|
327
|
+
|
|
328
|
+
| Mode | Behavior |
|
|
329
|
+
|------|----------|
|
|
330
|
+
| `warn` | Warnings in output, doesn't block (default) |
|
|
331
|
+
| `strict` | Errors that block sync, for CI/CD enforcement |
|
|
332
|
+
| `off` | No validation |
|
|
333
|
+
|
|
334
|
+
### Validation Output
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
$ bm schema validate people/ada-lovelace.md
|
|
338
|
+
|
|
339
|
+
⚠ Person schema validation:
|
|
340
|
+
- Missing required field: name (expected [name] observation)
|
|
341
|
+
- Missing optional field: role
|
|
342
|
+
- Missing optional field: works_at (no relation found)
|
|
343
|
+
|
|
344
|
+
ℹ Unmatched observations: [fact] ×2, [born] ×1
|
|
345
|
+
ℹ Unmatched relations: collaborated_with
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
"Unmatched" items are informational — observations and relations the schema doesn't cover.
|
|
349
|
+
|
|
350
|
+
### Schema Inference
|
|
351
|
+
|
|
352
|
+
Generate schemas from existing notes by analyzing observation and relation frequency:
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
$ bm schema infer Person
|
|
356
|
+
|
|
357
|
+
Analyzing 30 notes with type: Person...
|
|
358
|
+
|
|
359
|
+
Observations found:
|
|
360
|
+
[name] 30/30 100% → name: string
|
|
361
|
+
[role] 27/30 90% → role?: string
|
|
362
|
+
[expertise] 18/30 60% → expertise?(array): string
|
|
363
|
+
[email] 8/30 27% → email?: string
|
|
364
|
+
|
|
365
|
+
Relations found:
|
|
366
|
+
works_at 22/30 73% → works_at?: Organization
|
|
367
|
+
|
|
368
|
+
Suggested schema:
|
|
369
|
+
name: string, full name
|
|
370
|
+
role?: string, job title
|
|
371
|
+
expertise?(array): string, areas of knowledge
|
|
372
|
+
email?: string, contact email
|
|
373
|
+
works_at?: Organization, employer
|
|
374
|
+
|
|
375
|
+
Save to schema/Person.md? [y/n]
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
Frequency thresholds:
|
|
379
|
+
- **100% present** → required field
|
|
380
|
+
- **25%+ present** → optional field
|
|
381
|
+
- **Below 25%** → excluded from suggestion
|
|
382
|
+
|
|
383
|
+
### Schema Drift Detection
|
|
384
|
+
|
|
385
|
+
Track how usage patterns shift over time:
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
$ bm schema diff Person
|
|
389
|
+
|
|
390
|
+
Schema drift detected:
|
|
391
|
+
|
|
392
|
+
+ expertise: now in 81% of notes (was 12%)
|
|
393
|
+
- department: dropped to 3% of notes
|
|
394
|
+
~ works_at: cardinality changed (one → many)
|
|
395
|
+
|
|
396
|
+
Update schema? [y/n/review]
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## Complete Examples
|
|
400
|
+
|
|
401
|
+
### Simple Note (No Schema)
|
|
402
|
+
|
|
403
|
+
```markdown
|
|
404
|
+
---
|
|
405
|
+
title: Project Ideas
|
|
406
|
+
type: note
|
|
407
|
+
tags: [ideas, brainstorm]
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
# Project Ideas
|
|
411
|
+
|
|
412
|
+
## Observations
|
|
413
|
+
- [idea] Build a CLI tool for markdown linting #tooling
|
|
414
|
+
- [idea] Create a recipe knowledge base #cooking
|
|
415
|
+
- [priority] Focus on developer tools first (Q1 goal)
|
|
416
|
+
|
|
417
|
+
## Relations
|
|
418
|
+
- inspired_by [[Developer Workflow Research]]
|
|
419
|
+
- part_of [[Q1 Planning]]
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Schema-Validated Note
|
|
423
|
+
|
|
424
|
+
Schema at `schema/Person.md`:
|
|
425
|
+
|
|
426
|
+
```yaml
|
|
427
|
+
---
|
|
428
|
+
title: Person
|
|
429
|
+
type: schema
|
|
430
|
+
entity: Person
|
|
431
|
+
version: 1
|
|
432
|
+
schema:
|
|
433
|
+
name: string, full name
|
|
434
|
+
role?: string, job title or position
|
|
435
|
+
works_at?: Organization, employer
|
|
436
|
+
expertise?(array): string, areas of knowledge
|
|
437
|
+
email?: string, contact email
|
|
438
|
+
settings:
|
|
439
|
+
validation: warn
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
# Person
|
|
443
|
+
|
|
444
|
+
A human individual in the knowledge graph.
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
Note at `people/paul-graham.md`:
|
|
448
|
+
|
|
449
|
+
```markdown
|
|
450
|
+
---
|
|
451
|
+
title: Paul Graham
|
|
452
|
+
type: Person
|
|
453
|
+
tags: [startups, essays, lisp]
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
# Paul Graham
|
|
457
|
+
|
|
458
|
+
## Observations
|
|
459
|
+
- [name] Paul Graham
|
|
460
|
+
- [role] Essayist and investor
|
|
461
|
+
- [expertise] Startups
|
|
462
|
+
- [expertise] Lisp
|
|
463
|
+
- [expertise] Essay writing
|
|
464
|
+
- [fact] Created Viaweb, the first web app
|
|
465
|
+
|
|
466
|
+
## Relations
|
|
467
|
+
- works_at [[Y Combinator]]
|
|
468
|
+
- authored [[Hackers and Painters]]
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
The `[fact]` observation and `authored` relation are not in the schema — they're valid, just unmatched. The schema only checks that `[name]` exists (required) and looks for optional fields like `[role]`, `[expertise]`, and `works_at`.
|
|
472
|
+
|
|
473
|
+
### Inline Schema Note
|
|
474
|
+
|
|
475
|
+
```markdown
|
|
476
|
+
---
|
|
477
|
+
title: Team Standup 2024-01-15
|
|
478
|
+
type: meeting
|
|
479
|
+
schema:
|
|
480
|
+
attendees(array): string, who was there
|
|
481
|
+
decisions(array): string, what was decided
|
|
482
|
+
action_items(array): string, follow-ups
|
|
483
|
+
blockers?(array): string, anything stuck
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
# Team Standup 2024-01-15
|
|
487
|
+
|
|
488
|
+
## Observations
|
|
489
|
+
- [attendees] Paul
|
|
490
|
+
- [attendees] Sarah
|
|
491
|
+
- [decisions] Ship v2 by Friday
|
|
492
|
+
- [action_items] Paul to review PR #42
|
|
493
|
+
- [blockers] Waiting on API credentials
|
|
494
|
+
```
|